@graphite-sports/sdk 0.6.0 → 0.7.0

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 (2) hide show
  1. package/index.d.ts +1350 -376
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { ButtonHTMLAttributes } from 'react';
1
2
  import { ChangeEventHandler } from 'react';
2
3
  import { ColumnDef } from '@tanstack/react-table';
3
4
  import { ColumnHelper } from '@tanstack/table-core';
@@ -56,7 +57,7 @@ declare type AddGameEdit_2 = {
56
57
  game: Extract<GameKind, {
57
58
  type: 'game-node';
58
59
  }> & {
59
- variant: {
60
+ kind: {
60
61
  type: 'parallel';
61
62
  };
62
63
  };
@@ -64,20 +65,13 @@ declare type AddGameEdit_2 = {
64
65
  division: GameDivision;
65
66
  });
66
67
 
67
- /**
68
- * <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1})
69
- */
70
- declare interface AddRecordFieldsNode {
71
- fields: string[];
72
- }
73
-
74
68
  declare type AgeGroupClasses = Record<'female' | 'male', ClassId>;
75
69
 
76
70
  export declare type AnyQuerySchema = QuerySchema<QueryFields>;
77
71
 
78
- export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, autoFocus, }: AppButtonProps): JSX.Element;
72
+ export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, autoFocus, ...aria }: AppButtonProps): JSX.Element;
79
73
 
