@graphite-sports/sdk 0.4.0 → 0.6.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 +1585 -1233
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -3,22 +3,26 @@ import { ColumnDef } from '@tanstack/react-table';
3
3
  import { ColumnHelper } from '@tanstack/table-core';
4
4
  import { ColumnVisibilityState } from '@tanstack/react-table';
5
5
  import { ComponentProps } from 'react';
6
+ import { ComponentType } from 'react';
6
7
  import { CSSProperties } from 'react';
7
8
  import type { DataTag } from '@tanstack/react-query';
8
9
  import { FC } from 'react';
9
10
  import { FocusEventHandler } from 'react';
10
11
  import { HTMLInputTypeAttribute } from 'react';
11
12
  import { JSX } from 'react/jsx-runtime';
13
+ import type { KeyboardEvent as KeyboardEvent_2 } from 'react';
12
14
  import { KeyboardEventHandler } from 'react';
13
15
  import { OnChangeFn } from '@tanstack/react-table';
14
16
  import { default as React_2 } from 'react';
15
17
  import * as React_3 from 'react';
18
+ import type { ReactElement } from 'react';
16
19
  import { ReactNode } from 'react';
17
20
  import type { Ref } from 'react';
18
21
  import { RefObject } from 'react';
19
22
  import { RowData } from '@tanstack/react-table';
20
23
  import { RowModel } from '@tanstack/table-core';
21
24
  import { SortingState } from '@tanstack/react-table';
25
+ import { SVGProps } from 'react';
22
26
  import { Tab } from '@headlessui/react';
23
27
  import { TabGroup } from '@headlessui/react';
24
28
  import { Table as Table_2 } from '@tanstack/table-core';
@@ -29,6 +33,46 @@ import { TabPanels } from '@headlessui/react';
29
33
  import { toast } from 'react-hot-toast';
30
34
  import type { UnusedSkipTokenOptions } from '@tanstack/react-query';
31
35
 
36
+ /**
37
+ * <C extends {}, P extends Primitive, S extends Sorted|Unsorted>(Table<C, S>, P) -> (Table<C & {<self.key>: P}, S>)
38
+ */
39
+ declare interface AddColumnsNode {
40
+ columns: string[];
41
+ }
42
+
43
+ declare type AddGameEdit = Extract<LoweredFormatEdit, {
44
+ type: 'add-game';
45
+ }>;
46
+
47
+ declare type AddGameEdit_2 = {
48
+ type: 'add-game';
49
+ section: SectionId;
50
+ at: MoveTarget;
51
+ } & ({
52
+ game: GameKind;
53
+ connectFrom?: ElementPortRef;
54
+ division?: never;
55
+ } | {
56
+ game: Extract<GameKind, {
57
+ type: 'game-node';
58
+ }> & {
59
+ variant: {
60
+ type: 'parallel';
61
+ };
62
+ };
63
+ connectFrom: ElementPortRef;
64
+ division: GameDivision;
65
+ });
66
+
67
+ /**
68
+ * <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1})
69
+ */
70
+ declare interface AddRecordFieldsNode {
71
+ fields: string[];
72
+ }
73
+
74
+ declare type AgeGroupClasses = Record<'female' | 'male', ClassId>;
75
+
32
76
  export declare type AnyQuerySchema = QuerySchema<QueryFields>;
33
77
 
34
78
  export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, autoFocus, }: AppButtonProps): JSX.Element;
@@ -45,7 +89,10 @@ export declare type AppButtonProps = {
45
89
  loading?: boolean;
46
90
  value?: string;
47
91
  ref?: RefObject<HTMLButtonElement | null>;
48
- /** Focuses the button on mount, and with `href` also when this turns true later. */
92
+ /**
93
+ * Focuses the button as soon as it is enabled while this is set, which can be after mount, unless a text field has the
94
+ * focus. Again only after this was false.
95
+ */
49
96
  autoFocus?: boolean;
50
97
  /** Makes the button a link to this route, so it can also be opened in a new tab. `onClick` runs before routing. */
51
98
  href?: string;
@@ -94,6 +141,8 @@ export declare type AppInputProps = {
94
141
  onFocus?: FocusEventHandler<HTMLInputElement>;
95
142
  onKeyDown?: KeyboardEventHandler<HTMLInputElement>;
96
143
  type?: HTMLInputTypeAttribute;
144
+ min?: number;
145
+ step?: number;
97
146
  placeholder?: string;
98
147
  required?: boolean;
99
148
  maxLength?: number;
@@ -166,7 +215,7 @@ export declare function AppTab({ className, ...props }: ComponentProps<typeof Ta
166
215
 
167
216
  export declare function AppTabGroup(props: ComponentProps<typeof TabGroup>): JSX.Element;
168
217
 
169
- export declare function AppTable<TData extends RowData>({ data, columns, actions, allowSelect, getRowId, getRowState, rowClicked, rowHref, initialPageSize, initialSorting, pageSizes, enableSorting, autoResetPageIndex, emptyTableText, columnVisibility: columnVisibilityState, }: TableProps<TData>): JSX.Element;
218
+ export declare function AppTable<TData extends RowData>({ data, columns, actions, allowSelect, getRowId, getRowState, getRowClassName, rowClicked, rowHref, initialPageSize, initialSorting, pageSizes, enableSorting, autoResetPageIndex, emptyTableText, columnVisibility: columnVisibilityState, enableSearch, }: TableProps<TData>): JSX.Element;
170
219
 
171
220
  export declare type AppTableFeatures = typeof appTableFeatures;
172
221
 
@@ -221,11 +270,14 @@ export declare type ArrayValue<T = Primitive> = Value<T>[];
221
270
 
222
271
  export declare type BIB = Brand<number, 'bib'>;
223
272
 
273
+ declare type BooleanOp = "and" | "or" | "xor" | "not";
274
+
224
275
  /**
225
- * Mirrors the backend's `domain_id!` newtype IDs (graphite-engine/src/domain_id.rs) so distinct ID
226
- * kinds can't be mixed up on the frontend either. Every type here must match the name of a
227
- * `#/components/schemas/<Name>` entry in the OpenAPI schema - see the `DOMAIN_ID_NAMES` redirect in
228
- * generate-openapi-types.js, which points the generated schema types at these instead of `number`/`string`.
276
+ * Mirrors the backend's `domain_id!` newtype IDs so distinct ID kinds can't be mixed up on the frontend either. Every
277
+ * type here must match the name of a `#/components/schemas/<Name>` entry in the OpenAPI schema - see the
278
+ * `DOMAIN_ID_NAMES` redirect in generate-openapi-types.js, which points the generated schema types at these instead of
279
+ * `number`/`string`. The ids graphite-wasm exports (EventId, FormatId, ...) are not here: they come from
280
+ * graphite_wasm.d.ts, branded the same way.
229
281
  */
230
282
  export declare type Brand<T, B> = T & {
231
283
  readonly __brand: B;
@@ -234,13 +286,15 @@ export declare type Brand<T, B> = T & {
234
286
  /** Stable reference — a new inline `select` on every `queryOptions()` call makes React Query re-select each render. */
235
287
  export declare function buildCompetitorsMapped(competitors: CompetitorDAO[]): CompetitorsMapped;
236
288
 
237
- export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspaceId" | "/workspace/:workspaceId/event/:eventId" | "/download" | "/login" | "/register" | "/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/lineage" | "/workspace/:workspaceId/event/:eventId/create-game" | "/workspace/:workspaceId/event/:eventId/game/:gameId" | "/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: {
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: {
238
290
  '/': undefined;
239
291
  '/download': undefined;
240
292
  '/login': QuerySchema< {
241
293
  readonly returnTo: OptionalQueryField<ReturnPath>;
242
294
  }>;
243
- '/register': undefined;
295
+ '/register': QuerySchema< {
296
+ readonly returnTo: OptionalQueryField<ReturnPath>;
297
+ }>;
244
298
  '/preferences': undefined;
245
299
  '/crate-workspace': undefined;
246
300
  '/workspace/:workspaceId': undefined;
@@ -253,6 +307,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
253
307
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
254
308
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
255
309
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
310
+ readonly name: OptionalQueryField<string>;
311
+ readonly template: OptionalQueryField<FormatId>;
312
+ readonly place: OptionalQueryField<GamePlace>;
256
313
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
257
314
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
258
315
  }>;
@@ -265,6 +322,12 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
265
322
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
266
323
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
267
324
  }>;
325
+ '/workspace/:workspaceId/event/:eventId/simplified': QuerySchema< {
326
+ /** Applied once, e.g. for a format just created to be used as a game. */
327
+ readonly addGame: OptionalQueryField<AddGameEdit>;
328
+ readonly focusNode: RepeatedQueryField<FormatNodeId>;
329
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
330
+ }>;
268
331
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
269
332
  readonly game: OptionalQueryField<GameId>;
270
333
  readonly table: OptionalQueryField<TableId>;
@@ -277,6 +340,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
277
340
  }>;
278
341
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
279
342
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
343
+ '/workspace/:workspaceId/event/:eventId/create-table': undefined;
280
344
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
281
345
  '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
282
346
  '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
@@ -290,7 +354,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
290
354
  '/login': QuerySchema< {
291
355
  readonly returnTo: OptionalQueryField<ReturnPath>;
292
356
  }>;
293
- '/register': undefined;
357
+ '/register': QuerySchema< {
358
+ readonly returnTo: OptionalQueryField<ReturnPath>;
359
+ }>;
294
360
  '/preferences': undefined;
295
361
  '/crate-workspace': undefined;
296
362
  '/workspace/:workspaceId': undefined;
@@ -303,6 +369,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
303
369
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
304
370
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
305
371
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
372
+ readonly name: OptionalQueryField<string>;
373
+ readonly template: OptionalQueryField<FormatId>;
374
+ readonly place: OptionalQueryField<GamePlace>;
306
375
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
307
376
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
308
377
  }>;
@@ -315,6 +384,12 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
315
384
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
316
385
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
317
386
  }>;
387
+ '/workspace/:workspaceId/event/:eventId/simplified': QuerySchema< {
388
+ /** Applied once, e.g. for a format just created to be used as a game. */
389
+ readonly addGame: OptionalQueryField<AddGameEdit>;
390
+ readonly focusNode: RepeatedQueryField<FormatNodeId>;
391
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
392
+ }>;
318
393
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
319
394
  readonly game: OptionalQueryField<GameId>;
320
395
  readonly table: OptionalQueryField<TableId>;
@@ -327,6 +402,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
327
402
  }>;
328
403
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
329
404
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
405
+ '/workspace/:workspaceId/event/:eventId/create-table': undefined;
330
406
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
331
407
  '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
332
408
  '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
@@ -336,9 +412,27 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
336
412
  '*': undefined;
337
413
  }[Path] ? T extends AnyQuerySchema ? [query?: QueryInput<T> | undefined] : [] : never : never) => string;
338
414
 
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';
417
+
418
+ declare type ChildrenSpec = { type: "disallowed" } | { type: "allowed" } | { type: "closure"; signature: NodeSignature<Type> };
419
+
339
420
  export declare type ClassDAO = components['schemas']['ClassDAO'];
340
421
 
341
- export declare type ClassId = Brand<string, 'classId'>;
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
+ /**
432
+ * Identifies a class. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
433
+ * Deserializing one only yields a reference to an existing class; it does not check that it exists.
434
+ */
435
+ export declare type ClassId = string & { readonly __brand: 'classId' };
342
436
 
343
437
  export declare type ClassResponse = components['schemas']['ClassResponse'];
344
438
 
@@ -346,6 +440,8 @@ declare type CommonApiKeyId = Brand<number, 'commonApiKeyId'>;
346
440
 
347
441
  export declare type CommonWorkspaceId = WorkspaceRootId | WorkspaceSelfHostedId;
348
442
 
443
+ declare type ComparisonOp = "greater" | "less" | "greater-equals" | "less-equals" | "equals" | "not-equals";
444
+
349
445
  export declare type CompetitorDAO = components['schemas']['CompetitorDAO'];
350
446
 
351
447
  export declare type CompetitorId = Brand<number, 'competitorId'>;
@@ -358,6 +454,22 @@ export declare const CompetitorNameLineSpacer: FC<{
358
454
  className?: string;
359
455
  }>;
360
456
 
457
+ /**
458
+ * Two rows of the same competitor met in one table.
459
+ */
460
+ declare interface CompetitorNotUniqueError {
461
+ competitorId: number;
462
+ /**
463
+ * Where the row that came first comes from, see [crate::Origin::trails]. The steps of the node that failed are not
464
+ * attributed yet.
465
+ */
466
+ first: Trail[];
467
+ /**
468
+ * Where the row that clashed with it comes from.
469
+ */
470
+ second: Trail[];
471
+ }
472
+
361
473
  /**
362
474
  * Shows which competitor is picked and lets the user pick another one.
363
475
  */
@@ -382,11 +494,14 @@ export declare type CompetitorSelectorProps<IsRequired extends boolean = false>
382
494
 
383
495
  export declare interface CompetitorsMapped {
384
496
  byId: Map<CompetitorId, CompetitorDAO>;
497
+ /** Leaves out the competitors without a bib. */
385
498
  byBib: Map<BIB, CompetitorDAO>;
386
499
  }
387
500
 
388
501
  export declare type CompetitorType = components['schemas']['CompetitorType'];
389
502
 