80
- export declare type AppButtonProps = {
74
+ export declare type AppButtonProps = Pick<ButtonHTMLAttributes<HTMLButtonElement>, 'aria-label' | 'aria-haspopup' | 'aria-expanded' | 'aria-required'> & {
81
75
  type?: AppButtonType;
82
76
  onClick?: () => void;
83
77
  disabled?: boolean;
@@ -157,7 +151,7 @@ export declare type AppInputProps = {
157
151
  autoFocus?: boolean;
158
152
  };
159
153
 
160
- export declare function AppListbox<TVal>({ options, value, onChange, label, description, disabled, placeholder, className, direction, readonly: readonlyProp, required, }: AppListboxProps<TVal>): JSX.Element;
154
+ export declare function AppListbox<TVal>({ options, value, onChange, label, description, disabled, placeholder, className, direction, readonly: readonlyProp, required, describeOptions, }: AppListboxProps<TVal>): JSX.Element;
161
155
 
162
156
  export declare type AppListboxProps<TVal> = {
163
157
  options: Option_2<TVal>[];
@@ -171,6 +165,8 @@ export declare type AppListboxProps<TVal> = {
171
165
  direction?: 'up' | 'down';
172
166
  readonly?: boolean;
173
167
  required?: boolean;
168
+ /** Shows each option's description under it in the list. */
169
+ describeOptions?: boolean;
174
170
  };
175
171
 
176
172
  export declare function AppNumberInput<IsRequired extends boolean = false>({ label, description, value, onChange, min, max, integer, placeholder, required, disabled, readonly: readonlyProp, className, layout, onKeyDown, onFocus, onBlur, tabIndex, autoFocus, inputRef, }: AppNumberInputProps<IsRequired>): JSX.Element;
@@ -197,6 +193,22 @@ export declare type AppNumberInputProps<IsRequired extends boolean = false> = {
197
193
  inputRef?: React.RefObject<HTMLInputElement | null>;
198
194
  };
199
195
 
196
+ /** Picks one of a few options, all of them visible at once with their descriptions, as a compact vertical list. */
197
+ export declare function AppRadioGroup<TVal>({ label, options, value, onChange, disabled, readonly: readonlyProp, className, checkedMarker, }: AppRadioGroupProps<TVal>): JSX.Element;
198
+
199
+ export declare type AppRadioGroupProps<TVal> = {
200
+ label: React_2.ReactNode;
201
+ /** Each one a radio, with its description below its label. */
202
+ options: Option_2<TVal>[];
203
+ value: TVal;
204
+ onChange: (value: TVal) => void;
205
+ disabled?: boolean;
206
+ readonly?: boolean;
207
+ className?: string;
208
+ /** Shown at the left edge of the checked option, positioned by itself, e.g. a port a line leaves from. */
209
+ checkedMarker?: React_2.ReactNode;
210
+ };
211
+
200
212
  export declare function AppSwitch(props: AppSwitchProps): JSX.Element;
201
213
 
202
214
  export declare type AppSwitchProps = {
@@ -268,6 +280,8 @@ export declare type ArithmeticOperator = "add" | "subtract";
268
280
 
269
281
  export declare type ArrayValue<T = Primitive> = Value<T>[];
270
282
 
283
+ declare type AutomationScriptError = { type: "ParseError"; error: { kind: ParseErrorKind; location: SourceLocation } } | { type: "TypeErrors"; error: TypeErrors };
284
+
271
285
  export declare type BIB = Brand<number, 'bib'>;
272
286
 
273
287
  declare type BooleanOp = "and" | "or" | "xor" | "not";
@@ -286,7 +300,7 @@ export declare type Brand<T, B> = T & {
286
300
  /** Stable reference — a new inline `select` on every `queryOptions()` call makes React Query re-select each render. */
287
301
  export declare function buildCompetitorsMapped(competitors: CompetitorDAO[]): CompetitorsMapped;
288
302
 
289
- export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspaceId" | "/workspace/:workspaceId/event/:eventId" | "/login" | "/register" | "/download" | "/preferences" | "/crate-workspace" | "/workspace/:workspaceId/create-event" | "/workspace/:workspaceId/event/:eventId/dashboard" | "/workspace/:workspaceId/event/:eventId/create-class" | "/workspace/:workspaceId/event/:eventId/class/:classId" | "/workspace/:workspaceId/event/:eventId/create-competitor" | "/workspace/:workspaceId/event/:eventId/create-team" | "/workspace/:workspaceId/event/:eventId/competitor/:competitorId" | "/workspace/:workspaceId/event/:eventId/create-format" | "/workspace/:workspaceId/event/:eventId/format/:formatId" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId" | "/workspace/:workspaceId/event/:eventId/graph" | "/workspace/:workspaceId/event/:eventId/simplified" | "/workspace/:workspaceId/event/:eventId/lineage" | "/workspace/:workspaceId/event/:eventId/create-game" | "/workspace/:workspaceId/event/:eventId/game/:gameId" | "/workspace/:workspaceId/event/:eventId/create-table" | "/workspace/:workspaceId/event/:eventId/table/:tableId" | "/workspace/:workspaceId/event/:eventId/create-game-format" | "/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId" | "/workspace/:workspaceId/event/:eventId/create-template" | "/workspace/:workspaceId/event/:eventId/template/:templateId" | "/workspace/:workspaceId/event/:eventId/extension/$extensionIdentifier">(path: Path, params: PathParams<Path>, ...query: {
303
+ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspaceId" | "/workspace/:workspaceId/event/:eventId" | "/login" | "/download" | "/register" | "/preferences" | "/crate-workspace" | "/workspace/:workspaceId/create-event" | "/workspace/:workspaceId/create-event/empty" | "/workspace/:workspaceId/create-event/template" | "/workspace/:workspaceId/create-event/assistant" | "/workspace/:workspaceId/event/:eventId/assistant" | "/workspace/:workspaceId/event/:eventId/create-class" | "/workspace/:workspaceId/event/:eventId/class/:classId" | "/workspace/:workspaceId/event/:eventId/create-competitor" | "/workspace/:workspaceId/event/:eventId/create-team" | "/workspace/:workspaceId/event/:eventId/competitor/:competitorId" | "/workspace/:workspaceId/event/:eventId/create-format" | "/workspace/:workspaceId/event/:eventId/format/:formatId" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId" | "/workspace/:workspaceId/event/:eventId/graph" | "/workspace/:workspaceId/event/:eventId/flow" | "/workspace/:workspaceId/event/:eventId/simplified" | "/workspace/:workspaceId/event/:eventId/lineage" | "/workspace/:workspaceId/event/:eventId/create-game" | "/workspace/:workspaceId/event/:eventId/game/:gameId" | "/workspace/:workspaceId/event/:eventId/create-table" | "/workspace/:workspaceId/event/:eventId/table/:tableId" | "/workspace/:workspaceId/event/:eventId/create-game-format" | "/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId" | "/workspace/:workspaceId/event/:eventId/create-scoring-definition" | "/workspace/:workspaceId/event/:eventId/scoring-definition/:scoringDefinitionId" | "/workspace/:workspaceId/event/:eventId/create-template" | "/workspace/:workspaceId/event/:eventId/template/:templateId" | "/workspace/:workspaceId/event/:eventId/extension/$extensionIdentifier">(path: Path, params: PathParams<Path>, ...query: {
290
304
  '/': undefined;
291
305
  '/download': undefined;
292
306
  '/login': QuerySchema< {
@@ -299,17 +313,22 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
299
313
  '/crate-workspace': undefined;
300
314
  '/workspace/:workspaceId': undefined;
301
315
  '/workspace/:workspaceId/create-event': undefined;
316
+ '/workspace/:workspaceId/create-event/empty': undefined;
317
+ '/workspace/:workspaceId/create-event/template': undefined;
318
+ '/workspace/:workspaceId/create-event/assistant': undefined;
302
319
  '/workspace/:workspaceId/event/:eventId': undefined;
303
- '/workspace/:workspaceId/event/:eventId/dashboard': undefined;
304
- '/workspace/:workspaceId/event/:eventId/create-class': undefined;
320
+ '/workspace/:workspaceId/event/:eventId/assistant': undefined;
321
+ '/workspace/:workspaceId/event/:eventId/create-class': QuerySchema< {
322
+ readonly from: OptionalQueryField<ClassId>;
323
+ }>;
305
324
  '/workspace/:workspaceId/event/:eventId/class/:classId': undefined;
306
325
  '/workspace/:workspaceId/event/:eventId/create-competitor': undefined;
307
326
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
308
327
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
309
328
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
310
329
  readonly name: OptionalQueryField<string>;
311
- readonly template: OptionalQueryField<FormatId>;
312
330
  readonly place: OptionalQueryField<GamePlace>;
331
+ readonly from: OptionalQueryField<FormatId>;
313
332
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
314
333
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
315
334
  }>;
@@ -317,17 +336,23 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
317
336
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
318
337
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
319
338
  }>;
320
- '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': undefined;
339
+ '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': QuerySchema< {
340
+ readonly from: OptionalQueryField<FormatTestId>;
341
+ }>;
321
342
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId': undefined;
322
343
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
323
344
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
345
+ /** The root format shown, else the one with the focused nodes or the first. */
346
+ readonly format: OptionalQueryField<FormatId>;
324
347
  }>;
325
- '/workspace/:workspaceId/event/:eventId/simplified': QuerySchema< {
348
+ '/workspace/:workspaceId/event/:eventId/flow': QuerySchema< {
349
+ readonly focusNode: RepeatedQueryField<FormatNodeId>;
326
350
  /** Applied once, e.g. for a format just created to be used as a game. */
327
351
  readonly addGame: OptionalQueryField<AddGameEdit>;
328
- readonly focusNode: RepeatedQueryField<FormatNodeId>;
329
- readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
352
+ readonly sidebar: OptionalQueryField<string>;
330
353
  }>;
354
+ /** The flow's old path, which redirects there. */
355
+ '/workspace/:workspaceId/event/:eventId/simplified': undefined;
331
356
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
332
357
  readonly game: OptionalQueryField<GameId>;
333
358
  readonly table: OptionalQueryField<TableId>;
@@ -338,12 +363,25 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
338
363
  /** Narrows `node` down to its instances in these format instances. */
339
364
  readonly formatInstance: RepeatedQueryField<FormatInstanceHash>;
340
365
  }>;
341
- '/workspace/:workspaceId/event/:eventId/create-game': undefined;
366
+ '/workspace/:workspaceId/event/:eventId/create-game': QuerySchema< {
367
+ readonly from: OptionalQueryField<GameId>;
368
+ }>;
342
369
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
343
370
  '/workspace/:workspaceId/event/:eventId/create-table': undefined;
344
371
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
345
- '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
346
- '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
372
+ '/workspace/:workspaceId/event/:eventId/create-game-format': QuerySchema< {
373
+ readonly from: OptionalQueryField<GameFormatId>;
374
+ }>;
375
+ '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': QuerySchema< {
376
+ /** The tab of the modes shown: a kind of game or a mode of the game format, see `GameModeTabs`. */
377
+ readonly mode: OptionalQueryField<string>;
378
+ /** `modes` scrolls the modes into view once, for links to a mode. */
379
+ readonly reveal: OptionalQueryField<string>;
380
+ }>;
381
+ '/workspace/:workspaceId/event/:eventId/create-scoring-definition': QuerySchema< {
382
+ readonly from: OptionalQueryField<ScoringDefinitionId>;
383
+ }>;
384
+ '/workspace/:workspaceId/event/:eventId/scoring-definition/:scoringDefinitionId': undefined;
347
385
  '/workspace/:workspaceId/event/:eventId/create-template': undefined;
348
386
  '/workspace/:workspaceId/event/:eventId/template/:templateId': undefined;
349
387
  '/workspace/:workspaceId/event/:eventId/extension/$extensionIdentifier': undefined;
@@ -361,17 +399,22 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
361
399
  '/crate-workspace': undefined;
362
400
  '/workspace/:workspaceId': undefined;
363
401
  '/workspace/:workspaceId/create-event': undefined;
402
+ '/workspace/:workspaceId/create-event/empty': undefined;
403
+ '/workspace/:workspaceId/create-event/template': undefined;
404
+ '/workspace/:workspaceId/create-event/assistant': undefined;
364
405
  '/workspace/:workspaceId/event/:eventId': undefined;
365
- '/workspace/:workspaceId/event/:eventId/dashboard': undefined;
366
- '/workspace/:workspaceId/event/:eventId/create-class': undefined;
406
+ '/workspace/:workspaceId/event/:eventId/assistant': undefined;
407
+ '/workspace/:workspaceId/event/:eventId/create-class': QuerySchema< {
408
+ readonly from: OptionalQueryField<ClassId>;
409
+ }>;
367
410
  '/workspace/:workspaceId/event/:eventId/class/:classId': undefined;
368
411
  '/workspace/:workspaceId/event/:eventId/create-competitor': undefined;
369
412
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
370
413
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
371
414
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
372
415
  readonly name: OptionalQueryField<string>;
373
- readonly template: OptionalQueryField<FormatId>;
374
416
  readonly place: OptionalQueryField<GamePlace>;
417
+ readonly from: OptionalQueryField<FormatId>;
375
418
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
376
419
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
377
420
  }>;
@@ -379,17 +422,23 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
379
422
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
380
423
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
381
424
  }>;
382
- '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': undefined;
425
+ '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': QuerySchema< {
426
+ readonly from: OptionalQueryField<FormatTestId>;
427
+ }>;
383
428
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId': undefined;
384
429
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
385
430
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
431
+ /** The root format shown, else the one with the focused nodes or the first. */
432
+ readonly format: OptionalQueryField<FormatId>;
386
433
  }>;
387
- '/workspace/:workspaceId/event/:eventId/simplified': QuerySchema< {
434
+ '/workspace/:workspaceId/event/:eventId/flow': QuerySchema< {
435
+ readonly focusNode: RepeatedQueryField<FormatNodeId>;
388
436
  /** Applied once, e.g. for a format just created to be used as a game. */
389
437
  readonly addGame: OptionalQueryField<AddGameEdit>;
390
- readonly focusNode: RepeatedQueryField<FormatNodeId>;
391
- readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
438
+ readonly sidebar: OptionalQueryField<string>;
392
439
  }>;
440
+ /** The flow's old path, which redirects there. */
441
+ '/workspace/:workspaceId/event/:eventId/simplified': undefined;
393
442
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
394
443
  readonly game: OptionalQueryField<GameId>;
395
444
  readonly table: OptionalQueryField<TableId>;
@@ -400,34 +449,41 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
400
449
  /** Narrows `node` down to its instances in these format instances. */
401
450
  readonly formatInstance: RepeatedQueryField<FormatInstanceHash>;
402
451
  }>;
403
- '/workspace/:workspaceId/event/:eventId/create-game': undefined;
452
+ '/workspace/:workspaceId/event/:eventId/create-game': QuerySchema< {
453
+ readonly from: OptionalQueryField<GameId>;
454
+ }>;
404
455
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
405
456
  '/workspace/:workspaceId/event/:eventId/create-table': undefined;
406
457
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
407
- '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
408
- '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
458
+ '/workspace/:workspaceId/event/:eventId/create-game-format': QuerySchema< {
459
+ readonly from: OptionalQueryField<GameFormatId>;
460
+ }>;
461
+ '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': QuerySchema< {
462
+ /** The tab of the modes shown: a kind of game or a mode of the game format, see `GameModeTabs`. */
463
+ readonly mode: OptionalQueryField<string>;
464
+ /** `modes` scrolls the modes into view once, for links to a mode. */
465
+ readonly reveal: OptionalQueryField<string>;
466
+ }>;
467
+ '/workspace/:workspaceId/event/:eventId/create-scoring-definition': QuerySchema< {
468
+ readonly from: OptionalQueryField<ScoringDefinitionId>;
469
+ }>;
470
+ '/workspace/:workspaceId/event/:eventId/scoring-definition/:scoringDefinitionId': undefined;
409
471
  '/workspace/:workspaceId/event/:eventId/create-template': undefined;
410
472
  '/workspace/:workspaceId/event/:eventId/template/:templateId': undefined;
411
473
  '/workspace/:workspaceId/event/:eventId/extension/$extensionIdentifier': undefined;
412
474
  '*': undefined;
413
475
  }[Path] ? T extends AnyQuerySchema ? [query?: QueryInput<T> | undefined] : [] : never : never) => string;
414
476
 
415
- /** How to handle a disqualification: one of the strategies to catch it, or "throw" - not catching it at all. */
416
- declare type CatchDqChoice = DqStrategy_2 | 'throw';
477
+ /** A tutorial of the engine. */
478
+ export declare interface BuiltInTutorial {
479
+ scope?: 'built-in';
480
+ id: TutorialId;
481
+ }
417
482
 
418
483
  declare type ChildrenSpec = { type: "disallowed" } | { type: "allowed" } | { type: "closure"; signature: NodeSignature<Type> };
419
484
 
420
485
  export declare type ClassDAO = components['schemas']['ClassDAO'];
421
486
 
422
- /**
423
- * Outputs the competitors of classes as a table.
424
- *
425
- * ```text
426
- * multiple: ('roundrobin' | 'serpentine' | 'concat', ...Class) -> (Table<{}, Sorted>)
427
- * ```
428
- */
429
- declare type ClassesCompetitorsNode = null;
430
-
431
487
  /**
432
488
  * Identifies a class. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
433
489
  * Deserializing one only yields a reference to an existing class; it does not check that it exists.
@@ -436,6 +492,20 @@ export declare type ClassId = string & { readonly __brand: 'classId' };
436
492
 
437
493
  export declare type ClassResponse = components['schemas']['ClassResponse'];
438
494
 
495
+ /**
496
+ * The signature of a script closure: no variadic ports, exactly one output and an input name per input. The names
497
+ * are distinct variable names.
498
+ */
499
+ declare interface ClosureSignature {
500
+ signature: NodeSignature<Type>;
501
+ inputNames: VariableName[];
502
+ }
503
+
504
+ /**
505
+ * Where a node gets the closure it calls.
506
+ */
507
+ declare type ClosureSource = "children" | "input" | "deterministic-input";
508
+
439
509
  declare type CommonApiKeyId = Brand<number, 'commonApiKeyId'>;
440
510
 
441
511
  export declare type CommonWorkspaceId = WorkspaceRootId | WorkspaceSelfHostedId;
@@ -555,6 +625,11 @@ declare interface components {
555
625
  force: boolean;
556
626
  /** @description The id of the new format, see [FormatId::new_random]. It must not exist yet. */
557
627
  formatId: components["schemas"]["FormatId"];
628
+ /**
629
+ * @description Never changes afterwards.
630
+ * @default normal
631
+ */
632
+ kind: components["schemas"]["FormatKind"];
558
633
  };
559
634
  AddFormatTestMutation: {
560
635
  /** @default */
@@ -567,10 +642,19 @@ declare interface components {
567
642
  };
568
643
  AddGameFormatMutation: {
569
644
  eventId: components["schemas"]["EventId"];
645
+ /** @description If true, saves the game format although its settings don't validate. Its game nodes are invalid then. */
646
+ force?: boolean;
570
647
  gameFormat: components["schemas"]["GameFormatDTO"];
571
648
  /** @description The id of the new game format, see [GameFormatId::new_random]. It must not exist yet. */
572
649
  gameFormatId: components["schemas"]["GameFormatId"];
573
650
  };
651
+ AddGameFormatQuery: {
652
+ /**
653
+ * @description If true, saves the game format although its settings don't validate. Its game nodes are invalid then.
654
+ * @default false
655
+ */
656
+ force: boolean;
657
+ };
574
658
  AddGameMutation: {
575
659
  eventId: components["schemas"]["EventId"];
576
660
  game: components["schemas"]["GameDTO"];
@@ -584,8 +668,13 @@ declare interface components {
584
668
  tableId: components["schemas"]["TableId"];
585
669
  variant: components["schemas"]["TableVariant"];
586
670
  };
587
- /** @description <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1}) */
588
- AddRecordFieldsNode: AddRecordFieldsNode;
671
+ /** @description Stores the definition even if it is invalid, with its errors. */
672
+ AddScoringDefinitionMutation: {
673
+ eventId: components["schemas"]["EventId"];
674
+ scoringDefinition: components["schemas"]["ScoringDefinitionDTO"];
675
+ /** @description The id of the new definition, see [ScoringDefinitionId::new_random]. It must not exist yet. */
676
+ scoringDefinitionId: components["schemas"]["ScoringDefinitionId"];
677
+ };
589
678
  AddTarget: {
590
679
  backendUrl: string;
591
680
  /** @description Replicate into this existing remote workspace instead of creating a new one. */
@@ -643,7 +732,8 @@ declare interface components {
643
732
  * Format: uuid
644
733
  * @description The template the entry belongs to: installing it links the entity to it and reuses the entity of the event
645
734
  * installed from it before, see [template_origin](crate::graphite_engine::template_origin). Without one, the entity
646
- * is installed as a plain editable entity. Ignored for [ArchiveData::Group].
735
+ * is installed as a plain editable entity. Never set on [ArchiveData::Group] and root formats, and ignored for them:
736
+ * every import adds root formats anew as editable root formats.
647
737
  */
648
738
  templateOrigin?: string | null;
649
739
  /**
@@ -663,10 +753,10 @@ declare interface components {
663
753
  */
664
754
  invalid: boolean;
665
755
  /**
666
- * @description Whether this is the root format of the exported event. See [import_archive::RootFormatImport] for how it gets imported.
667
- * @default false
756
+ * @description The format gets imported with it.
757
+ * @default normal
668
758
  */
669
- root: boolean;
759
+ kind: components["schemas"]["FormatKind"];
670
760
  tests: components["schemas"]["FormatTestArchive"][];
671
761
  /** @description Maps ids from the format DTO to uuids of [Archive::dependencies] */
672
762
  wiring: components["schemas"]["Wiring"];
@@ -674,7 +764,43 @@ declare interface components {
674
764
  } | {
675
765
  /** @constant */
676
766
  type: "game-format";
677
- data: components["schemas"]["GameFormatDTO"];
767
+ /**
768
+ * @description Describes the shape of a game and how its result is post processed.
769
+ *
770
+ * `GameFormatSettings<Validated>` proves that every automation typechecks against the row type
771
+ * left behind by the automations before it.
772
+ */
773
+ data: {
774
+ /** @default */
775
+ description: string;
776
+ attributesType: components["schemas"]["RecordTypeWithDefaults"];
777
+ customData?: {
778
+ [key: string]: string;
779
+ };
780
+ /**
781
+ * @description Settings by disqualification kind. May hold kinds no automation disqualifies under. Kinds without an entry have
782
+ * the default settings.
783
+ */
784
+ disqualifications?: {
785
+ [key: string]: components["schemas"]["DqSettings"];
786
+ };
787
+ entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
788
+ /** @description A group of game formats of the event. */
789
+ formatGroupId?: components["schemas"]["FormatGroupId"] | null;
790
+ name: string;
791
+ /** @description Run in order on every result row. */
792
+ postProcessingSteps: components["schemas"]["GameFormatStep_for_GameFormatPostProcessingStep"][];
793
+ /** @description Run in order on every row of the entry list, before the game. */
794
+ preProcessingSteps?: components["schemas"]["GameFormatStep_for_GameFormatPreProcessingStep"][];
795
+ resultListColumns: components["schemas"]["RecordTypeWithDefaults"];
796
+ tags?: components["schemas"]["Tags"];
797
+ /** @description Maps the game format's group to the uuid of its entry in [Archive::dependencies]. */
798
+ wiring?: components["schemas"]["Wiring"];
799
+ };
800
+ } | {
801
+ /** @constant */
802
+ type: "scoring-definition";
803
+ data: components["schemas"]["ScoringDefinitionDTO"];
678
804
  } | {
679
805
  /** @constant */
680
806
  type: "class";
@@ -711,11 +837,65 @@ declare interface components {
711
837
  workspaceId: components["schemas"]["CommonWorkspaceId"];
712
838
  };
713
839
  };
840
+ AutomationError: {
841
+ /** Format: uint */
842
+ automationIndex: number;
843
+ /**
844
+ * Format: uint
845
+ * @description Which expression of the step is invalid, in the order of [GameFormatPreProcessingStep::expressions]. Steps with
846
+ * one expression and errors not about an expression have `0`.
847
+ */
848
+ expressionIndex?: number;
849
+ kind: components["schemas"]["AutomationErrorKind"];
850
+ /** @description Which steps `automation_index` indexes. */
851
+ stage: components["schemas"]["ProcessingStage"];
852
+ };
853
+ AutomationErrorKind: {
854
+ /** @constant */
855
+ type: "script";
856
+ data: components["schemas"]["AutomationScriptError"];
857
+ } | {
858
+ /** @constant */
859
+ type: "non-primitive-column-type";
860
+ } | {
861
+ /** @constant */
862
+ type: "empty-sit-out-output-name";
863
+ } | {
864
+ /** @constant */
865
+ type: "empty-dq-key";
866
+ };
867
+ AutomationScriptError: AutomationScriptError;
714
868
  /** Format: int64 */
715
869
  BIB: BIB;
716
870
  BibNotUniqueError: components["schemas"]["BIB"];
717
871
  /** @enum {string} */
718
872
  BooleanOp: BooleanOp;
873
+ BranchDTO_for_CommonWorkspaceId: {
874
+ /** Format: date-time */
875
+ createdAt: string;
876
+ familyId: components["schemas"]["CommonWorkspaceId"];
877
+ /** @description The last log entry it shares with its parent. */
878
+ forkLogId?: components["schemas"]["LogId"] | null;
879
+ /** @description The last log entry of the branch. */
880
+ head: components["schemas"]["LogId"];
881
+ name: string;
882
+ parentWorkspaceId?: components["schemas"]["CommonWorkspaceId"] | null;
883
+ workspaceId: components["schemas"]["CommonWorkspaceId"];
884
+ };
885
+ BranchPathVariables_for_CommonWorkspaceId: {
886
+ branchId: components["schemas"]["CommonWorkspaceId"];
887
+ };
888
+ /** @description Query of every endpoint of a workspace. */
889
+ BranchQuery_for_CommonWorkspaceId: {
890
+ /** @description The branch of the workspace's family to use instead of its default branch (T-149). */
891
+ branch?: components["schemas"]["CommonWorkspaceId"] | null;
892
+ };
893
+ BranchesDTO_for_CommonWorkspaceId: {
894
+ /** @description The first one first. */
895
+ branches: components["schemas"]["BranchDTO_for_CommonWorkspaceId"][];
896
+ defaultBranch: components["schemas"]["CommonWorkspaceId"];
897
+ familyId: components["schemas"]["CommonWorkspaceId"];
898
+ };
719
899
  /** @description The [CICManagedState] of a relation that is a membership, so all but `DeletedByUser`. */
720
900
  CICMembershipState: "added-by-user" | "automation";
721
901
  ChildrenSpec: ChildrenSpec;
@@ -833,13 +1013,12 @@ declare interface components {
833
1013
  competitorCount: number;
834
1014
  };
835
1015
  /**
836
- * @description Outputs the competitors of classes as a table.
837
- *
838
- * ```text
839
- * multiple: ('roundrobin' | 'serpentine' | 'concat', ...Class) -> (Table<{}, Sorted>)
840
- * ```
1016
+ * @description The signature of a script closure: no variadic ports, exactly one output and an input name per input. The names
1017
+ * are distinct variable names.
841
1018
  */
842
- ClassesCompetitorsNode: ClassesCompetitorsNode;
1019
+ ClosureSignature: ClosureSignature;
1020
+ /** @description Where a node gets the closure it calls. */
1021
+ ClosureSource: ClosureSource;
843
1022
  /** Format: int64 */
844
1023
  CommonApiKeyId: CommonApiKeyId;
845
1024
  CommonWorkspaceId: CommonWorkspaceId;
@@ -1074,13 +1253,20 @@ declare interface components {
1074
1253
  /** @description If part of a group, the group will get included automatically. */
1075
1254
  formatIds: components["schemas"]["FormatId"][];
1076
1255
  gameFormatIds: components["schemas"]["GameFormatId"][];
1256
+ /** @description Formats include the definitions they use anyway. */
1257
+ scoringDefinitionIds?: components["schemas"]["ScoringDefinitionId"][];
1258
+ };
1259
+ CreateBranchBody: {
1260
+ /** @description The last log entry the branch shares with the branch it is branched off. */
1261
+ atEntry: components["schemas"]["LogId"];
1262
+ name: string;
1077
1263
  };
1078
1264
  CreatedTarget: {
1079
1265
  apiKey: string;
1080
1266
  workspaceId: components["schemas"]["CommonWorkspaceId"];
1081
1267
  };
1082
1268
  /** @enum {string} */
1083
- CustomControl: "sort-criterion";
1269
+ CustomControl: CustomControl;
1084
1270
  CustomDataEntity: {
1085
1271
  /** @constant */
1086
1272
  type: "game";
@@ -1300,6 +1486,22 @@ declare interface components {
1300
1486
  /** @constant */
1301
1487
  type: "unknown";
1302
1488
  };
1489
+ DefaultChangeEvent_for_ScoringDefinitionId: {
1490
+ /** @constant */
1491
+ type: "created";
1492
+ data: components["schemas"]["ScoringDefinitionId"];
1493
+ } | {
1494
+ /** @constant */
1495
+ type: "updated";
1496
+ data: components["schemas"]["ScoringDefinitionId"];
1497
+ } | {
1498
+ /** @constant */
1499
+ type: "deleted";
1500
+ data: components["schemas"]["ScoringDefinitionId"];
1501
+ } | {
1502
+ /** @constant */
1503
+ type: "unknown";
1504
+ };
1303
1505
  DefaultChangeEvent_for_TableId: {
1304
1506
  /** @constant */
1305
1507
  type: "created";
@@ -1351,10 +1553,16 @@ declare interface components {
1351
1553
  };
1352
1554
  /** @description What happens to the games and tables of node instances that get deleted. */
1353
1555
  DeleteInstanceSettings: "errorOnContent" | "keepContentAsCopy" | "deleteContent";
1556
+ /** @description Definitions can only be deleted when no scoring node uses them. */
1557
+ DeleteScoringDefinitionMutation: {
1558
+ scoringDefinitionId: components["schemas"]["ScoringDefinitionId"];
1559
+ };
1354
1560
  DeleteTableMutation: {
1355
1561
  id: components["schemas"]["TableId"];
1356
1562
  };
1357
1563
  DetailedSupertypeDiagnostics_for_Type: DetailedSupertypeDiagnostics<Type>;
1564
+ /** @description A competitor's worst results that don't count towards their total. */
1565
+ Discards: Discards;
1358
1566
  /**
1359
1567
  * @description Disqualifies every row of the table it receives, throwing them all under `key` so that a
1360
1568
  * [`GroupNode`](super::group_node::GroupNode) further up the graph can collect them.
@@ -1373,13 +1581,13 @@ declare interface components {
1373
1581
  source: components["schemas"]["DivergedRows"];
1374
1582
  target: components["schemas"]["DivergedRows"];
1375
1583
  };
1376
- /** @description What a node does by default with a disqualification it can throw. */
1377
- DqDefaultStrategy: DqDefaultStrategy;
1378
1584
  DqKey: DqKey;
1379
- /** @description What a format or game format says about one of its disqualification kinds. */
1585
+ DqKind: DqKind;
1586
+ DqRecord: DqRecord;
1587
+ /** @description What a game format says about one of its disqualification kinds. */
1380
1588
  DqSettings: DqSettings;
1381
- /** @description Decides how caught disqualifications are surfaced. */
1382
- DqStrategy: DqStrategy;
1589
+ /** @description Where a competitor got disqualified. */
1590
+ DqSource: DqSource;
1383
1591
  /**
1384
1592
  * @description How functions that combine tables from multiple competitor sources (e.g. merging or
1385
1593
  * concatenating) should treat a competitor that appears in more than one of them.
@@ -1453,6 +1661,13 @@ declare interface components {
1453
1661
  } & {
1454
1662
  [key: string]: unknown;
1455
1663
  };
1664
+ /** @description A log entry that changed an entity. */
1665
+ EntityChange: {
1666
+ description: string;
1667
+ logId: components["schemas"]["LogId"];
1668
+ /** Format: date-time */
1669
+ timestamp: string;
1670
+ };
1456
1671
  EntityChangeEvent: {
1457
1672
  /** @constant */
1458
1673
  type: "event";
@@ -1469,6 +1684,10 @@ declare interface components {
1469
1684
  /** @constant */
1470
1685
  type: "game-format";
1471
1686
  data: components["schemas"]["DefaultChangeEvent_for_GameFormatId"];
1687
+ } | {
1688
+ /** @constant */
1689
+ type: "scoring-definition";
1690
+ data: components["schemas"]["DefaultChangeEvent_for_ScoringDefinitionId"];
1472
1691
  } | {
1473
1692
  /** @constant */
1474
1693
  type: "format-group";
@@ -1522,7 +1741,12 @@ declare interface components {
1522
1741
  type: "content-in-event-folder";
1523
1742
  };
1524
1743
  /** @description Auto-generated discriminant enum variants */
1525
- EntityChangeEventDiscriminants: ("Event" | "Game" | "Table" | "GameFormat" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "FormatTest" | "Log" | "ContentInEventFolder") | "CompetitorInTeam" | "CompetitorInClass";
1744
+ EntityChangeEventDiscriminants: ("Event" | "Game" | "Table" | "GameFormat" | "ScoringDefinition" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "FormatTest" | "Log" | "ContentInEventFolder") | "CompetitorInTeam" | "CompetitorInClass";
1745
+ EntityHistoryQuery: {
1746
+ entity: components["schemas"]["HistoryEntity"];
1747
+ /** @description The id of the entity, as the API writes it. */
1748
+ id: string;
1749
+ };
1526
1750
  /** @description A scope portal that used to be there but got removed in order to be serializable */
1527
1751
  ErasedScopedTypeRef_for_Type: ErasedScopedTypeRef<Type>;
1528
1752
  EventCompetitorsNode: EventCompetitorsNode;
@@ -1538,11 +1762,6 @@ declare interface components {
1538
1762
  /** @description All competitors in this event are forced to have these parameters. */
1539
1763
  individualCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1540
1764
  name: string;
1541
- /**
1542
- * @description should only be null when creating an event. The next
1543
- * action should always be to create and set the root format.
1544
- */
1545
- rootFormatId?: components["schemas"]["FormatId"] | null;
1546
1765
  settings: components["schemas"]["EventSettings"];
1547
1766
  /**
1548
1767
  * Format: date
@@ -1568,7 +1787,8 @@ declare interface components {
1568
1787
  /**
1569
1788
  * @default {
1570
1789
  * "duplicateCompetitorPolicy": "error",
1571
- * "invalidLinkedFormatPolicy": "last-known-table"
1790
+ * "invalidLinkedFormatPolicy": "last-known-table",
1791
+ * "sport": "44cfa5f1-264f-4b3c-9734-8a93f647d7d8"
1572
1792
  * }
1573
1793
  */
1574
1794
  settings: components["schemas"]["EventSettings"];
@@ -1633,6 +1853,7 @@ declare interface components {
1633
1853
  };
1634
1854
  EventLineageRow: {
1635
1855
  competitorId: components["schemas"]["CompetitorId"];
1856
+ dqs: components["schemas"]["DqRecord"][];
1636
1857
  /** Format: int64 */
1637
1858
  place?: number | null;
1638
1859
  };
@@ -1669,7 +1890,7 @@ declare interface components {
1669
1890
  rows: components["schemas"]["EventLineageRow"][];
1670
1891
  tableId: components["schemas"]["TableId"];
1671
1892
  };
1672
- /** @description Settings of an event that change how its formats execute. Missing fields get their defaults. */
1893
+ /** @description Settings of an event. Missing fields get their defaults. */
1673
1894
  EventSettings: {
1674
1895
  /**
1675
1896
  * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
@@ -1683,6 +1904,11 @@ declare interface components {
1683
1904
  * @default last-known-table
1684
1905
  */
1685
1906
  invalidLinkedFormatPolicy: components["schemas"]["InvalidLinkedFormatPolicy"];
1907
+ /**
1908
+ * @description Only clients read it, e.g. to name concepts the way the sport does ("races" instead of "games").
1909
+ * @default 44cfa5f1-264f-4b3c-9734-8a93f647d7d8
1910
+ */
1911
+ sport: components["schemas"]["SportId"];
1686
1912
  };
1687
1913
  Example: {
1688
1914
  /**
@@ -1795,6 +2021,8 @@ declare interface components {
1795
2021
  data: components["schemas"]["GameWithTables"];
1796
2022
  });
1797
2023
  FolderPath: string[];
2024
+ /** @description What the nodes representing a format do with a disqualification it raises. */
2025
+ FormatCatch: FormatCatch;
1798
2026
  FormatConnectionDTO: FormatConnectionDTO;
1799
2027
  FormatDAO: {
1800
2028
  description: string;
@@ -1807,9 +2035,11 @@ declare interface components {
1807
2035
  customData: {
1808
2036
  [key: string]: string;
1809
2037
  };
2038
+ /** @default false */
2039
+ deterministic: boolean;
1810
2040
  /** @default {} */
1811
2041
  disqualificationKinds: {
1812
- [key: string]: components["schemas"]["DqSettings"];
2042
+ [key: string]: components["schemas"]["FormatDqKind"];
1813
2043
  };
1814
2044
  /** @description The default values in here are not guaranteed to be valid for the signature. */
1815
2045
  docs: components["schemas"]["NodeVariantDoc"];
@@ -1817,12 +2047,13 @@ declare interface components {
1817
2047
  eventId: components["schemas"]["EventId"];
1818
2048
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
1819
2049
  id: components["schemas"]["FormatId"];
2050
+ kind: components["schemas"]["FormatKind"];
1820
2051
  name: string;
1821
2052
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1822
2053
  /**
1823
2054
  * @default {
1824
- * "nodes": {},
1825
- * "sections": []
2055
+ * "groups": [],
2056
+ * "nodes": {}
1826
2057
  * }
1827
2058
  */
1828
2059
  simplifiedView: components["schemas"]["SimplifiedView"];
@@ -1830,10 +2061,6 @@ declare interface components {
1830
2061
  templateOrigin?: string | null;
1831
2062
  valid: components["schemas"]["FormatValidity"];
1832
2063
  };
1833
- FormatDAOWithRoot: {
1834
- format: components["schemas"]["FormatDAO"];
1835
- isRoot: boolean;
1836
- };
1837
2064
  FormatDTO: {
1838
2065
  /** @default */
1839
2066
  description: string;
@@ -1841,6 +2068,8 @@ declare interface components {
1841
2068
  customData?: {
1842
2069
  [key: string]: string;
1843
2070
  };
2071
+ /** @description Whether the format may contain only deterministic nodes, see [NodeType]. Its nodes are deterministic then. */
2072
+ deterministic?: boolean;
1844
2073
  /**
1845
2074
  * @description All disqualifications that can escape this format. Like checked exceptions, every
1846
2075
  * uncaught disqualification has to be declared and every declared one has to be throwable.
@@ -1848,7 +2077,7 @@ declare interface components {
1848
2077
  * @default {}
1849
2078
  */
1850
2079
  disqualificationKinds: {
1851
- [key: string]: components["schemas"]["DqSettings"];
2080
+ [key: string]: components["schemas"]["FormatDqKind"];
1852
2081
  };
1853
2082
  /** @description There must be docs for every input and output. Otherwise formats get rejected. */
1854
2083
  docs: components["schemas"]["NodeVariantDoc"];
@@ -1862,6 +2091,8 @@ declare interface components {
1862
2091
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1863
2092
  simplifiedView?: components["schemas"]["SimplifiedView"];
1864
2093
  };
2094
+ /** @description What a format says about a disqualification kind it raises. */
2095
+ FormatDqKind: FormatDqKind;
1865
2096
  FormatError: {
1866
2097
  /** @constant */
1867
2098
  type: "format-reference-error";
@@ -1880,14 +2111,11 @@ declare interface components {
1880
2111
  } | {
1881
2112
  /** @constant */
1882
2113
  type: "invalidate-parents";
1883
- data: components["schemas"]["FormatId"][];
2114
+ data: components["schemas"]["InvalidatedFormat"][];
1884
2115
  } | {
1885
2116
  /** @constant */
1886
2117
  type: "node-has-content";
1887
2118
  data: components["schemas"]["NodeHasContentError"];
1888
- } | {
1889
- /** @constant */
1890
- type: "tried-to-delete-root-format";
1891
2119
  } | {
1892
2120
  /** @constant */
1893
2121
  type: "referenced-by-format-node";
@@ -1909,21 +2137,21 @@ declare interface components {
1909
2137
  type: "upload";
1910
2138
  };
1911
2139
  FormatGroupDAO: {
1912
- category: components["schemas"]["NodeCategory"];
1913
2140
  customData: {
1914
2141
  [key: string]: string;
1915
2142
  };
1916
2143
  eventId: components["schemas"]["EventId"];
1917
2144
  id: components["schemas"]["FormatGroupId"];
2145
+ members: components["schemas"]["FormatGroupMembers"];
1918
2146
  name: string;
1919
2147
  /** Format: uuid */
1920
2148
  templateOrigin?: string | null;
1921
2149
  };
1922
2150
  FormatGroupDTO: {
1923
- category: components["schemas"]["NodeCategory"];
1924
2151
  customData?: {
1925
2152
  [key: string]: string;
1926
2153
  };
2154
+ members: components["schemas"]["FormatGroupMembers"];
1927
2155
  name: string;
1928
2156
  };
1929
2157
  /**
@@ -1932,6 +2160,18 @@ declare interface components {
1932
2160
  * Deserializing one only yields a reference to an existing format group; it does not check that it exists.
1933
2161
  */
1934
2162
  FormatGroupId: FormatGroupId;
2163
+ /**
2164
+ * @description What a format group groups, fixed when the group is created. Formats and game formats can only be in a group of
2165
+ * their kind.
2166
+ */
2167
+ FormatGroupMembers: {
2168
+ /** @constant */
2169
+ type: "formats";
2170
+ category: components["schemas"]["NodeCategory"];
2171
+ } | {
2172
+ /** @constant */
2173
+ type: "game-formats";
2174
+ };
1935
2175
  FormatGroupPathVariables_for_CommonWorkspaceId: {
1936
2176
  eventId: components["schemas"]["EventId"];
1937
2177
  formatGroupId: components["schemas"]["FormatGroupId"];
@@ -2007,6 +2247,8 @@ declare interface components {
2007
2247
  formatInstance: components["schemas"]["FormatInstanceDAO"];
2008
2248
  nodeStates: components["schemas"]["NodeInstanceStateDTO"][];
2009
2249
  };
2250
+ /** @description Set when the format is created and never changed: only the inputs that create a format take it. */
2251
+ FormatKind: "normal" | "root-format";
2010
2252
  FormatNodeConnectionDAO: {
2011
2253
  pins: components["schemas"]["ConnectionPin"][];
2012
2254
  sourceFormatNodeId: components["schemas"]["FormatNodeId"];
@@ -2115,8 +2357,12 @@ declare interface components {
2115
2357
  data: components["schemas"]["GameFormatId"];
2116
2358
  } | {
2117
2359
  /** @constant */
2118
- type: "invalid-standalone-input-table";
2119
- data: components["schemas"]["TableId"];
2360
+ type: "invalid-input-table-link";
2361
+ data: components["schemas"]["FormatNodeId"];
2362
+ } | {
2363
+ /** @constant */
2364
+ type: "cyclic-input-table-link";
2365
+ data: components["schemas"]["FormatNodeId"];
2120
2366
  } | {
2121
2367
  /** @constant */
2122
2368
  type: "invalid-portal-source";
@@ -2141,7 +2387,7 @@ declare interface components {
2141
2387
  };
2142
2388
  /** @description An action invalidated a format */
2143
2389
  FormatRevalidationError: {
2144
- invalidatedFormats: components["schemas"]["FormatId"][];
2390
+ invalidatedFormats: components["schemas"]["InvalidatedFormat"][];
2145
2391
  };
2146
2392
  FormatTest: {
2147
2393
  description: string;
@@ -2200,6 +2446,10 @@ declare interface components {
2200
2446
  /** @constant */
2201
2447
  type: "custom";
2202
2448
  competitors: components["schemas"]["CompetitorDTO"][];
2449
+ } | {
2450
+ /** @constant */
2451
+ type: "custom-teams";
2452
+ competitors: components["schemas"]["CompetitorDTO"][];
2203
2453
  };
2204
2454
  FormatTestDTO: {
2205
2455
  /** @default */
@@ -2364,7 +2614,6 @@ declare interface components {
2364
2614
  formatInstanceId: components["schemas"]["FormatInstanceHash"];
2365
2615
  formatNodeId: components["schemas"]["FormatNodeId"];
2366
2616
  };
2367
- GTFilterKind: GTFilterKind;
2368
2617
  GameDAO: {
2369
2618
  attributes: components["schemas"]["RecordValue_for_Primitive"];
2370
2619
  customData: {
@@ -2390,6 +2639,11 @@ declare interface components {
2390
2639
  gameFormatId: components["schemas"]["GameFormatId"];
2391
2640
  name: string;
2392
2641
  };
2642
+ /**
2643
+ * @description What a game node does with a disqualification kind of its game format: throw it on, or catch it with a
2644
+ * [LadderDqStrategy]. The game format sets the default for its game nodes, each node can override it.
2645
+ */
2646
+ GameDqHandling: GameDqHandling;
2393
2647
  /**
2394
2648
  * @description Describes the shape of a game and how its result is post processed.
2395
2649
  *
@@ -2411,13 +2665,20 @@ declare interface components {
2411
2665
  };
2412
2666
  entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2413
2667
  eventId: components["schemas"]["EventId"];
2668
+ /** @description A group of game formats. */
2669
+ formatGroupId?: components["schemas"]["FormatGroupId"] | null;
2414
2670
  id: components["schemas"]["GameFormatId"];
2415
2671
  name: string;
2416
2672
  /** @description Run in order on every result row. */
2417
- postProcessingSteps: components["schemas"]["GameFormatPostProcessingStep"][];
2673
+ postProcessingSteps: components["schemas"]["GameFormatStep_for_GameFormatPostProcessingStep"][];
2674
+ /** @description Run in order on every row of the entry list, before the game. */
2675
+ preProcessingSteps?: components["schemas"]["GameFormatStep_for_GameFormatPreProcessingStep"][];
2418
2676
  resultListColumns: components["schemas"]["RecordTypeWithDefaults"];
2677
+ tags: components["schemas"]["Tags"];
2419
2678
  /** Format: uuid */
2420
2679
  templateOrigin?: string | null;
2680
+ /** @description Whether `settings` validate. With force, game formats are saved although they don't: their game nodes are invalid. */
2681
+ valid: components["schemas"]["FormatValidity"];
2421
2682
  };
2422
2683
  /**
2423
2684
  * @description Describes the shape of a game and how its result is post processed.
@@ -2440,10 +2701,15 @@ declare interface components {
2440
2701
  [key: string]: components["schemas"]["DqSettings"];
2441
2702
  };
2442
2703
  entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2704
+ /** @description A group of game formats of the event. */
2705
+ formatGroupId?: components["schemas"]["FormatGroupId"] | null;
2443
2706
  name: string;
2444
2707
  /** @description Run in order on every result row. */
2445
- postProcessingSteps: components["schemas"]["GameFormatPostProcessingStep"][];
2708
+ postProcessingSteps: components["schemas"]["GameFormatStep_for_GameFormatPostProcessingStep"][];
2709
+ /** @description Run in order on every row of the entry list, before the game. */
2710
+ preProcessingSteps?: components["schemas"]["GameFormatStep_for_GameFormatPreProcessingStep"][];
2446
2711
  resultListColumns: components["schemas"]["RecordTypeWithDefaults"];
2712
+ tags?: components["schemas"]["Tags"];
2447
2713
  };
2448
2714
  /**
2449
2715
  * Format: uuid
@@ -2456,12 +2722,14 @@ declare interface components {
2456
2722
  gameFormatId: components["schemas"]["GameFormatId"];
2457
2723
  workspaceId: components["schemas"]["CommonWorkspaceId"];
2458
2724
  };
2459
- /**
2460
- * @description One step of a game format's post processing. Automations run in order on every row of a game's
2461
- * result, after the result has been entered. They never change the stored result of the game, only
2462
- * the result table the game node outputs.
2463
- */
2464
- GameFormatPostProcessingStep: GameFormatPostProcessingStep;
2725
+ /** @description A pre or post processing step with a description for the people reading the game format. */
2726
+ GameFormatStep_for_GameFormatPostProcessingStep: GameFormatStep<GameFormatPostProcessingStep>;
2727
+ /** @description A pre or post processing step with a description for the people reading the game format. */
2728
+ GameFormatStep_for_GameFormatPreProcessingStep: GameFormatStep<GameFormatPreProcessingStep>;
2729
+ GameFormatValidationError: {
2730
+ /** @description Not empty. */
2731
+ errors: components["schemas"]["AutomationError"][];
2732
+ };
2465
2733
  /**
2466
2734
  * Format: uuid
2467
2735
  * @description Identifies a game, the primary key of `games`. Comes from one of:
@@ -2473,9 +2741,9 @@ declare interface components {
2473
2741
  * Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
2474
2742
  */
2475
2743
  GameId: GameId;
2476
- GameNodeDTO: GameNodeDTO;
2477
2744
  /** @description How many games a game node plays and how they depend on each other. */
2478
- GameNodeVariant: GameNodeVariant;
2745
+ GameModeKind: GameModeKind;
2746
+ GameNodeDTO: GameNodeDTO;
2479
2747
  GamePathVariables_for_CommonWorkspaceId: {
2480
2748
  eventId: components["schemas"]["EventId"];
2481
2749
  gameId: components["schemas"]["GameId"];
@@ -2524,6 +2792,8 @@ declare interface components {
2524
2792
  };
2525
2793
  /** @description Location of a validation error in the graph. */
2526
2794
  GraphLocation: GraphLocation;
2795
+ /** @description How a group outputs the disqualifications of a key it catches. */
2796
+ GroupCatch: GroupCatch;
2527
2797
  /**
2528
2798
  * @description Contains other nodes. It can add its name to the folder path of its descendants and catch the disqualifications
2529
2799
  * they throw.
@@ -2577,6 +2847,13 @@ declare interface components {
2577
2847
  });
2578
2848
  /** @enum {string} */
2579
2849
  HeaderStyle: "simple";
2850
+ /**
2851
+ * @description The kinds of entities with a history.
2852
+ * @enum {string}
2853
+ */
2854
+ HistoryEntity: "event" | "game" | "table" | "game-format" | "scoring-definition" | "format-group" | "format" | "format-node" | "format-test" | "class" | "competitor";
2855
+ /** @description A note, serialized as a plain string, or a disqualification. */
2856
+ HistoryEntry: HistoryEntry;
2580
2857
  ImportArchiveError: {
2581
2858
  /** @constant */
2582
2859
  type: "invalid-archive";
@@ -2589,9 +2866,6 @@ declare interface components {
2589
2866
  /** @constant */
2590
2867
  type: "missing-lookup-format-group";
2591
2868
  data: components["schemas"]["FormatGroupId"];
2592
- } | {
2593
- /** @constant */
2594
- type: "multiple-root-formats";
2595
2869
  };
2596
2870
  ImportArchiveMutation: {
2597
2871
  archive: components["schemas"]["Archive"];
@@ -2603,9 +2877,11 @@ declare interface components {
2603
2877
  * built; reusing a seed in the same event reproduces the same ids.
2604
2878
  */
2605
2879
  nodeUuidSeed?: components["schemas"]["Seed"] | null;
2606
- /** @default as-format */
2607
- rootFormat: components["schemas"]["RootFormatImport"];
2608
2880
  };
2881
+ /** @description Node types that aren't deterministic: they read or write the workspace, play games or raise disqualifications. */
2882
+ ImpureNodeType: ImpureNodeType;
2883
+ /** @description Auto-generated discriminant enum variants */
2884
+ ImpureNodeTypeDiscriminants: ("game" | "input-table" | "class" | "disqualify" | "split-by-class" | "event-competitors" | "classes-competitors") | "output-table";
2609
2885
  /**
2610
2886
  * @description The object provides metadata about the API.
2611
2887
  * The metadata MAY be used by the clients if needed,
@@ -2639,8 +2915,14 @@ declare interface components {
2639
2915
  } & {
2640
2916
  [key: string]: unknown;
2641
2917
  };
2918
+ /** @description Node types as deterministic as what they stand for. */
2919
+ InheritedNodeType: InheritedNodeType;
2920
+ /** @description Auto-generated discriminant enum variants */
2921
+ InheritedNodeTypeDiscriminants: "format" | "filter-table" | "table-map" | "array-map" | "repeat";
2642
2922
  /** Format: uint16 */
2643
2923
  InputIdx: InputIdx;
2924
+ /** @description The table an InputTableNode outputs. */
2925
+ InputTableLink: InputTableLink;
2644
2926
  InstallExtensionBody: {
2645
2927
  identifier: components["schemas"]["ExtensionIdentifier"];
2646
2928
  kind: components["schemas"]["ExtensionKind"];
@@ -2663,6 +2945,16 @@ declare interface components {
2663
2945
  };
2664
2946
  InvalidLinkedFormatPolicy: "empty-table" | "node-error" | "last-known-table";
2665
2947
  InvalidNodeReason: InvalidNodeReason;
2948
+ /** @description A valid format that an action would make invalid. */
2949
+ InvalidatedFormat: {
2950
+ /** @description Why it would turn invalid: its validation errors after the action. */
2951
+ errors: components["schemas"]["FormatValidationError"][];
2952
+ formatId: components["schemas"]["FormatId"];
2953
+ };
2954
+ /** @description How the finals of a ladder game node get their name or their attributes. */
2955
+ LadderInput: LadderInput;
2956
+ /** @description The finals of a ladder game node. */
2957
+ LadderNode: LadderNode;
2666
2958
  /** @description License information for the exposed API. */
2667
2959
  License: {
2668
2960
  /** @description An [SPDX](https://spdx.org/spdx-specification-21-web-version#h.jxpfx0ykyb60) license expression for the API. The `identifier` field is mutually exclusive of the `url` field. */
@@ -2727,17 +3019,10 @@ declare interface components {
2727
3019
  } | {
2728
3020
  operationId: string;
2729
3021
  });
2730
- /** @description Links the entities a template was created from to its archive entries. */
3022
+ /** @description Links the entities a template was created from to its archive entries, except root formats, which are never linked. */
2731
3023
  LinkToTemplateMutation: {
2732
3024
  wiring: components["schemas"]["Wiring"];
2733
3025
  };
2734
- LoadArchiveQuery: {
2735
- /**
2736
- * @description What to do with a root format contained in the archive.
2737
- * @default as-format
2738
- */
2739
- rootFormat: components["schemas"]["RootFormatImport"];
2740
- };
2741
3026
  LocalExtensionPath: {
2742
3027
  extensionIdent: components["schemas"]["ExtensionIdentifier"];
2743
3028
  };
@@ -2772,6 +3057,11 @@ declare interface components {
2772
3057
  };
2773
3058
  /** Format: uuid */
2774
3059
  LogBatchId: string;
3060
+ /** @description Log entries of a branch, in log order. */
3061
+ LogEntriesDTO: {
3062
+ branch: components["schemas"]["CommonWorkspaceId"];
3063
+ entries: components["schemas"]["LogEntrySmall"][];
3064
+ };
2775
3065
  LogEntry: {
2776
3066
  /** @constant */
2777
3067
  type: "add-game-format";
@@ -2788,6 +3078,22 @@ declare interface components {
2788
3078
  /** @constant */
2789
3079
  type: "update-game-format";
2790
3080
  data: components["schemas"]["UpdateGameFormatMutation"];
3081
+ } | {
3082
+ /** @constant */
3083
+ type: "add-scoring-definition";
3084
+ data: components["schemas"]["AddScoringDefinitionMutation"];
3085
+ } | {
3086
+ /** @constant */
3087
+ type: "rename-scoring-definition";
3088
+ data: components["schemas"]["RenameScoringDefinitionMutation"];
3089
+ } | {
3090
+ /** @constant */
3091
+ type: "delete-scoring-definition";
3092
+ data: components["schemas"]["DeleteScoringDefinitionMutation"];
3093
+ } | {
3094
+ /** @constant */
3095
+ type: "update-scoring-definition";
3096
+ data: components["schemas"]["UpdateScoringDefinitionMutation"];
2791
3097
  } | {
2792
3098
  /** @constant */
2793
3099
  type: "add-class";
@@ -3028,9 +3334,35 @@ declare interface components {
3028
3334
  };
3029
3335
  /**
3030
3336
  * @description What a continuation does with competitors of its parts that are missing from the previous result.
3031
- * If the previous result is empty, nobody is missing: everyone's previous total is 0.
3337
+ *
3338
+ * A continuation of a scoring's result, straight or through nodes that keep the table's metadata, scores like one
3339
+ * scoring node over all parts of the chain: the points of the earlier parts are carried, the discards and tie breaks of
3340
+ * the last node apply to all parts, `part.index` counts through the chain, and the result has the columns of all
3341
+ * parts. Each part's points come from the node that scores it. The direction must be the same along the chain. For
3342
+ * competitors new in a later node, only [Self::ScoredAsAbsent] is exactly like one node. Continuing a table that
3343
+ * doesn't come from a scoring only adds to its `total_points` and keeps its columns.
3344
+ *
3345
+ * If the previous result is empty, nobody is missing.
3032
3346
  */
3033
3347
  MissingFromPrevious: MissingFromPrevious;
3348
+ /** @description Something a format uses that its [FormatRefs] lack. */
3349
+ MissingReference: {
3350
+ /** @constant */
3351
+ type: "format";
3352
+ data: components["schemas"]["FormatId"];
3353
+ } | {
3354
+ /** @constant */
3355
+ type: "game-format";
3356
+ data: components["schemas"]["GameFormatId"];
3357
+ } | {
3358
+ /** @constant */
3359
+ type: "scoring-definition";
3360
+ data: components["schemas"]["ScoringDefinitionId"];
3361
+ } | {
3362
+ /** @constant */
3363
+ type: "input-table-link";
3364
+ data: components["schemas"]["InputTableLink"];
3365
+ };
3034
3366
  /** @enum {string} */
3035
3367
  MultiplexingStrategy: MultiplexingStrategy;
3036
3368
  NameQuery: {
@@ -3039,15 +3371,34 @@ declare interface components {
3039
3371
  NoSupertypeLayerReason: NoSupertypeLayerReason;
3040
3372
  NoSupertypeLayer_for_Type: NoSupertypeLayer<Type>;
3041
3373
  /** @enum {string} */
3042
- NodeCategory: "logic" | "game" | "tables" | "arrays" | "math" | "class" | "input-output" | "invalid" | "other" | "root";
3374
+ NodeCategory: NodeCategory;
3043
3375
  NodeConfigurationError: NodeConfigurationError;
3044
3376
  NodeDocTest: {
3045
3377
  description?: string | null;
3046
3378
  format: components["schemas"]["FormatDTO"];
3379
+ dependencies: components["schemas"]["NodeDocTestDependencies"];
3047
3380
  name?: string | null;
3048
3381
  nodeType: components["schemas"]["NodeType"];
3049
3382
  test: components["schemas"]["FormatTestDefinition"];
3050
3383
  };
3384
+ /** @description What the format of a [NodeDocTest] refers to, by the ids it uses. The test imports them with the format. */
3385
+ NodeDocTestDependencies: {
3386
+ classes: {
3387
+ [key: string]: components["schemas"]["ClassDTO"];
3388
+ };
3389
+ formats: {
3390
+ [key: string]: components["schemas"]["FormatDTO"];
3391
+ };
3392
+ gameFormats: {
3393
+ [key: string]: components["schemas"]["GameFormatDTO"];
3394
+ };
3395
+ /** @description The prototypes of the Class and Format nodes of these, as an event with them has them. */
3396
+ prototypes: components["schemas"]["NodePrototype"][];
3397
+ /** @description The fundamental scorings the Scoring nodes use, by their archive ids, see [FundamentalScoring::archive_id]. */
3398
+ scoringDefinitions: {
3399
+ [key: string]: components["schemas"]["ScoringDefinitionDTO"];
3400
+ };
3401
+ };
3051
3402
  NodeErrorState_for_NodeRuntimeError: {
3052
3403
  /** @constant */
3053
3404
  type: "ok";
@@ -3104,7 +3455,6 @@ declare interface components {
3104
3455
  NodePlacement: {
3105
3456
  group?: components["schemas"]["SimplifiedGroupId"] | null;
3106
3457
  link?: components["schemas"]["NodeLinkId"] | null;
3107
- section: components["schemas"]["SimplifiedSectionId"];
3108
3458
  };
3109
3459
  NodePrototype: {
3110
3460
  /**
@@ -3138,9 +3488,15 @@ declare interface components {
3138
3488
  NodeRuntimeError: {
3139
3489
  /** @constant */
3140
3490
  type: "table-kind-mismatch";
3491
+ } | {
3492
+ /** @constant */
3493
+ type: "scoring-direction-mismatch";
3141
3494
  } | {
3142
3495
  /** @constant */
3143
3496
  type: "table-ownership-mismatch";
3497
+ } | {
3498
+ /** @constant */
3499
+ type: "linked-format-is-invalid";
3144
3500
  } | {
3145
3501
  /** @constant */
3146
3502
  type: "game-not-found";
@@ -3170,6 +3526,9 @@ declare interface components {
3170
3526
  } | {
3171
3527
  /** @constant */
3172
3528
  type: "integer-overflow";
3529
+ } | {
3530
+ /** @constant */
3531
+ type: "invalid-math-operands";
3173
3532
  } | {
3174
3533
  /** @constant */
3175
3534
  type: "record-field-does-not-exist";
@@ -3190,17 +3549,26 @@ declare interface components {
3190
3549
  /** Format: uint */
3191
3550
  expectedRowLength: number;
3192
3551
  /** Format: uint */
3193
- foundRowLength?: number | null;
3552
+ foundRowLength: number;
3194
3553
  /** Format: uint */
3195
3554
  rowIndex: number;
3196
3555
  };
3556
+ } | {
3557
+ /** @constant */
3558
+ type: "invalid-distribution";
3559
+ data: {
3560
+ /** Format: int64 */
3561
+ maxTableSize: number;
3562
+ /** Format: int64 */
3563
+ minTableSize: number;
3564
+ };
3197
3565
  } | {
3198
3566
  /** @constant */
3199
3567
  type: "invalid-row-types";
3200
3568
  data: components["schemas"]["RecordValueTypeValidationError"];
3201
3569
  } | {
3202
3570
  /** @constant */
3203
- type: "disqualification-script-error";
3571
+ type: "script-error";
3204
3572
  data: components["schemas"]["RuntimeErrorKind"];
3205
3573
  };
3206
3574
  /**
@@ -3213,24 +3581,29 @@ declare interface components {
3213
3581
  * Written in notation as `<T>(T) -> (T)` for the identity node.
3214
3582
  */
3215
3583
  NodeSignature_for_Type_and_ParamRef: NodeSignature<Type, ParamRef>;
3584
+ /**
3585
+ * @description What a node does. Its purity says whether its nodes are deterministic: what they output depends only on their inputs,
3586
+ * their node type and the formats and scoring definitions they reference. Deterministic formats (see
3587
+ * [FormatInterface::deterministic]) and pipelines contain only deterministic nodes.
3588
+ *
3589
+ * Top level purity distinction to have that be a type system invariant from the start. Reduces invariants.
3590
+ */
3216
3591
  NodeType: NodeType;
3217
- /** @description Auto-generated discriminant enum variants */
3218
- NodeTypeDiscriminants: ("input" | "output" | "format" | "math" | "game" | "input-table" | "portal" | "class" | "disqualify" | "group" | "string-concat" | "string-format" | "sort-node" | "constant" | "merge-tables" | "divide-table" | "distribute-table" | "split-table" | "concat" | "remove-places" | "table-map" | "length" | "boolean-op" | "record-field" | "add-record-fields" | "fallback" | "gt-row" | "filter-gt" | "comparison" | "comment" | "ternary" | "separate-row" | "update-row" | "array-map" | "create-array" | "create-table" | "array-access" | "unpack-array" | "promotion-relegation" | "age-at" | "split-by-class" | "empty-record" | "event-competitors" | "add-columns" | "matrix-transpose" | "simple-scoring" | "classes-competitors") | "output-table" | "invalid";
3219
- NodeVariantDoc: {
3220
- description?: string | null;
3221
- /** @default other */
3222
- category: components["schemas"]["NodeCategory"];
3223
- /** @description If the node has `children_spec` set to `Closure`, this documents that closure */
3224
- closureDocs?: components["schemas"]["NodeVariantDoc"] | null;
3225
- inputVargsToArrayArrayLabel: components["schemas"]["PortLabelPart"][];
3226
- inputs: components["schemas"]["PortsDoc"];
3227
- /** @description The label for the new output when vargs_to_array is enabled. */
3228
- outputVargsToArrayArrayLabel: components["schemas"]["PortLabelPart"][];
3229
- /** @description The label for the new input when vargs_to_array is enabled. */
3230
- outputVargsToArrayCountLabel: components["schemas"]["PortLabelPart"][];
3231
- outputs: components["schemas"]["PortsDoc"];
3232
- variantLabel: string;
3592
+ /** @description The kind of a [NodeType] without its data: `{ "purity": "pure", "type": "math" }`. */
3593
+ NodeTypeDiscriminants: {
3594
+ type: components["schemas"]["PureNodeTypeDiscriminants"];
3595
+ /** @constant */
3596
+ purity: "pure";
3597
+ } | {
3598
+ type: components["schemas"]["ImpureNodeTypeDiscriminants"];
3599
+ /** @constant */
3600
+ purity: "impure";
3601
+ } | {
3602
+ type: components["schemas"]["InheritedNodeTypeDiscriminants"];
3603
+ /** @constant */
3604
+ purity: "inherited";
3233
3605
  };
3606
+ NodeVariantDoc: NodeVariantDoc;
3234
3607
  NodeVariantPrototype: {
3235
3608
  childrenSpec: components["schemas"]["ChildrenSpec"];
3236
3609
  /**
@@ -3241,8 +3614,6 @@ declare interface components {
3241
3614
  /** Format: uint32 */
3242
3615
  defaultOutputVargCount: number;
3243
3616
  includeInSearch: boolean;
3244
- /** @description These outputs emit warnings when not used */
3245
- mustUseOutputs: components["schemas"]["OutputIdx"][];
3246
3617
  /** @description Uniquely identifies a node variant */
3247
3618
  nodeType: components["schemas"]["NodeType"];
3248
3619
  /** @description Type of settings excluding the variant property. */
@@ -3864,49 +4235,20 @@ declare interface components {
3864
4235
  Paths: {
3865
4236
  [key: string]: components["schemas"]["ReferenceOr_for_PathItem"];
3866
4237
  };
3867
- PortDoc: {
3868
- description?: string | null;
3869
- defaultValue?: components["schemas"]["Value_for_Primitive"] | null;
3870
- /** @description CustomControls only get used when enabled with this property. */
3871
- enabledCustomControls: components["schemas"]["CustomControl"][];
3872
- /** @description Each port label part gets turned into a string and then concatenated to retrieve the full label. */
3873
- label: components["schemas"]["PortLabelPart"][];
3874
- /** @description Finite value options representing the value will get labeled with the string */
3875
- valueLabels: [
3876
- components["schemas"]["Value_for_Primitive"],
3877
- string
3878
- ][];
3879
- };
3880
- PortLabelPart: {
3881
- /** @constant */
3882
- type: "idx-decimal";
3883
- /** Format: int64 */
3884
- data: number;
3885
- } | {
3886
- /** @constant */
3887
- type: "idx-alphabetic";
3888
- /** Format: int64 */
3889
- data: number;
3890
- } | {
3891
- /** @constant */
3892
- type: "idx-ordinal";
3893
- /** Format: int64 */
3894
- data: number;
3895
- } | {
3896
- /** @constant */
3897
- type: "string";
3898
- data: string;
3899
- };
4238
+ PortDoc: PortDoc;
4239
+ PortLabelPart: PortLabelPart;
3900
4240
  /** @description A list of port types, optionally with a variadic type (`...T`). */
3901
4241
  PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type: PortTypes<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
3902
4242
  /** @description A list of port types, optionally with a variadic type (`...T`). */
3903
4243
  PortTypes_for_Type_and_ParamRef: PortTypes<Type, ParamRef>;
3904
- PortsDoc: {
3905
- ports: components["schemas"]["PortDoc"][];
3906
- varg?: components["schemas"]["PortDoc"] | null;
3907
- };
4244
+ PortsDoc: PortsDoc;
3908
4245
  PostFormatQuery: {
3909
4246
  force: boolean;
4247
+ /**
4248
+ * @description Never changes afterwards.
4249
+ * @default normal
4250
+ */
4251
+ kind: components["schemas"]["FormatKind"];
3910
4252
  };
3911
4253
  PostRandomCompetitorsQuery: {
3912
4254
  count: components["schemas"]["LimitedInt_for_1_and_500"];
@@ -3918,6 +4260,15 @@ declare interface components {
3918
4260
  };
3919
4261
  /** @description Crate local version of [std::convert::Infallible] */
3920
4262
  Primitive: Primitive;
4263
+ /**
4264
+ * @description The pre or post processing steps of a game format.
4265
+ * @enum {string}
4266
+ */
4267
+ ProcessingStage: ProcessingStage;
4268
+ /** @description Deterministic node types. Input, output, group, portal and comment nodes only route values. */
4269
+ PureNodeType: PureNodeType;
4270
+ /** @description Auto-generated discriminant enum variants */
4271
+ PureNodeTypeDiscriminants: ("input" | "output" | "group" | "portal" | "comment" | "math" | "string-concat" | "string-format" | "sort-table" | "constant" | "merge-tables" | "divide-table" | "distribute-table" | "split-table" | "concat-tables" | "remove-places" | "transfer-history" | "length" | "boolean-op" | "record-field" | "record" | "record-access" | "fallback" | "comparison" | "ternary" | "separate-row" | "update-row" | "create-array" | "create-table" | "array-access" | "unpack-array" | "promotion-relegation" | "age-at" | "add-columns" | "matrix-transpose" | "scoring" | "script-closure") | "invalid" | "zip";
3921
4272
  PushTableRowMutationsMutation: {
3922
4273
  /**
3923
4274
  * @description Challenge for a client to prevent accidentally
@@ -3938,6 +4289,10 @@ declare interface components {
3938
4289
  classId: components["schemas"]["ClassId"];
3939
4290
  seed: components["schemas"]["Seed"];
3940
4291
  };
4292
+ /** @description Reads `keys` of a record, see [record_access_node_sig]. */
4293
+ RecordAccessNode: RecordAccessNode;
4294
+ /** @description What a record node adds its fields to. */
4295
+ RecordBase: RecordBase;
3941
4296
  /** @enum {string} */
3942
4297
  RecordFieldOp: RecordFieldOp;
3943
4298
  RecordMakeValidMutation: RecordMakeValidMutation;
@@ -3955,6 +4310,8 @@ declare interface components {
3955
4310
  /** @description The mutations that were applied to make the record valid. */
3956
4311
  mutations: components["schemas"]["RecordMakeValidMutation"][];
3957
4312
  };
4313
+ /** @description The record node: a record with `fields`, see [record_node_sig]. */
4314
+ RecordNode: RecordNode;
3958
4315
  /** @description RecordTypes should **only** be manipulated though this helper to have a single source of truth for the structure. */
3959
4316
  RecordTypeHelper_for_ParamRef: RecordTypeHelper<ParamRef>;
3960
4317
  RecordTypeWithDefaults: RecordTypeWithDefaults;
@@ -4179,6 +4536,9 @@ declare interface components {
4179
4536
  */
4180
4537
  force: boolean;
4181
4538
  };
4539
+ RenameBranchBody: {
4540
+ name: string;
4541
+ };
4182
4542
  RenameClassMutation: {
4183
4543
  classId: components["schemas"]["ClassId"];
4184
4544
  name: string;
@@ -4191,6 +4551,12 @@ declare interface components {
4191
4551
  gameFormatId: components["schemas"]["GameFormatId"];
4192
4552
  name: string;
4193
4553
  };
4554
+ RenameScoringDefinitionMutation: {
4555
+ name: string;
4556
+ scoringDefinitionId: components["schemas"]["ScoringDefinitionId"];
4557
+ };
4558
+ /** @description What a repeat node runs its closure for. */
4559
+ RepeatOver: RepeatOver;
4194
4560
  ReplicateWorkspaceQuery: {
4195
4561
  logId: components["schemas"]["LogId"];
4196
4562
  name: string;
@@ -4315,8 +4681,6 @@ declare interface components {
4315
4681
  } & {
4316
4682
  [key: string]: components["schemas"]["ReferenceOr_for_Response"];
4317
4683
  };
4318
- /** @description What happens to a format of the archive that was the root format of the exported event. */
4319
- RootFormatImport: "as-format" | "overwrite" | "ignore";
4320
4684
  RootFormatResponse: {
4321
4685
  rootFormat: components["schemas"]["FullFormatDAO"];
4322
4686
  /** @description None if the format was never executed */
@@ -4392,11 +4756,99 @@ declare interface components {
4392
4756
  /** @description Additional external documentation for this schema. */
4393
4757
  externalDocs?: components["schemas"]["ExternalDocumentation"] | null;
4394
4758
  };
4395
- /** @description Only `[a-z0-9-]`, at least one character. */
4396
- SecretName: string;
4397
- SecretPath: {
4398
- extensionIdent: components["schemas"]["ExtensionIdentifier"];
4399
- name: components["schemas"]["SecretName"];
4759
+ /** @description A way to score a part, with parameters a node sets. An entity of an event, like a game format. */
4760
+ ScoringDefinition: ScoringDefinition;
4761
+ /** @description A scoring definition of an event. Can be stored invalid, like a format: then every format using it is invalid. */
4762
+ ScoringDefinitionDAO: {
4763
+ customData: {
4764
+ [key: string]: string;
4765
+ };
4766
+ definition: components["schemas"]["ScoringDefinition"];
4767
+ /** @description [ScoringDefinition::validate], empty for a valid definition. */
4768
+ errors: components["schemas"]["ScoringScriptError"][];
4769
+ eventId: components["schemas"]["EventId"];
4770
+ id: components["schemas"]["ScoringDefinitionId"];
4771
+ /** Format: uuid */
4772
+ templateOrigin?: string | null;
4773
+ valid: components["schemas"]["FormatValidity"];
4774
+ };
4775
+ /** @description A way to score a part, with parameters a node sets. An entity of an event, like a game format. */
4776
+ ScoringDefinitionDTO: {
4777
+ description: string;
4778
+ customData?: {
4779
+ [key: string]: string;
4780
+ };
4781
+ direction: components["schemas"]["ScoringDirection"];
4782
+ name: string;
4783
+ /** @description The documentation of each parameter, by name, like the ports of a node. */
4784
+ parameterDocs: {
4785
+ [key: string]: components["schemas"]["PortDoc"];
4786
+ };
4787
+ /** @description The script sees their values as `params`. Every parameter has a default. */
4788
+ parameters: components["schemas"]["RecordTypeWithDefaults"];
4789
+ /** @description The columns the rows of every part must have, the script sees them in `row.attributes`. */
4790
+ requiredColumns: components["schemas"]["RecordTypeHelper_for_ParamRef"];
4791
+ /** @description A graphite script, typechecked like [ScoringPoints::Custom]'s with `params` in addition. */
4792
+ script: string;
4793
+ /** @description Examples of what the definition scores, see [Self::run_test]. */
4794
+ tests: components["schemas"]["ScoringTest"][];
4795
+ };
4796
+ /**
4797
+ * Format: uuid
4798
+ * @description Identifies a scoring definition of an event. Random ([Self::new_random]) from the endpoint, derived for the
4799
+ * fundamental scorings of a new event, or derived by `ImportArchiveMutation`. Deserializing one only yields a
4800
+ * reference to an existing definition; it does not check that it exists.
4801
+ */
4802
+ ScoringDefinitionId: ScoringDefinitionId;
4803
+ ScoringDefinitionPathVariables_for_CommonWorkspaceId: {
4804
+ eventId: components["schemas"]["EventId"];
4805
+ scoringDefinitionId: components["schemas"]["ScoringDefinitionId"];
4806
+ workspaceId: components["schemas"]["CommonWorkspaceId"];
4807
+ };
4808
+ ScoringDirection: ScoringDirection;
4809
+ /**
4810
+ * @description Scores competitors over several parts, e.g. the races of a series.
4811
+ *
4812
+ * ```text
4813
+ * <R0 extends {}, ...>(Table<R0, Sorted>, ...) -> (Table<{total_points: P, <part name>: P, ...}, Sorted>)
4814
+ * ```
4815
+ *
4816
+ * One input per part and one output table. Competitors are the union of all parts. The script of `points` computes
4817
+ * the points of every competitor in every part. `P` is `Integer` if the script returns integers whatever the
4818
+ * columns of the parts, else `Integer | Float`. If the points are `null` for a part, the competitor is left out of
4819
+ * the result. The total is the sum of the points, without the worst `discards`. The output is ranked by the total in
4820
+ * the direction of `points`, ties are broken by the `tie_breaks` in order, and competitors still tied share the
4821
+ * place.
4822
+ *
4823
+ * With `continues_previous`, the first input is the result of a previous scoring,
4824
+ * `Table<{total_points: Integer | Float}, Sorted>`, and the totals add this node's parts to the previous
4825
+ * `total_points`. The previous result's other columns are carried over, those named like a part are replaced. Ties
4826
+ * keep the previous result's order. Discards and tie breaks only see this node's parts.
4827
+ */
4828
+ ScoringNode: ScoringNode;
4829
+ /** @description One scored part, e.g. a single race of a series. */
4830
+ ScoringPart: ScoringPart;
4831
+ /** @description The points of a scoring node. */
4832
+ ScoringPoints: ScoringPoints;
4833
+ /** @description The script of a scoring node does not parse or typecheck. */
4834
+ ScoringScriptError: ScoringScriptError;
4835
+ /** @description Parts scored with values of the parameters, and the result they are expected to score to. */
4836
+ ScoringTest: ScoringTest;
4837
+ ScoringTestPart: ScoringTestPart;
4838
+ /**
4839
+ * @description Outputs a deterministic closure (scripts are) with `signature`. Calling it runs `script` with each input bound to the
4840
+ * variable of its name, and what the script evaluates to is the closure's output.
4841
+ *
4842
+ * ```text
4843
+ * () -> (<signature>)
4844
+ * ```
4845
+ */
4846
+ ScriptClosureNode: ScriptClosureNode;
4847
+ /** @description Only `[a-z0-9-]`, at least one character. */
4848
+ SecretName: string;
4849
+ SecretPath: {
4850
+ extensionIdent: components["schemas"]["ExtensionIdentifier"];
4851
+ name: components["schemas"]["SecretName"];
4400
4852
  };
4401
4853
  /** @description At most 16 KiB. Its [Debug] does not show the value. */
4402
4854
  SecretValue: string;
@@ -4544,29 +4996,6 @@ declare interface components {
4544
4996
  SetFormatsFormatGroupQuery: {
4545
4997
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
4546
4998
  };
4547
- /**
4548
- * @description Place 1 = 1 point, Place 2 = 2 points, etc.
4549
- * On tie, whoever won the part with the highest priority wins.
4550
- * If still tied, the next lower priority part is considered etc.
4551
- *
4552
- * ```text
4553
- * (Table<{}, Sorted>, ...) -> (Table<{total_points: Integer, <part name>: Integer, ...}, Sorted>)
4554
- * ```
4555
- *
4556
- * One input per part and one output table, sorted by ascending total points.
4557
- * Competitors are the union of all parts: a competitor without a place in a part
4558
- * (missing from the table of that part, or in it without a place) scores one point
4559
- * more than that part has rows, so not finishing a part is always worse than
4560
- * finishing it last. An empty part has not taken place yet and scores 0 for everyone.
4561
- *
4562
- * With `continues_previous`, the first input is the result of a previous scoring,
4563
- * `Table<{total_points: Integer}, Sorted>`, and the totals add this node's parts to the previous `total_points`.
4564
- * The previous result's other columns are carried over, those named like a part are replaced. Ties keep the
4565
- * previous result's order.
4566
- */
4567
- SimpleScoringNode: SimpleScoringNode;
4568
- /** @description One scored part, e.g. a single race of a series. */
4569
- SimpleScoringPart: SimpleScoringPart;
4570
4999
  SimplifiedGroup: {
4571
5000
  id: components["schemas"]["SimplifiedGroupId"];
4572
5001
  name: string;
@@ -4576,25 +5005,19 @@ declare interface components {
4576
5005
  * @description Unique per format, not only per section.
4577
5006
  */
4578
5007
  SimplifiedGroupId: SimplifiedGroupId;
4579
- SimplifiedSection: {
4580
- /** @description In display order. */
4581
- groups: components["schemas"]["SimplifiedGroup"][];
4582
- id: components["schemas"]["SimplifiedSectionId"];
4583
- name: string;
4584
- };
4585
- /** Format: uuid */
4586
- SimplifiedSectionId: SimplifiedSectionId;
4587
5008
  /**
4588
5009
  * @description How the simplified view arranges the format's nodes. Only the simplified view interprets it: the backend stores it,
4589
5010
  * keeps its references consistent ([Self::repaired]) and carries it over to copies with new node ids.
4590
5011
  */
4591
5012
  SimplifiedView: {
5013
+ /** @description In display order. */
5014
+ groups: components["schemas"]["SimplifiedGroup"][];
4592
5015
  nodes: {
4593
5016
  [key: string]: components["schemas"]["NodePlacement"];
4594
5017
  };
4595
- /** @description In display order. */
4596
- sections: components["schemas"]["SimplifiedSection"][];
4597
5018
  };
5019
+ /** @description Where the rows of the competitors sitting out go. They keep no columns. */
5020
+ SitOutHandling: SitOutHandling;
4598
5021
  SnapshotMultipart: {
4599
5022
  /** Format: binary */
4600
5023
  file: Blob;
@@ -4644,14 +5067,21 @@ declare interface components {
4644
5067
  *
4645
5068
  * for `Static { split_count }`:
4646
5069
  * ```text
4647
- * <C extends {}>(Table<C, Sorted>, Integer * split_count) -> (Table<C, Sorted> * (split_count + 1))
5070
+ * <C extends {}>(table: Table<C, Sorted>, cut_1: Integer, …, cut_<split_count>: Integer)
5071
+ * -> (part_1: Table<C, Sorted>, …, part_<split_count + 1>: Table<C, Sorted>)
4648
5072
  * ```
4649
5073
  * for `Dynamic`:
4650
5074
  * ```text
4651
- * <C extends {}>(Table<C, Sorted>, Array<Integer>) -> (Array<Table<C, Sorted>>)
5075
+ * <C extends {}>(table: Table<C, Sorted>, cuts: Array<Integer>) -> (parts: Array<Table<C, Sorted>>)
4652
5076
  * ```
4653
5077
  */
4654
5078
  SplitTableNode: SplitTableNode;
5079
+ /**
5080
+ * Format: uuid
5081
+ * @description Identifies a sport, the content that the root server serves. Unknown ids are not refused: the event keeps
5082
+ * them, clients fall back to the generic sport.
5083
+ */
5084
+ SportId: string;
4655
5085
  /** @description A standalone table of the user. Its kind is always [TableKind::Other], its state is set like the state of any table. */
4656
5086
  StandaloneTableDTO: {
4657
5087
  columnTypes: components["schemas"]["RecordTypeWithDefaults"];
@@ -4688,24 +5118,26 @@ declare interface components {
4688
5118
  */
4689
5119
  gameDepth: number;
4690
5120
  id: components["schemas"]["TableId"];
4691
- /** @description The owner of the tables data (items, attributes and state) */
4692
- layerOneOwner: components["schemas"]["TableOwner"];
5121
+ /** @description Empty for the entry and result tables of game nodes: clients name game tables by their [Self::table_kind]. */
4693
5122
  name: string;
5123
+ /** @description Who created the table. */
4694
5124
  owner: components["schemas"]["ContentOwner"];
5125
+ ownership: components["schemas"]["TableOwnership"];
4695
5126
  state: components["schemas"]["ContentState"];
4696
- /** @description Set by nodes. */
4697
- stateLayerOne: components["schemas"]["TableState"];
4698
- /** @description Overwrites layer one if Some */
4699
- stateLayerTwo?: components["schemas"]["TableState"] | null;
5127
+ /** @description Set by nodes only. */
5128
+ stateNodes?: components["schemas"]["TableState"] | null;
5129
+ /** @description Set by users only, takes precedence over [Self::state_nodes]. See [Self::resolve_state]. */
5130
+ stateUser?: components["schemas"]["TableState"] | null;
4700
5131
  tableKind: components["schemas"]["TableKind"];
4701
5132
  variant: components["schemas"]["TableVariant"];
4702
5133
  };
4703
5134
  TableDTO: {
4704
5135
  name: string;
4705
- /** @description If Some, sets either layer one or layer two state depending on who issues the request. */
5136
+ /** @description The [TableDAO::state_user]. */
4706
5137
  state?: components["schemas"]["TableState"] | null;
4707
5138
  tableKind: components["schemas"]["TableKind"];
4708
5139
  };
5140
+ TableFilter: TableFilter;
4709
5141
  /**
4710
5142
  * Format: uuid
4711
5143
  * @description Identifies a table, the primary key of `tables`. Comes from one of:
@@ -4766,8 +5198,11 @@ declare interface components {
4766
5198
  /** @description The test id of the node reading the table. */
4767
5199
  nodeId: components["schemas"]["FormatNodeTestId"];
4768
5200
  };
4769
- /** @enum {string} */
4770
- TableOwner: "nodes" | "user";
5201
+ /**
5202
+ * @description Who writes the rows of a table. Independent of who created it ([ContentOwner]): nodes create user owned tables too,
5203
+ * e.g. the result tables of their games, but a table the user created is always user owned.
5204
+ */
5205
+ TableOwnership: "node-owned" | "user-owned";
4771
5206
  TablePathVariables_for_CommonWorkspaceId: {
4772
5207
  eventId: components["schemas"]["EventId"];
4773
5208
  tableId: components["schemas"]["TableId"];
@@ -4821,6 +5256,8 @@ declare interface components {
4821
5256
  } & {
4822
5257
  [key: string]: unknown;
4823
5258
  };
5259
+ /** @description A set of tags, each trimmed and not empty. Deserializing normalizes any list of strings into this. */
5260
+ Tags: string[];
4824
5261
  TargetDTO: {
4825
5262
  acknowledged: components["schemas"]["LogHead"];
4826
5263
  backendUrl: string;
@@ -4938,7 +5375,13 @@ declare interface components {
4938
5375
  /** @constant */
4939
5376
  type: "format-group";
4940
5377
  id: components["schemas"]["FormatGroupId"];
5378
+ } | {
5379
+ /** @constant */
5380
+ type: "scoring-definition";
5381
+ id: components["schemas"]["ScoringDefinitionId"];
4941
5382
  };
5383
+ /** @description A rule deciding between competitors with the same total. */
5384
+ TieBreak: TieBreak;
4942
5385
  /**
4943
5386
  * @description The first value are the seconds of the delta, the second are nanoseconds.
4944
5387
  * the nanoseconds are always 0 <= nanos < (1000000)
@@ -4947,6 +5390,11 @@ declare interface components {
4947
5390
  number,
4948
5391
  number
4949
5392
  ];
5393
+ /** @description Query of every endpoint that reads a running workspace. */
5394
+ TimeMachineQuery: {
5395
+ /** @description Shows the workspace as it was right after this log entry, read-only. `0` is the empty workspace. */
5396
+ atEntry?: components["schemas"]["LogId"] | null;
5397
+ };
4950
5398
  /** @description One way a row got to where it is. */
4951
5399
  Trail: Trail;
4952
5400
  Type: Type;
@@ -5072,6 +5520,11 @@ declare interface components {
5072
5520
  test: components["schemas"]["FormatTestDefinition"];
5073
5521
  };
5074
5522
  UpdateGameFormatMutation: {
5523
+ /**
5524
+ * @description If true, saves the game format although its settings don't validate, invalidating the formats using it and
5525
+ * with them their games. Implies `invalidate_formats`.
5526
+ */
5527
+ force?: boolean;
5075
5528
  gameFormat: components["schemas"]["GameFormatDTO"];
5076
5529
  id: components["schemas"]["GameFormatId"];
5077
5530
  /** @description If true, will proceed even if that invalidates formats. */
@@ -5082,6 +5535,12 @@ declare interface components {
5082
5535
  modifyRows: boolean;
5083
5536
  };
5084
5537
  UpdateGameFormatQuery: {
5538
+ /**
5539
+ * @description If true, saves the game format although its settings don't validate, invalidating the formats using it and
5540
+ * with them their games. Implies `invalidateFormats`.
5541
+ * @default false
5542
+ */
5543
+ force: boolean;
5085
5544
  /**
5086
5545
  * @description If true, will proceed even if that invalidates formats.
5087
5546
  * @default false
@@ -5102,8 +5561,38 @@ declare interface components {
5102
5561
  game: components["schemas"]["GameDTO"];
5103
5562
  id: components["schemas"]["GameId"];
5104
5563
  };
5564
+ /**
5565
+ * @description Stores the definition even if it is invalid, with its errors. The formats using it are revalidated, the parameters
5566
+ * of their scoring nodes made valid for the new parameters with the defaults.
5567
+ */
5568
+ UpdateScoringDefinitionMutation: {
5569
+ id: components["schemas"]["ScoringDefinitionId"];
5570
+ /** @description If true, will proceed even if that invalidates formats, like an invalid definition does. */
5571
+ invalidateFormats: boolean;
5572
+ /** @description If true, will reset now incompatible parameters of the scoring nodes to their defaults. */
5573
+ modifyUsages: boolean;
5574
+ scoringDefinition: components["schemas"]["ScoringDefinitionDTO"];
5575
+ };
5576
+ UpdateScoringDefinitionQuery: {
5577
+ /**
5578
+ * @description If true, will proceed even if that invalidates formats.
5579
+ * @default false
5580
+ */
5581
+ invalidateFormats: boolean;
5582
+ /**
5583
+ * @description If true, will reset now incompatible parameters of the scoring nodes to their defaults.
5584
+ * @default false
5585
+ */
5586
+ modifyUsages: boolean;
5587
+ };
5105
5588
  /** @description Renames a standalone table of the user and sets its column types. */
5106
5589
  UpdateStandaloneTableMutation: {
5590
+ /**
5591
+ * @description Lets changed column types invalidate the formats whose InputTableNodes link the table. Without it, the update
5592
+ * fails if that would make any of them invalid.
5593
+ * @default false
5594
+ */
5595
+ invalidateFormats: boolean;
5107
5596
  /**
5108
5597
  * @description Makes the rows and row mutations valid for changed column types, see [RecordTypeWithDefaults::make_valid].
5109
5598
  * Without it, the update fails if that would change any of them.
@@ -5113,6 +5602,12 @@ declare interface components {
5113
5602
  tableId: components["schemas"]["TableId"];
5114
5603
  };
5115
5604
  UpdateStandaloneTableQuery: {
5605
+ /**
5606
+ * @description If true, changed column types may make the formats invalid whose input table nodes link the table. Otherwise
5607
+ * the update fails with `format-revalidation` naming them.
5608
+ * @default false
5609
+ */
5610
+ invalidateFormats: boolean;
5116
5611
  /**
5117
5612
  * @description If true, makes the rows and row mutations valid for changed column types (missing or mistyped columns get the
5118
5613
  * column's default). Otherwise the update fails with `change-would-modify-rows` if that would change any of them.
@@ -5155,6 +5650,8 @@ declare interface components {
5155
5650
  * @description Changes in here are breaking changes for logs
5156
5651
  */
5157
5652
  Value_for_SerializableNonPrimitiveValue: Value<SerializableNonPrimitiveValue>;
5653
+ /** @description A name a script can refer to as a variable: an identifier that isn't a keyword. */
5654
+ VariableName: VariableName;
5158
5655
  /**
5159
5656
  * @description The ids inside an archive (in its format DTO and here) are archive-local join keys, not ids of a workspace: each
5160
5657
  * maps to the [Archive::uuid] of the dependency it refers to. Importing gives the entities new ids.
@@ -5172,6 +5669,9 @@ declare interface components {
5172
5669
  gameFormats: {
5173
5670
  [key: string]: string;
5174
5671
  };
5672
+ scoringDefinitions?: {
5673
+ [key: string]: string;
5674
+ };
5175
5675
  scriptedNodes: {
5176
5676
  [key: string]: string;
5177
5677
  };
@@ -5200,6 +5700,8 @@ declare interface components {
5200
5700
  /** @description Anything but normal makes the workspace read-only. */
5201
5701
  state: components["schemas"]["WorkspaceState"];
5202
5702
  };
5703
+ /** @description What a zip node does with lists of different lengths. */
5704
+ ZipLengths: ZipLengths;
5203
5705
  };
5204
5706
  responses: never;
5205
5707
  parameters: never;
@@ -5262,6 +5764,27 @@ paginatedRowModel: (table: Table_2<any, any>) => () => RowModel<any, any>;
5262
5764
  columnVisibilityFeature: TableFeature;
5263
5765
  }, TData>;
5264
5766
 
5767
+ /**
5768
+ * A page of the create-event assistant. The assistant shows it after its own steps, once per contribution of the
5769
+ * extensions installed on the event, in install order. The extension stores what is entered itself, saving every change
5770
+ * right away like the rest of the assistant; the assistant only keeps the page's {@link CreateEventAssistantProgress},
5771
+ * shared by everyone working on the event.
5772
+ */
5773
+ export declare interface CreateEventAssistantContribution {
5774
+ title: Record<Locales, string>;
5775
+ Component: FC<CreateEventAssistantProps>;
5776
+ }
5777
+
5778
+ /** Whether the user can go on from the page to the next step of the assistant (`done`) or not yet (`incomplete`). */
5779
+ export declare type CreateEventAssistantProgress = 'incomplete' | 'done';
5780
+
5781
+ export declare type CreateEventAssistantProps = EventPath & {
5782
+ progress: CreateEventAssistantProgress;
5783
+ onProgressChange: (progress: CreateEventAssistantProgress) => void;
5784
+ };
5785
+
5786
+ declare type CustomControl = "sort-criterion";
5787
+
5265
5788
  export declare const DateTimeInput: FC<DateTimeInputProps>;
5266
5789
 
5267
5790
  export declare interface DateTimeInputProps {
@@ -5294,22 +5817,45 @@ declare interface DetailedSupertypeDiagnostics<T> {
5294
5817
  export declare interface DialogButton<T> {
5295
5818
  value: T;
5296
5819
  label: ReactNode;
5297
- theme?: 'primary' | 'default' | 'danger';
5820
+ /** Default: 'secondary'. */
5821
+ theme?: AppButtonType;
5822
+ }
5823
+
5824
+ /** What a dialog says: a short question or statement, the explanation of it and how serious it is. */
5825
+ export declare interface DialogMessage {
5826
+ title: ReactNode;
5827
+ body?: ReactNode;
5828
+ /** Default: 'plain', without an icon. 'danger' is for what destroys data or has failed. */
5829
+ tone?: DialogTone;
5298
5830
  }
5299
5831
 
5300
- declare interface DialogOptions {
5832
+ export declare interface DialogOptions {
5301
5833
  /** Shows it in a window (see `ModalConfig.window`), for content with links that the user may follow first. */
5302
- window?: {
5303
- title: ReactNode;
5304
- };
5834
+ window?: WindowOptions;
5305
5835
  }
5306
5836
 
5837
+ export declare type DialogTone = 'plain' | 'info' | 'warning' | 'danger';
5838
+
5307
5839
  /**
5308
5840
  * Greys out a disabled competitor wherever it is shown. Nodes don't spawn disabled competitors, but they can still be
5309
5841
  * in classes and tables.
5310
5842
  */
5311
5843
  export declare function disabledCompetitorClassName(competitor: Pick<CompetitorDAO, 'enabled'> | undefined): string | undefined;
5312
5844
 
5845
+ /**
5846
+ * A competitor's worst results that don't count towards their total.
5847
+ */
5848
+ declare interface Discards {
5849
+ /**
5850
+ * How many results are discarded.
5851
+ */
5852
+ count: number;
5853
+ /**
5854
+ * A result whose `dqs` (see [script_type_context]) hold one of these keys is never discarded.
5855
+ */
5856
+ keep: DqKey[];
5857
+ }
5858
+
5313
5859
  /**
5314
5860
  * Disqualifies every row of the table it receives, throwing them all under `key` so that a
5315
5861
  * [`GroupNode`](super::group_node::GroupNode) further up the graph can collect them.
@@ -5318,39 +5864,42 @@ declare interface DisqualifyNode {
5318
5864
  key: DqKey;
5319
5865
  }
5320
5866
 
5321
- /**
5322
- * What a node does by default with a disqualification it can throw.
5323
- */
5324
- declare type DqDefaultStrategy = "throw" | "output-placed" | "output-unplaced" | "append-placed" | "append-unplaced";
5325
-
5326
5867
  /** A caught disqualification. The strategy decides how multiple caught tables of the key get merged. */
5327
5868
  declare interface DqEntry {
5328
5869
  key: DqKey_2;
5329
5870
  mergeStrategy: MultiplexingStrategy_2;
5871
+ /** Whether the caught competitors keep their places. Disqualified competitors are usually unplaced. */
5872
+ placed: boolean;
5330
5873
  }
5331
5874
 
5332
- declare type DqKey = string;
5875
+ export declare type DqKey = string;
5333
5876
 
5334
5877
  declare type DqKey_2 = components['schemas']['DqKey'];
5335
5878
 
5879
+ export declare type DqKind = { type: "disqualified" };
5880
+
5881
+ export declare interface DqRecord {
5882
+ key: DqKey;
5883
+ at: DqSource;
5884
+ kind: DqKind;
5885
+ }
5886
+
5336
5887
  /**
5337
- * What a format or game format says about one of its disqualification kinds.
5888
+ * What a game format says about one of its disqualification kinds.
5338
5889
  */
5339
5890
  declare interface DqSettings {
5340
5891
  description: string;
5341
5892
  /**
5342
- * Initialises `catch_dqs` of new nodes.
5893
+ * What the game nodes of the game format do with the disqualification by default. Each game node can override
5894
+ * it, see `GameNodeDTO::catches`.
5343
5895
  */
5344
- defaultStrategy: DqDefaultStrategy;
5896
+ strategy: GameDqHandling;
5345
5897
  }
5346
5898
 
5347
5899
  /**
5348
- * Decides how caught disqualifications are surfaced.
5900
+ * Where a competitor got disqualified.
5349
5901
  */
5350
- declare type DqStrategy = "output-placed" | "output-unplaced" | "append-placed" | "append-unplaced";
5351
-
5352
- /** How a game or format node surfaces a disqualification it catches. */
5353
- declare type DqStrategy_2 = components['schemas']['DqStrategy'];
5902
+ export declare type DqSource = { type: "game"; game: string; ladder: boolean; formatTags: string[] } | { type: "node"; node: string };
5354
5903
 
5355
5904
  export declare type DraggableChildProps = React_2.HTMLAttributes<HTMLElement> & React_2.RefAttributes<HTMLElement>;
5356
5905
 
@@ -5374,7 +5923,9 @@ export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T,
5374
5923
  */
5375
5924
  declare type ErasedScopedTypeRef<T> = { type: "Param"; data: ParamRef } | { type: "ScopedExpr"; data: { expr: TypeExpr<T, ErasedScopedTypeRef<T>> } };
5376
5925
 
5377
- declare type EventCompetitorsNode = CompetitorType_2;
5926
+ declare interface EventCompetitorsNode {
5927
+ competitorType: CompetitorType_2;
5928
+ }
5378
5929
 
5379
5930
  export declare const eventFoldersByEventQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<ContentInEventFolderDTO[]>;
5380
5931
 
@@ -5395,6 +5946,10 @@ export declare class ExpressionInContextWasm {
5395
5946
  private constructor();
5396
5947
  free(): void;
5397
5948
  [Symbol.dispose](): void;
5949
+ /**
5950
+ * The type the expression evaluates to.
5951
+ */
5952
+ returnType(): TypeExpr<Type, ParamRef>;
5398
5953
  /**
5399
5954
  * Runs the expression with the provided primitive values.
5400
5955
  * @throws {ExpressionInContextError} if the expression is not valid or
@@ -5419,6 +5974,7 @@ export declare function extensionContribution<K extends keyof ExtensionContribut
5419
5974
 
5420
5975
  /** Props the host passes when rendering an inject at each slot. */
5421
5976
  export declare type ExtensionContributions = {
5977
+ 'create-event-assistant': CreateEventAssistantContribution;
5422
5978
  'game-format-page-bottom': GameFormatPageContribution;
5423
5979
  'game-page': GamePageContribution;
5424
5980
  'table-drop': TableDropContribution;
@@ -5488,6 +6044,15 @@ export declare interface ExtensionSidebarContribution {
5488
6044
 
5489
6045
  export declare type ExtensionSidebarProps = EventPath;
5490
6046
 
6047
+ /**
6048
+ * A tutorial of the calling extension: its `id` only has to be unique within the extension, the state is stored as
6049
+ * preference `tutorial:ext:<identifier>/<id>`, `identifier` being the one the extension is installed under.
6050
+ */
6051
+ export declare interface ExtensionTutorial {
6052
+ scope: 'extension';
6053
+ id: string;
6054
+ }
6055
+
5491
6056
  declare type ExtractRecordFieldError<T> = { type: "field-does-not-exist"; data: string } | { type: "invalid-type"; data: { field: string; value: Value<T> | null } };
5492
6057
 
5493
6058
  export declare interface FieldTypeWithDefault {
@@ -5496,6 +6061,10 @@ export declare interface FieldTypeWithDefault {
5496
6061
  * Validated to be a subtype of field_type
5497
6062
  */
5498
6063
  default: Value | null;
6064
+ /**
6065
+ * Never blank. Skipped when `None` so that types without one serialize (and hash) as before.
6066
+ */
6067
+ description?: string;
5499
6068
  }
5500
6069
 
5501
6070
  /** Games and result tables live in folders, and folders in folders. */
@@ -5509,6 +6078,11 @@ declare type FolderContentRef = {
5509
6078
 
5510
6079
  declare type FolderId = FormatNodeId;
5511
6080
 
6081
+ /**
6082
+ * What the nodes representing a format do with a disqualification it raises.
6083
+ */
6084
+ declare type FormatCatch = "throw" | "output-unplaced";
6085
+
5512
6086
  /**
5513
6087
  * How a competitor is written out. Kept apart from the components that show competitors so both
5514
6088
  * the picker and the selector can reach it without importing each other.
@@ -5523,6 +6097,23 @@ declare interface FormatConnectionDTO {
5523
6097
  pins: ConnectionPin[];
5524
6098
  }
5525
6099
 
6100
+ /**
6101
+ * What a format says about a disqualification kind it raises.
6102
+ */
6103
+ declare interface FormatDqKind {
6104
+ description?: string;
6105
+ /**
6106
+ * What the nodes representing the format do with the disqualification.
6107
+ */
6108
+ catch: FormatCatch;
6109
+ /**
6110
+ * The columns of the rows the format throws with the kind, which the nodes representing it throw them with. The
6111
+ * editor sets them to what it infers; the validator checks that what the graph throws has them. None known: rows
6112
+ * without columns.
6113
+ */
6114
+ columns?: RecordTypeHelper;
6115
+ }
6116
+
5526
6117
  declare type FormatGroupId = Brand<string, 'formatGroupId'>;
5527
6118
 
5528
6119
  /**
@@ -5577,7 +6168,7 @@ declare type FormatTestId = Brand<string, 'formatTestId'>;
5577
6168
  /**
5578
6169
  * Represents a state in which the format is not valid for execution but can be stored in the db.
5579
6170
  */
5580
- declare type FormatValidationError = { type: "uncaught-throw"; data: Record<DqKey, RowTypeHelper[]> } | { type: "unthrown-disqualification-kinds"; data: DqKey[] } | { type: "root-format-with-disqualification-kinds" } | { type: "graph-is-cyclic" } | { type: "too-many-inputs"; data: ParentType } | { type: "too-many-outputs"; data: ParentType } | { type: "invalid-node"; data: [FormatNodeId, InvalidNodeReason] } | { type: "too-many-closure-inputs" } | { type: "root-format-with-input-or-output" } | { type: "child-format-is-invalid"; data: FormatId } | { type: "root-format-referenced"; data: FormatId } | { type: "cyclic-parent-relation"; data: FormatNodeId[] } | { type: "illegal-child"; data: FormatNodeId } | { type: "parent-connected-to-child"; data: { parent: FormatNodeId; child: FormatNodeId } } | { type: "connection-escapes-scope"; data: { source: FormatNodeId; target: FormatNodeId; scope: FormatNodeId } } | { type: "input-or-output-node-with-parent" } | { type: "node-configuration-error"; data: NodeConfigurationError } | { type: "cyclic-format-dependency" } | { type: "type-validation-errors"; data: ValidationError<Type>[] } | { type: "static-input-received-non-static-connection" } | { type: "nodety-error"; data: NodetyError } | { type: "format-of-other-event-referenced"; data: FormatId } | { type: "invalid-signature" } | { type: "missing-output-node" };
6171
+ declare type FormatValidationError = { type: "uncaught-throw"; data: Record<DqKey, RowTypeHelper[]> } | { type: "unthrown-disqualification-kinds"; data: DqKey[] } | { type: "thrown-columns-not-as-declared"; data: { key: DqKey; thrown: RecordTypeHelper } } | { type: "root-format-with-disqualification-kinds" } | { type: "graph-is-cyclic" } | { type: "too-many-inputs"; data: ParentType } | { type: "too-many-outputs"; data: ParentType } | { type: "invalid-node"; data: [FormatNodeId, InvalidNodeReason] } | { type: "invalid-scoring-script"; data: [FormatNodeId, ScoringScriptError] } | { type: "scoring-definition-is-invalid"; data: [FormatNodeId, ScoringDefinitionId] } | { type: "scoring-direction-mismatch"; data: FormatNodeId } | { type: "too-many-closure-inputs" } | { type: "root-format-with-input-or-output" } | { type: "child-format-is-invalid"; data: FormatId } | { type: "root-format-referenced"; data: FormatId } | { type: "cyclic-parent-relation"; data: FormatNodeId[] } | { type: "illegal-child"; data: FormatNodeId } | { type: "parent-connected-to-child"; data: { parent: FormatNodeId; child: FormatNodeId } } | { type: "connection-escapes-scope"; data: { source: FormatNodeId; target: FormatNodeId; scope: FormatNodeId } } | { type: "input-or-output-node-with-parent" } | { type: "node-configuration-error"; data: NodeConfigurationError } | { type: "cyclic-format-dependency" } | { type: "type-validation-errors"; data: ValidationError<Type>[] } | { type: "static-input-received-non-static-connection" } | { type: "nodety-error"; data: NodetyError } | { type: "format-of-other-event-referenced"; data: FormatId } | { type: "invalid-signature" } | { type: "missing-output-node" } | { type: "effectful-node"; data: FormatNodeId };
5581
6172
 
5582
6173
  declare type FormatValidity = "invalid" | "valid";
5583
6174
 
@@ -5590,11 +6181,11 @@ export declare type FormFieldHookId = object;
5590
6181
 
5591
6182
  export declare interface FormFieldMeta {
5592
6183
  /**
5593
- * true if setValue has been called at least once since the last reset
6184
+ * true if setValue has been called at least once since the last reset, so the field shows a value of its own
5594
6185
  */
5595
6186
  isTouched: boolean;
5596
6187
  /**
5597
- * true if the working value differs from the base value
6188
+ * true if the working value differs from the base value and is not being saved
5598
6189
  */
5599
6190
  isChanged: boolean;
5600
6191
  /**
@@ -5635,7 +6226,7 @@ export declare interface FormFieldProps<I, O = I> {
5635
6226
  }
5636
6227
 
5637
6228
  export declare interface FormFieldRegistry {
5638
- registerFormField: (hookId: FormFieldHookId, formField: FormFieldMeta) => void;
6229
+ registerFormField: (hookId: FormFieldHookId, formField: GroupedFormField) => void;
5639
6230
  unregisterFormField: (hookId: FormFieldHookId) => void;
5640
6231
  /**
5641
6232
  * `useFormField` bound to this registry. Follows the rules of hooks:
@@ -5662,13 +6253,21 @@ declare type GameDivision = {
5662
6253
  type: 'fixed';
5663
6254
  strategy: 'serpentine' | 'roundrobin';
5664
6255
  count: number;
5665
- } | {
6256
+ }
6257
+ /** The min and max table size of the distribute table node: `maxSize - minSize` are its backfill rounds. */
6258
+ | {
5666
6259
  type: 'dynamic';
5667
6260
  strategy: 'serpentine' | 'roundrobin';
6261
+ minSize: number;
5668
6262
  maxSize: number;
5669
- allowBackfill: boolean;
5670
6263
  };
5671
6264
 
6265
+ /**
6266
+ * What a game node does with a disqualification kind of its game format: throw it on, or catch it with a
6267
+ * [LadderDqStrategy]. The game format sets the default for its game nodes, each node can override it.
6268
+ */
6269
+ declare type GameDqHandling = "throw" | "output-unplaced" | "append-placed" | "append-unplaced" | "append-ladder-placed" | "append-ladder-unplaced";
6270
+
5672
6271
  export declare type GameDTO = components['schemas']['GameDTO'];
5673
6272
 
5674
6273
  export declare type GameFormatDTO = components['schemas']['GameFormatDTO'];
@@ -5692,34 +6291,56 @@ export declare type GameFormatPageProps = EventPath & {
5692
6291
  * result, after the result has been entered. They never change the stored result of the game, only
5693
6292
  * the result table the game node outputs.
5694
6293
  */
5695
- declare type GameFormatPostProcessingStep = { type: "disqualify"; data: { key: DqKey; expression: string } } | { type: "set-output-column"; data: { column: string; columnType: TypeExpr<Type>; expression: string } };
6294
+ declare type GameFormatPostProcessingStep = { type: "disqualify"; data: { key: DqKey; expression: string } } | { type: "set-output-column"; data: { column: string; columnType: TypeExpr<Type>; expression: string } } | { type: "add-to-history"; data: { addToHistory: string } };
6295
+
6296
+ /**
6297
+ * One step of a game format's pre processing. Steps run in order on every row of a game's entry list, before the
6298
+ * game.
6299
+ */
6300
+ declare type GameFormatPreProcessingStep = { type: "sit-out"; data: { condition: string; thenAddToHistory: string; handling: SitOutHandling } } | { type: "drop"; data: { condition: string } };
6301
+
6302
+ /**
6303
+ * A pre or post processing step with a description for the people reading the game format.
6304
+ */
6305
+ declare type GameFormatStep<T> = T & { description?: string };
5696
6306
 
5697
6307
  export declare type GameId = Brand<string, 'gameId'>;
5698
6308
 
5699
- declare type GameKind = {
6309
+ declare type GameKind =
6310
+ /** `catches` overrides what the game format does with its disqualification kinds, see `GameNodeDTO.catches`. */
6311
+ {
5700
6312
  type: 'game-node';
5701
6313
  gameFormatId: GameFormatId;
5702
- variant: GameNodeVariant_2;
6314
+ kind: GameNodeKind;
6315
+ catches?: Record<DqKey_2, GameDqHandling>;
5703
6316
  } | {
5704
6317
  type: 'gamified-format';
5705
6318
  formatId: FormatId;
5706
6319
  };
5707
6320
 
6321
+ /**
6322
+ * How many games a game node plays and how they depend on each other.
6323
+ */
6324
+ declare type GameModeKind = "single" | "parallel" | "ladder";
6325
+
5708
6326
  declare interface GameNodeDTO {
5709
- variant: GameNodeVariant;
5710
6327
  gameFormatId: GameFormatId;
6328
+ kind: GameModeKind;
6329
+ /**
6330
+ * The finals of a ladder node, nothing for other kinds.
6331
+ */
6332
+ ladder?: LadderNode | null;
5711
6333
  /**
5712
- * Caught disqualifications are not thrown. [DqStrategy] decides how they are surfaced.
6334
+ * What the node does with a disqualification kind of its game format, overriding the game format's default for
6335
+ * it (its [DqSettings]). Only keys the game format raises, see [GameNodeKind::catch_dqs].
5713
6336
  */
5714
- catchDqs?: Record<DqKey, DqStrategy>;
6337
+ catches?: Record<DqKey, GameDqHandling>;
5715
6338
  }
5716
6339
 
5717
6340
  /**
5718
- * How many games a game node plays and how they depend on each other.
6341
+ * What a game node plays: its kind with the node's settings for ladders.
5719
6342
  */
5720
- declare type GameNodeVariant = { type: "single" } | { type: "parallel" } | { type: "sequential"; data: { gameCount: number } };
5721
-
5722
- declare type GameNodeVariant_2 = components['schemas']['GameNodeVariant'];
6343
+ declare type GameNodeKind = { type: "single" } | { type: "parallel" } | { type: "ladder"; data: LadderNode };
5723
6344
 
5724
6345
  export declare type GamePageContribution = FormContribution<GamePageProps & {
5725
6346
  game: WorkingGameDTO;
@@ -5729,7 +6350,7 @@ export declare type GamePageProps = EventPath & {
5729
6350
  gameId: GameId | null;
5730
6351
  };
5731
6352
 
5732
- /** Where a game goes in the simplified view of the root format. */
6353
+ /** Where a game goes in the flow. */
5733
6354
  declare type GamePlace = Omit<AddGameEdit, 'type' | 'game' | 'division'>;
5734
6355
 
5735
6356
  export declare const gamesWithTablesMappedByEventQO: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<Map<GameId, GameWithTables>>;
@@ -5763,6 +6384,28 @@ export declare const getTableByIdQueryOptions: (workspaceId: CommonWorkspaceId,
5763
6384
  */
5764
6385
  declare type GraphLocation = { type: "Edge"; data: number } | { type: "InputPort"; data: { nodeIdx: number; inputIdx: number } };
5765
6386
 
6387
+ /**
6388
+ * How a group outputs the disqualifications of a key it catches.
6389
+ */
6390
+ declare interface GroupCatch {
6391
+ /**
6392
+ * How multiple caught tables get merged.
6393
+ */
6394
+ merge: MultiplexingStrategy;
6395
+ /**
6396
+ * Whether the merged competitors keep their places. Disqualified competitors are usually unplaced.
6397
+ */
6398
+ placed: boolean;
6399
+ }
6400
+
6401
+ /** A field as its group sees it, to take its value through a save. */
6402
+ export declare interface GroupedFormField extends FormFieldMeta {
6403
+ /** Keeps showing the overwritten value, as saved and no longer persisted, until `settle`. */
6404
+ commit: () => void;
6405
+ /** Drops the committed value, once the base value holds what was saved. */
6406
+ settle: () => void;
6407
+ }
6408
+
5766
6409
  /**
5767
6410
  * Contains other nodes. It can add its name to the folder path of its descendants and catch the disqualifications
5768
6411
  * they throw.
@@ -5774,10 +6417,9 @@ declare interface GroupNode {
5774
6417
  */
5775
6418
  folder: boolean;
5776
6419
  /**
5777
- * The node has one output per catch key, in order. The strategy decides how multiple
5778
- * caught tables of the same key get merged.
6420
+ * The node has one output per catch key, in order.
5779
6421
  */
5780
- catches: Record<DqKey, MultiplexingStrategy>;
6422
+ catches: Record<DqKey, GroupCatch>;
5781
6423
  }
5782
6424
 
5783
6425
  /** The settings of a group node: BE-C's unified folder, group and catch-dq node. */
@@ -5794,22 +6436,32 @@ declare interface GroupSettings {
5794
6436
  catches: DqEntry[];
5795
6437
  }
5796
6438
 
5797
- declare type GTFilterKind = { type: "class-filter" } | { type: "gender" } | { type: "comparison-filter"; data: ComparisonOp } | { type: "custom" };
5798
-
5799
6439
  export declare const H1: FC<H1Props>;
5800
6440
 
5801
- export declare interface H1Props {
5802
- children?: ReactNode;
6441
+ export declare type H1Props = {
5803
6442
  className?: string;
5804
- }
6443
+ } & HeadingContent;
5805
6444
 
5806
6445
  export declare const H2: FC<H2Props>;
5807
6446
 
5808
- export declare interface H2Props {
5809
- children?: ReactNode;
6447
+ export declare type H2Props = {
5810
6448
  className?: string;
5811
6449
  noMargin?: boolean;
5812
- }
6450
+ } & HeadingContent;
6451
+
6452
+ /** A tutorial is named by its heading, so a heading with one has plain text. */
6453
+ export declare type HeadingContent = {
6454
+ children?: ReactNode;
6455
+ tutorial?: undefined;
6456
+ } | {
6457
+ children: string;
6458
+ tutorial?: Tutorial;
6459
+ };
6460
+
6461
+ /**
6462
+ * A note, serialized as a plain string, or a disqualification.
6463
+ */
6464
+ export declare type HistoryEntry = string | DqRecord;
5813
6465
 
5814
6466
  export declare function HR({ className }: HRProps): JSX.Element;
5815
6467
 
@@ -5817,6 +6469,16 @@ export declare type HRProps = {
5817
6469
  className?: string;
5818
6470
  };
5819
6471
 
6472
+ /**
6473
+ * Node types that aren't deterministic: they read or write the workspace, play games or raise disqualifications.
6474
+ */
6475
+ declare type ImpureNodeType = ({ type: "game" } & GameNodeDTO) | { type: "output-table"; columnTypes?: RecordTypeWithDefaults } | { type: "input-table"; link: InputTableLink } | { type: "class"; classId: ClassId } | ({ type: "disqualify" } & DisqualifyNode) | { type: "split-by-class"; classCount: number } | ({ type: "event-competitors" } & EventCompetitorsNode) | { type: "classes-competitors" };
6476
+
6477
+ /**
6478
+ * Node types as deterministic as what they stand for.
6479
+ */
6480
+ declare type InheritedNodeType = { type: "format"; formatId: FormatId; catches?: Record<DqKey, FormatCatch> } | { type: "filter-table"; filter: TableFilter } | { type: "table-map"; closure: ClosureSource } | { type: "array-map"; closure: ClosureSource } | { type: "repeat"; closure: ClosureSource; over: RepeatOver };
6481
+
5820
6482
  declare type InputIdx = number & { readonly __brand: 'inputIdx' };
5821
6483
 
5822
6484
  export declare enum InputLayout {
@@ -5826,10 +6488,17 @@ export declare enum InputLayout {
5826
6488
  */
5827
6489
  Compact = 1,
5828
6490
  /** Fills the parent (e.g. a table cell) without the browser's default ~20ch input min-width. */
5829
- Fill = 2
6491
+ Fill = 2,
6492
+ /** As wide as its text, at most as wide as the parent. */
6493
+ Content = 3
5830
6494
  }
5831
6495
 
5832
- declare type InvalidNodeReason = { type: "invalid-node" } | { type: "node-is-not-variadic-but-vargs-to-array-set" } | { type: "illegal-control-values" } | ({ type: "node-configuration-error" } & NodeConfigurationError) | { type: "catching-disqualifications-of-variadic-format" } | { type: "appending-disqualifications-to-incompatible-output" } | { type: "game-result-not-assignable-to-entry" };
6496
+ /**
6497
+ * The table an InputTableNode outputs.
6498
+ */
6499
+ declare type InputTableLink = { type: "table"; data: { tableId: TableId } } | { type: "output-table"; data: { nodeId: FormatNodeId } };
6500
+
6501
+ declare type InvalidNodeReason = { type: "invalid-node" } | { type: "node-is-not-variadic-but-vargs-to-array-set" } | { type: "illegal-control-values" } | ({ type: "node-configuration-error" } & NodeConfigurationError) | { type: "catching-disqualifications-of-variadic-format" } | { type: "appending-disqualifications-to-incompatible-output" } | { type: "game-result-not-assignable-to-entry" } | { type: "game-mode-ladder-mismatch" } | { type: "stale-dq-override" } | { type: "invalid-script"; error: AutomationScriptError } | { type: "invalid-game-format" };
5833
6502
 
5834
6503
  /** Anything that can be selected and removed. A connection is identified by its target port: inputs take one connection. */
5835
6504
  declare type ItemRef = {
@@ -5846,6 +6515,20 @@ declare type ItemRef = {
5846
6515
  id: FormatNodeId;
5847
6516
  };
5848
6517
 
6518
+ /**
6519
+ * How the finals of a ladder game node get their name or their attributes.
6520
+ */
6521
+ declare type LadderInput = "per-game" | "shared";
6522
+
6523
+ /**
6524
+ * The finals of a ladder game node.
6525
+ */
6526
+ declare interface LadderNode {
6527
+ gameCount: number;
6528
+ names: LadderInput;
6529
+ attributes: LadderInput;
6530
+ }
6531
+
5849
6532
  /** Loads graphite-script from the host's wasm on demand, a static import would make this entry an async module. */
5850
6533
  export declare const loadGraphiteScript: () => Promise<{
5851
6534
  primValueToTypeExpr: typeof primValueToTypeExpr;
@@ -5887,14 +6570,11 @@ export declare interface LogOperation {
5887
6570
  * connected to the first input of the new game or result table that its kind and type fit.
5888
6571
  */
5889
6572
  declare type LoweredFormatEdit =
5890
- /**
5891
- * Into `section`, or into a new section of its own with null; connected into the input `connectTo` if given, replacing
5892
- * its connection like `connect` does.
5893
- */
6573
+ /** Into `section`, connected into the input `connectTo` if given, replacing its connection like `connect` does. */
5894
6574
  {
5895
6575
  type: 'add-source';
5896
6576
  source: SourceKind;
5897
- section: SectionId | null;
6577
+ section: SectionId;
5898
6578
  connectTo?: ElementPortRef;
5899
6579
  }
5900
6580
  /** A new game or result table goes where `at` points, e.g. first, or where a connection was dropped. */
@@ -5994,22 +6674,20 @@ declare type LoweredFormatEdit =
5994
6674
  }[];
5995
6675
  order?: SimplifiedGroupId[];
5996
6676
  }
5997
- /** Copies the section with all its nodes into a new one right after it, linked among themselves only. */
6677
+ /** Refused with an empty name: a section is always named. */
5998
6678
  | {
5999
- type: 'copy-section';
6000
- section: SectionId;
6001
- } | {
6002
6679
  type: 'rename-section';
6003
6680
  section: SectionId;
6004
6681
  name: string;
6005
6682
  }
6006
6683
  /**
6007
- * A new, last section. An age group section starts with its groups, each with a class source of its class, and goes
6008
- * among the others (see `withAgeGroupsInSync`).
6684
+ * A new, last section called `name`. An age group section starts with its groups, each with a class source of its
6685
+ * class, is named after its age group and goes among the others (see `withAgeGroupsInSync`).
6009
6686
  */
6010
6687
  | {
6011
6688
  type: 'add-section';
6012
6689
  section: SectionId;
6690
+ name: string;
6013
6691
  kind: NewSectionKind;
6014
6692
  }
6015
6693
  /** Makes the class sources of the age group section's groups those of another age group. */
@@ -6026,20 +6704,6 @@ declare type LoweredFormatEdit =
6026
6704
  type: 'set-section-kind';
6027
6705
  section: SectionId;
6028
6706
  kind: SimplifiedSectionKind['type'];
6029
- }
6030
- /**
6031
- * Moves the section one place up (-1) or down (1) in the order of sections, over all age group sections at once. Age
6032
- * group sections go youngest first and aren't moved.
6033
- */
6034
- | {
6035
- type: 'move-section';
6036
- section: SectionId;
6037
- step: -1 | 1;
6038
- }
6039
- /** Removes the section with all its nodes. */
6040
- | {
6041
- type: 'delete-section';
6042
- section: SectionId;
6043
6707
  } | {
6044
6708
  type: 'rename-group';
6045
6709
  section: SectionId;
@@ -6145,13 +6809,6 @@ declare type LoweredFormatEdit =
6145
6809
  game: ElementId;
6146
6810
  to: GameKind;
6147
6811
  }
6148
- /** For game nodes and gamified formats alike; appending on gamified formats adds or updates their `Concat`. */
6149
- | {
6150
- type: 'set-game-dq';
6151
- game: ElementId;
6152
- key: DqKey_2;
6153
- choice: CatchDqChoice;
6154
- }
6155
6812
  /**
6156
6813
  * The steps of a stage's pipeline are the nodes of its chain. A new step goes in before the node at `index`, or after
6157
6814
  * the last with the chain's length. Taking a step out connects what it got to what it fed, where the types fit.
@@ -6192,19 +6849,32 @@ export declare type MergePathParams<A, B> = {
6192
6849
 
6193
6850
  /**
6194
6851
  * What a continuation does with competitors of its parts that are missing from the previous result.
6195
- * If the previous result is empty, nobody is missing: everyone's previous total is 0.
6852
+ *
6853
+ * A continuation of a scoring's result, straight or through nodes that keep the table's metadata, scores like one
6854
+ * scoring node over all parts of the chain: the points of the earlier parts are carried, the discards and tie breaks of
6855
+ * the last node apply to all parts, `part.index` counts through the chain, and the result has the columns of all
6856
+ * parts. Each part's points come from the node that scores it. The direction must be the same along the chain. For
6857
+ * competitors new in a later node, only [Self::ScoredAsAbsent] is exactly like one node. Continuing a table that
6858
+ * doesn't come from a scoring only adds to its `total_points` and keeps its columns.
6859
+ *
6860
+ * If the previous result is empty, nobody is missing.
6196
6861
  */
6197
- declare type MissingFromPrevious = "leave-out" | "worst-total-plus-one";
6862
+ declare type MissingFromPrevious = "leave-out" | "worst-total-plus-one" | "scored-as-absent";
6198
6863
 
6199
6864
  export declare function Modal({ children, isOpen, onClose, closable, height, width, verticalPosition, horizontalPosition, lightbox, blockBackground, }: ModalProps): null;
6200
6865
 
6201
6866
  /** Modal inner body: explicit width; shell uses `width: 'fit'` and shrink-wraps to this. */
6202
- export declare const modalBodyNarrow = "p-6 w-[min(500px,calc(100vw - 2rem))] min-w-0 md:min-w-[320px]";
6867
+ export declare const modalBodyNarrow = "p-6 w-[min(500px,calc(100vw_-_2rem))] min-w-0 md:min-w-[320px]";
6203
6868
 
6204
6869
  export declare interface ModalConfig {
6205
6870
  id: string;
6206
6871
  content: ReactNode;
6207
6872
  closable?: boolean;
6873
+ /**
6874
+ * Default: 'shown'. Whether a closable modal has an X in its top right corner. Hide it for content that has its own
6875
+ * button to close it, such as a dialog; ESC and a click outside still close it.
6876
+ */
6877
+ xButton?: 'shown' | 'hidden';
6208
6878
  height?: 'fit' | 'fill';
6209
6879
  width?: 'fit' | 'fill';
6210
6880
  verticalPosition?: 'center' | 'top' | 'bottom';
@@ -6212,13 +6882,13 @@ export declare interface ModalConfig {
6212
6882
  lightbox?: boolean;
6213
6883
  blockBackground?: boolean;
6214
6884
  /**
6215
- * Opens it as a window instead: one that the user drags around by this title, that leaves the page behind it usable
6216
- * and that only its X closes. It stays open across navigation, so it suits content with links, such as errors
6217
- * pointing at what caused them. Ignores the options about size, position and background.
6885
+ * Opens it as a window instead: one that the user drags around by this title and resizes by its corner, that leaves
6886
+ * the page behind it usable and that only its X closes. It stays open across navigation, so it suits content with
6887
+ * links, such as errors pointing at what caused them, and pages (see `WindowRouter`), whose route guards then ask
6888
+ * before the X closes it. Ignores the options about size, position and background. With `closable: false` it has no
6889
+ * X.
6218
6890
  */
6219
- window?: {
6220
- title: ReactNode;
6221
- };
6891
+ window?: WindowOptions;
6222
6892
  onClose?: () => void;
6223
6893
  }
6224
6894
 
@@ -6262,6 +6932,8 @@ declare type MultiplexingStrategy = "serpentine" | "round-robin";
6262
6932
 
6263
6933
  declare type MultiplexingStrategy_2 = components['schemas']['MultiplexingStrategy'];
6264
6934
 
6935
+ export declare type NamedTable = Pick<TableDAO, 'name' | 'tableKind' | 'variant'>;
6936
+
6265
6937
  declare type NewSectionKind = {
6266
6938
  type: 'simple' | 'layered';
6267
6939
  } | {
@@ -6269,6 +6941,8 @@ declare type NewSectionKind = {
6269
6941
  classes: AgeGroupClasses;
6270
6942
  };
6271
6943
 
6944
+ declare type NodeCategory = "logic" | "game" | "tables" | "arrays" | "math" | "class" | "input-output" | "invalid" | "other" | "root";
6945
+
6272
6946
  declare type NodeConfigurationError = { type: "extract-record-field-error"; data: ExtractRecordFieldError<Primitive> } | { type: "invalid-value"; data: { identifier: string; message: string; givenValue: Value<SerializableNonPrimitiveValue> } } | { type: "node-is-not-variadic-but-vargs-to-array-set" } | { type: "found-closure-input-node-in-non-closure" } | { type: "invalid-node" } | { type: "illegal-vargs-to-array" } | { type: "illegal-control-values" };
6273
6947
 
6274
6948
  declare type NodeInstanceHash = Brand<string, 'nodeInstanceHash'>;
@@ -6331,10 +7005,49 @@ export declare interface NodeSignature<T, R = ParamRef> {
6331
7005
 
6332
7006
  declare type NodetyError = { type: "NodeHasChildren" } | { type: "ParentNotFound" } | { type: "NodeNotFound" } | { type: "CycleDetected" } | { type: "TypeExprValidationError"; error: TypeExprValidationError };
6333
7007
 
6334
- declare type NodeType = { type: "input" } | { type: "output" } | { type: "format"; data: { formatId: FormatId; catchDqs?: Record<DqKey, DqStrategy> } } | { type: "math"; data: { op: MathNodeOp } } | { type: "game"; data: GameNodeDTO } | { type: "output-table" } | { type: "input-table"; data: { tableId: TableId } } | { type: "portal"; data: { sourceNodeId: FormatNodeId; sourceOutput: OutputIdx } } | { type: "class"; data: { classId: ClassId } } | { type: "disqualify"; data: DisqualifyNode } | { type: "group"; data: GroupNode } | { type: "string-concat" } | { type: "string-format" } | { type: "sort-node" } | { type: "constant" } | { type: "merge-tables" } | { type: "divide-table" } | { type: "distribute-table" } | { type: "split-table"; data: SplitTableNode } | { type: "concat"; data: { sorted: boolean } } | { type: "remove-places" } | { type: "table-map" } | { type: "length" } | { type: "boolean-op"; data: { op: BooleanOp } } | { type: "record-field"; data: { op: RecordFieldOp } } | { type: "add-record-fields"; data: AddRecordFieldsNode } | { type: "fallback" } | { type: "gt-row"; data: { errorOnNotFound: boolean } } | { type: "filter-gt"; data: { filter: GTFilterKind } } | { type: "comparison"; data: { op: ComparisonOp } } | { type: "comment"; data: { comment: string; linkedNodeId?: FormatNodeId } } | { type: "ternary" } | { type: "separate-row" } | { type: "update-row" } | { type: "array-map" } | { type: "create-array" } | { type: "create-table" } | { type: "array-access"; data: { errorOnNotFound: boolean } } | { type: "unpack-array"; data: { errorOnNotFound: boolean } } | { type: "promotion-relegation"; data: { finalCount: number | null } } | { type: "age-at" } | { type: "split-by-class"; data: { classCount: number } } | { type: "invalid"; data: { nodeType: NodeType } } | { type: "empty-record" } | { type: "event-competitors"; data: EventCompetitorsNode } | { type: "add-columns"; data: AddColumnsNode } | { type: "matrix-transpose" } | { type: "simple-scoring"; data: SimpleScoringNode } | { type: "classes-competitors"; data: ClassesCompetitorsNode };
7008
+ /**
7009
+ * What a node does. Its purity says whether its nodes are deterministic: what they output depends only on their inputs,
7010
+ * their node type and the formats and scoring definitions they reference. Deterministic formats (see
7011
+ * [FormatInterface::deterministic]) and pipelines contain only deterministic nodes.
7012
+ *
7013
+ * Top level purity distinction to have that be a type system invariant from the start. Reduces invariants.
7014
+ */
7015
+ declare type NodeType = ({ purity: "pure" } & PureNodeType) | ({ purity: "impure" } & ImpureNodeType) | ({ purity: "inherited" } & InheritedNodeType);
6335
7016
 
6336
- /** A change of a node's settings: its node type and its data, the values of its inputs or its number of variadic ports. */
6337
- declare type NodeUpdate = Partial<Pick<FormatNodeDTO_2, 'nodeType' | 'controlValues' | 'addedInputVargs' | 'addedOutputVargs'>>;
7017
+ /**
7018
+ * A change of a node's settings: its node type and its data, the values of its inputs or its variadic ports, which it
7019
+ * can collect into lists, or one of them to remove.
7020
+ */
7021
+ declare type NodeUpdate = Partial<Pick<FormatNodeDTO_2, 'nodeType' | 'controlValues' | 'addedInputVargs' | 'addedOutputVargs' | 'inputVargsToArray' | 'outputVargsToArray'> & {
7022
+ removedInput: number;
7023
+ }>;
7024
+
7025
+ declare interface NodeVariantDoc {
7026
+ variantLabel: string;
7027
+ inputs: PortsDoc;
7028
+ outputs: PortsDoc;
7029
+ description?: string | null;
7030
+ /**
7031
+ * The label for the new input when vargs_to_array is enabled.
7032
+ */
7033
+ outputVargsToArrayCountLabel: PortLabelPart[];
7034
+ /**
7035
+ * The label for the new output when vargs_to_array is enabled.
7036
+ */
7037
+ outputVargsToArrayArrayLabel: PortLabelPart[];
7038
+ inputVargsToArrayArrayLabel: PortLabelPart[];
7039
+ category: NodeCategory;
7040
+ /**
7041
+ * If the node has `children_spec` set to `Closure`, this documents that closure
7042
+ */
7043
+ closureDocs?: NodeVariantDoc | null;
7044
+ /**
7045
+ * The outputs the editor warns about while they aren't connected, with the reason: without them the node is
7046
+ * useless, like a value of a `#[must_use]` function in Rust. Not serialized while empty, so that log entries of
7047
+ * docs without must-use outputs keep their hashes.
7048
+ */
7049
+ mustUse?: Record<number, string>;
7050
+ }
6338
7051
 
6339
7052
  declare type NoMetadata = Record<never, never>;
6340
7053
 
@@ -6375,6 +7088,10 @@ export declare type OperatorOf<T> = Extract<TypeOperators[keyof TypeOperators],
6375
7088
 
6376
7089
  declare interface Option_2<TVal> {
6377
7090
  label: React_2.ReactNode;
7091
+ /** Shown before the label, in the list and when selected; one rendering nothing takes no room. */
7092
+ icon?: React_2.ReactNode;
7093
+ /** Explains the option where a control has room for it, like `AppRadioGroup`. */
7094
+ description?: React_2.ReactNode;
6378
7095
  value: TVal;
6379
7096
  disabled?: boolean;
6380
7097
  }
@@ -6440,6 +7157,30 @@ export declare type PersistedStateOptions = {
6440
7157
  version?: number;
6441
7158
  };
6442
7159
 
7160
+ declare interface PortDoc {
7161
+ /**
7162
+ * Each port label part gets turned into a string and then concatenated to retrieve the full label.
7163
+ */
7164
+ label: PortLabelPart[];
7165
+ description?: string | null;
7166
+ /**
7167
+ * Finite value options representing the value will get labeled with the string
7168
+ */
7169
+ valueLabels: [Value, string][];
7170
+ /**
7171
+ * CustomControls only get used when enabled with this property.
7172
+ */
7173
+ enabledCustomControls: CustomControl[];
7174
+ defaultValue?: Value | null;
7175
+ }
7176
+
7177
+ declare type PortLabelPart = { type: "idx-decimal"; data: number } | { type: "idx-alphabetic"; data: number } | { type: "idx-ordinal"; data: number } | { type: "string"; data: string };
7178
+
7179
+ declare interface PortsDoc {
7180
+ ports: PortDoc[];
7181
+ varg?: PortDoc | null;
7182
+ }
7183
+
6443
7184
  /**
6444
7185
  * A list of port types, optionally with a variadic type (`...T`).
6445
7186
  */
@@ -6455,6 +7196,16 @@ export declare type Primitive = never;
6455
7196
 
6456
7197
  declare function primValueToTypeExpr(value: Value<Primitive>): TypeExpr<Type, ParamRef>;
6457
7198
 
7199
+ /**
7200
+ * The pre or post processing steps of a game format.
7201
+ */
7202
+ declare type ProcessingStage = "pre-processing" | "post-processing";
7203
+
7204
+ /**
7205
+ * Deterministic node types. Input, output, group, portal and comment nodes only route values.
7206
+ */
7207
+ declare type PureNodeType = { type: "invalid"; nodeType: NodeType } | { type: "input" } | { type: "output" } | ({ type: "group" } & GroupNode) | { type: "portal"; sourceNodeId: FormatNodeId; sourceOutput: OutputIdx } | { type: "comment"; comment: string; linkedNodeId?: FormatNodeId } | { type: "math"; op: MathNodeOp } | { type: "string-concat" } | { type: "string-format" } | { type: "sort-table" } | { type: "constant" } | { type: "merge-tables" } | { type: "divide-table" } | { type: "distribute-table" } | { type: "split-table"; split: SplitTableNode } | { type: "concat-tables"; sorted: boolean } | { type: "remove-places" } | { type: "transfer-history" } | { type: "length" } | { type: "boolean-op"; op: BooleanOp } | { type: "record-field"; op: RecordFieldOp } | ({ type: "record" } & RecordNode) | ({ type: "record-access" } & RecordAccessNode) | { type: "fallback" } | { type: "comparison"; op: ComparisonOp } | { type: "ternary" } | { type: "separate-row" } | { type: "update-row" } | { type: "create-array" } | { type: "create-table" } | { type: "array-access"; errorOnNotFound: boolean } | { type: "unpack-array"; errorOnNotFound: boolean } | { type: "promotion-relegation"; finalCount: number | null } | { type: "age-at" } | ({ type: "add-columns" } & AddColumnsNode) | { type: "matrix-transpose" } | { type: "zip"; lengths: ZipLengths } | ({ type: "scoring" } & ScoringNode) | ({ type: "script-closure" } & ScriptClosureNode);
7208
+
6458
7209
  /**
6459
7210
  * Replaces the rows a table holds on layer one.
6460
7211
  *
@@ -6493,6 +7244,9 @@ export declare function putTableRows(workspaceId: CommonWorkspaceId, eventId: Ev
6493
7244
  } | {
6494
7245
  type: "change-would-modify-rows";
6495
7246
  data: components["schemas"]["RecordModifications"];
7247
+ } | {
7248
+ type: "format-revalidation";
7249
+ data: components["schemas"]["FormatRevalidationError"];
6496
7250
  };
6497
7251
  }>;
6498
7252
 
@@ -6526,6 +7280,18 @@ export declare interface QuerySchema<Fields extends QueryFields> {
6526
7280
  set<Key extends keyof Fields>(search: string, key: Key, value: QueryFieldValue<Fields[Key]>): string;
6527
7281
  }
6528
7282
 
7283
+ /**
7284
+ * Reads `keys` of a record, see [record_access_node_sig].
7285
+ */
7286
+ declare interface RecordAccessNode {
7287
+ keys: string[];
7288
+ }
7289
+
7290
+ /**
7291
+ * What a record node adds its fields to.
7292
+ */
7293
+ declare type RecordBase = "extend" | "new";
7294
+
6529
7295
  declare type RecordFieldOp = "read-field" | "write-field";
6530
7296
 
6531
7297
  declare interface RecordMakeValidMutation {
@@ -6533,6 +7299,14 @@ declare interface RecordMakeValidMutation {
6533
7299
  newValue: Value;
6534
7300
  }
6535
7301
 
7302
+ /**
7303
+ * The record node: a record with `fields`, see [record_node_sig].
7304
+ */
7305
+ declare interface RecordNode {
7306
+ fields: string[];
7307
+ base: RecordBase;
7308
+ }
7309
+
6536
7310
  /**
6537
7311
  * RecordTypes should **only** be manipulated though this helper to have a single source of truth for the structure.
6538
7312
  */
@@ -6553,6 +7327,11 @@ export declare interface RepeatedQueryField<T> {
6553
7327
  codec: QueryCodec<T>;
6554
7328
  }
6555
7329
 
7330
+ /**
7331
+ * What a repeat node runs its closure for.
7332
+ */
7333
+ declare type RepeatOver = "count" | "list";
7334
+
6556
7335
  export declare function ResizablePanel({ value, onChange, edge, min, max, hideWhenBelowMin, onClose, children, className, contentClassName, }: ResizablePanelProps): JSX.Element;
6557
7336
 
6558
7337
  export declare interface ResizablePanelProps {
@@ -6604,6 +7383,8 @@ export declare interface RouterContextType {
6604
7383
  register: (route: string) => boolean;
6605
7384
  back: () => void;
6606
7385
  unregister: (route: string) => void;
7386
+ /** What unloads the routes below, see `useGuardRoute`. */
7387
+ scope: RouterScope;
6607
7388
  }
6608
7389
 
6609
7390
  export declare interface RouterLocation {
@@ -6612,6 +7393,14 @@ export declare interface RouterLocation {
6612
7393
  hash: string;
6613
7394
  }
6614
7395
 
7396
+ /** The app's routes are unloaded by navigating, a window's (see `WindowRouter`) by closing it. */
7397
+ export declare type RouterScope = {
7398
+ type: 'app';
7399
+ } | {
7400
+ type: 'window';
7401
+ windowId: string;
7402
+ };
7403
+
6615
7404
  /**
6616
7405
  * Rows can only be created and moved by this crate, so that their [Origin] stays truthful.
6617
7406
  */
@@ -6622,6 +7411,11 @@ export declare interface Row {
6622
7411
  competitorId: number;
6623
7412
  place: number | null;
6624
7413
  columns: RecordValue;
7414
+ /**
7415
+ * What happened to the competitor so far. Histories of the same competitor arriving on several paths are united
7416
+ * in table order. Left out when empty.
7417
+ */
7418
+ history?: RowHistory;
6625
7419
  }
6626
7420
 
6627
7421
  export declare interface RowAction<T> {
@@ -6636,6 +7430,15 @@ export declare interface RowAction<T> {
6636
7430
  readOnlySafe?: boolean;
6637
7431
  }
6638
7432
 
7433
+ /**
7434
+ * What happened to a competitor on the way to a row, oldest first: the notes game format automations added and the
7435
+ * disqualifications the competitor collected.
7436
+ *
7437
+ * Holds every disqualification once (identity: key, source and kind), so uniting the histories of the same
7438
+ * competitor from several paths doesn't count any twice. Notes are concatenated.
7439
+ */
7440
+ export declare type RowHistory = HistoryEntry[];
7441
+
6639
7442
  declare type RowMutationIdx = Brand<number, 'rowMutationIdx'>;
6640
7443
 
6641
7444
  declare type RowMutationKind = { type: "set-record-field"; field: string; value: Value } | { type: "push-unranked"; columns: RecordValue<Primitive> } | { type: "remove" } | { type: "set-place"; place: number } | { type: "set-unranked"; tiebraker: number } | { type: "set-place-and-tie-braker"; place: number; tiebraker: number };
@@ -6676,13 +7479,51 @@ declare interface RowTypeHelper<R = ParamRef> {
6676
7479
  columns: RecordTypeHelper<R>;
6677
7480
  }
6678
7481
 
6679
- declare type RuntimeErrorKind = { type: "division-by-zero" } | { type: "variable-not-found"; data: { name: string } } | { type: "function-not-found"; data: { name: string } } | { type: "index-out-of-bounds" } | { type: "invalid-index" } | { type: "invalid-math-operands" } | { type: "non-boolean-condition" } | { type: "non-boolean-operand" } | { type: "invalid-comparison-operands" } | { type: "argument"; data: { expected: string; got: string } };
7482
+ declare type RuntimeErrorKind = { type: "division-by-zero" } | { type: "variable-not-found"; data: { name: string } } | { type: "function-not-found"; data: { name: string } } | { type: "index-out-of-bounds" } | { type: "invalid-index" } | { type: "invalid-math-operands" } | { type: "non-boolean-condition" } | { type: "non-boolean-operand" } | { type: "invalid-comparison-operands" } | { type: "argument"; data: { expected: string; got: string } } | { type: "function-failed"; data: { message: string } };
7483
+
7484
+ /**
7485
+ * A way to score a part, with parameters a node sets. An entity of an event, like a game format.
7486
+ */
7487
+ declare interface ScoringDefinition {
7488
+ name: string;
7489
+ description: string;
7490
+ /**
7491
+ * The script sees their values as `params`. Every parameter has a default.
7492
+ */
7493
+ parameters: RecordTypeWithDefaults;
7494
+ /**
7495
+ * The documentation of each parameter, by name, like the ports of a node.
7496
+ */
7497
+ parameterDocs: Record<string, PortDoc>;
7498
+ /**
7499
+ * The columns the rows of every part must have, the script sees them in `row.attributes`.
7500
+ */
7501
+ requiredColumns: RecordTypeHelper;
7502
+ direction: ScoringDirection;
7503
+ /**
7504
+ * A graphite script, typechecked like [ScoringPoints::Custom]'s with `params` in addition.
7505
+ */
7506
+ script: string;
7507
+ /**
7508
+ * Examples of what the definition scores, see [Self::run_test].
7509
+ */
7510
+ tests: ScoringTest[];
7511
+ }
7512
+
7513
+ /**
7514
+ * Identifies a scoring definition of an event. Random ([Self::new_random]) from the endpoint, derived for the
7515
+ * fundamental scorings of a new event, or derived by `ImportArchiveMutation`. Deserializing one only yields a
7516
+ * reference to an existing definition; it does not check that it exists.
7517
+ */
7518
+ declare type ScoringDefinitionId = string & { readonly __brand: 'scoringDefinitionId' };
7519
+
7520
+ declare type ScoringDirection = "lower-is-better" | "higher-is-better";
6680
7521
 
6681
7522
  /** A sequential scoring of fewer than two parts is a parallel one (see `ResultScoring`). */
6682
7523
  declare interface ScoringEdit {
6683
7524
  mode: ScoringMode;
6684
7525
  parts: {
6685
- part: SimpleScoringPart_2;
7526
+ part: ScoringPart_2;
6686
7527
  from: number | null;
6687
7528
  }[];
6688
7529
  }
@@ -6694,6 +7535,105 @@ declare type ScoringMode = {
6694
7535
  missing: MissingFromPrevious;
6695
7536
  };
6696
7537
 
7538
+ /**
7539
+ * Scores competitors over several parts, e.g. the races of a series.
7540
+ *
7541
+ * ```text
7542
+ * <R0 extends {}, ...>(Table<R0, Sorted>, ...) -> (Table<{total_points: P, <part name>: P, ...}, Sorted>)
7543
+ * ```
7544
+ *
7545
+ * One input per part and one output table. Competitors are the union of all parts. The script of `points` computes
7546
+ * the points of every competitor in every part. `P` is `Integer` if the script returns integers whatever the
7547
+ * columns of the parts, else `Integer | Float`. If the points are `null` for a part, the competitor is left out of
7548
+ * the result. The total is the sum of the points, without the worst `discards`. The output is ranked by the total in
7549
+ * the direction of `points`, ties are broken by the `tie_breaks` in order, and competitors still tied share the
7550
+ * place.
7551
+ *
7552
+ * With `continues_previous`, the first input is the result of a previous scoring,
7553
+ * `Table<{total_points: Integer | Float}, Sorted>`, and the totals add this node's parts to the previous
7554
+ * `total_points`. The previous result's other columns are carried over, those named like a part are replaced. Ties
7555
+ * keep the previous result's order. Discards and tie breaks only see this node's parts.
7556
+ */
7557
+ declare interface ScoringNode {
7558
+ parts: ScoringPart[];
7559
+ continuesPrevious?: MissingFromPrevious;
7560
+ points: ScoringPoints;
7561
+ discards: Discards;
7562
+ /**
7563
+ * Decide between competitors with the same total, in order.
7564
+ */
7565
+ tieBreaks: TieBreak[];
7566
+ }
7567
+
7568
+ /**
7569
+ * One scored part, e.g. a single race of a series.
7570
+ */
7571
+ declare interface ScoringPart {
7572
+ /**
7573
+ * Used as the name of the output column holding the points of this part.
7574
+ */
7575
+ name: string;
7576
+ /**
7577
+ * [TieBreak::PartPriority] compares higher priority parts first.
7578
+ */
7579
+ priority: number;
7580
+ }
7581
+
7582
+ declare type ScoringPart_2 = components['schemas']['ScoringPart'];
7583
+
7584
+ /**
7585
+ * The points of a scoring node.
7586
+ */
7587
+ declare type ScoringPoints = { type: "definition"; data: { definition: ScoringDefinitionId; params: RecordValue } } | { type: "custom"; data: { script: string; direction: ScoringDirection } };
7588
+
7589
+ /**
7590
+ * The script of a scoring node does not parse or typecheck.
7591
+ */
7592
+ declare interface ScoringScriptError {
7593
+ /**
7594
+ * The part the script fails to typecheck for, none if it does not parse.
7595
+ */
7596
+ part: string | null;
7597
+ message: string;
7598
+ }
7599
+
7600
+ /**
7601
+ * Parts scored with values of the parameters, and the result they are expected to score to.
7602
+ */
7603
+ declare interface ScoringTest {
7604
+ name: string;
7605
+ description: string;
7606
+ params: RecordValue;
7607
+ parts: ScoringTestPart[];
7608
+ /**
7609
+ * The scored rows, best first: the places and the columns, the points of every part and the total. Their
7610
+ * disqualifications and history are not compared.
7611
+ */
7612
+ expected: Rows<Sorted>;
7613
+ }
7614
+
7615
+ declare interface ScoringTestPart {
7616
+ /**
7617
+ * The name of the column of its points.
7618
+ */
7619
+ name: string;
7620
+ rows: Rows<Sorted>;
7621
+ }
7622
+
7623
+ /**
7624
+ * Outputs a deterministic closure (scripts are) with `signature`. Calling it runs `script` with each input bound to the
7625
+ * variable of its name, and what the script evaluates to is the closure's output.
7626
+ *
7627
+ * ```text
7628
+ * () -> (<signature>)
7629
+ * ```
7630
+ */
7631
+ declare interface ScriptClosureNode {
7632
+ script: string;
7633
+ signature: ClosureSignature;
7634
+ docs: NodeVariantDoc;
7635
+ }
7636
+
6697
7637
  export declare function SearchInput({ value, onChange, placeholder, className, autoFocus, ref, onKeyDown }: SearchInputProps): JSX.Element;
6698
7638
 
6699
7639
  export declare type SearchInputProps = {
@@ -6706,11 +7646,8 @@ export declare type SearchInputProps = {
6706
7646
  onKeyDown?: (event: KeyboardEvent_2<HTMLInputElement>) => void;
6707
7647
  };
6708
7648
 
6709
- /**
6710
- * A section of the simplified view (see `SimplifiedView`). Until it is stored, a section is identified by the lowest
6711
- * node id of its island, which is a uuid like the ids of stored sections.
6712
- */
6713
- declare type SectionId = SimplifiedSectionId;
7649
+ /** A section of the flow (see `SimplifiedView`): the id of its root format. */
7650
+ declare type SectionId = FormatId;
6714
7651
 
6715
7652
  declare type SerializableNonPrimitiveValue = { type: "game-table"; data: Table<Unsorted, StateMetadata> } | { type: "game-table-sorted"; data: Table<Sorted, StateMetadata> } | { type: "row"; data: Row } | { type: "class"; data: string } | { type: "closure" };
6716
7653
 
@@ -6722,10 +7659,12 @@ declare type SerializableNonPrimitiveValue = { type: "game-table"; data: Table<U
6722
7659
  export declare type Shortcut = readonly string[];
6723
7660
 
6724
7661
  /**
6725
- * Shows a dialog that can be dismissed (ESC, click outside, or X button; only X for a window)
6726
- * Returns the selected value or null if dismissed
7662
+ * Shows a dialog that can be dismissed (ESC, click outside; only the X of a window). The first primary button, or else
7663
+ * the first button, has the focus. Without buttons, it has a close button.
7664
+ *
7665
+ * @returns the value of the chosen button or null if dismissed
6727
7666
  */
6728
- export declare function showDialog<T>(modal: ModalControls, buttons: DialogButton<T>[], content: ReactNode, { window }?: DialogOptions): Promise<T | null>;
7667
+ export declare function showDialog<T>(modal: ModalControls, buttons: DialogButton<T>[], message: DialogMessage, { window }?: DialogOptions): Promise<T | null>;
6729
7668
 
6730
7669
  /**
6731
7670
  * A panel as a column of its own, next to the content. Keeping it out of the content gives toolbars the whole
@@ -6786,57 +7725,11 @@ export declare type SidePanelIcon = ComponentType<SVGProps<SVGSVGElement>>;
6786
7725
 
6787
7726
  export declare type SidePanelVariant = 'dock' | 'drawer';
6788
7727
 
6789
- /**
6790
- * Place 1 = 1 point, Place 2 = 2 points, etc.
6791
- * On tie, whoever won the part with the highest priority wins.
6792
- * If still tied, the next lower priority part is considered etc.
6793
- *
6794
- * ```text
6795
- * (Table<{}, Sorted>, ...) -> (Table<{total_points: Integer, <part name>: Integer, ...}, Sorted>)
6796
- * ```
6797
- *
6798
- * One input per part and one output table, sorted by ascending total points.
6799
- * Competitors are the union of all parts: a competitor without a place in a part
6800
- * (missing from the table of that part, or in it without a place) scores one point
6801
- * more than that part has rows, so not finishing a part is always worse than
6802
- * finishing it last. An empty part has not taken place yet and scores 0 for everyone.
6803
- *
6804
- * With `continues_previous`, the first input is the result of a previous scoring,
6805
- * `Table<{total_points: Integer}, Sorted>`, and the totals add this node's parts to the previous `total_points`.
6806
- * The previous result's other columns are carried over, those named like a part are replaced. Ties keep the
6807
- * previous result's order.
6808
- */
6809
- declare interface SimpleScoringNode {
6810
- parts: SimpleScoringPart[];
6811
- /**
6812
- * Missing means a scoring that continues none, so that nodes written before keep their serialization.
6813
- */
6814
- continuesPrevious?: MissingFromPrevious;
6815
- }
6816
-
6817
- /**
6818
- * One scored part, e.g. a single race of a series.
6819
- */
6820
- declare interface SimpleScoringPart {
6821
- /**
6822
- * Used as the name of the output column holding the points of this part.
6823
- */
6824
- name: string;
6825
- /**
6826
- * Higher priority parts break ties first.
6827
- */
6828
- priority: number;
6829
- }
6830
-
6831
- declare type SimpleScoringPart_2 = components['schemas']['SimpleScoringPart'];
6832
-
6833
7728
  /**
6834
7729
  * Unique per format, not only per section.
6835
7730
  */
6836
7731
  declare type SimplifiedGroupId = string & { readonly __brand: 'simplifiedGroupId' };
6837
7732
 
6838
- declare type SimplifiedSectionId = string & { readonly __brand: 'simplifiedSectionId' };
6839
-
6840
7733
  /** A `simple` section has no groups. An age group's classes are the values of its two groups' class sources, see `ageGroupOf`. */
6841
7734
  declare type SimplifiedSectionKind = {
6842
7735
  type: 'layered';
@@ -6850,6 +7743,11 @@ declare type SimplifiedSectionKind = {
6850
7743
  };
6851
7744
  };
6852
7745
 
7746
+ /**
7747
+ * Where the rows of the competitors sitting out go. They keep no columns.
7748
+ */
7749
+ declare type SitOutHandling = { type: "append-placed" } | { type: "append-unplaced" } | { type: "append-ladder-placed" } | { type: "append-ladder-unplaced" } | { type: "output"; data: { name: string } } | { type: "throw"; data: { key: DqKey } };
7750
+
6853
7751
  /**
6854
7752
  * Sorted game tables have the following guarantees:
6855
7753
  * - None places are last
@@ -6872,7 +7770,7 @@ declare type SourceKind = {
6872
7770
  type: 'classes-competitors';
6873
7771
  } | {
6874
7772
  type: 'input-table';
6875
- tableId: TableId;
7773
+ link: InputTableLink;
6876
7774
  };
6877
7775
 
6878
7776
  /**
@@ -6888,11 +7786,12 @@ declare interface SourceLocation {
6888
7786
  *
6889
7787
  * for `Static { split_count }`:
6890
7788
  * ```text
6891
- * <C extends {}>(Table<C, Sorted>, Integer * split_count) -> (Table<C, Sorted> * (split_count + 1))
7789
+ * <C extends {}>(table: Table<C, Sorted>, cut_1: Integer, …, cut_<split_count>: Integer)
7790
+ * -> (part_1: Table<C, Sorted>, …, part_<split_count + 1>: Table<C, Sorted>)
6892
7791
  * ```
6893
7792
  * for `Dynamic`:
6894
7793
  * ```text
6895
- * <C extends {}>(Table<C, Sorted>, Array<Integer>) -> (Array<Table<C, Sorted>>)
7794
+ * <C extends {}>(table: Table<C, Sorted>, cuts: Array<Integer>) -> (parts: Array<Table<C, Sorted>>)
6896
7795
  * ```
6897
7796
  */
6898
7797
  declare type SplitTableNode = { type: "static"; data: { splitCount: number } } | { type: "dynamic" };
@@ -6947,6 +7846,8 @@ export declare type TableDropTarget = EventPath & {
6947
7846
  table: TableDAO;
6948
7847
  };
6949
7848
 
7849
+ declare type TableFilter = { type: "comparison-filter"; data: ComparisonOp } | { type: "class-filter" } | { type: "gender" } | { type: "custom"; data: ClosureSource };
7850
+
6950
7851
  /**
6951
7852
  * Identifies a table, the primary key of `tables`. Comes from one of:
6952
7853
  * - [Self::new_random]: a table the user adds. The endpoint picks the id and the mutation carries it.
@@ -7010,6 +7911,24 @@ declare type TableState = number;
7010
7911
 
7011
7912
  export declare type TableWithType = components['schemas']['TableWithType'];
7012
7913
 
7914
+ /**
7915
+ * The names of the concepts that sports name differently, in one locale. Plain data, so it can come from anywhere.
7916
+ *
7917
+ * A translation takes a term as an argument that its formatter fills in, `{game?|game}`, or capitalized
7918
+ * `{Game?|Game}`; callers pass nothing. German translations use singular terms without articles or adjectives (the
7919
+ * gender differs between terms) and never in compounds.
7920
+ */
7921
+ export declare type Terminology = Record<TermKey, string>;
7922
+
7923
+ export declare type TermKey = (typeof termKeys)[number];
7924
+
7925
+ declare const termKeys: readonly ["game", "games", "gameFormat", "gameFormats", "entryTable", "entryTables", "resultTable", "resultTables", "ladder", "ladders", "parallelGames", "bib", "bibs", "gameFlow", "competitors"];
7926
+
7927
+ /**
7928
+ * A rule deciding between competitors with the same total.
7929
+ */
7930
+ declare type TieBreak = "part-priority" | "countback" | "last-part";
7931
+
7013
7932
  export declare type TimeDelta = components['schemas']['TimeDeltaSchema'];
7014
7933
 
7015
7934
  export declare const TimeDeltaInput: FC<TimeDeltaInputProps>;
@@ -7039,6 +7958,17 @@ declare interface Trail {
7039
7958
  steps: Step[];
7040
7959
  }
7041
7960
 
7961
+ /** Help on the section of the heading it belongs to. */
7962
+ export declare type Tutorial = {
7963
+ content: ReactNode;
7964
+ } & (BuiltInTutorial | ExtensionTutorial);
7965
+
7966
+ /**
7967
+ * Every place of the engine showing a tutorial has its own id, its state is stored per user as preference
7968
+ * `tutorial:<id>`. None starts with `ext:`, which is the namespace of the extensions' tutorials.
7969
+ */
7970
+ export declare type TutorialId = 'game-format/tables' | 'game-format/variants' | 'game-format/pre-processing' | 'game-format/post-processing' | 'game-format/disqualifications' | 'scoring-definition/parameters' | 'scoring-definition/required-columns' | 'scoring-definition/script' | 'scoring-definition/tests' | 'game/manually-created' | 'game/add-competitors' | 'class/add-competitors' | 'team/add-members' | 'competitor/add-to-class' | 'archives/export';
7971
+
7042
7972
  export declare type Type = { type: "integer"; data: { min: number | null; max: number | null } } | { type: "float" } | { type: "string"; data: string | null } | { type: "boolean" } | { type: "iterable" } | { type: "countable" } | { type: "comparable" } | { type: "sortable" } | { type: "unit" } | { type: "time-delta" } | { type: "date-time" } | { type: "date" } | { type: "primitive" } | { type: "competitor-id" } | { type: "array" } | { type: "record" } | { type: "table" } | { type: "row" } | { type: "table-sorting"; data: TableSorting } | { type: "class" };
7043
7973
 
7044
7974
  /**
@@ -7060,7 +7990,7 @@ declare interface TypeError_2 {
7060
7990
  location: SourceLocation;
7061
7991
  }
7062
7992
 
7063
- declare type TypeErrorKind = { type: "unknown-variable"; data: { name: string } } | { type: "unknown-function"; data: { name: string } } | { type: "wrong-arity"; data: { name: string; expected: number; got: number } } | { type: "type-mismatch"; data: { expected: string; got: string } } | { type: "non-integer-index" } | { type: "non-record-property-access" } | { type: "nodety"; data: { message: string } };
7993
+ declare type TypeErrorKind = { type: "unknown-variable"; data: { name: string } } | { type: "unknown-function"; data: { name: string } } | { type: "wrong-arity"; data: { name: string; expected: number; got: number } } | { type: "type-mismatch"; data: { expected: string; got: string } } | { type: "non-integer-index" } | { type: "non-record-property-access" } | { type: "unknown-method"; data: { name: string; receiver: string } } | { type: "misplaced-lambda" } | { type: "nodety"; data: { message: string } };
7064
7994
 
7065
7995
  declare type TypeErrors = TypeError_2[];
7066
7996
 
@@ -7116,6 +8046,9 @@ declare type Unsorted = null;
7116
8046
  /** The engine's active locale. Extensions ship their own dictionaries and select them by it. */
7117
8047
  export declare function useEngineLocale(): Locales;
7118
8048
 
8049
+ /** The terms in the locale of the engine, or in `locale`. Extensions can name the concepts with them. */
8050
+ export declare function useEngineTerminology(locale?: Locales): Terminology;
8051
+
7119
8052
  /** Returns a `fetch` for `path` (relative, e.g. `"items"`) on the calling extension's own backend in the current event. */
7120
8053
  export declare function useExtensionBackend(): ExtensionHost['backend'];
7121
8054
 
@@ -7155,6 +8088,9 @@ export declare function useRouter(): RouterContextType;
7155
8088
  */
7156
8089
  export declare function useRunLogBatch(): (workspaceId: CommonWorkspaceId, operations: LogOperation[], label: ReactNode) => Promise<boolean | null>;
7157
8090
 
8091
+ /** The names of tables as the engine shows them (see `tableName`), e.g. for extensions. */
8092
+ export declare function useTableName(): (table: NamedTable) => string;
8093
+
7158
8094
  /** The `:` params that are uuids, by name. All other `:` params are numbers. Workspace ids are uuids on root only. */
7159
8095
  declare type UuidPathParams = {
7160
8096
  workspaceId: CommonWorkspaceId;
@@ -7164,6 +8100,7 @@ declare type UuidPathParams = {
7164
8100
  formatTestId: FormatTestId;
7165
8101
  gameFormatId: GameFormatId;
7166
8102
  gameId: GameId;
8103
+ scoringDefinitionId: ScoringDefinitionId;
7167
8104
  tableId: TableId;
7168
8105
  };
7169
8106
 
@@ -7194,6 +8131,11 @@ export declare type Value<T = Primitive> = { type: "unit" } | { type: "float"; d
7194
8131
  */
7195
8132
  export declare function valueIntoExportable(value: Value): ExportableValue;
7196
8133
 
8134
+ /**
8135
+ * A name a script can refer to as a variable: an identifier that isn't a keyword.
8136
+ */
8137
+ declare type VariableName = string;
8138
+
7197
8139
  export declare function Warning({ children, className }: WarningProps): JSX.Element;
7198
8140
 
7199
8141
  export declare interface WarningProps {
@@ -7201,6 +8143,33 @@ export declare interface WarningProps {
7201
8143
  className?: string;
7202
8144
  }
7203
8145
 
8146
+ /** See `ModalConfig.window`. The user resizes a window by its bottom right corner, its content scrolls inside. */
8147
+ export declare interface WindowOptions {
8148
+ title: ReactNode;
8149
+ /** Its size until the user resizes it. Default: fit content. */
8150
+ size?: WindowStartSize;
8151
+ /**
8152
+ * Default: 'never'. With a bar, a button in its title bar hides it and `MinimizedWindowsBar` shows the bar next to a
8153
+ * button that restores it.
8154
+ */
8155
+ minimize?: 'never' | {
8156
+ bar: ReactNode;
8157
+ };
8158
+ }
8159
+
8160
+ export declare interface WindowSize {
8161
+ width: number;
8162
+ height: number;
8163
+ }
8164
+
8165
+ /** The size a window opens with, until the user resizes it. */
8166
+ export declare type WindowStartSize = {
8167
+ type: 'fit-content';
8168
+ } | {
8169
+ type: 'initial';
8170
+ size: WindowSize;
8171
+ };
8172
+
7204
8173
  /**
7205
8174
  * Same as GameDTO but with gameFormatId optional
7206
8175
  */
@@ -7212,4 +8181,9 @@ export declare type WorkspaceRootId = Brand<string, 'workspaceRootId'>;
7212
8181
 
7213
8182
  export declare type WorkspaceSelfHostedId = Brand<number, 'workspaceSelfHostedId'>;
7214
8183
 
8184
+ /**
8185
+ * What a zip node does with lists of different lengths.
8186
+ */
8187
+ declare type ZipLengths = "longest" | "shortest" | "a";
8188
+
7215
8189
  export { }