503
+ declare type CompetitorType_2 = "individual" | "team";
504
+
390
505
  declare interface components {
391
506
  schemas: {
392
507
  APIKeyPathVariables: {
@@ -414,19 +529,8 @@ declare interface components {
414
529
  classId: components["schemas"]["ClassId"];
415
530
  eventId: components["schemas"]["EventId"];
416
531
  };
417
- AddClassesMutation: {
418
- classDtos: components["schemas"]["ClassDTO"][];
419
- eventId: components["schemas"]["EventId"];
420
- /**
421
- * @description The classes get ids derived from it, see [ClassId::nth_of_seed]. Random, picked by the endpoint; reusing a seed
422
- * reproduces the same ids.
423
- */
424
- idSeed: components["schemas"]["Seed"];
425
- };
426
532
  /** @description <C extends {}, P extends Primitive, S extends Sorted|Unsorted>(Table<C, S>, P) -> (Table<C & {<self.key>: P}, S>) */
427
- AddColumnsNode: {
428
- columns: string[];
429
- };
533
+ AddColumnsNode: AddColumnsNode;
430
534
  AddCompetitorsMutation: {
431
535
  competitorDtos: components["schemas"]["CompetitorDTO"][];
432
536
  competitorType: components["schemas"]["CompetitorType"];
@@ -481,9 +585,7 @@ declare interface components {
481
585
  variant: components["schemas"]["TableVariant"];
482
586
  };
483
587
  /** @description <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1}) */
484
- AddRecordFieldsNode: {
485
- fields: string[];
486
- };
588
+ AddRecordFieldsNode: AddRecordFieldsNode;
487
589
  AddTarget: {
488
590
  backendUrl: string;
489
591
  /** @description Replicate into this existing remote workspace instead of creating a new one. */
@@ -532,10 +634,23 @@ declare interface components {
532
634
  * Later dependencies expect earlier ones to exist.
533
635
  */
534
636
  dependencies: components["schemas"]["Archive"][];
535
- /** Format: uuid */
637
+ /**
638
+ * Format: uint32
639
+ * @description Always [ENGINE_VERSION]: deserializing migrates older archives.
640
+ */
641
+ engineVersion: number;
642
+ /**
643
+ * Format: uuid
644
+ * @description The template the entry belongs to: installing it links the entity to it and reuses the entity of the event
645
+ * 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].
647
+ */
648
+ templateOrigin?: string | null;
649
+ /**
650
+ * Format: uuid
651
+ * @description Identifies the entry within the archive, see [Wiring]. Importing derives the ids of the entities from it.
652
+ */
536
653
  uuid: string;
537
- /** @description The version of the archive system at time of creation of this archive. */
538
- writtenWithVersion: components["schemas"]["SemVer"];
539
654
  };
540
655
  ArchiveData: {
541
656
  /** @constant */
@@ -573,9 +688,9 @@ declare interface components {
573
688
  type: "group";
574
689
  };
575
690
  /** @enum {string} */
576
- ArithmeticOperator: "add" | "subtract";
691
+ ArithmeticOperator: ArithmeticOperator;
577
692
  ArrayValue_for_Primitive: ArrayValue<Primitive>;
578
- ArrayValue_for_SerializableNonPrimitiveValue: components["schemas"]["Value_for_SerializableNonPrimitiveValue"][];
693
+ ArrayValue_for_SerializableNonPrimitiveValue: ArrayValue<SerializableNonPrimitiveValue>;
579
694
  AuthScope: {
580
695
  /** @constant */
581
696
  type: "general";
@@ -600,28 +715,10 @@ declare interface components {
600
715
  BIB: BIB;
601
716
  BibNotUniqueError: components["schemas"]["BIB"];
602
717
  /** @enum {string} */
603
- BooleanOp: "and" | "or" | "xor" | "not";
604
- CatchDqNode: {
605
- /**
606
- * @description The node has one output per catch key, in order. The strategy decides how multiple
607
- * caught tables of the same key get merged.
608
- */
609
- catches: {
610
- [key: string]: components["schemas"]["MultiplexingStrategy"];
611
- };
612
- };
613
- ChildrenSpec: {
614
- /** @constant */
615
- type: "disallowed";
616
- } | {
617
- /** @constant */
618
- type: "allowed";
619
- } | {
620
- /** @constant */
621
- type: "closure";
622
- /** @description The signature that the inner closure must adhere to. */
623
- signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
624
- };
718
+ BooleanOp: BooleanOp;
719
+ /** @description The [CICManagedState] of a relation that is a membership, so all but `DeletedByUser`. */
720
+ CICMembershipState: "added-by-user" | "automation";
721
+ ChildrenSpec: ChildrenSpec;
625
722
  ClassAutomationDTO: {
626
723
  /** @constant */
627
724
  type: "age";
@@ -654,7 +751,7 @@ declare interface components {
654
751
  ClassAutomationScriptError: {
655
752
  /** @constant */
656
753
  type: "parse-error";
657
- data: components["schemas"]["ParseError"];
754
+ data: components["schemas"]["ExpressionParseError"];
658
755
  } | {
659
756
  /** @constant */
660
757
  type: "type-errors";
@@ -669,6 +766,9 @@ declare interface components {
669
766
  attributes: components["schemas"]["RecordValue_for_Primitive"];
670
767
  automationScript?: components["schemas"]["ClassAutomationScript"] | null;
671
768
  automationScriptError?: components["schemas"]["ClassAutomationScriptError"] | null;
769
+ customData: {
770
+ [key: string]: string;
771
+ };
672
772
  eventId: components["schemas"]["EventId"];
673
773
  gender: components["schemas"]["ClassGender"];
674
774
  id: components["schemas"]["ClassId"];
@@ -682,6 +782,9 @@ declare interface components {
682
782
  description: string;
683
783
  attributes: components["schemas"]["RecordValue_for_Primitive"];
684
784
  automation?: components["schemas"]["ClassAutomationDTO"] | null;
785
+ customData?: {
786
+ [key: string]: string;
787
+ };
685
788
  gender: components["schemas"]["ClassGender"];
686
789
  name: string;
687
790
  state: components["schemas"]["TableState"];
@@ -711,8 +814,7 @@ declare interface components {
711
814
  ClassGender: "female-only" | "male-only" | "all-genders";
712
815
  /**
713
816
  * Format: uuid
714
- * @description Identifies a class. Random ([Self::new_random]) from the endpoint, [Self::nth_of_seed] for `AddClassesMutation`,
715
- * or derived by `ImportArchiveMutation`.
817
+ * @description Identifies a class. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
716
818
  * Deserializing one only yields a reference to an existing class; it does not check that it exists.
717
819
  */
718
820
  ClassId: ClassId;
@@ -737,19 +839,27 @@ declare interface components {
737
839
  * multiple: ('roundrobin' | 'serpentine' | 'concat', ...Class) -> (Table<{}, Sorted>)
738
840
  * ```
739
841
  */
740
- ClassesCompetitorsNode: null;
842
+ ClassesCompetitorsNode: ClassesCompetitorsNode;
741
843
  /** Format: int64 */
742
844
  CommonApiKeyId: CommonApiKeyId;
743
- /** Format: int64 */
744
845
  CommonWorkspaceId: CommonWorkspaceId;
745
846
  /** @enum {string} */
746
- ComparisonOp: "greater" | "less" | "greater-equals" | "less-equals" | "equals" | "not-equals";
847
+ ComparisonOp: ComparisonOp;
747
848
  CompetitorDAO: {
748
849
  attributes: components["schemas"]["RecordValue_for_Primitive"];
749
- bib: components["schemas"]["BIB"];
850
+ /** @description Unique among the competitors of the event that have one. */
851
+ bib?: components["schemas"]["BIB"] | null;
750
852
  birthdate?: string | null;
751
853
  /** @description The competitor_type MUST NEVER be altered after creation. */
752
854
  competitorType: components["schemas"]["CompetitorType"];
855
+ customData: {
856
+ [key: string]: string;
857
+ };
858
+ /**
859
+ * @description Nodes that bring the competitors of the event into the graph (event competitors, classes) leave disabled
860
+ * competitors out, everything else treats them as usual.
861
+ */
862
+ enabled: boolean;
753
863
  eventId: components["schemas"]["EventId"];
754
864
  firstName?: string | null;
755
865
  /** @description Genders are `"f"`, `"m"`, or any other string stored in SQLite. */
@@ -762,8 +872,14 @@ declare interface components {
762
872
  };
763
873
  CompetitorDTO: {
764
874
  attributes: components["schemas"]["RecordValue_for_Primitive"];
765
- bib: components["schemas"]["BIB"];
875
+ /** @description See [CompetitorDAO::bib]. */
876
+ bib?: components["schemas"]["BIB"] | null;
766
877
  birthdate?: string | null;
878
+ customData?: {
879
+ [key: string]: string;
880
+ };
881
+ /** @description See [CompetitorDAO::enabled]. Missing means enabled. */
882
+ enabled?: boolean;
767
883
  firstName?: string | null;
768
884
  gender?: components["schemas"]["Gender"] | null;
769
885
  lastName?: string | null;
@@ -779,6 +895,7 @@ declare interface components {
779
895
  CompetitorInClassDTO: {
780
896
  classId: components["schemas"]["ClassId"];
781
897
  competitorId: components["schemas"]["CompetitorId"];
898
+ managedState: components["schemas"]["CICMembershipState"];
782
899
  /** Format: int64 */
783
900
  place: number;
784
901
  };
@@ -789,15 +906,15 @@ declare interface components {
789
906
  teamId: components["schemas"]["CompetitorId"];
790
907
  to?: string | null;
791
908
  };
792
- /** Format: int64 */
793
- CompetitorNotUniqueError: number;
909
+ /** @description Two rows of the same competitor met in one table. */
910
+ CompetitorNotUniqueError: CompetitorNotUniqueError;
794
911
  CompetitorPathVariables_for_CommonWorkspaceId: {
795
912
  competitorId: components["schemas"]["CompetitorId"];
796
913
  eventId: components["schemas"]["EventId"];
797
914
  workspaceId: components["schemas"]["CommonWorkspaceId"];
798
915
  };
799
916
  /** @enum {string} */
800
- CompetitorType: "individual" | "team";
917
+ CompetitorType: CompetitorType_2;
801
918
  CompetitorTypeQuery: {
802
919
  competitorType: components["schemas"]["CompetitorType"];
803
920
  };
@@ -872,14 +989,7 @@ declare interface components {
872
989
  * Besides the infer keyword, works almost exactly like conditional types in typescript.
873
990
  * Checkout [this doc](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html) for a good guide on the ts conditionals.
874
991
  */
875
- Conditional_for_Type_and_ErasedScopedTypeRef_for_Type: {
876
- /** @description @todo */
877
- infer: components["schemas"]["LocalParamID"][];
878
- tElse: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
879
- tTest: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
880
- tTestBound: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
881
- tThen: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
882
- };
992
+ Conditional_for_Type_and_ErasedScopedTypeRef_for_Type: Conditional<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
883
993
  /**
884
994
  * @description Represents the following: `t_test` extends `t_test_bound` ? `t_then` : `t_else`
885
995
  * Besides the infer keyword, works almost exactly like conditional types in typescript.
@@ -906,12 +1016,7 @@ declare interface components {
906
1016
  data: string;
907
1017
  };
908
1018
  /** @description A pin that reroutes a connection */
909
- ConnectionPin: {
910
- /** Format: int64 */
911
- x: number;
912
- /** Format: int64 */
913
- y: number;
914
- };
1019
+ ConnectionPin: ConnectionPin;
915
1020
  /** @description Contact information for the exposed API. */
916
1021
  Contact: {
917
1022
  /**
@@ -976,6 +1081,52 @@ declare interface components {
976
1081
  };
977
1082
  /** @enum {string} */
978
1083
  CustomControl: "sort-criterion";
1084
+ CustomDataEntity: {
1085
+ /** @constant */
1086
+ type: "game";
1087
+ id: components["schemas"]["GameId"];
1088
+ } | {
1089
+ /** @constant */
1090
+ type: "game-format";
1091
+ id: components["schemas"]["GameFormatId"];
1092
+ } | {
1093
+ /** @constant */
1094
+ type: "format";
1095
+ id: components["schemas"]["FormatId"];
1096
+ } | {
1097
+ /** @constant */
1098
+ type: "event";
1099
+ id: components["schemas"]["EventId"];
1100
+ } | {
1101
+ /** @constant */
1102
+ type: "competitor";
1103
+ id: components["schemas"]["CompetitorId"];
1104
+ } | {
1105
+ /** @constant */
1106
+ type: "class";
1107
+ id: components["schemas"]["ClassId"];
1108
+ } | {
1109
+ /** @constant */
1110
+ type: "format-group";
1111
+ id: components["schemas"]["FormatGroupId"];
1112
+ } | {
1113
+ /** @constant */
1114
+ type: "format-node";
1115
+ id: components["schemas"]["FormatNodeId"];
1116
+ };
1117
+ /**
1118
+ * @description Auto-generated discriminant enum variants
1119
+ * @enum {string}
1120
+ */
1121
+ CustomDataEntityType: "game" | "game-format" | "format" | "event" | "competitor" | "class" | "format-group" | "format-node";
1122
+ CustomDataPathVariables_for_CommonWorkspaceId: {
1123
+ entity: components["schemas"]["CustomDataEntityType"];
1124
+ eventId: components["schemas"]["EventId"];
1125
+ /** @description The id of the entity, which belongs to the event of the path. For `event`, the id of that event. */
1126
+ id: string;
1127
+ key: string;
1128
+ workspaceId: components["schemas"]["CommonWorkspaceId"];
1129
+ };
979
1130
  DayAndMonth: {
980
1131
  /**
981
1132
  * Format: uint8
@@ -1206,11 +1357,9 @@ declare interface components {
1206
1357
  DetailedSupertypeDiagnostics_for_Type: DetailedSupertypeDiagnostics<Type>;
1207
1358
  /**
1208
1359
  * @description Disqualifies every row of the table it receives, throwing them all under `key` so that a
1209
- * [`CatchDqNode`](super::catch_dq_node::CatchDqNode) further up the graph can collect them.
1360
+ * [`GroupNode`](super::group_node::GroupNode) further up the graph can collect them.
1210
1361
  */
1211
- DisqualifyNode: {
1212
- key: components["schemas"]["DqKey"];
1213
- };
1362
+ DisqualifyNode: DisqualifyNode;
1214
1363
  /** @description The rows of one side after the common row. */
1215
1364
  DivergedRows: {
1216
1365
  /** Format: int64 */
@@ -1224,9 +1373,13 @@ declare interface components {
1224
1373
  source: components["schemas"]["DivergedRows"];
1225
1374
  target: components["schemas"]["DivergedRows"];
1226
1375
  };
1227
- DqKey: string;
1376
+ /** @description What a node does by default with a disqualification it can throw. */
1377
+ DqDefaultStrategy: DqDefaultStrategy;
1378
+ DqKey: DqKey;
1379
+ /** @description What a format or game format says about one of its disqualification kinds. */
1380
+ DqSettings: DqSettings;
1228
1381
  /** @description Decides how caught disqualifications are surfaced. */
1229
- DqStrategy: "output-placed" | "output-unplaced" | "append-placed" | "append-unplaced";
1382
+ DqStrategy: DqStrategy;
1230
1383
  /**
1231
1384
  * @description How functions that combine tables from multiple competitor sources (e.g. merging or
1232
1385
  * concatenating) should treat a competitor that appears in more than one of them.
@@ -1240,11 +1393,6 @@ declare interface components {
1240
1393
  */
1241
1394
  nodeUuidSeed: components["schemas"]["Seed"];
1242
1395
  };
1243
- DuplicateGameFormatMutation: {
1244
- /** @description The id of the new copy, see [GameFormatId::new_random]. It must not exist yet. */
1245
- copyId: components["schemas"]["GameFormatId"];
1246
- gameFormatId: components["schemas"]["GameFormatId"];
1247
- };
1248
1396
  /** @description A single encoding definition applied to a single schema property. */
1249
1397
  Encoding: {
1250
1398
  /**
@@ -1376,27 +1524,14 @@ declare interface components {
1376
1524
  /** @description Auto-generated discriminant enum variants */
1377
1525
  EntityChangeEventDiscriminants: ("Event" | "Game" | "Table" | "GameFormat" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "FormatTest" | "Log" | "ContentInEventFolder") | "CompetitorInTeam" | "CompetitorInClass";
1378
1526
  /** @description A scope portal that used to be there but got removed in order to be serializable */
1379
- ErasedScopedTypeRef_for_Type: {
1380
- /** @constant */
1381
- type: "Param";
1382
- data: components["schemas"]["ParamRef"];
1383
- } | {
1384
- /** @constant */
1385
- type: "ScopedExpr";
1386
- data: {
1387
- expr: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
1388
- };
1389
- };
1390
- EventCompetitorsNode: components["schemas"]["CompetitorType"];
1527
+ ErasedScopedTypeRef_for_Type: ErasedScopedTypeRef<Type>;
1528
+ EventCompetitorsNode: EventCompetitorsNode;
1391
1529
  EventDAO: {
1392
1530
  description: string;
1393
1531
  attributes: components["schemas"]["RecordValue_for_Primitive"];
1394
- /**
1395
- * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
1396
- * concatenating) should error or silently drop rows when they encounter the same competitor
1397
- * more than once.
1398
- */
1399
- duplicateCompetitorPolicy: components["schemas"]["DuplicateCompetitorPolicy"];
1532
+ customData: {
1533
+ [key: string]: string;
1534
+ };
1400
1535
  /** Format: date */
1401
1536
  endDate?: string | null;
1402
1537
  id: components["schemas"]["EventId"];
@@ -1408,37 +1543,38 @@ declare interface components {
1408
1543
  * action should always be to create and set the root format.
1409
1544
  */
1410
1545
  rootFormatId?: components["schemas"]["FormatId"] | null;
1546
+ settings: components["schemas"]["EventSettings"];
1411
1547
  /**
1412
1548
  * Format: date
1413
1549
  * @description Updating this requires updating classes as well.
1414
1550
  */
1415
1551
  startDate: string;
1416
1552
  teamCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1417
- /** @description Enables tooling for trying out an event with generated data. */
1418
- testMode: boolean;
1419
1553
  };
1420
1554
  EventDTO: {
1421
1555
  /** @default */
1422
1556
  description: string;
1423
1557
  attributes: components["schemas"]["RecordValue_for_Primitive"];
1424
1558
  /**
1425
- * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
1426
- * concatenating) should error or silently drop rows when they encounter the same competitor
1427
- * more than once.
1428
- * @default error
1559
+ * @description The key `ui:test-mode` ([TEST_MODE_KEY]) set to `"true"` enables tooling for trying out the event with
1560
+ * generated data.
1429
1561
  */
1430
- duplicateCompetitorPolicy: components["schemas"]["DuplicateCompetitorPolicy"];
1562
+ customData?: {
1563
+ [key: string]: string;
1564
+ };
1431
1565
  endDate?: string | null;
1432
1566
  individualCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1433
1567
  name: string;
1568
+ /**
1569
+ * @default {
1570
+ * "duplicateCompetitorPolicy": "error",
1571
+ * "invalidLinkedFormatPolicy": "last-known-table"
1572
+ * }
1573
+ */
1574
+ settings: components["schemas"]["EventSettings"];
1434
1575
  /** @description The start date might be used for calculating the competitors age. */
1435
1576
  startDate: string;
1436
1577
  teamCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1437
- /**
1438
- * @description Enables tooling for trying out an event with generated data.
1439
- * @default false
1440
- */
1441
- testMode: boolean;
1442
1578
  };
1443
1579
  /**
1444
1580
  * Format: uuid
@@ -1533,6 +1669,21 @@ declare interface components {
1533
1669
  rows: components["schemas"]["EventLineageRow"][];
1534
1670
  tableId: components["schemas"]["TableId"];
1535
1671
  };
1672
+ /** @description Settings of an event that change how its formats execute. Missing fields get their defaults. */
1673
+ EventSettings: {
1674
+ /**
1675
+ * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
1676
+ * concatenating) should error or silently drop rows when they encounter the same competitor
1677
+ * more than once.
1678
+ * @default error
1679
+ */
1680
+ duplicateCompetitorPolicy: components["schemas"]["DuplicateCompetitorPolicy"];
1681
+ /**
1682
+ * @description What an InputTableNode returns when the format of its linked result table node is invalid.
1683
+ * @default last-known-table
1684
+ */
1685
+ invalidLinkedFormatPolicy: components["schemas"]["InvalidLinkedFormatPolicy"];
1686
+ };
1536
1687
  Example: {
1537
1688
  /**
1538
1689
  * @description Long description for the example.
@@ -1559,6 +1710,10 @@ declare interface components {
1559
1710
  } & {
1560
1711
  [key: string]: unknown;
1561
1712
  };
1713
+ ExpressionParseError: {
1714
+ kind: components["schemas"]["ParseErrorKind"];
1715
+ location: components["schemas"]["SourceLocation"];
1716
+ };
1562
1717
  ExtensionChangeEvent: ({
1563
1718
  /** @constant */
1564
1719
  type: "added";
@@ -1607,6 +1762,8 @@ declare interface components {
1607
1762
  /** Format: date-time */
1608
1763
  updatedAt?: string | null;
1609
1764
  };
1765
+ /** @description A value of the local store or the extension store, at most 64 KiB. */
1766
+ ExtensionValue: string;
1610
1767
  /** @description Allows referencing an external resource for extended documentation. */
1611
1768
  ExternalDocumentation: {
1612
1769
  /**
@@ -1622,18 +1779,7 @@ declare interface components {
1622
1779
  } & {
1623
1780
  [key: string]: unknown;
1624
1781
  };
1625
- ExtractRecordFieldError_for_Primitive: {
1626
- /** @constant */
1627
- type: "field-does-not-exist";
1628
- data: string;
1629
- } | {
1630
- /** @constant */
1631
- type: "invalid-type";
1632
- data: {
1633
- field: string;
1634
- value?: components["schemas"]["Value_for_Primitive"] | null;
1635
- };
1636
- };
1782
+ ExtractRecordFieldError_for_Primitive: ExtractRecordFieldError<Primitive>;
1637
1783
  FieldTypeWithDefault: FieldTypeWithDefault;
1638
1784
  FolderContent: {
1639
1785
  classIds: components["schemas"]["ClassId"][];
@@ -1649,18 +1795,22 @@ declare interface components {
1649
1795
  data: components["schemas"]["GameWithTables"];
1650
1796
  });
1651
1797
  FolderPath: string[];
1652
- FormatConnectionDTO: {
1653
- pins: components["schemas"]["ConnectionPin"][];
1654
- sourceFormatNodeId: components["schemas"]["FormatNodeId"];
1655
- sourceOutput: components["schemas"]["OutputIdx"];
1656
- targetFormatNodeId: components["schemas"]["FormatNodeId"];
1657
- targetInput: components["schemas"]["InputIdx"];
1658
- };
1798
+ FormatConnectionDTO: FormatConnectionDTO;
1659
1799
  FormatDAO: {
1660
1800
  description: string;
1661
1801
  category: components["schemas"]["NodeCategory"];
1662
- /** @default [] */
1663
- disqualificationKinds: components["schemas"]["DqKey"][];
1802
+ /**
1803
+ * @description Whether the format or a child format at any depth contains a game node. Derived from the nodes, not stored.
1804
+ * @default false
1805
+ */
1806
+ containsGames: boolean;
1807
+ customData: {
1808
+ [key: string]: string;
1809
+ };
1810
+ /** @default {} */
1811
+ disqualificationKinds: {
1812
+ [key: string]: components["schemas"]["DqSettings"];
1813
+ };
1664
1814
  /** @description The default values in here are not guaranteed to be valid for the signature. */
1665
1815
  docs: components["schemas"]["NodeVariantDoc"];
1666
1816
  errors: components["schemas"]["FormatValidationError"][];
@@ -1669,6 +1819,13 @@ declare interface components {
1669
1819
  id: components["schemas"]["FormatId"];
1670
1820
  name: string;
1671
1821
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1822
+ /**
1823
+ * @default {
1824
+ * "nodes": {},
1825
+ * "sections": []
1826
+ * }
1827
+ */
1828
+ simplifiedView: components["schemas"]["SimplifiedView"];
1672
1829
  /** Format: uuid */
1673
1830
  templateOrigin?: string | null;
1674
1831
  valid: components["schemas"]["FormatValidity"];
@@ -1681,12 +1838,18 @@ declare interface components {
1681
1838
  /** @default */
1682
1839
  description: string;
1683
1840
  connections: components["schemas"]["FormatConnectionDTO"][];
1841
+ customData?: {
1842
+ [key: string]: string;
1843
+ };
1684
1844
  /**
1685
1845
  * @description All disqualifications that can escape this format. Like checked exceptions, every
1686
1846
  * uncaught disqualification has to be declared and every declared one has to be throwable.
1687
- * @default []
1847
+ * Accepts the plain list of keys of older versions.
1848
+ * @default {}
1688
1849
  */
1689
- disqualificationKinds: components["schemas"]["DqKey"][];
1850
+ disqualificationKinds: {
1851
+ [key: string]: components["schemas"]["DqSettings"];
1852
+ };
1690
1853
  /** @description There must be docs for every input and output. Otherwise formats get rejected. */
1691
1854
  docs: components["schemas"]["NodeVariantDoc"];
1692
1855
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
@@ -1697,6 +1860,7 @@ declare interface components {
1697
1860
  * Otherwise the signature will get inferred.
1698
1861
  */
1699
1862
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1863
+ simplifiedView?: components["schemas"]["SimplifiedView"];
1700
1864
  };
1701
1865
  FormatError: {
1702
1866
  /** @constant */
@@ -1746,6 +1910,9 @@ declare interface components {
1746
1910
  };
1747
1911
  FormatGroupDAO: {
1748
1912
  category: components["schemas"]["NodeCategory"];
1913
+ customData: {
1914
+ [key: string]: string;
1915
+ };
1749
1916
  eventId: components["schemas"]["EventId"];
1750
1917
  id: components["schemas"]["FormatGroupId"];
1751
1918
  name: string;
@@ -1754,6 +1921,9 @@ declare interface components {
1754
1921
  };
1755
1922
  FormatGroupDTO: {
1756
1923
  category: components["schemas"]["NodeCategory"];
1924
+ customData?: {
1925
+ [key: string]: string;
1926
+ };
1757
1927
  name: string;
1758
1928
  };
1759
1929
  /**
@@ -1850,6 +2020,9 @@ declare interface components {
1850
2020
  controlValues: {
1851
2021
  [key: string]: components["schemas"]["Value_for_Primitive"];
1852
2022
  };
2023
+ customData: {
2024
+ [key: string]: string;
2025
+ };
1853
2026
  formatId: components["schemas"]["FormatId"];
1854
2027
  /** @description When not yet persisted, this is a negative number unique to the graph */
1855
2028
  id: components["schemas"]["FormatNodeId"];
@@ -1862,7 +2035,6 @@ declare interface components {
1862
2035
  * be the array varg type input.
1863
2036
  */
1864
2037
  inputVargsToArray: boolean;
1865
- /** @description Must always be formatted as serde formats in the db, because [Self::find_by_event_and_type] relies on that. */
1866
2038
  nodeType: components["schemas"]["NodeType"];
1867
2039
  /**
1868
2040
  * @description Only legal if the nodes outputs are variadic.
@@ -1888,31 +2060,7 @@ declare interface components {
1888
2060
  yPos: number;
1889
2061
  };
1890
2062
  /** @description For documentation about the node struct, checkout the docs for FormatNodeDAO. */
1891
- FormatNodeDTO: {
1892
- controlValues: {
1893
- [key: string]: components["schemas"]["Value_for_Primitive"];
1894
- };
1895
- /**
1896
- * @description Any unique id works, including for new nodes: whether the id refers to a new or an
1897
- * existing node is determined by whether it already exists on the format, not by its value.
1898
- */
1899
- id: components["schemas"]["FormatNodeId"];
1900
- inputVargsToArray: boolean;
1901
- nodeType: components["schemas"]["NodeType"];
1902
- outputVargsToArray: boolean;
1903
- parentNodeId?: components["schemas"]["FormatNodeId"] | null;
1904
- settings: components["schemas"]["RecordValue_for_Primitive"];
1905
- /**
1906
- * @description Ignored for existing nodes, because a node's test id never changes. Defaults to the node id.
1907
- * @default null
1908
- */
1909
- testId: components["schemas"]["FormatNodeTestId"] | null;
1910
- typeHints: components["schemas"]["TypeHints_for_Type_and_ParamRef"];
1911
- /** Format: int64 */
1912
- xPos: number;
1913
- /** Format: int64 */
1914
- yPos: number;
1915
- };
2063
+ FormatNodeDTO: FormatNodeDTO;
1916
2064
  /** Format: uuid */
1917
2065
  FormatNodeId: FormatNodeId;
1918
2066
  /** @description The node `format_node_id` in the format instance `format_instance_id`. */
@@ -1976,6 +2124,10 @@ declare interface components {
1976
2124
  } | {
1977
2125
  /** @constant */
1978
2126
  type: "portal-has-input-connection";
2127
+ } | {
2128
+ /** @constant */
2129
+ type: "invalid-comment-link";
2130
+ data: components["schemas"]["FormatNodeId"];
1979
2131
  } | {
1980
2132
  /** @constant */
1981
2133
  type: "parent-creates-cycle";
@@ -2187,108 +2339,9 @@ declare interface components {
2187
2339
  testFormatInstanceId: components["schemas"]["FormatInstanceHash"];
2188
2340
  };
2189
2341
  /** @description Represents a state in which the format is not valid for execution but can be stored in the db. */
2190
- FormatValidationError: {
2191
- /** @constant */
2192
- type: "uncaught-throw";
2193
- data: {
2194
- [key: string]: components["schemas"]["RowTypeHelper_for_ParamRef"][];
2195
- };
2196
- } | {
2197
- /** @constant */
2198
- type: "unthrown-disqualification-kinds";
2199
- data: components["schemas"]["DqKey"][];
2200
- } | {
2201
- /** @constant */
2202
- type: "root-format-with-disqualification-kinds";
2203
- } | {
2204
- /** @constant */
2205
- type: "graph-is-cyclic";
2206
- } | {
2207
- /** @constant */
2208
- type: "too-many-inputs";
2209
- data: components["schemas"]["ParentType"];
2210
- } | {
2211
- /** @constant */
2212
- type: "too-many-outputs";
2213
- data: components["schemas"]["ParentType"];
2214
- } | {
2215
- /** @constant */
2216
- type: "invalid-node";
2217
- data: [
2218
- components["schemas"]["FormatNodeId"],
2219
- components["schemas"]["InvalidNodeReason"]
2220
- ];
2221
- } | {
2222
- /** @constant */
2223
- type: "too-many-closure-inputs";
2224
- } | {
2225
- /** @constant */
2226
- type: "root-format-with-input-or-output";
2227
- } | {
2228
- /** @constant */
2229
- type: "child-format-is-invalid";
2230
- data: components["schemas"]["FormatId"];
2231
- } | {
2232
- /** @constant */
2233
- type: "root-format-referenced";
2234
- data: components["schemas"]["FormatId"];
2235
- } | {
2236
- /** @constant */
2237
- type: "cyclic-parent-relation";
2238
- data: components["schemas"]["FormatNodeId"][];
2239
- } | {
2240
- /** @constant */
2241
- type: "illegal-child";
2242
- data: components["schemas"]["FormatNodeId"];
2243
- } | {
2244
- /** @constant */
2245
- type: "parent-connected-to-child";
2246
- data: {
2247
- child: components["schemas"]["FormatNodeId"];
2248
- parent: components["schemas"]["FormatNodeId"];
2249
- };
2250
- } | {
2251
- /** @constant */
2252
- type: "connection-escapes-scope";
2253
- data: {
2254
- scope: components["schemas"]["FormatNodeId"];
2255
- source: components["schemas"]["FormatNodeId"];
2256
- target: components["schemas"]["FormatNodeId"];
2257
- };
2258
- } | {
2259
- /** @constant */
2260
- type: "input-or-output-node-with-parent";
2261
- } | {
2262
- /** @constant */
2263
- type: "node-configuration-error";
2264
- data: components["schemas"]["NodeConfigurationError"];
2265
- } | {
2266
- /** @constant */
2267
- type: "cyclic-format-dependency";
2268
- } | {
2269
- /** @constant */
2270
- type: "type-validation-errors";
2271
- data: components["schemas"]["ValidationError_for_Type"][];
2272
- } | {
2273
- /** @constant */
2274
- type: "static-input-received-non-static-connection";
2275
- } | {
2276
- /** @constant */
2277
- type: "nodety-error";
2278
- data: components["schemas"]["NodetyError"];
2279
- } | {
2280
- /** @constant */
2281
- type: "format-of-other-event-referenced";
2282
- data: components["schemas"]["FormatId"];
2283
- } | {
2284
- /** @constant */
2285
- type: "invalid-signature";
2286
- } | {
2287
- /** @constant */
2288
- type: "missing-output-node";
2289
- };
2342
+ FormatValidationError: FormatValidationError;
2290
2343
  /** @enum {string} */
2291
- FormatValidity: "invalid" | "valid";
2344
+ FormatValidity: FormatValidity;
2292
2345
  FullFormatDAO: {
2293
2346
  format: components["schemas"]["FormatDAO"];
2294
2347
  connections: components["schemas"]["FormatNodeConnectionDAO"][];
@@ -2311,26 +2364,13 @@ declare interface components {
2311
2364
  formatInstanceId: components["schemas"]["FormatInstanceHash"];
2312
2365
  formatNodeId: components["schemas"]["FormatNodeId"];
2313
2366
  };
2314
- GTFilterKind: {
2315
- /** @constant */
2316
- type: "class-filter";
2317
- } | {
2318
- /** @constant */
2319
- type: "gender";
2320
- } | {
2321
- /** @constant */
2322
- type: "comparison-filter";
2323
- data: components["schemas"]["ComparisonOp"];
2324
- } | {
2325
- /** @constant */
2326
- type: "custom";
2327
- };
2367
+ GTFilterKind: GTFilterKind;
2328
2368
  GameDAO: {
2329
2369
  attributes: components["schemas"]["RecordValue_for_Primitive"];
2330
- eventId: components["schemas"]["EventId"];
2331
- extensionData: {
2370
+ customData: {
2332
2371
  [key: string]: string;
2333
2372
  };
2373
+ eventId: components["schemas"]["EventId"];
2334
2374
  /**
2335
2375
  * Format: uint32
2336
2376
  * @description The game depth of the game's entry table.
@@ -2344,7 +2384,7 @@ declare interface components {
2344
2384
  };
2345
2385
  GameDTO: {
2346
2386
  attributes: components["schemas"]["RecordValue_for_Primitive"];
2347
- extensionData: {
2387
+ customData?: {
2348
2388
  [key: string]: string;
2349
2389
  };
2350
2390
  gameFormatId: components["schemas"]["GameFormatId"];
@@ -2359,11 +2399,18 @@ declare interface components {
2359
2399
  GameFormatDAO: {
2360
2400
  description: string;
2361
2401
  attributesType: components["schemas"]["RecordTypeWithDefaults"];
2362
- entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2363
- eventId: components["schemas"]["EventId"];
2364
- extensionData: {
2402
+ customData: {
2365
2403
  [key: string]: string;
2366
2404
  };
2405
+ /**
2406
+ * @description Settings by disqualification kind. May hold kinds no automation disqualifies under. Kinds without an entry have
2407
+ * the default settings.
2408
+ */
2409
+ disqualifications?: {
2410
+ [key: string]: components["schemas"]["DqSettings"];
2411
+ };
2412
+ entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2413
+ eventId: components["schemas"]["EventId"];
2367
2414
  id: components["schemas"]["GameFormatId"];
2368
2415
  name: string;
2369
2416
  /** @description Run in order on every result row. */
@@ -2382,10 +2429,17 @@ declare interface components {
2382
2429
  /** @default */
2383
2430
  description: string;
2384
2431
  attributesType: components["schemas"]["RecordTypeWithDefaults"];
2385
- entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2386
- extensionData: {
2432
+ customData?: {
2387
2433
  [key: string]: string;
2388
2434
  };
2435
+ /**
2436
+ * @description Settings by disqualification kind. May hold kinds no automation disqualifies under. Kinds without an entry have
2437
+ * the default settings.
2438
+ */
2439
+ disqualifications?: {
2440
+ [key: string]: components["schemas"]["DqSettings"];
2441
+ };
2442
+ entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2389
2443
  name: string;
2390
2444
  /** @description Run in order on every result row. */
2391
2445
  postProcessingSteps: components["schemas"]["GameFormatPostProcessingStep"][];
@@ -2407,22 +2461,7 @@ declare interface components {
2407
2461
  * result, after the result has been entered. They never change the stored result of the game, only
2408
2462
  * the result table the game node outputs.
2409
2463
  */
2410
- GameFormatPostProcessingStep: {
2411
- /** @constant */
2412
- type: "disqualify";
2413
- data: {
2414
- expression: string;
2415
- key: components["schemas"]["DqKey"];
2416
- };
2417
- } | {
2418
- /** @constant */
2419
- type: "set-output-column";
2420
- data: {
2421
- column: string;
2422
- columnType: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
2423
- expression: string;
2424
- };
2425
- };
2464
+ GameFormatPostProcessingStep: GameFormatPostProcessingStep;
2426
2465
  /**
2427
2466
  * Format: uuid
2428
2467
  * @description Identifies a game, the primary key of `games`. Comes from one of:
@@ -2434,32 +2473,9 @@ declare interface components {
2434
2473
  * Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
2435
2474
  */
2436
2475
  GameId: GameId;
2437
- GameNodeDTO: {
2438
- /**
2439
- * @description Caught disqualifications are not thrown. [DqStrategy] decides how they are surfaced.
2440
- * @default {}
2441
- */
2442
- catchDqs: {
2443
- [key: string]: components["schemas"]["DqStrategy"];
2444
- };
2445
- gameFormatId: components["schemas"]["GameFormatId"];
2446
- variant: components["schemas"]["GameNodeVariant"];
2447
- };
2476
+ GameNodeDTO: GameNodeDTO;
2448
2477
  /** @description How many games a game node plays and how they depend on each other. */
2449
- GameNodeVariant: {
2450
- /** @constant */
2451
- type: "single";
2452
- } | {
2453
- /** @constant */
2454
- type: "parallel";
2455
- } | {
2456
- /** @constant */
2457
- type: "sequential";
2458
- data: {
2459
- /** Format: uint */
2460
- gameCount: number;
2461
- };
2462
- };
2478
+ GameNodeVariant: GameNodeVariant;
2463
2479
  GamePathVariables_for_CommonWorkspaceId: {
2464
2480
  eventId: components["schemas"]["EventId"];
2465
2481
  gameId: components["schemas"]["GameId"];
@@ -2507,21 +2523,12 @@ declare interface components {
2507
2523
  strategy: components["schemas"]["UniqueBibStrategy"];
2508
2524
  };
2509
2525
  /** @description Location of a validation error in the graph. */
2510
- GraphLocation: {
2511
- /** @constant */
2512
- type: "Edge";
2513
- /** Format: uint */
2514
- data: number;
2515
- } | {
2516
- /** @constant */
2517
- type: "InputPort";
2518
- data: {
2519
- /** Format: uint */
2520
- inputIdx: number;
2521
- /** Format: uint */
2522
- nodeIdx: number;
2523
- };
2524
- };
2526
+ GraphLocation: GraphLocation;
2527
+ /**
2528
+ * @description Contains other nodes. It can add its name to the folder path of its descendants and catch the disqualifications
2529
+ * they throw.
2530
+ */
2531
+ GroupNode: GroupNode;
2525
2532
  /**
2526
2533
  * @description The Header Object follows the structure of the Parameter Object with the
2527
2534
  * following changes:
@@ -2571,13 +2578,6 @@ declare interface components {
2571
2578
  /** @enum {string} */
2572
2579
  HeaderStyle: "simple";
2573
2580
  ImportArchiveError: {
2574
- /** @constant */
2575
- type: "incompatible-version";
2576
- data: {
2577
- got: components["schemas"]["SemVer"];
2578
- required: string;
2579
- };
2580
- } | {
2581
2581
  /** @constant */
2582
2582
  type: "invalid-archive";
2583
2583
  data: components["schemas"]["InvalidArchiveError"];
@@ -2596,12 +2596,6 @@ declare interface components {
2596
2596
  ImportArchiveMutation: {
2597
2597
  archive: components["schemas"]["Archive"];
2598
2598
  eventId: components["schemas"]["EventId"];
2599
- /**
2600
- * @description Links the installed entities to their archive entries and reuses entries installed before, see
2601
- * [template_origin](crate::graphite_engine::template_origin). False for log entries written before linking existed.
2602
- * @default false
2603
- */
2604
- linkTemplate: boolean;
2605
2599
  /**
2606
2600
  * @description When `Some`, regenerates format node ids from this seed (deterministic log replay).
2607
2601
  * When `None`, preserves archive node ids — for one-shot imports such as format tests.
@@ -2667,28 +2661,8 @@ declare interface components {
2667
2661
  /** @constant */
2668
2662
  type: "missing-dependency";
2669
2663
  };
2670
- InvalidNodeReason: {
2671
- /** @constant */
2672
- type: "invalid-node";
2673
- } | {
2674
- /** @constant */
2675
- type: "node-is-not-variadic-but-vargs-to-array-set";
2676
- } | {
2677
- /** @constant */
2678
- type: "illegal-control-values";
2679
- } | ({
2680
- /** @constant */
2681
- type: "node-configuration-error";
2682
- } & components["schemas"]["NodeConfigurationError"]) | {
2683
- /** @constant */
2684
- type: "catching-disqualifications-of-variadic-format";
2685
- } | {
2686
- /** @constant */
2687
- type: "appending-disqualifications-to-incompatible-output";
2688
- } | {
2689
- /** @constant */
2690
- type: "game-result-not-assignable-to-entry";
2691
- };
2664
+ InvalidLinkedFormatPolicy: "empty-table" | "node-error" | "last-known-table";
2665
+ InvalidNodeReason: InvalidNodeReason;
2692
2666
  /** @description License information for the exposed API. */
2693
2667
  License: {
2694
2668
  /** @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. */
@@ -2772,7 +2746,7 @@ declare interface components {
2772
2746
  * @description Identifies a type parameter within a type expression or node signature.
2773
2747
  * Can be created from a single character (e.g. `'T'`) or a string (hashed for multi-char names).
2774
2748
  */
2775
- LocalParamID: number;
2749
+ LocalParamID: LocalParamID;
2776
2750
  /** @description An error that originated in a node, identified independently of the unstable `NodeIndex`. */
2777
2751
  LocatedNodeError: {
2778
2752
  error: components["schemas"]["NodeRuntimeError"];
@@ -2780,6 +2754,21 @@ declare interface components {
2780
2754
  formatId: components["schemas"]["FormatId"];
2781
2755
  formatInstanceId: components["schemas"]["FormatInstanceHash"];
2782
2756
  formatNodeId: components["schemas"]["FormatNodeId"];
2757
+ nodeType: components["schemas"]["NodeTypeDiscriminants"];
2758
+ /**
2759
+ * @description The executed node instances that the steps in the lineage of the rows of `error` name, see
2760
+ * [graphite_table::Step::node]. Resolved here because the nodes may be gone by the time the error is shown, like
2761
+ * the ones of a rolled back mutation.
2762
+ */
2763
+ nodes: components["schemas"]["LocatedNodeInstance"][];
2764
+ };
2765
+ /** @description A node instance that the lineage of a [LocatedNodeError] names, see [LocatedNodeError::nodes]. */
2766
+ LocatedNodeInstance: {
2767
+ formatId: components["schemas"]["FormatId"];
2768
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
2769
+ formatNodeId: components["schemas"]["FormatNodeId"];
2770
+ id: components["schemas"]["NodeInstanceHash"];
2771
+ nodeType: components["schemas"]["NodeTypeDiscriminants"];
2783
2772
  };
2784
2773
  /** Format: uuid */
2785
2774
  LogBatchId: string;
@@ -2791,10 +2780,6 @@ declare interface components {
2791
2780
  /** @constant */
2792
2781
  type: "rename-game-format";
2793
2782
  data: components["schemas"]["RenameGameFormatMutation"];
2794
- } | {
2795
- /** @constant */
2796
- type: "duplicate-game-format";
2797
- data: components["schemas"]["DuplicateGameFormatMutation"];
2798
2783
  } | {
2799
2784
  /** @constant */
2800
2785
  type: "delete-game-format";
@@ -2807,10 +2792,6 @@ declare interface components {
2807
2792
  /** @constant */
2808
2793
  type: "add-class";
2809
2794
  data: components["schemas"]["AddClassMutation"];
2810
- } | {
2811
- /** @constant */
2812
- type: "add-classes";
2813
- data: components["schemas"]["AddClassesMutation"];
2814
2795
  } | {
2815
2796
  /** @constant */
2816
2797
  type: "rename-class";
@@ -2819,6 +2800,10 @@ declare interface components {
2819
2800
  /** @constant */
2820
2801
  type: "update-class";
2821
2802
  data: components["schemas"]["UpdateClassMutation"];
2803
+ } | {
2804
+ /** @constant */
2805
+ type: "update-class-state";
2806
+ data: components["schemas"]["UpdateClassStateMutation"];
2822
2807
  } | {
2823
2808
  /** @constant */
2824
2809
  type: "delete-class";
@@ -2859,6 +2844,10 @@ declare interface components {
2859
2844
  /** @constant */
2860
2845
  type: "update-game-table";
2861
2846
  data: components["schemas"]["UpdateTableMutation"];
2847
+ } | {
2848
+ /** @constant */
2849
+ type: "update-standalone-table";
2850
+ data: components["schemas"]["UpdateStandaloneTableMutation"];
2862
2851
  } | {
2863
2852
  /** @constant */
2864
2853
  type: "delete-game-table";
@@ -2975,6 +2964,10 @@ declare interface components {
2975
2964
  /** @constant */
2976
2965
  type: "link-to-template";
2977
2966
  data: components["schemas"]["LinkToTemplateMutation"];
2967
+ } | {
2968
+ /** @constant */
2969
+ type: "set-custom-data";
2970
+ data: components["schemas"]["SetCustomDataMutation"];
2978
2971
  };
2979
2972
  LogEntrySmall: {
2980
2973
  description: string;
@@ -2991,7 +2984,7 @@ declare interface components {
2991
2984
  LogId: LogId;
2992
2985
  LogsQuery: {
2993
2986
  after: components["schemas"]["LogId"];
2994
- /** Format: int64 */
2987
+ /** Format: uint32 */
2995
2988
  limit: number;
2996
2989
  };
2997
2990
  /**
@@ -3012,9 +3005,7 @@ declare interface components {
3012
3005
  /** @description The exact name to give the copied format. */
3013
3006
  name: string;
3014
3007
  };
3015
- MakeValidError: {
3016
- missingDefaultField: string;
3017
- };
3008
+ MakeValidError: MakeValidError;
3018
3009
  Map_of_TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: {
3019
3010
  [key: string]: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3020
3011
  };
@@ -3022,7 +3013,7 @@ declare interface components {
3022
3013
  [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
3023
3014
  };
3024
3015
  /** @enum {string} */
3025
- MathNodeOp: "addition" | "subtraction" | "multiplication" | "division-float" | "division-integer" | "modulo" | "power" | "logarithm" | "sqrt" | "absolute" | "minimum" | "maximum" | "ceil" | "floor" | "round";
3016
+ MathNodeOp: MathNodeOp;
3026
3017
  MediaType: {
3027
3018
  encoding?: {
3028
3019
  [key: string]: components["schemas"]["Encoding"];
@@ -3035,43 +3026,21 @@ declare interface components {
3035
3026
  } & {
3036
3027
  [key: string]: unknown;
3037
3028
  };
3029
+ /**
3030
+ * @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.
3032
+ */
3033
+ MissingFromPrevious: MissingFromPrevious;
3038
3034
  /** @enum {string} */
3039
- MultiplexingStrategy: "serpentine" | "round-robin";
3035
+ MultiplexingStrategy: MultiplexingStrategy;
3040
3036
  NameQuery: {
3041
3037
  name: string;
3042
3038
  };
3043
- NoSupertypeLayerReason: "UnknownTypeParam" | "NodeSignatureInputsVarg" | "NodeSignatureInputs" | "NodeSignatureOutputs" | "NodeSignatureTags" | "NodeSignatureRequiredTags" | "PortTypesVarg" | "PortTypesArity" | "PortTypesPort" | "Index" | "ConstructorArity" | "ConstructorParam";
3039
+ NoSupertypeLayerReason: NoSupertypeLayerReason;
3044
3040
  NoSupertypeLayer_for_Type: NoSupertypeLayer<Type>;
3045
3041
  /** @enum {string} */
3046
3042
  NodeCategory: "logic" | "game" | "tables" | "arrays" | "math" | "class" | "input-output" | "invalid" | "other" | "root";
3047
- NodeConfigurationError: {
3048
- /** @constant */
3049
- type: "extract-record-field-error";
3050
- data: components["schemas"]["ExtractRecordFieldError_for_Primitive"];
3051
- } | {
3052
- /** @constant */
3053
- type: "invalid-value";
3054
- data: {
3055
- givenValue: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
3056
- identifier: string;
3057
- message: string;
3058
- };
3059
- } | {
3060
- /** @constant */
3061
- type: "node-is-not-variadic-but-vargs-to-array-set";
3062
- } | {
3063
- /** @constant */
3064
- type: "found-closure-input-node-in-non-closure";
3065
- } | {
3066
- /** @constant */
3067
- type: "invalid-node";
3068
- } | {
3069
- /** @constant */
3070
- type: "illegal-vargs-to-array";
3071
- } | {
3072
- /** @constant */
3073
- type: "illegal-control-values";
3074
- };
3043
+ NodeConfigurationError: NodeConfigurationError;
3075
3044
  NodeDocTest: {
3076
3045
  description?: string | null;
3077
3046
  format: components["schemas"]["FormatDTO"];
@@ -3121,12 +3090,22 @@ declare interface components {
3121
3090
  result: components["schemas"]["SerializableNodeResult"];
3122
3091
  testId: components["schemas"]["FormatNodeTestId"];
3123
3092
  };
3093
+ /**
3094
+ * Format: uuid
3095
+ * @description Shared by the variants of one node, each in another group of the same section.
3096
+ */
3097
+ NodeLinkId: NodeLinkId;
3124
3098
  NodePathVariables_for_CommonWorkspaceId: {
3125
3099
  eventId: components["schemas"]["EventId"];
3126
3100
  formatId: components["schemas"]["FormatId"];
3127
3101
  nodeId: components["schemas"]["FormatNodeId"];
3128
3102
  workspaceId: components["schemas"]["CommonWorkspaceId"];
3129
3103
  };
3104
+ NodePlacement: {
3105
+ group?: components["schemas"]["SimplifiedGroupId"] | null;
3106
+ link?: components["schemas"]["NodeLinkId"] | null;
3107
+ section: components["schemas"]["SimplifiedSectionId"];
3108
+ };
3130
3109
  NodePrototype: {
3131
3110
  /**
3132
3111
  * @description If there is only one variant, the node should not display a select for the variants.
@@ -3228,367 +3207,77 @@ declare interface components {
3228
3207
  * @description Function-like type for a node: generic parameters, inputs, outputs, and defaults.
3229
3208
  * Written in notation as `<T>(T) -> (T)` for the identity node.
3230
3209
  */
3231
- NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type: {
3232
- /**
3233
- * @description Types that get used when there is no connection to the input.
3234
- * These get ignored for nested NodeSignatures.
3235
- */
3236
- defaultInputTypes: {
3237
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3238
- };
3239
- /**
3240
- * @description inputs and outputs are no PortTypes because having them TypeExpr
3241
- * Enables one to express `() -> Never` which is the node signature
3242
- * assignable to all other node signatures. Useful for inferring what
3243
- * type a closure should be.
3244
- */
3245
- inputs: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3246
- outputs: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3247
- /** @description Generic parameters with their bounds and defaults. */
3248
- parameters: components["schemas"]["TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type"];
3249
- /**
3250
- * @description Tags this node *requires* from every incoming edge.
3251
- *
3252
- * During validation, each incoming edge's source tags are checked against
3253
- * this set. Any tag present here but missing from an incoming edge
3254
- * produces a [`TagMissing`](crate::validation::ValidationErrorKind::TagMissing)
3255
- * error.
3256
- *
3257
- * Defaults to `∅` (no requirements).
3258
- */
3259
- requiredTags: number[];
3260
- /**
3261
- * @description Tags this node *provides* to downstream consumers.
3262
- *
3263
- * - `Some(set)` — the node carries exactly the listed tags.
3264
- * - `None` — the node carries *every* tag (universal set), making it a
3265
- * supertype of all other tag sets.
3266
- *
3267
- * Tags propagate forward through the graph: a node's effective tag set
3268
- * is the intersection of its own `tags` with every incoming edge's tags.
3269
- *
3270
- * Defaults to `Some(∅)` (no tags).
3271
- *
3272
- * `u32` is used instead of `usize` for wasm compatibility (JS has 32-bit
3273
- * integers).
3274
- */
3275
- tags?: number[] | null;
3276
- };
3210
+ NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type: NodeSignature<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
3277
3211
  /**
3278
3212
  * @description Function-like type for a node: generic parameters, inputs, outputs, and defaults.
3279
3213
  * Written in notation as `<T>(T) -> (T)` for the identity node.
3280
3214
  */
3281
3215
  NodeSignature_for_Type_and_ParamRef: NodeSignature<Type, ParamRef>;
3282
- NodeType: {
3283
- /** @constant */
3284
- type: "input";
3285
- } | {
3286
- /** @constant */
3287
- type: "output";
3288
- } | {
3289
- /** @constant */
3290
- type: "format";
3291
- data: {
3292
- /**
3293
- * @description Each of these get caught and handled according to [`DqStrategy`].
3294
- * @default {}
3295
- */
3296
- catchDqs: {
3297
- [key: string]: components["schemas"]["DqStrategy"];
3216
+ 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;
3233
+ };
3234
+ NodeVariantPrototype: {
3235
+ childrenSpec: components["schemas"]["ChildrenSpec"];
3236
+ /**
3237
+ * Format: uint32
3238
+ * @description The number of vargs to add when creating this node
3239
+ */
3240
+ defaultInputVargCount: number;
3241
+ /** Format: uint32 */
3242
+ defaultOutputVargCount: number;
3243
+ includeInSearch: boolean;
3244
+ /** @description These outputs emit warnings when not used */
3245
+ mustUseOutputs: components["schemas"]["OutputIdx"][];
3246
+ /** @description Uniquely identifies a node variant */
3247
+ nodeType: components["schemas"]["NodeType"];
3248
+ /** @description Type of settings excluding the variant property. */
3249
+ settingsType: components["schemas"]["RecordTypeHelper_for_ParamRef"];
3250
+ signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
3251
+ /** @description For the docs of format nodes */
3252
+ userDefinedDocs?: components["schemas"]["NodeVariantDoc"] | null;
3253
+ };
3254
+ NodetyError: NodetyError;
3255
+ OAuth2Flows: ({
3256
+ implicit: {
3257
+ authorizationUrl: string;
3258
+ refreshUrl?: string | null;
3259
+ /** @default {} */
3260
+ scopes: {
3261
+ [key: string]: string;
3298
3262
  };
3299
- formatId: components["schemas"]["FormatId"];
3300
- };
3301
- } | {
3302
- /** @constant */
3303
- type: "math";
3304
- data: {
3305
- op: components["schemas"]["MathNodeOp"];
3306
3263
  };
3307
3264
  } | {
3308
- /** @constant */
3309
- type: "game";
3310
- data: components["schemas"]["GameNodeDTO"];
3311
- } | {
3312
- /** @constant */
3313
- type: "output-table";
3314
- } | {
3315
- /** @constant */
3316
- type: "input-table";
3317
- data: {
3318
- tableId: components["schemas"]["TableId"];
3265
+ password: {
3266
+ refreshUrl?: string | null;
3267
+ /** @default {} */
3268
+ scopes: {
3269
+ [key: string]: string;
3270
+ };
3271
+ tokenUrl: string;
3319
3272
  };
3320
3273
  } | {
3321
- /** @constant */
3322
- type: "portal";
3323
- data: {
3324
- sourceNodeId: components["schemas"]["FormatNodeId"];
3325
- sourceOutput: components["schemas"]["OutputIdx"];
3326
- };
3327
- } | {
3328
- /** @constant */
3329
- type: "class";
3330
- data: {
3331
- classId: components["schemas"]["ClassId"];
3332
- };
3333
- } | {
3334
- /** @constant */
3335
- type: "catch-dq";
3336
- data: components["schemas"]["CatchDqNode"];
3337
- } | {
3338
- /** @constant */
3339
- type: "disqualify";
3340
- data: components["schemas"]["DisqualifyNode"];
3341
- } | {
3342
- /** @constant */
3343
- type: "folder";
3344
- data: {
3345
- folderName: string;
3346
- };
3347
- } | {
3348
- /** @constant */
3349
- type: "group";
3350
- data: {
3351
- name: string;
3352
- };
3353
- } | {
3354
- /** @constant */
3355
- type: "string-concat";
3356
- } | {
3357
- /** @constant */
3358
- type: "string-format";
3359
- } | {
3360
- /** @constant */
3361
- type: "sort-node";
3362
- } | {
3363
- /** @constant */
3364
- type: "constant";
3365
- } | {
3366
- /** @constant */
3367
- type: "merge-tables";
3368
- } | {
3369
- /** @constant */
3370
- type: "divide-table";
3371
- } | {
3372
- /** @constant */
3373
- type: "distribute-table";
3374
- } | {
3375
- /** @constant */
3376
- type: "split-table";
3377
- data: components["schemas"]["SplitTableNode"];
3378
- } | {
3379
- /** @constant */
3380
- type: "concat";
3381
- data: {
3382
- sorted: boolean;
3383
- };
3384
- } | {
3385
- /** @constant */
3386
- type: "remove-places";
3387
- } | {
3388
- /** @constant */
3389
- type: "table-map";
3390
- } | {
3391
- /** @constant */
3392
- type: "length";
3393
- } | {
3394
- /** @constant */
3395
- type: "boolean-op";
3396
- data: {
3397
- op: components["schemas"]["BooleanOp"];
3398
- };
3399
- } | {
3400
- /** @constant */
3401
- type: "record-field";
3402
- data: {
3403
- op: components["schemas"]["RecordFieldOp"];
3404
- };
3405
- } | {
3406
- /** @constant */
3407
- type: "add-record-fields";
3408
- data: components["schemas"]["AddRecordFieldsNode"];
3409
- } | {
3410
- /** @constant */
3411
- type: "fallback";
3412
- } | {
3413
- /** @constant */
3414
- type: "gt-row";
3415
- data: {
3416
- errorOnNotFound: boolean;
3417
- };
3418
- } | {
3419
- /** @constant */
3420
- type: "filter-gt";
3421
- data: {
3422
- filter: components["schemas"]["GTFilterKind"];
3423
- };
3424
- } | {
3425
- /** @constant */
3426
- type: "comparison";
3427
- data: {
3428
- op: components["schemas"]["ComparisonOp"];
3429
- };
3430
- } | {
3431
- /** @constant */
3432
- type: "comment";
3433
- data: {
3434
- comment: string;
3435
- };
3436
- } | {
3437
- /** @constant */
3438
- type: "ternary";
3439
- } | {
3440
- /** @constant */
3441
- type: "separate-row";
3442
- } | {
3443
- /** @constant */
3444
- type: "update-row";
3445
- } | {
3446
- /** @constant */
3447
- type: "array-map";
3448
- } | {
3449
- /** @constant */
3450
- type: "create-array";
3451
- } | {
3452
- /** @constant */
3453
- type: "create-table";
3454
- } | {
3455
- /** @constant */
3456
- type: "array-access";
3457
- data: {
3458
- errorOnNotFound: boolean;
3459
- };
3460
- } | {
3461
- /** @constant */
3462
- type: "unpack-array";
3463
- data: {
3464
- errorOnNotFound: boolean;
3465
- };
3466
- } | {
3467
- /** @constant */
3468
- type: "promotion-relegation";
3469
- data: {
3470
- /** Format: uint */
3471
- finalCount?: number | null;
3472
- };
3473
- } | {
3474
- /** @constant */
3475
- type: "age-at";
3476
- } | {
3477
- /** @constant */
3478
- type: "split-by-class";
3479
- data: {
3480
- /** Format: uint */
3481
- classCount: number;
3482
- };
3483
- } | {
3484
- /** @constant */
3485
- type: "invalid";
3486
- data: {
3487
- nodeType: components["schemas"]["NodeType"];
3488
- };
3489
- } | {
3490
- /** @constant */
3491
- type: "empty-record";
3492
- } | {
3493
- /** @constant */
3494
- type: "event-competitors";
3495
- data: components["schemas"]["EventCompetitorsNode"];
3496
- } | {
3497
- /** @constant */
3498
- type: "add-columns";
3499
- data: components["schemas"]["AddColumnsNode"];
3500
- } | {
3501
- /** @constant */
3502
- type: "matrix-transpose";
3503
- } | {
3504
- /** @constant */
3505
- type: "simple-scoring";
3506
- data: components["schemas"]["SimpleScoringNode"];
3507
- } | {
3508
- /** @constant */
3509
- type: "classes-competitors";
3510
- data: components["schemas"]["ClassesCompetitorsNode"];
3511
- };
3512
- /** @description Auto-generated discriminant enum variants */
3513
- NodeTypeDiscriminants: ("input" | "output" | "format" | "math" | "game" | "output-table" | "input-table" | "portal" | "class" | "catch-dq" | "disqualify" | "folder" | "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") | "invalid";
3514
- NodeVariantDoc: {
3515
- description?: string | null;
3516
- /** @default other */
3517
- category: components["schemas"]["NodeCategory"];
3518
- /** @description If the node has `children_spec` set to `Closure`, this documents that closure */
3519
- closureDocs?: components["schemas"]["NodeVariantDoc"] | null;
3520
- inputVargsToArrayArrayLabel: components["schemas"]["PortLabelPart"][];
3521
- inputs: components["schemas"]["PortsDoc"];
3522
- /** @description The label for the new output when vargs_to_array is enabled. */
3523
- outputVargsToArrayArrayLabel: components["schemas"]["PortLabelPart"][];
3524
- /** @description The label for the new input when vargs_to_array is enabled. */
3525
- outputVargsToArrayCountLabel: components["schemas"]["PortLabelPart"][];
3526
- outputs: components["schemas"]["PortsDoc"];
3527
- variantLabel: string;
3528
- };
3529
- NodeVariantPrototype: {
3530
- childrenSpec: components["schemas"]["ChildrenSpec"];
3531
- /**
3532
- * Format: uint32
3533
- * @description The number of vargs to add when creating this node
3534
- */
3535
- defaultInputVargCount: number;
3536
- /** Format: uint32 */
3537
- defaultOutputVargCount: number;
3538
- includeInSearch: boolean;
3539
- /** @description These outputs emit warnings when not used */
3540
- mustUseOutputs: components["schemas"]["OutputIdx"][];
3541
- /** @description Uniquely identifies a node variant */
3542
- nodeType: components["schemas"]["NodeType"];
3543
- /** @description Type of settings excluding the variant property. */
3544
- settingsType: components["schemas"]["RecordTypeHelper_for_ParamRef"];
3545
- signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
3546
- /** @description For the docs of format nodes */
3547
- userDefinedDocs?: components["schemas"]["NodeVariantDoc"] | null;
3548
- };
3549
- NodetyError: {
3550
- /** @constant */
3551
- type: "NodeHasChildren";
3552
- } | {
3553
- /** @constant */
3554
- type: "ParentNotFound";
3555
- } | {
3556
- /** @constant */
3557
- type: "NodeNotFound";
3558
- } | {
3559
- /** @constant */
3560
- type: "CycleDetected";
3561
- } | {
3562
- /** @constant */
3563
- type: "TypeExprValidationError";
3564
- error: components["schemas"]["TypeExprValidationError"];
3565
- };
3566
- OAuth2Flows: ({
3567
- implicit: {
3568
- authorizationUrl: string;
3569
- refreshUrl?: string | null;
3570
- /** @default {} */
3571
- scopes: {
3572
- [key: string]: string;
3573
- };
3574
- };
3575
- } | {
3576
- password: {
3577
- refreshUrl?: string | null;
3578
- /** @default {} */
3579
- scopes: {
3580
- [key: string]: string;
3581
- };
3582
- tokenUrl: string;
3583
- };
3584
- } | {
3585
- clientCredentials: {
3586
- refreshUrl?: string | null;
3587
- /** @default {} */
3588
- scopes: {
3589
- [key: string]: string;
3590
- };
3591
- tokenUrl: string;
3274
+ clientCredentials: {
3275
+ refreshUrl?: string | null;
3276
+ /** @default {} */
3277
+ scopes: {
3278
+ [key: string]: string;
3279
+ };
3280
+ tokenUrl: string;
3592
3281
  };
3593
3282
  } | {
3594
3283
  authorizationCode: {
@@ -3859,14 +3548,7 @@ declare interface components {
3859
3548
  /** Format: uint16 */
3860
3549
  OutputIdx: OutputIdx;
3861
3550
  /** @description References a local type parameter. This is context sensitive because parameters are scoped. */
3862
- ParamRef: {
3863
- /**
3864
- * @description If false, this reference will not be used to collect candidates for the parameter.
3865
- * In the notation this is written as `!T`.
3866
- */
3867
- infer: boolean;
3868
- paramId: components["schemas"]["LocalParamID"];
3869
- };
3551
+ ParamRef: ParamRef;
3870
3552
  Parameter: (({
3871
3553
  /**
3872
3554
  * @description A brief description of the parameter. This could
@@ -4115,37 +3797,8 @@ declare interface components {
4115
3797
  [key: string]: components["schemas"]["MediaType"];
4116
3798
  };
4117
3799
  }));
4118
- ParentType: {
4119
- /** @constant */
4120
- type: "format-root";
4121
- } | {
4122
- /** @constant */
4123
- type: "closure-node";
4124
- data: components["schemas"]["FormatNodeId"];
4125
- };
4126
- ParseError: {
4127
- kind: components["schemas"]["ParseErrorKind"];
4128
- location: components["schemas"]["SourceLocation"];
4129
- };
4130
- ParseErrorKind: {
4131
- /** @constant */
4132
- type: "invalid-token";
4133
- } | {
4134
- /** @constant */
4135
- type: "unexpected-token";
4136
- } | {
4137
- /** @constant */
4138
- type: "expected-token";
4139
- data: {
4140
- expected: string;
4141
- };
4142
- } | {
4143
- /** @constant */
4144
- type: "invalid-number";
4145
- } | {
4146
- /** @constant */
4147
- type: "unterminated-string";
4148
- };
3800
+ ParentType: ParentType;
3801
+ ParseErrorKind: ParseErrorKind;
4149
3802
  PatchTableStateMutation: {
4150
3803
  /** @description None resets the table state */
4151
3804
  state?: components["schemas"]["TableState"] | null;
@@ -4245,10 +3898,7 @@ declare interface components {
4245
3898
  data: string;
4246
3899
  };
4247
3900
  /** @description A list of port types, optionally with a variadic type (`...T`). */
4248
- PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type: {
4249
- ports: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"][];
4250
- varg?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
4251
- };
3901
+ PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type: PortTypes<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
4252
3902
  /** @description A list of port types, optionally with a variadic type (`...T`). */
4253
3903
  PortTypes_for_Type_and_ParamRef: PortTypes<Type, ParamRef>;
4254
3904
  PortsDoc: {
@@ -4267,7 +3917,7 @@ declare interface components {
4267
3917
  minAge: number;
4268
3918
  };
4269
3919
  /** @description Crate local version of [std::convert::Infallible] */
4270
- Primitive: unknown;
3920
+ Primitive: Primitive;
4271
3921
  PushTableRowMutationsMutation: {
4272
3922
  /**
4273
3923
  * @description Challenge for a client to prevent accidentally
@@ -4289,11 +3939,8 @@ declare interface components {
4289
3939
  seed: components["schemas"]["Seed"];
4290
3940
  };
4291
3941
  /** @enum {string} */
4292
- RecordFieldOp: "read-field" | "write-field";
4293
- RecordMakeValidMutation: {
4294
- columnName: string;
4295
- newValue: components["schemas"]["Value_for_Primitive"];
4296
- };
3942
+ RecordFieldOp: RecordFieldOp;
3943
+ RecordMakeValidMutation: RecordMakeValidMutation;
4297
3944
  RecordModifications: {
4298
3945
  /**
4299
3946
  * Format: uint
@@ -4325,9 +3972,7 @@ declare interface components {
4325
3972
  };
4326
3973
  };
4327
3974
  RecordValue_for_Primitive: RecordValue<Primitive>;
4328
- RecordValue_for_SerializableNonPrimitiveValue: {
4329
- [key: string]: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
4330
- };
3975
+ RecordValue_for_SerializableNonPrimitiveValue: RecordValue<SerializableNonPrimitiveValue>;
4331
3976
  ReferenceOr_for_Example: {
4332
3977
  /**
4333
3978
  * @description A description which by default SHOULD override that of the
@@ -4582,10 +4227,8 @@ declare interface components {
4582
4227
  hash: number[];
4583
4228
  id: components["schemas"]["LogId"];
4584
4229
  };
4585
- ReplicationProgressPath: {
4586
- /** Format: uuid */
4587
- taskId: string;
4588
- };
4230
+ /** @enum {string} */
4231
+ ReplicationSide: "source" | "target";
4589
4232
  ReplicationTargetMultipart: {
4590
4233
  /** Format: binary */
4591
4234
  file: Blob;
@@ -4617,7 +4260,7 @@ declare interface components {
4617
4260
  [key: string]: unknown;
4618
4261
  };
4619
4262
  Resolve: {
4620
- keep: components["schemas"]["Side"];
4263
+ keep: components["schemas"]["ReplicationSide"];
4621
4264
  };
4622
4265
  /** @description A table as nodes see it, without the results whose competitor is not in the entry of their game. */
4623
4266
  ResolvedTable: {
@@ -4717,47 +4360,8 @@ declare interface components {
4717
4360
  };
4718
4361
  /** Format: int64 */
4719
4362
  RowMutationIdx: RowMutationIdx;
4720
- RowMutationKind: {
4721
- /** @constant */
4722
- type: "set-record-field";
4723
- field: string;
4724
- value: components["schemas"]["Value_for_Primitive"];
4725
- } | {
4726
- /** @constant */
4727
- type: "push-unranked";
4728
- columns: components["schemas"]["RecordValue_for_Primitive"];
4729
- } | {
4730
- /** @constant */
4731
- type: "remove";
4732
- } | {
4733
- /** @constant */
4734
- type: "set-place";
4735
- /** Format: uint */
4736
- place: number;
4737
- } | {
4738
- /** @constant */
4739
- type: "set-unranked";
4740
- /** Format: uint */
4741
- tiebraker: number;
4742
- } | {
4743
- /** @constant */
4744
- type: "set-place-and-tie-braker";
4745
- /** Format: uint */
4746
- place: number;
4747
- /** Format: uint */
4748
- tiebraker: number;
4749
- };
4750
- RowMutationWithBatch: {
4751
- /**
4752
- * Format: int64
4753
- * @description When performing batch actions like delete all, then all these will have the same batch id.
4754
- * Otherwise it will get incremented. Used for undo & redo.
4755
- */
4756
- batch: number;
4757
- /** Format: int64 */
4758
- competitorId: number;
4759
- kind: components["schemas"]["RowMutationKind"];
4760
- };
4363
+ RowMutationKind: RowMutationKind;
4364
+ RowMutationWithBatch: RowMutationWithBatch;
4761
4365
  RowQuery: {
4762
4366
  /** @description The competitor of the row */
4763
4367
  competitorId: components["schemas"]["CompetitorId"];
@@ -4770,52 +4374,10 @@ declare interface components {
4770
4374
  timestamp: string;
4771
4375
  };
4772
4376
  /** @description GameTableTypes types should **only** be manipulated though this helper to have a single source of truth for the structure. */
4773
- RowTypeHelper_for_ParamRef: {
4774
- columns: components["schemas"]["RecordTypeHelper_for_ParamRef"];
4775
- };
4377
+ RowTypeHelper_for_ParamRef: RowTypeHelper<ParamRef>;
4776
4378
  Rows_for_Sorted: Rows<Sorted>;
4777
4379
  Rows_for_Unsorted: Rows<Unsorted>;
4778
- RuntimeErrorKind: {
4779
- /** @constant */
4780
- type: "division-by-zero";
4781
- } | {
4782
- /** @constant */
4783
- type: "variable-not-found";
4784
- data: {
4785
- name: string;
4786
- };
4787
- } | {
4788
- /** @constant */
4789
- type: "function-not-found";
4790
- data: {
4791
- name: string;
4792
- };
4793
- } | {
4794
- /** @constant */
4795
- type: "index-out-of-bounds";
4796
- } | {
4797
- /** @constant */
4798
- type: "invalid-index";
4799
- } | {
4800
- /** @constant */
4801
- type: "invalid-math-operands";
4802
- } | {
4803
- /** @constant */
4804
- type: "non-boolean-condition";
4805
- } | {
4806
- /** @constant */
4807
- type: "non-boolean-operand";
4808
- } | {
4809
- /** @constant */
4810
- type: "invalid-comparison-operands";
4811
- } | {
4812
- /** @constant */
4813
- type: "argument";
4814
- data: {
4815
- expected: string;
4816
- got: string;
4817
- };
4818
- };
4380
+ RuntimeErrorKind: RuntimeErrorKind;
4819
4381
  SchemaObject: {
4820
4382
  /**
4821
4383
  * @description A free-form property to include an example of an instance for this
@@ -4899,27 +4461,7 @@ declare interface components {
4899
4461
  errorState: components["schemas"]["NodeErrorState_for_NodeRuntimeError"];
4900
4462
  values: components["schemas"]["SerializablePortValues_for_OutputIdx"];
4901
4463
  };
4902
- SerializableNonPrimitiveValue: {
4903
- /** @constant */
4904
- type: "game-table";
4905
- data: components["schemas"]["Table_for_Unsorted_and_StateMetadata"];
4906
- } | {
4907
- /** @constant */
4908
- type: "game-table-sorted";
4909
- data: components["schemas"]["Table_for_Sorted_and_StateMetadata"];
4910
- } | {
4911
- /** @constant */
4912
- type: "row";
4913
- data: components["schemas"]["Row"];
4914
- } | {
4915
- /** @constant */
4916
- type: "class";
4917
- /** Format: uuid */
4918
- data: string;
4919
- } | {
4920
- /** @constant */
4921
- type: "closure";
4922
- };
4464
+ SerializableNonPrimitiveValue: SerializableNonPrimitiveValue;
4923
4465
  SerializablePortValues_for_InputIdx: {
4924
4466
  values: {
4925
4467
  [key: string]: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
@@ -4983,6 +4525,12 @@ declare interface components {
4983
4525
  } & {
4984
4526
  [key: string]: unknown;
4985
4527
  };
4528
+ /** @description Sets one key of the `custom_data` of an entity, `None` deletes it. */
4529
+ SetCustomDataMutation: {
4530
+ entity: components["schemas"]["CustomDataEntity"];
4531
+ key: string;
4532
+ value?: string | null;
4533
+ };
4986
4534
  /** @description Adds or sets the extension to the given version */
4987
4535
  SetExtensionMutation: {
4988
4536
  eventId: components["schemas"]["EventId"];
@@ -4996,8 +4544,6 @@ declare interface components {
4996
4544
  SetFormatsFormatGroupQuery: {
4997
4545
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
4998
4546
  };
4999
- /** @enum {string} */
5000
- Side: "source" | "target";
5001
4547
  /**
5002
4548
  * @description Place 1 = 1 point, Place 2 = 2 points, etc.
5003
4549
  * On tie, whoever won the part with the highest priority wins.
@@ -5011,20 +4557,43 @@ declare interface components {
5011
4557
  * Competitors are the union of all parts: a competitor without a place in a part
5012
4558
  * (missing from the table of that part, or in it without a place) scores one point
5013
4559
  * more than that part has rows, so not finishing a part is always worse than
5014
- * finishing it last.
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.
5015
4566
  */
5016
- SimpleScoringNode: {
5017
- parts: components["schemas"]["SimpleScoringPart"][];
5018
- };
4567
+ SimpleScoringNode: SimpleScoringNode;
5019
4568
  /** @description One scored part, e.g. a single race of a series. */
5020
- SimpleScoringPart: {
5021
- /** @description Used as the name of the output column holding the points of this part. */
4569
+ SimpleScoringPart: SimpleScoringPart;
4570
+ SimplifiedGroup: {
4571
+ id: components["schemas"]["SimplifiedGroupId"];
5022
4572
  name: string;
5023
- /**
5024
- * Format: uint32
5025
- * @description Higher priority parts break ties first.
5026
- */
5027
- priority: number;
4573
+ };
4574
+ /**
4575
+ * Format: uuid
4576
+ * @description Unique per format, not only per section.
4577
+ */
4578
+ 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
+ /**
4588
+ * @description How the simplified view arranges the format's nodes. Only the simplified view interprets it: the backend stores it,
4589
+ * keeps its references consistent ([Self::repaired]) and carries it over to copies with new node ids.
4590
+ */
4591
+ SimplifiedView: {
4592
+ nodes: {
4593
+ [key: string]: components["schemas"]["NodePlacement"];
4594
+ };
4595
+ /** @description In display order. */
4596
+ sections: components["schemas"]["SimplifiedSection"][];
5028
4597
  };
5029
4598
  SnapshotMultipart: {
5030
4599
  /** Format: binary */
@@ -5069,12 +4638,7 @@ declare interface components {
5069
4638
  type: "internal";
5070
4639
  };
5071
4640
  /** @description 1-based line and column at the start of a token. */
5072
- SourceLocation: {
5073
- /** Format: uint */
5074
- column: number;
5075
- /** Format: uint */
5076
- line: number;
5077
- };
4641
+ SourceLocation: SourceLocation;
5078
4642
  /**
5079
4643
  * @description Splits a sorted table at the given places, see `Table::split_n`.
5080
4644
  *
@@ -5087,35 +4651,15 @@ declare interface components {
5087
4651
  * <C extends {}>(Table<C, Sorted>, Array<Integer>) -> (Array<Table<C, Sorted>>)
5088
4652
  * ```
5089
4653
  */
5090
- SplitTableNode: {
5091
- /** @constant */
5092
- type: "static";
5093
- data: {
5094
- /** Format: uint16 */
5095
- splitCount: number;
5096
- };
5097
- } | {
5098
- /** @constant */
5099
- type: "dynamic";
5100
- };
4654
+ SplitTableNode: SplitTableNode;
4655
+ /** @description A standalone table of the user. Its kind is always [TableKind::Other], its state is set like the state of any table. */
5101
4656
  StandaloneTableDTO: {
5102
4657
  columnTypes: components["schemas"]["RecordTypeWithDefaults"];
5103
4658
  name: string;
5104
- /** @description If Some, sets either layer one or layer two state depending on who issues the request. */
5105
- state?: components["schemas"]["TableState"] | null;
5106
- tableKind: components["schemas"]["TableKind"];
5107
- };
5108
- Step: {
5109
- /**
5110
- * Format: uuid
5111
- * @description Whoever ran the operation, see [Origin::attributed]: the engine's `NodeInstanceHash`, a raw uuid because this
5112
- * crate doesn't know engine types. None until it is attributed.
5113
- */
5114
- node?: string | null;
5115
- op: components["schemas"]["StepOp"];
5116
4659
  };
4660
+ Step: Step;
5117
4661
  /** @description An operation that moved rows between or within tables. */
5118
- StepOp: ("sort" | "split" | "concat" | "merge" | "divide" | "filter" | "remove-places" | "set-places" | "promote-relegate" | "score") | "create";
4662
+ StepOp: StepOp;
5119
4663
  StoreExtensionValueMutation: {
5120
4664
  eventId: components["schemas"]["EventId"];
5121
4665
  extension: string;
@@ -5234,9 +4778,9 @@ declare interface components {
5234
4778
  rows: components["schemas"]["Row"][];
5235
4779
  };
5236
4780
  /** @enum {string} */
5237
- TableSorting: "unsorted" | "sorted";
4781
+ TableSorting: TableSorting;
5238
4782
  /** Format: int64 */
5239
- TableState: number;
4783
+ TableState: TableState;
5240
4784
  /** @description Encodes the two columns `game_id` and `column_types` (exactly one of which must be NON NULL). */
5241
4785
  TableVariant: {
5242
4786
  /** @constant */
@@ -5256,15 +4800,9 @@ declare interface components {
5256
4800
  table: components["schemas"]["TableDAO"];
5257
4801
  };
5258
4802
  /** @description Combines rows with table attributes and state */
5259
- Table_for_Sorted_and_StateMetadata: {
5260
- rows: components["schemas"]["Rows_for_Sorted"];
5261
- state: components["schemas"]["TableState"];
5262
- };
4803
+ Table_for_Sorted_and_StateMetadata: Table<Sorted, StateMetadata>;
5263
4804
  /** @description Combines rows with table attributes and state */
5264
- Table_for_Unsorted_and_StateMetadata: {
5265
- rows: components["schemas"]["Rows_for_Unsorted"];
5266
- state: components["schemas"]["TableState"];
5267
- };
4805
+ Table_for_Unsorted_and_StateMetadata: Table<Unsorted, StateMetadata>;
5268
4806
  /**
5269
4807
  * @description Adds metadata to a single tag that is used by the
5270
4808
  * Operation Object. It is not mandatory to have a
@@ -5325,6 +4863,10 @@ declare interface components {
5325
4863
  /** @constant */
5326
4864
  type: "detached";
5327
4865
  };
4866
+ TaskPathVariables: {
4867
+ /** Format: uuid */
4868
+ taskId: string;
4869
+ };
5328
4870
  TaskProgressDTO: {
5329
4871
  /** @constant */
5330
4872
  type: "in-progress";
@@ -5355,6 +4897,11 @@ declare interface components {
5355
4897
  /** @constant */
5356
4898
  type: "failed";
5357
4899
  data: {
4900
+ /**
4901
+ * Format: uint
4902
+ * @description The index of the log entry that failed, for tasks that apply log entries.
4903
+ */
4904
+ entry?: number | null;
5358
4905
  error: string;
5359
4906
  };
5360
4907
  };
@@ -5400,6 +4947,8 @@ declare interface components {
5400
4947
  number,
5401
4948
  number
5402
4949
  ];
4950
+ /** @description One way a row got to where it is. */
4951
+ Trail: Trail;
5403
4952
  Type: Type;
5404
4953
  /**
5405
4954
  * @description Can be parsed from string with the following syntax:
@@ -5410,67 +4959,11 @@ declare interface components {
5410
4959
  * - `{a: Integer} -> Float`
5411
4960
  * - `{} -> Any`
5412
4961
  */
5413
- TypeContext: {
5414
- returnType: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5415
- variables: {
5416
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5417
- };
5418
- };
5419
- TypeError: {
5420
- kind: components["schemas"]["TypeErrorKind"];
5421
- location: components["schemas"]["SourceLocation"];
5422
- };
5423
- TypeErrorKind: {
5424
- /** @constant */
5425
- type: "unknown-variable";
5426
- data: {
5427
- name: string;
5428
- };
5429
- } | {
5430
- /** @constant */
5431
- type: "unknown-function";
5432
- data: {
5433
- name: string;
5434
- };
5435
- } | {
5436
- /** @constant */
5437
- type: "wrong-arity";
5438
- data: {
5439
- /** Format: uint */
5440
- expected: number;
5441
- /** Format: uint */
5442
- got: number;
5443
- name: string;
5444
- };
5445
- } | {
5446
- /** @constant */
5447
- type: "type-mismatch";
5448
- data: {
5449
- expected: string;
5450
- got: string;
5451
- };
5452
- } | {
5453
- /** @constant */
5454
- type: "non-integer-index";
5455
- } | {
5456
- /** @constant */
5457
- type: "non-record-property-access";
5458
- } | {
5459
- /** @constant */
5460
- type: "nodety";
5461
- data: {
5462
- message: string;
5463
- };
5464
- };
5465
- TypeErrors: components["schemas"]["TypeError"][];
5466
- TypeExprValidationError: {
5467
- /** @constant */
5468
- type: "UnknownVar";
5469
- var: components["schemas"]["LocalParamID"];
5470
- } | {
5471
- /** @constant */
5472
- type: "CyclicReference";
5473
- };
4962
+ TypeContext: TypeContext;
4963
+ TypeError: TypeError_2;
4964
+ TypeErrorKind: TypeErrorKind;
4965
+ TypeErrors: TypeErrors;
4966
+ TypeExprValidationError: TypeExprValidationError;
5474
4967
  /**
5475
4968
  * @description Type expression—the core type representation in nodety.
5476
4969
  *
@@ -5480,74 +4973,7 @@ declare interface components {
5480
4973
  * [`PartialEq`], [`Eq`] and [`Hash`] are structural: `A | B` is not equal to `B | A`.
5481
4974
  * [`Eq`] and [`Hash`] are available when `T: Eq + Hash`.
5482
4975
  */
5483
- TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: {
5484
- /** @constant */
5485
- type: "Type";
5486
- data: components["schemas"]["Type"];
5487
- } | {
5488
- /** @constant */
5489
- type: "Constructor";
5490
- data: {
5491
- inner: components["schemas"]["Type"];
5492
- /** @description Type arguments / record fields. Iterates in insertion order; equality ignores order. */
5493
- parameters: components["schemas"]["Map_of_TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5494
- };
5495
- } | {
5496
- /** @constant */
5497
- type: "Operation";
5498
- data: {
5499
- a: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5500
- b: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5501
- operator: components["schemas"]["ArithmeticOperator"];
5502
- };
5503
- } | {
5504
- /** @constant */
5505
- type: "NodeSignature";
5506
- data: components["schemas"]["NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type"];
5507
- } | {
5508
- /** @constant */
5509
- type: "PortTypes";
5510
- data: components["schemas"]["PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type"];
5511
- } | {
5512
- /** @constant */
5513
- type: "Union";
5514
- data: [
5515
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"],
5516
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"]
5517
- ];
5518
- } | {
5519
- /** @constant */
5520
- type: "KeyOf";
5521
- data: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5522
- } | {
5523
- /** @constant */
5524
- type: "Index";
5525
- data: {
5526
- expr: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5527
- index: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5528
- };
5529
- } | {
5530
- /** @constant */
5531
- type: "Intersection";
5532
- data: [
5533
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"],
5534
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"]
5535
- ];
5536
- } | {
5537
- /** @constant */
5538
- type: "Conditional";
5539
- data: components["schemas"]["Conditional_for_Type_and_ErasedScopedTypeRef_for_Type"];
5540
- } | {
5541
- /** @constant */
5542
- type: "Any";
5543
- } | {
5544
- /** @constant */
5545
- type: "Never";
5546
- } | {
5547
- /** @constant */
5548
- type: "Ref";
5549
- data: components["schemas"]["ErasedScopedTypeRef_for_Type"];
5550
- };
4976
+ TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: TypeExpr<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5551
4977
  /**
5552
4978
  * @description Type expression—the core type representation in nodety.
5553
4979
  *
@@ -5557,107 +4983,27 @@ declare interface components {
5557
4983
  * [`PartialEq`], [`Eq`] and [`Hash`] are structural: `A | B` is not equal to `B | A`.
5558
4984
  * [`Eq`] and [`Hash`] are available when `T: Eq + Hash`.
5559
4985
  */
5560
- TypeExpr_for_Type_and_ParamRef: {
5561
- /** @constant */
5562
- type: "Type";
5563
- data: components["schemas"]["Type"];
5564
- } | {
5565
- /** @constant */
5566
- type: "Constructor";
5567
- data: {
5568
- inner: components["schemas"]["Type"];
5569
- /** @description Type arguments / record fields. Iterates in insertion order; equality ignores order. */
5570
- parameters: components["schemas"]["Map_of_TypeExpr_for_Type_and_ParamRef"];
5571
- };
5572
- } | {
5573
- /** @constant */
5574
- type: "Operation";
5575
- data: {
5576
- a: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5577
- b: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5578
- operator: components["schemas"]["ArithmeticOperator"];
5579
- };
5580
- } | {
5581
- /** @constant */
5582
- type: "NodeSignature";
5583
- data: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
5584
- } | {
5585
- /** @constant */
5586
- type: "PortTypes";
5587
- data: components["schemas"]["PortTypes_for_Type_and_ParamRef"];
5588
- } | {
5589
- /** @constant */
5590
- type: "Union";
5591
- data: [
5592
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"],
5593
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"]
5594
- ];
5595
- } | {
5596
- /** @constant */
5597
- type: "KeyOf";
5598
- data: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5599
- } | {
5600
- /** @constant */
5601
- type: "Index";
5602
- data: {
5603
- expr: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5604
- index: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5605
- };
5606
- } | {
5607
- /** @constant */
5608
- type: "Intersection";
5609
- data: [
5610
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"],
5611
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"]
5612
- ];
5613
- } | {
5614
- /** @constant */
5615
- type: "Conditional";
5616
- data: components["schemas"]["Conditional_for_Type_and_ParamRef"];
5617
- } | {
5618
- /** @constant */
5619
- type: "Any";
5620
- } | {
5621
- /** @constant */
5622
- type: "Never";
5623
- } | {
5624
- /** @constant */
5625
- type: "Ref";
5626
- data: components["schemas"]["ParamRef"];
5627
- };
4986
+ TypeExpr_for_Type_and_ParamRef: TypeExpr<Type, ParamRef>;
5628
4987
  /** @description Type hints for pre-inference annotations (e.g. `T = Integer, U = String`). */
5629
- TypeHints_for_Type_and_ParamRef: {
5630
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5631
- };
4988
+ TypeHints_for_Type_and_ParamRef: TypeHints<Type, ParamRef>;
5632
4989
  /** @description A generic type parameter with optional bound and default. */
5633
- TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type: {
5634
- /** @description Upper bound (e.g. `T extends Comparable`). */
5635
- bound?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
5636
- /** @description Default when not inferred (e.g. `T = Any`). */
5637
- default?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
5638
- };
4990
+ TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type: TypeParameter<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5639
4991
  /** @description A generic type parameter with optional bound and default. */
5640
- TypeParameter_for_Type_and_ParamRef: {
5641
- /** @description Upper bound (e.g. `T extends Comparable`). */
5642
- bound?: components["schemas"]["TypeExpr_for_Type_and_ParamRef"] | null;
5643
- /** @description Default when not inferred (e.g. `T = Any`). */
5644
- default?: components["schemas"]["TypeExpr_for_Type_and_ParamRef"] | null;
5645
- };
4992
+ TypeParameter_for_Type_and_ParamRef: TypeParameter<Type, ParamRef>;
5646
4993
  /**
5647
4994
  * @description Wrapper for BtreeMap
5648
4995
  *
5649
4996
  * Exists so that it can implement traits like [std::str::FromStr]
5650
4997
  */
5651
- TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type: {
5652
- [key: string]: components["schemas"]["TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type"];
5653
- };
4998
+ TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type: TypeParameters<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5654
4999
  /**
5655
5000
  * @description Wrapper for BtreeMap
5656
5001
  *
5657
5002
  * Exists so that it can implement traits like [std::str::FromStr]
5658
5003
  */
5659
- TypeParameters_for_Type_and_ParamRef: {
5660
- [key: string]: components["schemas"]["TypeParameter_for_Type_and_ParamRef"];
5004
+ TypeParameters_for_Type_and_ParamRef: TypeParameters<Type, ParamRef>;
5005
+ UninstalledExtensionPath: {
5006
+ extensionIdent: components["schemas"]["ExtensionIdentifier"];
5661
5007
  };
5662
5008
  /** @enum {string} */
5663
5009
  UniqueBibStrategy: "increment" | "lowest-free";
@@ -5673,6 +5019,11 @@ declare interface components {
5673
5019
  classDto: components["schemas"]["ClassDTO"];
5674
5020
  id: components["schemas"]["ClassId"];
5675
5021
  };
5022
+ /** @description Changes only the state of a class, which is event data and so also changes on classes linked to a template. */
5023
+ UpdateClassStateMutation: {
5024
+ classId: components["schemas"]["ClassId"];
5025
+ state: components["schemas"]["TableState"];
5026
+ };
5676
5027
  UpdateCompetitorMutation: {
5677
5028
  competitorDto: components["schemas"]["CompetitorDTO"];
5678
5029
  competitorId: components["schemas"]["CompetitorId"];
@@ -5751,6 +5102,24 @@ declare interface components {
5751
5102
  game: components["schemas"]["GameDTO"];
5752
5103
  id: components["schemas"]["GameId"];
5753
5104
  };
5105
+ /** @description Renames a standalone table of the user and sets its column types. */
5106
+ UpdateStandaloneTableMutation: {
5107
+ /**
5108
+ * @description Makes the rows and row mutations valid for changed column types, see [RecordTypeWithDefaults::make_valid].
5109
+ * Without it, the update fails if that would change any of them.
5110
+ */
5111
+ modifyRows: boolean;
5112
+ table: components["schemas"]["StandaloneTableDTO"];
5113
+ tableId: components["schemas"]["TableId"];
5114
+ };
5115
+ UpdateStandaloneTableQuery: {
5116
+ /**
5117
+ * @description If true, makes the rows and row mutations valid for changed column types (missing or mistyped columns get the
5118
+ * column's default). Otherwise the update fails with `change-would-modify-rows` if that would change any of them.
5119
+ * @default false
5120
+ */
5121
+ modifyRows: boolean;
5122
+ };
5754
5123
  UpdateTableMutation: {
5755
5124
  table: components["schemas"]["TableDTO"];
5756
5125
  tableId: components["schemas"]["TableId"];
@@ -5769,6 +5138,13 @@ declare interface components {
5769
5138
  ValidationErrorKind_for_Type: ValidationErrorKind<Type>;
5770
5139
  /** @description A validation error with its location and kind. */
5771
5140
  ValidationError_for_Type: ValidationError<Type>;
5141
+ ValueBody: {
5142
+ value: components["schemas"]["ExtensionValue"];
5143
+ };
5144
+ ValuePath: {
5145
+ extensionIdent: components["schemas"]["ExtensionIdentifier"];
5146
+ key: string;
5147
+ };
5772
5148
  /**
5773
5149
  * Important
5774
5150
  * @description Changes in here are breaking changes for logs
@@ -5850,6 +5226,14 @@ export declare interface Conditional<T, R> {
5850
5226
 
5851
5227
  export declare function confirmDeleteItem(modalControls: ModalControls, itemName: string): Promise<boolean>;
5852
5228
 
5229
+ /**
5230
+ * A pin that reroutes a connection
5231
+ */
5232
+ declare interface ConnectionPin {
5233
+ x: number;
5234
+ y: number;
5235
+ }
5236
+
5853
5237
  /**
5854
5238
  * Named type arguments of a [`TypeExpr::Constructor`](crate::TypeExpr::Constructor).
5855
5239
  *
@@ -5913,6 +5297,73 @@ export declare interface DialogButton<T> {
5913
5297
  theme?: 'primary' | 'default' | 'danger';
5914
5298
  }
5915
5299
 
5300
+ declare interface DialogOptions {
5301
+ /** Shows it in a window (see `ModalConfig.window`), for content with links that the user may follow first. */
5302
+ window?: {
5303
+ title: ReactNode;
5304
+ };
5305
+ }
5306
+
5307
+ /**
5308
+ * Greys out a disabled competitor wherever it is shown. Nodes don't spawn disabled competitors, but they can still be
5309
+ * in classes and tables.
5310
+ */
5311
+ export declare function disabledCompetitorClassName(competitor: Pick<CompetitorDAO, 'enabled'> | undefined): string | undefined;
5312
+
5313
+ /**
5314
+ * Disqualifies every row of the table it receives, throwing them all under `key` so that a
5315
+ * [`GroupNode`](super::group_node::GroupNode) further up the graph can collect them.
5316
+ */
5317
+ declare interface DisqualifyNode {
5318
+ key: DqKey;
5319
+ }
5320
+
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
+ /** A caught disqualification. The strategy decides how multiple caught tables of the key get merged. */
5327
+ declare interface DqEntry {
5328
+ key: DqKey_2;
5329
+ mergeStrategy: MultiplexingStrategy_2;
5330
+ }
5331
+
5332
+ declare type DqKey = string;
5333
+
5334
+ declare type DqKey_2 = components['schemas']['DqKey'];
5335
+
5336
+ /**
5337
+ * What a format or game format says about one of its disqualification kinds.
5338
+ */
5339
+ declare interface DqSettings {
5340
+ description: string;
5341
+ /**
5342
+ * Initialises `catch_dqs` of new nodes.
5343
+ */
5344
+ defaultStrategy: DqDefaultStrategy;
5345
+ }
5346
+
5347
+ /**
5348
+ * Decides how caught disqualifications are surfaced.
5349
+ */
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'];
5354
+
5355
+ export declare type DraggableChildProps = React_2.HTMLAttributes<HTMLElement> & React_2.RefAttributes<HTMLElement>;
5356
+
5357
+ /** An element is identified by its primary node: the source, game or result table node, or the first node of a stage. */
5358
+ declare type ElementId = FormatNodeId;
5359
+
5360
+ /** A port of an element, or the output of a group that catches disqualifications (`element` is the group's id then). */
5361
+ declare interface ElementPortRef {
5362
+ element: ElementId | FolderId;
5363
+ /** Index into the element's `inputs` (target) or `outputs` (source). */
5364
+ port: number;
5365
+ }
5366
+
5916
5367
  /** Spelled out because the inferred `queryOptions` type references TanStack's unexported `dataTagSymbol`, which breaks the SDK's declaration rollup. */
5917
5368
  export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T, readonly unknown[]> & {
5918
5369
  queryKey: DataTag<readonly unknown[], T, Error>;
@@ -5923,9 +5374,15 @@ export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T,
5923
5374
  */
5924
5375
  declare type ErasedScopedTypeRef<T> = { type: "Param"; data: ParamRef } | { type: "ScopedExpr"; data: { expr: TypeExpr<T, ErasedScopedTypeRef<T>> } };
5925
5376
 
5377
+ declare type EventCompetitorsNode = CompetitorType_2;
5378
+
5926
5379
  export declare const eventFoldersByEventQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<ContentInEventFolderDTO[]>;
5927
5380
 
5928
- export declare type EventId = Brand<string, 'eventId'>;
5381
+ /**
5382
+ * Identifies an event. Random ([Self::new_random]): the endpoint picks it and `AddEventMutation` carries it.
5383
+ * Deserializing one only yields a reference to an existing event; it does not check that it exists.
5384
+ */
5385
+ export declare type EventId = string & { readonly __brand: 'eventId' };
5929
5386
 
5930
5387
  export declare interface EventPath {
5931
5388
  workspaceId: CommonWorkspaceId;
@@ -5964,8 +5421,26 @@ export declare function extensionContribution<K extends keyof ExtensionContribut
5964
5421
  export declare type ExtensionContributions = {
5965
5422
  'game-format-page-bottom': GameFormatPageContribution;
5966
5423
  'game-page': GamePageContribution;
5424
+ 'table-drop': TableDropContribution;
5967
5425
  };
5968
5426
 
5427
+ /**
5428
+ * Makes `children` draggable with `payload`. Dropping it onto a table hands `payload` to the `table-drop`
5429
+ * contributions of the calling extension, and to no other extension's.
5430
+ */
5431
+ export declare function ExtensionDraggable({ payload, children }: {
5432
+ payload: string;
5433
+ children: ReactElement<DraggableChildProps>;
5434
+ }): JSX.Element;
5435
+
5436
+ /** What the host lends to extension callbacks that run outside of the extension's components. */
5437
+ export declare interface ExtensionHost {
5438
+ /** Same as {@link useExtensionBackend}. */
5439
+ backend: (path: string, init?: RequestInit) => Promise<Response>;
5440
+ /** Modals whose content can use the extension's hooks, like {@link useExtensionBackend}. */
5441
+ modal: ModalControls;
5442
+ }
5443
+
5969
5444
  export declare type ExtensionInjectPlaceKey = keyof ExtensionContributions;
5970
5445
 
5971
5446
  /**
@@ -6013,6 +5488,8 @@ export declare interface ExtensionSidebarContribution {
6013
5488
 
6014
5489
  export declare type ExtensionSidebarProps = EventPath;
6015
5490
 
5491
+ declare type ExtractRecordFieldError<T> = { type: "field-does-not-exist"; data: string } | { type: "invalid-type"; data: { field: string; value: Value<T> | null } };
5492
+
6016
5493
  export declare interface FieldTypeWithDefault {
6017
5494
  fieldType: TypeExpr<Type>;
6018
5495
  /**
@@ -6021,24 +5498,89 @@ export declare interface FieldTypeWithDefault {
6021
5498
  default: Value | null;
6022
5499
  }
6023
5500
 
5501
+ /** Games and result tables live in folders, and folders in folders. */
5502
+ declare type FolderContentRef = {
5503
+ type: 'element';
5504
+ id: ElementId;
5505
+ } | {
5506
+ type: 'folder';
5507
+ id: FolderId;
5508
+ };
5509
+
5510
+ declare type FolderId = FormatNodeId;
5511
+
6024
5512
  /**
6025
5513
  * How a competitor is written out. Kept apart from the components that show competitors so both
6026
5514
  * the picker and the selector can reach it without importing each other.
6027
5515
  */
6028
5516
  export declare function formatCompetitorName(competitor: CompetitorDAO): string;
6029
5517
 
5518
+ declare interface FormatConnectionDTO {
5519
+ sourceFormatNodeId: FormatNodeId;
5520
+ targetFormatNodeId: FormatNodeId;
5521
+ sourceOutput: OutputIdx;
5522
+ targetInput: InputIdx;
5523
+ pins: ConnectionPin[];
5524
+ }
5525
+
6030
5526
  declare type FormatGroupId = Brand<string, 'formatGroupId'>;
6031
5527
 
6032
- declare type FormatId = Brand<string, 'formatId'>;
5528
+ /**
5529
+ * Identifies a format. Comes from one of:
5530
+ * - [Self::new_random]: the endpoint picks it and `AddFormatMutation` carries it.
5531
+ * - [Self::root_of]: the root format of an event.
5532
+ * - [Self::of_copy]: the copy a mutation makes with a seed.
5533
+ * - `ImportArchiveMutation`: derived from the seed, the event and the archive entry.
5534
+ *
5535
+ * Deserializing one only yields a reference to an existing format; it does not check that it exists.
5536
+ */
5537
+ declare type FormatId = string & { readonly __brand: 'formatId' };
6033
5538
 
6034
5539
  export declare type FormatInstanceHash = Brand<string, 'formatInstanceHash'>;
6035
5540
 
6036
- export declare type FormatNodeId = Brand<string, 'formatNodeId'>;
5541
+ /**
5542
+ * For documentation about the node struct, checkout the docs for FormatNodeDAO.
5543
+ */
5544
+ declare interface FormatNodeDTO {
5545
+ /**
5546
+ * Any unique id works, including for new nodes: whether the id refers to a new or an
5547
+ * existing node is determined by whether it already exists on the format, not by its value.
5548
+ */
5549
+ id: FormatNodeId;
5550
+ /**
5551
+ * Ignored for existing nodes, because a node's test id never changes. Defaults to the node id.
5552
+ */
5553
+ testId?: FormatNodeTestId | null;
5554
+ xPos: number;
5555
+ yPos: number;
5556
+ nodeType: NodeType;
5557
+ parentNodeId: FormatNodeId | null;
5558
+ settings: RecordValue<Primitive>;
5559
+ controlValues: Record<number, Value>;
5560
+ typeHints: TypeHints<Type>;
5561
+ inputVargsToArray: boolean;
5562
+ outputVargsToArray: boolean;
5563
+ customData?: Record<string, string>;
5564
+ }
6037
5565
 
6038
- declare type FormatNodeTestId = Brand<string, 'formatNodeTestId'>;
5566
+ declare type FormatNodeDTO_2 = components['schemas']['FormatNodeDTO'] & {
5567
+ addedInputVargs?: number;
5568
+ addedOutputVargs?: number;
5569
+ };
5570
+
5571
+ export declare type FormatNodeId = string & { readonly __brand: 'formatNodeId' };
5572
+
5573
+ declare type FormatNodeTestId = string & { readonly __brand: 'formatNodeTestId' };
6039
5574
 
6040
5575
  declare type FormatTestId = Brand<string, 'formatTestId'>;
6041
5576
 
5577
+ /**
5578
+ * Represents a state in which the format is not valid for execution but can be stored in the db.
5579
+ */
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" };
5581
+
5582
+ declare type FormatValidity = "invalid" | "valid";
5583
+
6042
5584
  export declare type FormContribution<Props, DTO> = FC<Props & {
6043
5585
  formFieldRegistry: FormFieldRegistry;
6044
5586
  ref: Ref<ContributionHandle<DTO>>;
@@ -6085,6 +5627,11 @@ export declare interface FormFieldProps<I, O = I> {
6085
5627
  isNew?: boolean;
6086
5628
  registry?: FormFieldRegistry;
6087
5629
  map?: (value: I) => O;
5630
+ /**
5631
+ * Persists the overwritten value under this key (see `usePersistedState`), so that it survives leaving the page.
5632
+ * Only the key passed in first is used.
5633
+ */
5634
+ persistenceKey?: string | null;
6088
5635
  }
6089
5636
 
6090
5637
  export declare interface FormFieldRegistry {
@@ -6111,11 +5658,26 @@ export declare type FormFieldState<T> = [value: T, setValue: (value: T | ((oldVa
6111
5658
 
6112
5659
  export declare type GameDAO = components['schemas']['GameDAO'];
6113
5660
 
5661
+ declare type GameDivision = {
5662
+ type: 'fixed';
5663
+ strategy: 'serpentine' | 'roundrobin';
5664
+ count: number;
5665
+ } | {
5666
+ type: 'dynamic';
5667
+ strategy: 'serpentine' | 'roundrobin';
5668
+ maxSize: number;
5669
+ allowBackfill: boolean;
5670
+ };
5671
+
6114
5672
  export declare type GameDTO = components['schemas']['GameDTO'];
6115
5673
 
6116
5674
  export declare type GameFormatDTO = components['schemas']['GameFormatDTO'];
6117
5675
 
6118
- export declare type GameFormatId = Brand<string, 'gameFormatId'>;
5676
+ /**
5677
+ * Identifies a game format. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
5678
+ * Deserializing one only yields a reference to an existing game format; it does not check that it exists.
5679
+ */
5680
+ export declare type GameFormatId = string & { readonly __brand: 'gameFormatId' };
6119
5681
 
6120
5682
  export declare type GameFormatPageContribution = FormContribution<GameFormatPageProps & {
6121
5683
  gameFormat: GameFormatDTO;
@@ -6125,8 +5687,40 @@ export declare type GameFormatPageProps = EventPath & {
6125
5687
  gameFormatId: GameFormatId | null;
6126
5688
  };
6127
5689
 
5690
+ /**
5691
+ * One step of a game format's post processing. Automations run in order on every row of a game's
5692
+ * result, after the result has been entered. They never change the stored result of the game, only
5693
+ * the result table the game node outputs.
5694
+ */
5695
+ declare type GameFormatPostProcessingStep = { type: "disqualify"; data: { key: DqKey; expression: string } } | { type: "set-output-column"; data: { column: string; columnType: TypeExpr<Type>; expression: string } };
5696
+
6128
5697
  export declare type GameId = Brand<string, 'gameId'>;
6129
5698
 
5699
+ declare type GameKind = {
5700
+ type: 'game-node';
5701
+ gameFormatId: GameFormatId;
5702
+ variant: GameNodeVariant_2;
5703
+ } | {
5704
+ type: 'gamified-format';
5705
+ formatId: FormatId;
5706
+ };
5707
+
5708
+ declare interface GameNodeDTO {
5709
+ variant: GameNodeVariant;
5710
+ gameFormatId: GameFormatId;
5711
+ /**
5712
+ * Caught disqualifications are not thrown. [DqStrategy] decides how they are surfaced.
5713
+ */
5714
+ catchDqs?: Record<DqKey, DqStrategy>;
5715
+ }
5716
+
5717
+ /**
5718
+ * How many games a game node plays and how they depend on each other.
5719
+ */
5720
+ declare type GameNodeVariant = { type: "single" } | { type: "parallel" } | { type: "sequential"; data: { gameCount: number } };
5721
+
5722
+ declare type GameNodeVariant_2 = components['schemas']['GameNodeVariant'];
5723
+
6130
5724
  export declare type GamePageContribution = FormContribution<GamePageProps & {
6131
5725
  game: WorkingGameDTO;
6132
5726
  }, WorkingGameDTO>;
@@ -6135,6 +5729,9 @@ export declare type GamePageProps = EventPath & {
6135
5729
  gameId: GameId | null;
6136
5730
  };
6137
5731
 
5732
+ /** Where a game goes in the simplified view of the root format. */
5733
+ declare type GamePlace = Omit<AddGameEdit, 'type' | 'game' | 'division'>;
5734
+
6138
5735
  export declare const gamesWithTablesMappedByEventQO: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<Map<GameId, GameWithTables>>;
6139
5736
 
6140
5737
  export declare type GameWithTables = components['schemas']['GameWithTables'];
@@ -6150,6 +5747,15 @@ export declare const getCompetitorsQO: (workspaceId: CommonWorkspaceId, eventId:
6150
5747
 
6151
5748
  export declare const getGameTableResolvedByGameQO: (workspaceId: CommonWorkspaceId, eventId: EventId, gameID: GameId, tableKind: "EntryList" | "ResultList") => EngineQueryOptions<ResolvedTableDTO>;
6152
5749
 
5750
+ /**
5751
+ * The table as nodes see it, with the rows they don't see in `hiddenRows`.
5752
+ */
5753
+ export declare const getGameTableResolvedQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId, tableId: TableId) => EngineQueryOptions<ResolvedTableDTO>;
5754
+
5755
+ export declare const getGameTablesByEventQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<Map<TableId, TableDAO>>;
5756
+
5757
+ export declare const getStandaloneTablesByEventQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<Map<TableId, TableDAO>>;
5758
+
6153
5759
  export declare const getTableByIdQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId, tableId: TableId) => EngineQueryOptions<TableWithType>;
6154
5760
 
6155
5761
  /**
@@ -6157,6 +5763,39 @@ export declare const getTableByIdQueryOptions: (workspaceId: CommonWorkspaceId,
6157
5763
  */
6158
5764
  declare type GraphLocation = { type: "Edge"; data: number } | { type: "InputPort"; data: { nodeIdx: number; inputIdx: number } };
6159
5765
 
5766
+ /**
5767
+ * Contains other nodes. It can add its name to the folder path of its descendants and catch the disqualifications
5768
+ * they throw.
5769
+ */
5770
+ declare interface GroupNode {
5771
+ name: string;
5772
+ /**
5773
+ * Whether the name is appended to the folder path of the descendants.
5774
+ */
5775
+ folder: boolean;
5776
+ /**
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.
5779
+ */
5780
+ catches: Record<DqKey, MultiplexingStrategy>;
5781
+ }
5782
+
5783
+ /** The settings of a group node: BE-C's unified folder, group and catch-dq node. */
5784
+ declare interface GroupSettings {
5785
+ /**
5786
+ * `null` for an unnamed group that is no folder (an empty name in the node), which only catches. With `folder` the
5787
+ * name is added to the path of the content.
5788
+ */
5789
+ name: {
5790
+ text: string;
5791
+ folder: boolean;
5792
+ } | null;
5793
+ /** In the order of the group's outputs, one per caught key. */
5794
+ catches: DqEntry[];
5795
+ }
5796
+
5797
+ declare type GTFilterKind = { type: "class-filter" } | { type: "gender" } | { type: "comparison-filter"; data: ComparisonOp } | { type: "custom" };
5798
+
6160
5799
  export declare const H1: FC<H1Props>;
6161
5800
 
6162
5801
  export declare interface H1Props {
@@ -6178,7 +5817,7 @@ export declare type HRProps = {
6178
5817
  className?: string;
6179
5818
  };
6180
5819
 
6181
- declare type InputIdx = Brand<number, 'inputIdx'>;
5820
+ declare type InputIdx = number & { readonly __brand: 'inputIdx' };
6182
5821
 
6183
5822
  export declare enum InputLayout {
6184
5823
  Normal = 0,
@@ -6190,6 +5829,23 @@ export declare enum InputLayout {
6190
5829
  Fill = 2
6191
5830
  }
6192
5831
 
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" };
5833
+
5834
+ /** Anything that can be selected and removed. A connection is identified by its target port: inputs take one connection. */
5835
+ declare type ItemRef = {
5836
+ type: 'element';
5837
+ id: ElementId;
5838
+ } | {
5839
+ type: 'connection';
5840
+ target: ElementPortRef;
5841
+ } | {
5842
+ type: 'folder';
5843
+ id: FolderId;
5844
+ } | {
5845
+ type: 'comment';
5846
+ id: FormatNodeId;
5847
+ };
5848
+
6193
5849
  /** Loads graphite-script from the host's wasm on demand, a static import would make this entry an async module. */
6194
5850
  export declare const loadGraphiteScript: () => Promise<{
6195
5851
  primValueToTypeExpr: typeof primValueToTypeExpr;
@@ -6215,12 +5871,331 @@ export declare type Locales = 'de' | 'en';
6215
5871
  */
6216
5872
  export declare type LocalParamID = number;
6217
5873
 
5874
+ export declare type LogEntry = components['schemas']['LogEntry'];
5875
+
6218
5876
  declare type LogId = Brand<number, 'logId'>;
6219
5877
 
5878
+ /** One step of a log batch: its entries stay together and in order. */
5879
+ export declare interface LogOperation {
5880
+ /** Names the operation when one of its entries fails. */
5881
+ name: string;
5882
+ entries: LogEntry[];
5883
+ }
5884
+
5885
+ /**
5886
+ * A change to the lowered view. Nodeification turns it into one change of the node graph. The output `connectFrom` is
5887
+ * connected to the first input of the new game or result table that its kind and type fit.
5888
+ */
5889
+ 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
+ */
5894
+ {
5895
+ type: 'add-source';
5896
+ source: SourceKind;
5897
+ section: SectionId | null;
5898
+ connectTo?: ElementPortRef;
5899
+ }
5900
+ /** A new game or result table goes where `at` points, e.g. first, or where a connection was dropped. */
5901
+ | AddGameEdit_2 | {
5902
+ type: 'add-result';
5903
+ section: SectionId;
5904
+ at: MoveTarget;
5905
+ name: string;
5906
+ connectFrom?: ElementPortRef;
5907
+ }
5908
+ /**
5909
+ * Settings of a node, e.g. a game's variant or the values of unconnected inputs. Drops connections at lost ports. With
5910
+ * `groups`, the changed values reach the node's siblings in these groups only, instead of those visible.
5911
+ */
5912
+ | {
5913
+ type: 'update-node';
5914
+ node: FormatNodeId;
5915
+ update: NodeUpdate;
5916
+ groups?: SimplifiedGroupId[];
5917
+ }
5918
+ /**
5919
+ * Replaces the connection that currently ends at `target`, if any. With `movedFrom`, also removes the one ending there.
5920
+ * A stage that fed nothing else goes with a replaced connection, and with it the connection into it.
5921
+ * With `stage`, connects through a new stage node: into its first input that fits `source`, out of its first output
5922
+ * that fits `target`.
5923
+ */
5924
+ /** A stage fed by `connectFrom`, its output left open, e.g. to connect a game to later. */
5925
+ | {
5926
+ type: 'add-stage';
5927
+ section: SectionId;
5928
+ stage: StageSpec;
5929
+ connectFrom: ElementPortRef;
5930
+ } | {
5931
+ type: 'connect';
5932
+ source: ElementPortRef;
5933
+ target: ElementPortRef;
5934
+ movedFrom?: ElementPortRef;
5935
+ stage?: StageSpec;
5936
+ }
5937
+ /** Connects each of the `sources`, each a group's own, into the copy of the shared `target` in its group. */
5938
+ | {
5939
+ type: 'connect-groups';
5940
+ sources: ElementPortRef[];
5941
+ target: ElementPortRef;
5942
+ }
5943
+ /** Connects the `sources`, one per group, through a new `merger` into `target`, in their order (see `mergers`). */
5944
+ | {
5945
+ type: 'merge';
5946
+ section: SectionId;
5947
+ sources: ElementPortRef[];
5948
+ target: ElementPortRef;
5949
+ merger: StageSpec;
5950
+ } | {
5951
+ type: 'remove';
5952
+ items: ItemRef[];
5953
+ }
5954
+ /**
5955
+ * Gives a result table a scoring of `parts` (see `ResultScoring`), changes it, or with null takes it away. Each part
5956
+ * keeps what came into the input it had before (`from`: of the parts before, or 0 for the table's own input without a
5957
+ * scoring); without a scoring the table keeps what came into the first part. What the overall standing fed, the new
5958
+ * overall standing feeds. What a sequential standing after a part fed, the standing after that part feeds when the
5959
+ * scoring stays sequential and the part isn't the last. Other standings' consumers lose their connection.
5960
+ */
5961
+ | {
5962
+ type: 'set-result-scoring';
5963
+ result: ElementId;
5964
+ scoring: ScoringEdit | null;
5965
+ }
5966
+ /**
5967
+ * Copies elements, and folders with their content, each right after itself, the first into `section`: with what comes
5968
+ * into them and the connections among them, but not into what they feed.
5969
+ */
5970
+ | {
5971
+ type: 'duplicate';
5972
+ items: FolderContentRef[];
5973
+ section: SectionId;
5974
+ }
5975
+ /** Adds an empty group to the section: its nodes outside the groups are the new group's as well as the others'. */
5976
+ | {
5977
+ type: 'add-group';
5978
+ section: SectionId;
5979
+ name: string;
5980
+ }
5981
+ /**
5982
+ * Adds copies of the group: copies of its shared nodes as their siblings, of its own nodes as the copy's own. With a
5983
+ * `classId`, the copy's class source (of the group's own) is of that class. The copies come after the groups, or in
5984
+ * `order`, all the section's groups then.
5985
+ */
5986
+ | {
5987
+ type: 'duplicate-group';
5988
+ section: SectionId;
5989
+ group: SimplifiedGroupId;
5990
+ copies: {
5991
+ group: SimplifiedGroupId;
5992
+ name: string;
5993
+ classId?: ClassId;
5994
+ }[];
5995
+ order?: SimplifiedGroupId[];
5996
+ }
5997
+ /** Copies the section with all its nodes into a new one right after it, linked among themselves only. */
5998
+ | {
5999
+ type: 'copy-section';
6000
+ section: SectionId;
6001
+ } | {
6002
+ type: 'rename-section';
6003
+ section: SectionId;
6004
+ name: string;
6005
+ }
6006
+ /**
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`).
6009
+ */
6010
+ | {
6011
+ type: 'add-section';
6012
+ section: SectionId;
6013
+ kind: NewSectionKind;
6014
+ }
6015
+ /** Makes the class sources of the age group section's groups those of another age group. */
6016
+ | {
6017
+ type: 'set-age-group';
6018
+ section: SectionId;
6019
+ classes: AgeGroupClasses;
6020
+ }
6021
+ /**
6022
+ * Turns the section into one of the kinds it can be (see `sectionConversions`). A layered section with one group
6023
+ * becomes simple without it: the group's nodes are the section's.
6024
+ */
6025
+ | {
6026
+ type: 'set-section-kind';
6027
+ section: SectionId;
6028
+ 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
+ } | {
6044
+ type: 'rename-group';
6045
+ section: SectionId;
6046
+ group: SimplifiedGroupId;
6047
+ name: string;
6048
+ }
6049
+ /** Moves the group one place left (-1) or right (1) in the order of the section's groups. */
6050
+ | {
6051
+ type: 'move-group';
6052
+ section: SectionId;
6053
+ group: SimplifiedGroupId;
6054
+ step: -1 | 1;
6055
+ }
6056
+ /** Removes the group with its nodes; their siblings in the other groups stay. */
6057
+ | {
6058
+ type: 'delete-group';
6059
+ section: SectionId;
6060
+ group: SimplifiedGroupId;
6061
+ }
6062
+ /**
6063
+ * Moves a group's own element into another group of its section: it then connects to that group's copies of shared
6064
+ * nodes, replacing what those inputs had; connections to the old group's own nodes go. A shared element becomes its
6065
+ * copy in the group alone, as that group's own: its other copies go.
6066
+ */
6067
+ | {
6068
+ type: 'move-to-group';
6069
+ element: ElementId;
6070
+ group: SimplifiedGroupId;
6071
+ }
6072
+ /**
6073
+ * Gives the element a copy in each of `groups` it isn't in yet: a group's own element becomes shared with them (see
6074
+ * `share`), a shared one gets more copies, each connected like its siblings to its group's copies of shared neighbours.
6075
+ * What a group's own nodes give it, e.g. its class source, is left to connect.
6076
+ */
6077
+ | {
6078
+ type: 'add-to-group';
6079
+ element: ElementId;
6080
+ groups: SimplifiedGroupId[];
6081
+ }
6082
+ /**
6083
+ * Makes the element of all groups one per group: a copy in each, connected like it, with what it feeds outside the
6084
+ * groups (see `splitByGroups`). A copy fed by a merger of the groups' outputs gets its group's output instead, and the
6085
+ * merger goes once it feeds nothing.
6086
+ */
6087
+ | {
6088
+ type: 'one-per-group';
6089
+ element: ElementId;
6090
+ }
6091
+ /**
6092
+ * Makes the element one for all groups: a group's own element leaves its group, of a shared one the copy `element`
6093
+ * stays outside the groups and feeds what all copies fed. What came into the copies comes into it, through a new
6094
+ * `merger` where they got different things (one is picked when not given, see `LoweredFormatEditor.apply`).
6095
+ */
6096
+ | {
6097
+ type: 'one-for-all-groups';
6098
+ element: ElementId;
6099
+ merger?: StageSpec;
6100
+ }
6101
+ /** Removes the shared element's copy in `group`; the last copy left is its group's own. */
6102
+ | {
6103
+ type: 'remove-from-group';
6104
+ element: ElementId;
6105
+ group: SimplifiedGroupId;
6106
+ }
6107
+ /** Takes a group's own element out of its group: it is every group's then, one node for all of them. */
6108
+ | {
6109
+ type: 'ungroup';
6110
+ element: ElementId;
6111
+ }
6112
+ /** The elements' nodes leave their siblings: each copy stays in its group as that group's own. */
6113
+ | {
6114
+ type: 'unshare';
6115
+ elements: ElementId[];
6116
+ }
6117
+ /**
6118
+ * Shares the elements' nodes, which are the groups' own: with one node of the same type per group, in the same order,
6119
+ * those become siblings; the nodes of one group get copies in the other `groups`, connected like them.
6120
+ */
6121
+ | {
6122
+ type: 'share';
6123
+ elements: ElementId[];
6124
+ groups: SimplifiedGroupId[];
6125
+ } | {
6126
+ type: 'add-folder';
6127
+ settings: GroupSettings;
6128
+ parent: FolderId | null;
6129
+ content: FolderContentRef[];
6130
+ } | {
6131
+ type: 'update-folder';
6132
+ folder: FolderId;
6133
+ settings: GroupSettings;
6134
+ } | {
6135
+ type: 'move';
6136
+ item: FolderContentRef;
6137
+ to: MoveTarget;
6138
+ }
6139
+ /**
6140
+ * Makes the game another one, in place: what came into it goes into the new game's inputs that fit, what it fed stays
6141
+ * connected where its outputs still are, and it keeps how it handles the disqualifications both games have.
6142
+ */
6143
+ | {
6144
+ type: 'change-game';
6145
+ game: ElementId;
6146
+ to: GameKind;
6147
+ }
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
+ /**
6156
+ * 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
+ * the last with the chain's length. Taking a step out connects what it got to what it fed, where the types fit.
6158
+ */
6159
+ | {
6160
+ type: 'add-stage-step';
6161
+ stage: ElementId;
6162
+ index: number;
6163
+ step: StageSpec;
6164
+ } | {
6165
+ type: 'remove-stage-step';
6166
+ stage: ElementId;
6167
+ index: number;
6168
+ } | {
6169
+ type: 'move-stage-step';
6170
+ stage: ElementId;
6171
+ index: number;
6172
+ step: -1 | 1;
6173
+ } | {
6174
+ type: 'add-comment';
6175
+ target: ElementId;
6176
+ text: string;
6177
+ } | {
6178
+ type: 'update-comment';
6179
+ comment: FormatNodeId;
6180
+ text: string;
6181
+ };
6182
+
6183
+ declare interface MakeValidError {
6184
+ missingDefaultField: string;
6185
+ }
6186
+
6187
+ declare type MathNodeOp = "addition" | "subtraction" | "multiplication" | "division-float" | "division-integer" | "modulo" | "power" | "logarithm" | "sqrt" | "absolute" | "minimum" | "maximum" | "ceil" | "floor" | "round";
6188
+
6220
6189
  export declare type MergePathParams<A, B> = {
6221
6190
  [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
6222
6191
  };
6223
6192
 
6193
+ /**
6194
+ * 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.
6196
+ */
6197
+ declare type MissingFromPrevious = "leave-out" | "worst-total-plus-one";
6198
+
6224
6199
  export declare function Modal({ children, isOpen, onClose, closable, height, width, verticalPosition, horizontalPosition, lightbox, blockBackground, }: ModalProps): null;
6225
6200
 
6226
6201
  /** Modal inner body: explicit width; shell uses `width: 'fit'` and shrink-wraps to this. */
@@ -6236,6 +6211,14 @@ export declare interface ModalConfig {
6236
6211
  horizontalPosition?: 'center' | 'left' | 'right';
6237
6212
  lightbox?: boolean;
6238
6213
  blockBackground?: boolean;
6214
+ /**
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.
6218
+ */
6219
+ window?: {
6220
+ title: ReactNode;
6221
+ };
6239
6222
  onClose?: () => void;
6240
6223
  }
6241
6224
 
@@ -6263,8 +6246,38 @@ export declare interface ModalProps {
6263
6246
  blockBackground?: boolean;
6264
6247
  }
6265
6248
 
6249
+ /**
6250
+ * Where a moved item goes: right before another item, into that item's folder, or last into a folder. The view orders
6251
+ * items by their position, so the moved nodes get a position between their new neighbours.
6252
+ */
6253
+ declare type MoveTarget = {
6254
+ type: 'before';
6255
+ item: FolderContentRef;
6256
+ } | {
6257
+ type: 'first' | 'last';
6258
+ folder: FolderId | null;
6259
+ };
6260
+
6261
+ declare type MultiplexingStrategy = "serpentine" | "round-robin";
6262
+
6263
+ declare type MultiplexingStrategy_2 = components['schemas']['MultiplexingStrategy'];
6264
+
6265
+ declare type NewSectionKind = {
6266
+ type: 'simple' | 'layered';
6267
+ } | {
6268
+ type: 'age-group';
6269
+ classes: AgeGroupClasses;
6270
+ };
6271
+
6272
+ 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
+
6266
6274
  declare type NodeInstanceHash = Brand<string, 'nodeInstanceHash'>;
6267
6275
 
6276
+ /**
6277
+ * Shared by the variants of one node, each in another group of the same section.
6278
+ */
6279
+ declare type NodeLinkId = string & { readonly __brand: 'nodeLinkId' };
6280
+
6268
6281
  /**
6269
6282
  * Function-like type for a node: generic parameters, inputs, outputs, and defaults.
6270
6283
  * Written in notation as `<T>(T) -> (T)` for the identity node.
@@ -6316,6 +6329,13 @@ export declare interface NodeSignature<T, R = ParamRef> {
6316
6329
  requiredTags: number[];
6317
6330
  }
6318
6331
 
6332
+ declare type NodetyError = { type: "NodeHasChildren" } | { type: "ParentNotFound" } | { type: "NodeNotFound" } | { type: "CycleDetected" } | { type: "TypeExprValidationError"; error: TypeExprValidationError };
6333
+
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 };
6335
+
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'>>;
6338
+
6319
6339
  declare type NoMetadata = Record<never, never>;
6320
6340
 
6321
6341
  declare interface NoSupertypeLayer<T> {
@@ -6326,6 +6346,21 @@ declare interface NoSupertypeLayer<T> {
6326
6346
 
6327
6347
  declare type NoSupertypeLayerReason = "UnknownTypeParam" | "NodeSignatureInputsVarg" | "NodeSignatureInputs" | "NodeSignatureOutputs" | "NodeSignatureTags" | "NodeSignatureRequiredTags" | "PortTypesVarg" | "PortTypesArity" | "PortTypesPort" | "Index" | "ConstructorArity" | "ConstructorParam";
6328
6348
 
6349
+ /**
6350
+ * The handle sticking out of the west edge of a panel, vertically centered. It is also the only thing left of the
6351
+ * panel once it is hidden.
6352
+ */
6353
+ export declare function NotchButton({ direction, label, onClick, className, children }: NotchButtonProps): JSX.Element;
6354
+
6355
+ export declare interface NotchButtonProps {
6356
+ /** Where the chevron points: out of the panel to hide it, back into it to bring it in. */
6357
+ direction: 'left' | 'right';
6358
+ label: string;
6359
+ onClick: () => void;
6360
+ className?: string;
6361
+ children?: ReactNode;
6362
+ }
6363
+
6329
6364
  export declare function Note({ children, className }: NoteProps): JSX.Element;
6330
6365
 
6331
6366
  export declare interface NoteProps {
@@ -6350,7 +6385,7 @@ export declare interface OptionalQueryField<T> {
6350
6385
  codec: QueryCodec<T>;
6351
6386
  }
6352
6387
 
6353
- declare type OutputIdx = Brand<number, 'outputIdx'>;
6388
+ declare type OutputIdx = number & { readonly __brand: 'outputIdx' };
6354
6389
 
6355
6390
  export declare const Page: FC<PageProps>;
6356
6391
 
@@ -6374,6 +6409,8 @@ export declare interface ParamRef {
6374
6409
  infer: boolean;
6375
6410
  }
6376
6411
 
6412
+ declare type ParentType = { type: "format-root" } | { type: "closure-node"; data: FormatNodeId };
6413
+
6377
6414
  export declare interface ParsedQuery<Values> {
6378
6415
  values: Values;
6379
6416
  /** The original search with malformed known values removed and valid values normalized. */
@@ -6381,6 +6418,8 @@ export declare interface ParsedQuery<Values> {
6381
6418
  malformedKeys: string[];
6382
6419
  }
6383
6420
 
6421
+ declare type ParseErrorKind = { type: "invalid-token" } | { type: "unexpected-token" } | { type: "expected-token"; data: { expected: string } } | { type: "invalid-number" } | { type: "unterminated-string" };
6422
+
6384
6423
  export declare type PathParams<Path extends string> = Path extends `${infer Base}/*` ? PathParams<Base> : Path extends `${infer _}/${infer Rest}` ? MergePathParams<PathSegmentParam<_>, PathParams<Rest>> : PathSegmentParam<Path>;
6385
6424
 
6386
6425
  export declare type PathSegmentParam<S extends string> = S extends `:${infer P}` ? {
@@ -6448,6 +6487,12 @@ export declare function putTableRows(workspaceId: CommonWorkspaceId, eventId: Ev
6448
6487
  } | {
6449
6488
  type: "row-not-hidden";
6450
6489
  data: [components["schemas"]["TableId"], components["schemas"]["CompetitorId"]];
6490
+ } | {
6491
+ type: "incompatible-row";
6492
+ data: components["schemas"]["MakeValidError"];
6493
+ } | {
6494
+ type: "change-would-modify-rows";
6495
+ data: components["schemas"]["RecordModifications"];
6451
6496
  };
6452
6497
  }>;
6453
6498
 
@@ -6481,6 +6526,13 @@ export declare interface QuerySchema<Fields extends QueryFields> {
6481
6526
  set<Key extends keyof Fields>(search: string, key: Key, value: QueryFieldValue<Fields[Key]>): string;
6482
6527
  }
6483
6528
 
6529
+ declare type RecordFieldOp = "read-field" | "write-field";
6530
+
6531
+ declare interface RecordMakeValidMutation {
6532
+ columnName: string;
6533
+ newValue: Value;
6534
+ }
6535
+
6484
6536
  /**
6485
6537
  * RecordTypes should **only** be manipulated though this helper to have a single source of truth for the structure.
6486
6538
  */
@@ -6541,9 +6593,10 @@ export declare interface RouterContextType {
6541
6593
  /** The complete reactive browser location. */
6542
6594
  location: RouterLocation;
6543
6595
  /**
6544
- * User initiated routing. Asks route guards before leaving (see `useGuardRoute`).
6596
+ * User initiated routing. Asks route guards before leaving (see `useGuardRoute`). `onArrive` runs once the location
6597
+ * is `to`, also when it already was, and not when the user stays on a guarded route.
6545
6598
  */
6546
- navigate: (to: string) => void;
6599
+ navigate: (to: string, onArrive?: (location: RouterLocation) => void) => void;
6547
6600
  /**
6548
6601
  * Programmatic redirect replacing the current history entry. Bypasses route guards.
6549
6602
  */
@@ -6585,6 +6638,18 @@ export declare interface RowAction<T> {
6585
6638
 
6586
6639
  declare type RowMutationIdx = Brand<number, 'rowMutationIdx'>;
6587
6640
 
6641
+ 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 };
6642
+
6643
+ declare interface RowMutationWithBatch {
6644
+ kind: RowMutationKind;
6645
+ competitorId: number;
6646
+ /**
6647
+ * When performing batch actions like delete all, then all these will have the same batch id.
6648
+ * Otherwise it will get incremented. Used for undo & redo.
6649
+ */
6650
+ batch: number;
6651
+ }
6652
+
6588
6653
  declare interface Rows<SortingState> {
6589
6654
  /**
6590
6655
  * Competitors are guaranteed to be unique per game table.
@@ -6604,16 +6669,50 @@ export declare enum RowState {
6604
6669
  Added = 3
6605
6670
  }
6606
6671
 
6607
- export declare function SearchInput({ value, onChange, placeholder, className }: SearchInputProps): JSX.Element;
6672
+ /**
6673
+ * GameTableTypes types should **only** be manipulated though this helper to have a single source of truth for the structure.
6674
+ */
6675
+ declare interface RowTypeHelper<R = ParamRef> {
6676
+ columns: RecordTypeHelper<R>;
6677
+ }
6678
+
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 } };
6680
+
6681
+ /** A sequential scoring of fewer than two parts is a parallel one (see `ResultScoring`). */
6682
+ declare interface ScoringEdit {
6683
+ mode: ScoringMode;
6684
+ parts: {
6685
+ part: SimpleScoringPart_2;
6686
+ from: number | null;
6687
+ }[];
6688
+ }
6689
+
6690
+ declare type ScoringMode = {
6691
+ type: 'parallel';
6692
+ } | {
6693
+ type: 'sequential';
6694
+ missing: MissingFromPrevious;
6695
+ };
6696
+
6697
+ export declare function SearchInput({ value, onChange, placeholder, className, autoFocus, ref, onKeyDown }: SearchInputProps): JSX.Element;
6608
6698
 
6609
6699
  export declare type SearchInputProps = {
6610
6700
  value: string;
6611
6701
  onChange: (value: string) => void;
6612
6702
  placeholder?: string;
6613
6703
  className?: string;
6704
+ autoFocus?: boolean;
6705
+ ref?: Ref<HTMLInputElement>;
6706
+ onKeyDown?: (event: KeyboardEvent_2<HTMLInputElement>) => void;
6614
6707
  };
6615
6708
 
6616
- declare type SerializableNonPrimitiveValue = { type: "game-table"; data: Table<Unsorted_2, StateMetadata> } | { type: "game-table-sorted"; data: Table<Sorted_2, StateMetadata> } | { type: "row"; data: Row } | { type: "class"; data: string } | { type: "closure" };
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;
6714
+
6715
+ 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" };
6617
6716
 
6618
6717
  /**
6619
6718
  * A keyboard shortcut as the keys to press together, e.g. `['Mod', 'Shift', 'Z']`. `Mod` is Ctrl, or
@@ -6623,12 +6722,133 @@ declare type SerializableNonPrimitiveValue = { type: "game-table"; data: Table<U
6623
6722
  export declare type Shortcut = readonly string[];
6624
6723
 
6625
6724
  /**
6626
- * Shows a dialog that can be dismissed (ESC, click outside, or X button)
6725
+ * Shows a dialog that can be dismissed (ESC, click outside, or X button; only X for a window)
6627
6726
  * Returns the selected value or null if dismissed
6628
6727
  */
6629
- export declare function showDialog<T>(modal: ModalControls, buttons: DialogButton<T>[], content: ReactNode): Promise<T | null>;
6728
+ export declare function showDialog<T>(modal: ModalControls, buttons: DialogButton<T>[], content: ReactNode, { window }?: DialogOptions): Promise<T | null>;
6729
+
6730
+ /**
6731
+ * A panel as a column of its own, next to the content. Keeping it out of the content gives toolbars the whole
6732
+ * width, and collapsing it hands the space back. Hidden on mobile, see {@link SidePanelDrawer}.
6733
+ */
6734
+ export declare function SidePanelDock({ storageKey, icon: Icon, badge, expandLabel, children }: SidePanelDockProps): JSX.Element;
6735
+
6736
+ export declare interface SidePanelDockProps {
6737
+ /** Remembers whether the panel is open. */
6738
+ storageKey: string;
6739
+ icon: SidePanelIcon;
6740
+ /** Shown on the notch while the panel is hidden. */
6741
+ badge?: ReactNode;
6742
+ expandLabel: string;
6743
+ children: (onClose: () => void) => ReactNode;
6744
+ }
6745
+
6746
+ /** On mobile a panel has no room of its own, so it waits behind a button and slides in over the content. */
6747
+ export declare function SidePanelDrawer({ icon: Icon, label, title, badge, closeLabel, buttonClassName, children, }: SidePanelDrawerProps): JSX.Element;
6748
+
6749
+ export declare interface SidePanelDrawerProps {
6750
+ icon: SidePanelIcon;
6751
+ label: string;
6752
+ title: string;
6753
+ badge?: ReactNode;
6754
+ closeLabel: string;
6755
+ /** Where the button opening the drawer sits. */
6756
+ buttonClassName?: string;
6757
+ children: (onClose: () => void) => ReactNode;
6758
+ }
6759
+
6760
+ export declare function SidePanelFooterButton({ onClick, disabled, children }: SidePanelFooterButtonProps): JSX.Element;
6761
+
6762
+ export declare interface SidePanelFooterButtonProps {
6763
+ onClick: () => void;
6764
+ disabled: boolean;
6765
+ children: string;
6766
+ }
6767
+
6768
+ /** A panel with a title, a scrolling body and an optional footer. The notch on its west edge closes it. */
6769
+ export declare function SidePanelFrame({ variant, icon: Icon, title, meta, closeLabel, onClose, footer, className, children, }: SidePanelFrameProps): JSX.Element;
6770
+
6771
+ export declare interface SidePanelFrameProps {
6772
+ /** Docked next to the content, or floating above it as the mobile drawer. */
6773
+ variant: SidePanelVariant;
6774
+ icon: SidePanelIcon;
6775
+ title: string;
6776
+ /** Shown at the right of the title, like how many items are selected. */
6777
+ meta?: ReactNode;
6778
+ closeLabel: string;
6779
+ onClose: () => void;
6780
+ footer?: ReactNode;
6781
+ className?: string;
6782
+ children: ReactNode;
6783
+ }
6784
+
6785
+ export declare type SidePanelIcon = ComponentType<SVGProps<SVGSVGElement>>;
6786
+
6787
+ export declare type SidePanelVariant = 'dock' | 'drawer';
6788
+
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
+ /**
6834
+ * Unique per format, not only per section.
6835
+ */
6836
+ declare type SimplifiedGroupId = string & { readonly __brand: 'simplifiedGroupId' };
6837
+
6838
+ declare type SimplifiedSectionId = string & { readonly __brand: 'simplifiedSectionId' };
6630
6839
 
6631
- declare type Sorted = Brand<'sorted', 'sorted'>;
6840
+ /** A `simple` section has no groups. An age group's classes are the values of its two groups' class sources, see `ageGroupOf`. */
6841
+ declare type SimplifiedSectionKind = {
6842
+ type: 'layered';
6843
+ } | {
6844
+ type: 'simple';
6845
+ } | {
6846
+ type: 'age-group';
6847
+ data: {
6848
+ female: SimplifiedGroupId;
6849
+ male: SimplifiedGroupId;
6850
+ };
6851
+ };
6632
6852
 
6633
6853
  /**
6634
6854
  * Sorted game tables have the following guarantees:
@@ -6640,12 +6860,64 @@ declare type Sorted = Brand<'sorted', 'sorted'>;
6640
6860
  * - 1, 2, 2, 2, 5, None, None
6641
6861
  * - None, None
6642
6862
  */
6643
- declare type Sorted_2 = null;
6863
+ declare type Sorted = null;
6864
+
6865
+ declare type SourceKind = {
6866
+ type: 'class';
6867
+ classId: ClassId;
6868
+ } | {
6869
+ type: 'event-competitors';
6870
+ competitorType: CompetitorType;
6871
+ } | {
6872
+ type: 'classes-competitors';
6873
+ } | {
6874
+ type: 'input-table';
6875
+ tableId: TableId;
6876
+ };
6877
+
6878
+ /**
6879
+ * 1-based line and column at the start of a token.
6880
+ */
6881
+ declare interface SourceLocation {
6882
+ line: number;
6883
+ column: number;
6884
+ }
6885
+
6886
+ /**
6887
+ * Splits a sorted table at the given places, see `Table::split_n`.
6888
+ *
6889
+ * for `Static { split_count }`:
6890
+ * ```text
6891
+ * <C extends {}>(Table<C, Sorted>, Integer * split_count) -> (Table<C, Sorted> * (split_count + 1))
6892
+ * ```
6893
+ * for `Dynamic`:
6894
+ * ```text
6895
+ * <C extends {}>(Table<C, Sorted>, Array<Integer>) -> (Array<Table<C, Sorted>>)
6896
+ * ```
6897
+ */
6898
+ declare type SplitTableNode = { type: "static"; data: { splitCount: number } } | { type: "dynamic" };
6899
+
6900
+ /** The node of a new stage. Inputs without a value get their default. */
6901
+ declare type StageSpec = Pick<FormatNodeDTO_2, 'nodeType'> & Partial<Pick<FormatNodeDTO_2, 'inputVargsToArray' | 'outputVargsToArray' | 'controlValues'>>;
6644
6902
 
6645
6903
  declare interface StateMetadata {
6646
6904
  state: TableState;
6647
6905
  }
6648
6906
 
6907
+ declare interface Step {
6908
+ /**
6909
+ * Whoever ran the operation, see [Origin::attributed]: the engine's `NodeInstanceHash`, a raw uuid because this
6910
+ * crate doesn't know engine types. None until it is attributed.
6911
+ */
6912
+ node: string | null;
6913
+ op: StepOp;
6914
+ }
6915
+
6916
+ /**
6917
+ * An operation that moved rows between or within tables.
6918
+ */
6919
+ declare type StepOp = "create" | "sort" | "split" | "concat" | "merge" | "divide" | "filter" | "remove-places" | "set-places" | "promote-relegate" | "score";
6920
+
6649
6921
  export declare enum StorageType {
6650
6922
  Session = 0,
6651
6923
  Local = 1
@@ -6658,7 +6930,35 @@ declare type Table<SortingState, M = NoMetadata> = { rows: Rows<SortingState> }
6658
6930
 
6659
6931
  export declare type TableDAO = components['schemas']['TableDAO'];
6660
6932
 
6661
- export declare type TableId = Brand<string, 'tableId'>;
6933
+ /**
6934
+ * Accepts payloads dragged with {@link ExtensionDraggable} of the same extension onto tables: standalone tables,
6935
+ * and the entry and result tables of games. The first contribution whose `canDrop` accepts a payload takes it;
6936
+ * payloads that none accepts can't be dropped.
6937
+ */
6938
+ export declare interface TableDropContribution {
6939
+ canDrop(payload: string, target: TableDropTarget): boolean;
6940
+ onDrop(payload: string, target: TableDropTarget, host: ExtensionHost): void | Promise<void>;
6941
+ /** Shown on the highlighted drop area. */
6942
+ label?: Record<Locales, string>;
6943
+ }
6944
+
6945
+ /** `table.variant` tells standalone and game tables apart, `table.tableKind` entry and result tables. */
6946
+ export declare type TableDropTarget = EventPath & {
6947
+ table: TableDAO;
6948
+ };
6949
+
6950
+ /**
6951
+ * Identifies a table, the primary key of `tables`. Comes from one of:
6952
+ * - [Self::new_random]: a table the user adds. The endpoint picks the id and the mutation carries it.
6953
+ * - [Self::of_user_game]: the entry and result table of a game of the user.
6954
+ * - [Self::of_game] and [Self::of_node]: a table of a node, see [TableDAO::derived_id]. Executing a graph creates the
6955
+ * same ids every time.
6956
+ * - [TableDAO::keep_as_user_copy]: a table of a node that the user kept when the node instance got deleted.
6957
+ *
6958
+ * Deserializing one only yields a reference to an existing table; it does not check that it exists or how it was
6959
+ * made. Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
6960
+ */
6961
+ export declare type TableId = string & { readonly __brand: 'tableId' };
6662
6962
 
6663
6963
  export declare interface TableProps<TData extends RowData> {
6664
6964
  data: TData[];
@@ -6667,6 +6967,7 @@ export declare interface TableProps<TData extends RowData> {
6667
6967
  allowSelect?: boolean;
6668
6968
  getRowId?: (row: TData, index: number) => string;
6669
6969
  getRowState?: (row: TData) => RowState;
6970
+ getRowClassName?: (row: TData) => string | undefined;
6670
6971
  rowClicked?: (row: TData) => void;
6671
6972
  /**
6672
6973
  * Route a row leads to. Clicking the row routes there (after `rowClicked`); a middle or Ctrl click
@@ -6694,6 +6995,11 @@ export declare interface TableProps<TData extends RowData> {
6694
6995
  * Columns with `enableHiding: false` are excluded.
6695
6996
  */
6696
6997
  columnVisibility?: [ColumnVisibilityState, OnChangeFn<ColumnVisibilityState>];
6998
+ /**
6999
+ * Shows a search box above the table that finds rows by the text of their visible columns, and a search per
7000
+ * column in its header. See `AppTableColumnMeta.searchText`.
7001
+ */
7002
+ enableSearch?: boolean;
6697
7003
  }
6698
7004
 
6699
7005
  export declare type TableSortedDTO = components['schemas']['Table_for_Sorted_and_StateMetadata'];
@@ -6718,6 +7024,21 @@ export declare interface TimeDeltaInputProps {
6718
7024
 
6719
7025
  export { toast }
6720
7026
 
7027
+ /**
7028
+ * One way a row got to where it is.
7029
+ */
7030
+ declare interface Trail {
7031
+ /**
7032
+ * The persisted table the row was read from: the engine's `TableId`, a raw uuid like [Step::node]. None for rows
7033
+ * that were created from scratch.
7034
+ */
7035
+ checkpoint: string | null;
7036
+ /**
7037
+ * The operations since the checkpoint, in order.
7038
+ */
7039
+ steps: Step[];
7040
+ }
7041
+
6721
7042
  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" };
6722
7043
 
6723
7044
  /**
@@ -6734,6 +7055,15 @@ export declare interface TypeContext {
6734
7055
  returnType: TypeExpr<Type, ParamRef>;
6735
7056
  }
6736
7057
 
7058
+ declare interface TypeError_2 {
7059
+ kind: TypeErrorKind;
7060
+ location: SourceLocation;
7061
+ }
7062
+
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 } };
7064
+
7065
+ declare type TypeErrors = TypeError_2[];
7066
+
6737
7067
  /**
6738
7068
  * Type expression—the core type representation in nodety.
6739
7069
  *
@@ -6747,6 +7077,11 @@ export declare type TypeExpr<T, R = ParamRef> = { type: "Type"; data: T } | { ty
6747
7077
 
6748
7078
  declare type TypeExprValidationError = { type: "UnknownVar"; var: LocalParamID } | { type: "CyclicReference" };
6749
7079
 
7080
+ /**
7081
+ * Type hints for pre-inference annotations (e.g. `T = Integer, U = String`).
7082
+ */
7083
+ declare type TypeHints<T, R = ParamRef> = Record<LocalParamID, TypeExpr<T, R>>;
7084
+
6750
7085
  export declare interface TypeOperators { graphite: [Type, ArithmeticOperator] }
6751
7086
 
6752
7087
  export declare interface TypeOperators {}
@@ -6772,23 +7107,28 @@ export declare interface TypeParameter<T, R = ParamRef> {
6772
7107
  */
6773
7108
  export declare type TypeParameters<T, R = ParamRef> = Record<LocalParamID, TypeParameter<T, R>>;
6774
7109
 
6775
- declare type Unsorted = Brand<'unsorted', 'unsorted'>;
6776
-
6777
7110
  /**
6778
7111
  * The places of unsorted game can be arbitrary values in arbitrary order.
6779
7112
  * Dublicated places are allowed. However competitors must still be unique.
6780
7113
  */
6781
- declare type Unsorted_2 = null;
7114
+ declare type Unsorted = null;
6782
7115
 
6783
7116
  /** The engine's active locale. Extensions ship their own dictionaries and select them by it. */
6784
7117
  export declare function useEngineLocale(): Locales;
6785
7118
 
6786
7119
  /** Returns a `fetch` for `path` (relative, e.g. `"items"`) on the calling extension's own backend in the current event. */
6787
- export declare function useExtensionBackend(): (path: string, init?: RequestInit) => Promise<Response>;
7120
+ export declare function useExtensionBackend(): ExtensionHost['backend'];
6788
7121
 
6789
- /** The identifier the calling extension is installed under, e.g. the key of its `extensionData`. */
7122
+ /** The identifier the calling extension is installed under, e.g. the key of its `customData`. */
6790
7123
  export declare function useExtensionIdentifier(): string;
6791
7124
 
7125
+ /**
7126
+ * A preference of the calling extension, stored as `ext:<identifier>/<key>` like the engine's own: per user on root,
7127
+ * per server on self-hosted. The value is stored as JSON; `isValid` checks what was stored, `defaultValue` is used
7128
+ * until the preferences are loaded and when the key is unset or the stored value isn't valid.
7129
+ */
7130
+ export declare function useExtensionPreference<T>(key: string, defaultValue: T, isValid: (stored: unknown) => stored is T): [T, (value: T) => void];
7131
+
6792
7132
  export declare function useMediaQuery(query: string): boolean;
6793
7133
 
6794
7134
  export declare function useModal(): ModalControls;
@@ -6801,15 +7141,23 @@ export declare function useModal(): ModalControls;
6801
7141
  *
6802
7142
  * @param storageKey Key used for persisting the state. Only the key passed
6803
7143
  * in the to the first call of usePersistedState is used. Consequent keys are discarded.
7144
+ * Null keeps the state in memory only, like useState.
6804
7145
  * @param initialState The initial state. Equal to useStates initial value
6805
7146
  */
6806
- export declare function usePersistedState<S>(storageKey: string, initialState: S | (() => S), { storage: storageType, version }?: PersistedStateOptions): [S, (newState: S | ((prev: S) => S)) => void];
7147
+ export declare function usePersistedState<S>(storageKey: string | null, initialState: S | (() => S), { storage: storageType, version }?: PersistedStateOptions): [S, (newState: S | ((prev: S) => S)) => void];
6807
7148
 
6808
7149
  /** Hook to use the router context. Must be called within a <Router> provider. */
6809
7150
  export declare function useRouter(): RouterContextType;
6810
7151
 
6811
- /** The `:` params that are uuids, by name. All other `:` params are numbers. */
7152
+ /**
7153
+ * Returns a function that applies the entries of all operations in one all-or-nothing `POST /log` with a progress modal
7154
+ * and reports a failure, like `runLogBatch`, with the modals and translations of the calling component.
7155
+ */
7156
+ export declare function useRunLogBatch(): (workspaceId: CommonWorkspaceId, operations: LogOperation[], label: ReactNode) => Promise<boolean | null>;
7157
+
7158
+ /** The `:` params that are uuids, by name. All other `:` params are numbers. Workspace ids are uuids on root only. */
6812
7159
  declare type UuidPathParams = {
7160
+ workspaceId: CommonWorkspaceId;
6813
7161
  classId: ClassId;
6814
7162
  eventId: EventId;
6815
7163
  formatId: FormatId;
@@ -6835,6 +7183,10 @@ declare interface ValidationError<T> {
6835
7183
 
6836
7184
  declare type ValidationErrorKind<T> = { type: "TypeParameterBoundsExceeded" } | { type: "TagMissing"; data: number[] } | { type: "MultipleEdgesOnOneInput" } | { type: "EdgeMissingOnInput" } | { type: "EdgeHasNoSourceOutput" } | { type: "InsufficientlyInferredTypes" } | { type: "NonPortTypesIO" } | { type: "TypeExprValidationError"; data: TypeExprValidationError } | { type: "TypeMismatch"; data: DetailedSupertypeDiagnostics<T> };
6837
7185
 
7186
+ /**
7187
+ * # Important
7188
+ * Changes in here are breaking changes for logs
7189
+ */
6838
7190
  export declare type Value<T = Primitive> = { type: "unit" } | { type: "float"; data: number } | { type: "integer"; data: number } | { type: "string"; data: string } | { type: "boolean"; data: boolean } | { type: "array"; data: ArrayValue<T> } | { type: "record"; data: RecordValue<T> } | { type: "time-delta"; data: [number, number] } | { type: "date-time"; data: string } | { type: "date"; data: string } | { type: "non-primitive"; data: T };
6839
7191
 
6840
7192
  /**
@@ -6856,7 +7208,7 @@ export declare type WorkingGameDTO = Omit<GameDTO, 'gameFormatId'> & {
6856
7208
  gameFormatId: GameFormatId | null;
6857
7209
  };
6858
7210
 
6859
- export declare type WorkspaceRootId = Brand<number, 'workspaceRootId'>;
7211
+ export declare type WorkspaceRootId = Brand<string, 'workspaceRootId'>;
6860
7212
 
6861
7213
  export declare type WorkspaceSelfHostedId = Brand<number, 'workspaceSelfHostedId'>;
6862
7214