@graphite-sports/sdk 0.5.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 +1378 -1167
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -10,6 +10,7 @@ import { FC } from 'react';
10
10
  import { FocusEventHandler } from 'react';
11
11
  import { HTMLInputTypeAttribute } from 'react';
12
12
  import { JSX } from 'react/jsx-runtime';
13
+ import type { KeyboardEvent as KeyboardEvent_2 } from 'react';
13
14
  import { KeyboardEventHandler } from 'react';
14
15
  import { OnChangeFn } from '@tanstack/react-table';
15
16
  import { default as React_2 } from 'react';
@@ -32,6 +33,46 @@ import { TabPanels } from '@headlessui/react';
32
33
  import { toast } from 'react-hot-toast';
33
34
  import type { UnusedSkipTokenOptions } from '@tanstack/react-query';
34
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
+
35
76
  export declare type AnyQuerySchema = QuerySchema<QueryFields>;
36
77
 
37
78
  export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, autoFocus, }: AppButtonProps): JSX.Element;
@@ -48,7 +89,10 @@ export declare type AppButtonProps = {
48
89
  loading?: boolean;
49
90
  value?: string;
50
91
  ref?: RefObject<HTMLButtonElement | null>;
51
- /** 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
+ */
52
96
  autoFocus?: boolean;
53
97
  /** Makes the button a link to this route, so it can also be opened in a new tab. `onClick` runs before routing. */
54
98
  href?: string;
@@ -97,6 +141,8 @@ export declare type AppInputProps = {
97
141
  onFocus?: FocusEventHandler<HTMLInputElement>;
98
142
  onKeyDown?: KeyboardEventHandler<HTMLInputElement>;
99
143
  type?: HTMLInputTypeAttribute;
144
+ min?: number;
145
+ step?: number;
100
146
  placeholder?: string;
101
147
  required?: boolean;
102
148
  maxLength?: number;
@@ -169,7 +215,7 @@ export declare function AppTab({ className, ...props }: ComponentProps<typeof Ta
169
215
 
170
216
  export declare function AppTabGroup(props: ComponentProps<typeof TabGroup>): JSX.Element;
171
217
 
172
- 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;
173
219
 
174
220
  export declare type AppTableFeatures = typeof appTableFeatures;
175
221
 
@@ -224,11 +270,14 @@ export declare type ArrayValue<T = Primitive> = Value<T>[];
224
270
 
225
271
  export declare type BIB = Brand<number, 'bib'>;
226
272
 
273
+ declare type BooleanOp = "and" | "or" | "xor" | "not";
274
+
227
275
  /**
228
- * Mirrors the backend's `domain_id!` newtype IDs (graphite-engine/src/domain_id.rs) so distinct ID
229
- * kinds can't be mixed up on the frontend either. Every type here must match the name of a
230
- * `#/components/schemas/<Name>` entry in the OpenAPI schema - see the `DOMAIN_ID_NAMES` redirect in
231
- * 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.
232
281
  */
233
282
  export declare type Brand<T, B> = T & {
234
283
  readonly __brand: B;
@@ -237,13 +286,15 @@ export declare type Brand<T, B> = T & {
237
286
  /** Stable reference — a new inline `select` on every `queryOptions()` call makes React Query re-select each render. */
238
287
  export declare function buildCompetitorsMapped(competitors: CompetitorDAO[]): CompetitorsMapped;
239
288
 
240
- 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: {
241
290
  '/': undefined;
242
291
  '/download': undefined;
243
292
  '/login': QuerySchema< {
244
293
  readonly returnTo: OptionalQueryField<ReturnPath>;
245
294
  }>;
246
- '/register': undefined;
295
+ '/register': QuerySchema< {
296
+ readonly returnTo: OptionalQueryField<ReturnPath>;
297
+ }>;
247
298
  '/preferences': undefined;
248
299
  '/crate-workspace': undefined;
249
300
  '/workspace/:workspaceId': undefined;
@@ -256,6 +307,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
256
307
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
257
308
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
258
309
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
310
+ readonly name: OptionalQueryField<string>;
311
+ readonly template: OptionalQueryField<FormatId>;
312
+ readonly place: OptionalQueryField<GamePlace>;
259
313
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
260
314
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
261
315
  }>;
@@ -268,6 +322,12 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
268
322
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
269
323
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
270
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
+ }>;
271
331
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
272
332
  readonly game: OptionalQueryField<GameId>;
273
333
  readonly table: OptionalQueryField<TableId>;
@@ -280,6 +340,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
280
340
  }>;
281
341
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
282
342
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
343
+ '/workspace/:workspaceId/event/:eventId/create-table': undefined;
283
344
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
284
345
  '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
285
346
  '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
@@ -293,7 +354,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
293
354
  '/login': QuerySchema< {
294
355
  readonly returnTo: OptionalQueryField<ReturnPath>;
295
356
  }>;
296
- '/register': undefined;
357
+ '/register': QuerySchema< {
358
+ readonly returnTo: OptionalQueryField<ReturnPath>;
359
+ }>;
297
360
  '/preferences': undefined;
298
361
  '/crate-workspace': undefined;
299
362
  '/workspace/:workspaceId': undefined;
@@ -306,6 +369,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
306
369
  '/workspace/:workspaceId/event/:eventId/create-team': undefined;
307
370
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
308
371
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
372
+ readonly name: OptionalQueryField<string>;
373
+ readonly template: OptionalQueryField<FormatId>;
374
+ readonly place: OptionalQueryField<GamePlace>;
309
375
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
310
376
  readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
311
377
  }>;
@@ -318,6 +384,12 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
318
384
  '/workspace/:workspaceId/event/:eventId/graph': QuerySchema< {
319
385
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
320
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
+ }>;
321
393
  '/workspace/:workspaceId/event/:eventId/lineage': QuerySchema< {
322
394
  readonly game: OptionalQueryField<GameId>;
323
395
  readonly table: OptionalQueryField<TableId>;
@@ -330,6 +402,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
330
402
  }>;
331
403
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
332
404
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
405
+ '/workspace/:workspaceId/event/:eventId/create-table': undefined;
333
406
  '/workspace/:workspaceId/event/:eventId/table/:tableId': undefined;
334
407
  '/workspace/:workspaceId/event/:eventId/create-game-format': undefined;
335
408
  '/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId': undefined;
@@ -339,9 +412,27 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
339
412
  '*': undefined;
340
413
  }[Path] ? T extends AnyQuerySchema ? [query?: QueryInput<T> | undefined] : [] : never : never) => string;
341
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
+
342
420
  export declare type ClassDAO = components['schemas']['ClassDAO'];
343
421
 
344
- 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' };
345
436
 
346
437
  export declare type ClassResponse = components['schemas']['ClassResponse'];
347
438
 
@@ -349,6 +440,8 @@ declare type CommonApiKeyId = Brand<number, 'commonApiKeyId'>;
349
440
 
350
441
  export declare type CommonWorkspaceId = WorkspaceRootId | WorkspaceSelfHostedId;
351
442
 
443
+ declare type ComparisonOp = "greater" | "less" | "greater-equals" | "less-equals" | "equals" | "not-equals";
444
+
352
445
  export declare type CompetitorDAO = components['schemas']['CompetitorDAO'];
353
446
 
354
447
  export declare type CompetitorId = Brand<number, 'competitorId'>;
@@ -361,6 +454,22 @@ export declare const CompetitorNameLineSpacer: FC<{
361
454
  className?: string;
362
455
  }>;
363
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
+
364
473
  /**
365
474
  * Shows which competitor is picked and lets the user pick another one.
366
475
  */
@@ -385,11 +494,14 @@ export declare type CompetitorSelectorProps<IsRequired extends boolean = false>
385
494
 
386
495
  export declare interface CompetitorsMapped {
387
496
  byId: Map<CompetitorId, CompetitorDAO>;
497
+ /** Leaves out the competitors without a bib. */
388
498
  byBib: Map<BIB, CompetitorDAO>;
389
499
  }
390
500
 
391
501
  export declare type CompetitorType = components['schemas']['CompetitorType'];
392
502
 
503
+ declare type CompetitorType_2 = "individual" | "team";
504
+
393
505
  declare interface components {
394
506
  schemas: {
395
507
  APIKeyPathVariables: {
@@ -418,9 +530,7 @@ declare interface components {
418
530
  eventId: components["schemas"]["EventId"];
419
531
  };
420
532
  /** @description <C extends {}, P extends Primitive, S extends Sorted|Unsorted>(Table<C, S>, P) -> (Table<C & {<self.key>: P}, S>) */
421
- AddColumnsNode: {
422
- columns: string[];
423
- };
533
+ AddColumnsNode: AddColumnsNode;
424
534
  AddCompetitorsMutation: {
425
535
  competitorDtos: components["schemas"]["CompetitorDTO"][];
426
536
  competitorType: components["schemas"]["CompetitorType"];
@@ -475,9 +585,7 @@ declare interface components {
475
585
  variant: components["schemas"]["TableVariant"];
476
586
  };
477
587
  /** @description <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1}) */
478
- AddRecordFieldsNode: {
479
- fields: string[];
480
- };
588
+ AddRecordFieldsNode: AddRecordFieldsNode;
481
589
  AddTarget: {
482
590
  backendUrl: string;
483
591
  /** @description Replicate into this existing remote workspace instead of creating a new one. */
@@ -580,9 +688,9 @@ declare interface components {
580
688
  type: "group";
581
689
  };
582
690
  /** @enum {string} */
583
- ArithmeticOperator: "add" | "subtract";
691
+ ArithmeticOperator: ArithmeticOperator;
584
692
  ArrayValue_for_Primitive: ArrayValue<Primitive>;
585
- ArrayValue_for_SerializableNonPrimitiveValue: components["schemas"]["Value_for_SerializableNonPrimitiveValue"][];
693
+ ArrayValue_for_SerializableNonPrimitiveValue: ArrayValue<SerializableNonPrimitiveValue>;
586
694
  AuthScope: {
587
695
  /** @constant */
588
696
  type: "general";
@@ -607,28 +715,10 @@ declare interface components {
607
715
  BIB: BIB;
608
716
  BibNotUniqueError: components["schemas"]["BIB"];
609
717
  /** @enum {string} */
610
- BooleanOp: "and" | "or" | "xor" | "not";
611
- CatchDqNode: {
612
- /**
613
- * @description The node has one output per catch key, in order. The strategy decides how multiple
614
- * caught tables of the same key get merged.
615
- */
616
- catches: {
617
- [key: string]: components["schemas"]["MultiplexingStrategy"];
618
- };
619
- };
620
- ChildrenSpec: {
621
- /** @constant */
622
- type: "disallowed";
623
- } | {
624
- /** @constant */
625
- type: "allowed";
626
- } | {
627
- /** @constant */
628
- type: "closure";
629
- /** @description The signature that the inner closure must adhere to. */
630
- signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
631
- };
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;
632
722
  ClassAutomationDTO: {
633
723
  /** @constant */
634
724
  type: "age";
@@ -661,7 +751,7 @@ declare interface components {
661
751
  ClassAutomationScriptError: {
662
752
  /** @constant */
663
753
  type: "parse-error";
664
- data: components["schemas"]["ParseError"];
754
+ data: components["schemas"]["ExpressionParseError"];
665
755
  } | {
666
756
  /** @constant */
667
757
  type: "type-errors";
@@ -676,6 +766,9 @@ declare interface components {
676
766
  attributes: components["schemas"]["RecordValue_for_Primitive"];
677
767
  automationScript?: components["schemas"]["ClassAutomationScript"] | null;
678
768
  automationScriptError?: components["schemas"]["ClassAutomationScriptError"] | null;
769
+ customData: {
770
+ [key: string]: string;
771
+ };
679
772
  eventId: components["schemas"]["EventId"];
680
773
  gender: components["schemas"]["ClassGender"];
681
774
  id: components["schemas"]["ClassId"];
@@ -689,6 +782,9 @@ declare interface components {
689
782
  description: string;
690
783
  attributes: components["schemas"]["RecordValue_for_Primitive"];
691
784
  automation?: components["schemas"]["ClassAutomationDTO"] | null;
785
+ customData?: {
786
+ [key: string]: string;
787
+ };
692
788
  gender: components["schemas"]["ClassGender"];
693
789
  name: string;
694
790
  state: components["schemas"]["TableState"];
@@ -743,19 +839,27 @@ declare interface components {
743
839
  * multiple: ('roundrobin' | 'serpentine' | 'concat', ...Class) -> (Table<{}, Sorted>)
744
840
  * ```
745
841
  */
746
- ClassesCompetitorsNode: null;
842
+ ClassesCompetitorsNode: ClassesCompetitorsNode;
747
843
  /** Format: int64 */
748
844
  CommonApiKeyId: CommonApiKeyId;
749
- /** Format: int64 */
750
845
  CommonWorkspaceId: CommonWorkspaceId;
751
846
  /** @enum {string} */
752
- ComparisonOp: "greater" | "less" | "greater-equals" | "less-equals" | "equals" | "not-equals";
847
+ ComparisonOp: ComparisonOp;
753
848
  CompetitorDAO: {
754
849
  attributes: components["schemas"]["RecordValue_for_Primitive"];
755
- bib: components["schemas"]["BIB"];
850
+ /** @description Unique among the competitors of the event that have one. */
851
+ bib?: components["schemas"]["BIB"] | null;
756
852
  birthdate?: string | null;
757
853
  /** @description The competitor_type MUST NEVER be altered after creation. */
758
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;
759
863
  eventId: components["schemas"]["EventId"];
760
864
  firstName?: string | null;
761
865
  /** @description Genders are `"f"`, `"m"`, or any other string stored in SQLite. */
@@ -768,8 +872,14 @@ declare interface components {
768
872
  };
769
873
  CompetitorDTO: {
770
874
  attributes: components["schemas"]["RecordValue_for_Primitive"];
771
- bib: components["schemas"]["BIB"];
875
+ /** @description See [CompetitorDAO::bib]. */
876
+ bib?: components["schemas"]["BIB"] | null;
772
877
  birthdate?: string | null;
878
+ customData?: {
879
+ [key: string]: string;
880
+ };
881
+ /** @description See [CompetitorDAO::enabled]. Missing means enabled. */
882
+ enabled?: boolean;
773
883
  firstName?: string | null;
774
884
  gender?: components["schemas"]["Gender"] | null;
775
885
  lastName?: string | null;
@@ -785,6 +895,7 @@ declare interface components {
785
895
  CompetitorInClassDTO: {
786
896
  classId: components["schemas"]["ClassId"];
787
897
  competitorId: components["schemas"]["CompetitorId"];
898
+ managedState: components["schemas"]["CICMembershipState"];
788
899
  /** Format: int64 */
789
900
  place: number;
790
901
  };
@@ -795,15 +906,15 @@ declare interface components {
795
906
  teamId: components["schemas"]["CompetitorId"];
796
907
  to?: string | null;
797
908
  };
798
- /** Format: int64 */
799
- CompetitorNotUniqueError: number;
909
+ /** @description Two rows of the same competitor met in one table. */
910
+ CompetitorNotUniqueError: CompetitorNotUniqueError;
800
911
  CompetitorPathVariables_for_CommonWorkspaceId: {
801
912
  competitorId: components["schemas"]["CompetitorId"];
802
913
  eventId: components["schemas"]["EventId"];
803
914
  workspaceId: components["schemas"]["CommonWorkspaceId"];
804
915
  };
805
916
  /** @enum {string} */
806
- CompetitorType: "individual" | "team";
917
+ CompetitorType: CompetitorType_2;
807
918
  CompetitorTypeQuery: {
808
919
  competitorType: components["schemas"]["CompetitorType"];
809
920
  };
@@ -878,14 +989,7 @@ declare interface components {
878
989
  * Besides the infer keyword, works almost exactly like conditional types in typescript.
879
990
  * Checkout [this doc](https://www.typescriptlang.org/docs/handbook/2/conditional-types.html) for a good guide on the ts conditionals.
880
991
  */
881
- Conditional_for_Type_and_ErasedScopedTypeRef_for_Type: {
882
- /** @description @todo */
883
- infer: components["schemas"]["LocalParamID"][];
884
- tElse: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
885
- tTest: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
886
- tTestBound: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
887
- tThen: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
888
- };
992
+ Conditional_for_Type_and_ErasedScopedTypeRef_for_Type: Conditional<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
889
993
  /**
890
994
  * @description Represents the following: `t_test` extends `t_test_bound` ? `t_then` : `t_else`
891
995
  * Besides the infer keyword, works almost exactly like conditional types in typescript.
@@ -912,12 +1016,7 @@ declare interface components {
912
1016
  data: string;
913
1017
  };
914
1018
  /** @description A pin that reroutes a connection */
915
- ConnectionPin: {
916
- /** Format: int64 */
917
- x: number;
918
- /** Format: int64 */
919
- y: number;
920
- };
1019
+ ConnectionPin: ConnectionPin;
921
1020
  /** @description Contact information for the exposed API. */
922
1021
  Contact: {
923
1022
  /**
@@ -982,6 +1081,52 @@ declare interface components {
982
1081
  };
983
1082
  /** @enum {string} */
984
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
+ };
985
1130
  DayAndMonth: {
986
1131
  /**
987
1132
  * Format: uint8
@@ -1212,11 +1357,9 @@ declare interface components {
1212
1357
  DetailedSupertypeDiagnostics_for_Type: DetailedSupertypeDiagnostics<Type>;
1213
1358
  /**
1214
1359
  * @description Disqualifies every row of the table it receives, throwing them all under `key` so that a
1215
- * [`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.
1216
1361
  */
1217
- DisqualifyNode: {
1218
- key: components["schemas"]["DqKey"];
1219
- };
1362
+ DisqualifyNode: DisqualifyNode;
1220
1363
  /** @description The rows of one side after the common row. */
1221
1364
  DivergedRows: {
1222
1365
  /** Format: int64 */
@@ -1230,9 +1373,13 @@ declare interface components {
1230
1373
  source: components["schemas"]["DivergedRows"];
1231
1374
  target: components["schemas"]["DivergedRows"];
1232
1375
  };
1233
- 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;
1234
1381
  /** @description Decides how caught disqualifications are surfaced. */
1235
- DqStrategy: "output-placed" | "output-unplaced" | "append-placed" | "append-unplaced";
1382
+ DqStrategy: DqStrategy;
1236
1383
  /**
1237
1384
  * @description How functions that combine tables from multiple competitor sources (e.g. merging or
1238
1385
  * concatenating) should treat a competitor that appears in more than one of them.
@@ -1377,27 +1524,14 @@ declare interface components {
1377
1524
  /** @description Auto-generated discriminant enum variants */
1378
1525
  EntityChangeEventDiscriminants: ("Event" | "Game" | "Table" | "GameFormat" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "FormatTest" | "Log" | "ContentInEventFolder") | "CompetitorInTeam" | "CompetitorInClass";
1379
1526
  /** @description A scope portal that used to be there but got removed in order to be serializable */
1380
- ErasedScopedTypeRef_for_Type: {
1381
- /** @constant */
1382
- type: "Param";
1383
- data: components["schemas"]["ParamRef"];
1384
- } | {
1385
- /** @constant */
1386
- type: "ScopedExpr";
1387
- data: {
1388
- expr: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
1389
- };
1390
- };
1391
- EventCompetitorsNode: components["schemas"]["CompetitorType"];
1527
+ ErasedScopedTypeRef_for_Type: ErasedScopedTypeRef<Type>;
1528
+ EventCompetitorsNode: EventCompetitorsNode;
1392
1529
  EventDAO: {
1393
1530
  description: string;
1394
1531
  attributes: components["schemas"]["RecordValue_for_Primitive"];
1395
- /**
1396
- * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
1397
- * concatenating) should error or silently drop rows when they encounter the same competitor
1398
- * more than once.
1399
- */
1400
- duplicateCompetitorPolicy: components["schemas"]["DuplicateCompetitorPolicy"];
1532
+ customData: {
1533
+ [key: string]: string;
1534
+ };
1401
1535
  /** Format: date */
1402
1536
  endDate?: string | null;
1403
1537
  id: components["schemas"]["EventId"];
@@ -1409,37 +1543,38 @@ declare interface components {
1409
1543
  * action should always be to create and set the root format.
1410
1544
  */
1411
1545
  rootFormatId?: components["schemas"]["FormatId"] | null;
1546
+ settings: components["schemas"]["EventSettings"];
1412
1547
  /**
1413
1548
  * Format: date
1414
1549
  * @description Updating this requires updating classes as well.
1415
1550
  */
1416
1551
  startDate: string;
1417
1552
  teamCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1418
- /** @description Enables tooling for trying out an event with generated data. */
1419
- testMode: boolean;
1420
1553
  };
1421
1554
  EventDTO: {
1422
1555
  /** @default */
1423
1556
  description: string;
1424
1557
  attributes: components["schemas"]["RecordValue_for_Primitive"];
1425
1558
  /**
1426
- * @description Whether nodes that combine tables from multiple competitor sources (e.g. merging or
1427
- * concatenating) should error or silently drop rows when they encounter the same competitor
1428
- * more than once.
1429
- * @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.
1430
1561
  */
1431
- duplicateCompetitorPolicy: components["schemas"]["DuplicateCompetitorPolicy"];
1562
+ customData?: {
1563
+ [key: string]: string;
1564
+ };
1432
1565
  endDate?: string | null;
1433
1566
  individualCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1434
1567
  name: string;
1568
+ /**
1569
+ * @default {
1570
+ * "duplicateCompetitorPolicy": "error",
1571
+ * "invalidLinkedFormatPolicy": "last-known-table"
1572
+ * }
1573
+ */
1574
+ settings: components["schemas"]["EventSettings"];
1435
1575
  /** @description The start date might be used for calculating the competitors age. */
1436
1576
  startDate: string;
1437
1577
  teamCompetitorTypes: components["schemas"]["RecordTypeWithDefaults"];
1438
- /**
1439
- * @description Enables tooling for trying out an event with generated data.
1440
- * @default false
1441
- */
1442
- testMode: boolean;
1443
1578
  };
1444
1579
  /**
1445
1580
  * Format: uuid
@@ -1534,6 +1669,21 @@ declare interface components {
1534
1669
  rows: components["schemas"]["EventLineageRow"][];
1535
1670
  tableId: components["schemas"]["TableId"];
1536
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
+ };
1537
1687
  Example: {
1538
1688
  /**
1539
1689
  * @description Long description for the example.
@@ -1560,6 +1710,10 @@ declare interface components {
1560
1710
  } & {
1561
1711
  [key: string]: unknown;
1562
1712
  };
1713
+ ExpressionParseError: {
1714
+ kind: components["schemas"]["ParseErrorKind"];
1715
+ location: components["schemas"]["SourceLocation"];
1716
+ };
1563
1717
  ExtensionChangeEvent: ({
1564
1718
  /** @constant */
1565
1719
  type: "added";
@@ -1625,18 +1779,7 @@ declare interface components {
1625
1779
  } & {
1626
1780
  [key: string]: unknown;
1627
1781
  };
1628
- ExtractRecordFieldError_for_Primitive: {
1629
- /** @constant */
1630
- type: "field-does-not-exist";
1631
- data: string;
1632
- } | {
1633
- /** @constant */
1634
- type: "invalid-type";
1635
- data: {
1636
- field: string;
1637
- value?: components["schemas"]["Value_for_Primitive"] | null;
1638
- };
1639
- };
1782
+ ExtractRecordFieldError_for_Primitive: ExtractRecordFieldError<Primitive>;
1640
1783
  FieldTypeWithDefault: FieldTypeWithDefault;
1641
1784
  FolderContent: {
1642
1785
  classIds: components["schemas"]["ClassId"][];
@@ -1652,18 +1795,22 @@ declare interface components {
1652
1795
  data: components["schemas"]["GameWithTables"];
1653
1796
  });
1654
1797
  FolderPath: string[];
1655
- FormatConnectionDTO: {
1656
- pins: components["schemas"]["ConnectionPin"][];
1657
- sourceFormatNodeId: components["schemas"]["FormatNodeId"];
1658
- sourceOutput: components["schemas"]["OutputIdx"];
1659
- targetFormatNodeId: components["schemas"]["FormatNodeId"];
1660
- targetInput: components["schemas"]["InputIdx"];
1661
- };
1798
+ FormatConnectionDTO: FormatConnectionDTO;
1662
1799
  FormatDAO: {
1663
1800
  description: string;
1664
1801
  category: components["schemas"]["NodeCategory"];
1665
- /** @default [] */
1666
- 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
+ };
1667
1814
  /** @description The default values in here are not guaranteed to be valid for the signature. */
1668
1815
  docs: components["schemas"]["NodeVariantDoc"];
1669
1816
  errors: components["schemas"]["FormatValidationError"][];
@@ -1672,6 +1819,13 @@ declare interface components {
1672
1819
  id: components["schemas"]["FormatId"];
1673
1820
  name: string;
1674
1821
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1822
+ /**
1823
+ * @default {
1824
+ * "nodes": {},
1825
+ * "sections": []
1826
+ * }
1827
+ */
1828
+ simplifiedView: components["schemas"]["SimplifiedView"];
1675
1829
  /** Format: uuid */
1676
1830
  templateOrigin?: string | null;
1677
1831
  valid: components["schemas"]["FormatValidity"];
@@ -1684,12 +1838,18 @@ declare interface components {
1684
1838
  /** @default */
1685
1839
  description: string;
1686
1840
  connections: components["schemas"]["FormatConnectionDTO"][];
1841
+ customData?: {
1842
+ [key: string]: string;
1843
+ };
1687
1844
  /**
1688
1845
  * @description All disqualifications that can escape this format. Like checked exceptions, every
1689
1846
  * uncaught disqualification has to be declared and every declared one has to be throwable.
1690
- * @default []
1847
+ * Accepts the plain list of keys of older versions.
1848
+ * @default {}
1691
1849
  */
1692
- disqualificationKinds: components["schemas"]["DqKey"][];
1850
+ disqualificationKinds: {
1851
+ [key: string]: components["schemas"]["DqSettings"];
1852
+ };
1693
1853
  /** @description There must be docs for every input and output. Otherwise formats get rejected. */
1694
1854
  docs: components["schemas"]["NodeVariantDoc"];
1695
1855
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
@@ -1700,6 +1860,7 @@ declare interface components {
1700
1860
  * Otherwise the signature will get inferred.
1701
1861
  */
1702
1862
  signature: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
1863
+ simplifiedView?: components["schemas"]["SimplifiedView"];
1703
1864
  };
1704
1865
  FormatError: {
1705
1866
  /** @constant */
@@ -1749,6 +1910,9 @@ declare interface components {
1749
1910
  };
1750
1911
  FormatGroupDAO: {
1751
1912
  category: components["schemas"]["NodeCategory"];
1913
+ customData: {
1914
+ [key: string]: string;
1915
+ };
1752
1916
  eventId: components["schemas"]["EventId"];
1753
1917
  id: components["schemas"]["FormatGroupId"];
1754
1918
  name: string;
@@ -1757,6 +1921,9 @@ declare interface components {
1757
1921
  };
1758
1922
  FormatGroupDTO: {
1759
1923
  category: components["schemas"]["NodeCategory"];
1924
+ customData?: {
1925
+ [key: string]: string;
1926
+ };
1760
1927
  name: string;
1761
1928
  };
1762
1929
  /**
@@ -1853,6 +2020,9 @@ declare interface components {
1853
2020
  controlValues: {
1854
2021
  [key: string]: components["schemas"]["Value_for_Primitive"];
1855
2022
  };
2023
+ customData: {
2024
+ [key: string]: string;
2025
+ };
1856
2026
  formatId: components["schemas"]["FormatId"];
1857
2027
  /** @description When not yet persisted, this is a negative number unique to the graph */
1858
2028
  id: components["schemas"]["FormatNodeId"];
@@ -1865,7 +2035,6 @@ declare interface components {
1865
2035
  * be the array varg type input.
1866
2036
  */
1867
2037
  inputVargsToArray: boolean;
1868
- /** @description Must always be formatted as serde formats in the db, because [Self::find_by_event_and_type] relies on that. */
1869
2038
  nodeType: components["schemas"]["NodeType"];
1870
2039
  /**
1871
2040
  * @description Only legal if the nodes outputs are variadic.
@@ -1891,31 +2060,7 @@ declare interface components {
1891
2060
  yPos: number;
1892
2061
  };
1893
2062
  /** @description For documentation about the node struct, checkout the docs for FormatNodeDAO. */
1894
- FormatNodeDTO: {
1895
- controlValues: {
1896
- [key: string]: components["schemas"]["Value_for_Primitive"];
1897
- };
1898
- /**
1899
- * @description Any unique id works, including for new nodes: whether the id refers to a new or an
1900
- * existing node is determined by whether it already exists on the format, not by its value.
1901
- */
1902
- id: components["schemas"]["FormatNodeId"];
1903
- inputVargsToArray: boolean;
1904
- nodeType: components["schemas"]["NodeType"];
1905
- outputVargsToArray: boolean;
1906
- parentNodeId?: components["schemas"]["FormatNodeId"] | null;
1907
- settings: components["schemas"]["RecordValue_for_Primitive"];
1908
- /**
1909
- * @description Ignored for existing nodes, because a node's test id never changes. Defaults to the node id.
1910
- * @default null
1911
- */
1912
- testId: components["schemas"]["FormatNodeTestId"] | null;
1913
- typeHints: components["schemas"]["TypeHints_for_Type_and_ParamRef"];
1914
- /** Format: int64 */
1915
- xPos: number;
1916
- /** Format: int64 */
1917
- yPos: number;
1918
- };
2063
+ FormatNodeDTO: FormatNodeDTO;
1919
2064
  /** Format: uuid */
1920
2065
  FormatNodeId: FormatNodeId;
1921
2066
  /** @description The node `format_node_id` in the format instance `format_instance_id`. */
@@ -1979,6 +2124,10 @@ declare interface components {
1979
2124
  } | {
1980
2125
  /** @constant */
1981
2126
  type: "portal-has-input-connection";
2127
+ } | {
2128
+ /** @constant */
2129
+ type: "invalid-comment-link";
2130
+ data: components["schemas"]["FormatNodeId"];
1982
2131
  } | {
1983
2132
  /** @constant */
1984
2133
  type: "parent-creates-cycle";
@@ -2190,150 +2339,38 @@ declare interface components {
2190
2339
  testFormatInstanceId: components["schemas"]["FormatInstanceHash"];
2191
2340
  };
2192
2341
  /** @description Represents a state in which the format is not valid for execution but can be stored in the db. */
2193
- FormatValidationError: {
2194
- /** @constant */
2195
- type: "uncaught-throw";
2196
- data: {
2197
- [key: string]: components["schemas"]["RowTypeHelper_for_ParamRef"][];
2342
+ FormatValidationError: FormatValidationError;
2343
+ /** @enum {string} */
2344
+ FormatValidity: FormatValidity;
2345
+ FullFormatDAO: {
2346
+ format: components["schemas"]["FormatDAO"];
2347
+ connections: components["schemas"]["FormatNodeConnectionDAO"][];
2348
+ nodes: components["schemas"]["FormatNodeDAO"][];
2349
+ };
2350
+ FullFormatInstanceDTO: {
2351
+ format: components["schemas"]["FormatDAO"];
2352
+ formatInstance: components["schemas"]["FormatInstanceDAO"];
2353
+ parent?: components["schemas"]["FullFormatInstanceDTO"] | null;
2354
+ parentFormatNode?: components["schemas"]["FormatNodeDAO"] | null;
2355
+ /**
2356
+ * @description The folder names [Self::parent_format_node] sits in, outermost first.
2357
+ * Empty when that node is not inside a folder or when there is no such node.
2358
+ */
2359
+ parentFormatNodeFolderPath: string[];
2360
+ };
2361
+ /** @description The node `format_node_id` in the format instance `format_instance_id`. */
2362
+ FullNodeInstance: {
2363
+ formatId: components["schemas"]["FormatId"];
2364
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
2365
+ formatNodeId: components["schemas"]["FormatNodeId"];
2366
+ };
2367
+ GTFilterKind: GTFilterKind;
2368
+ GameDAO: {
2369
+ attributes: components["schemas"]["RecordValue_for_Primitive"];
2370
+ customData: {
2371
+ [key: string]: string;
2198
2372
  };
2199
- } | {
2200
- /** @constant */
2201
- type: "unthrown-disqualification-kinds";
2202
- data: components["schemas"]["DqKey"][];
2203
- } | {
2204
- /** @constant */
2205
- type: "root-format-with-disqualification-kinds";
2206
- } | {
2207
- /** @constant */
2208
- type: "graph-is-cyclic";
2209
- } | {
2210
- /** @constant */
2211
- type: "too-many-inputs";
2212
- data: components["schemas"]["ParentType"];
2213
- } | {
2214
- /** @constant */
2215
- type: "too-many-outputs";
2216
- data: components["schemas"]["ParentType"];
2217
- } | {
2218
- /** @constant */
2219
- type: "invalid-node";
2220
- data: [
2221
- components["schemas"]["FormatNodeId"],
2222
- components["schemas"]["InvalidNodeReason"]
2223
- ];
2224
- } | {
2225
- /** @constant */
2226
- type: "too-many-closure-inputs";
2227
- } | {
2228
- /** @constant */
2229
- type: "root-format-with-input-or-output";
2230
- } | {
2231
- /** @constant */
2232
- type: "child-format-is-invalid";
2233
- data: components["schemas"]["FormatId"];
2234
- } | {
2235
- /** @constant */
2236
- type: "root-format-referenced";
2237
- data: components["schemas"]["FormatId"];
2238
- } | {
2239
- /** @constant */
2240
- type: "cyclic-parent-relation";
2241
- data: components["schemas"]["FormatNodeId"][];
2242
- } | {
2243
- /** @constant */
2244
- type: "illegal-child";
2245
- data: components["schemas"]["FormatNodeId"];
2246
- } | {
2247
- /** @constant */
2248
- type: "parent-connected-to-child";
2249
- data: {
2250
- child: components["schemas"]["FormatNodeId"];
2251
- parent: components["schemas"]["FormatNodeId"];
2252
- };
2253
- } | {
2254
- /** @constant */
2255
- type: "connection-escapes-scope";
2256
- data: {
2257
- scope: components["schemas"]["FormatNodeId"];
2258
- source: components["schemas"]["FormatNodeId"];
2259
- target: components["schemas"]["FormatNodeId"];
2260
- };
2261
- } | {
2262
- /** @constant */
2263
- type: "input-or-output-node-with-parent";
2264
- } | {
2265
- /** @constant */
2266
- type: "node-configuration-error";
2267
- data: components["schemas"]["NodeConfigurationError"];
2268
- } | {
2269
- /** @constant */
2270
- type: "cyclic-format-dependency";
2271
- } | {
2272
- /** @constant */
2273
- type: "type-validation-errors";
2274
- data: components["schemas"]["ValidationError_for_Type"][];
2275
- } | {
2276
- /** @constant */
2277
- type: "static-input-received-non-static-connection";
2278
- } | {
2279
- /** @constant */
2280
- type: "nodety-error";
2281
- data: components["schemas"]["NodetyError"];
2282
- } | {
2283
- /** @constant */
2284
- type: "format-of-other-event-referenced";
2285
- data: components["schemas"]["FormatId"];
2286
- } | {
2287
- /** @constant */
2288
- type: "invalid-signature";
2289
- } | {
2290
- /** @constant */
2291
- type: "missing-output-node";
2292
- };
2293
- /** @enum {string} */
2294
- FormatValidity: "invalid" | "valid";
2295
- FullFormatDAO: {
2296
- format: components["schemas"]["FormatDAO"];
2297
- connections: components["schemas"]["FormatNodeConnectionDAO"][];
2298
- nodes: components["schemas"]["FormatNodeDAO"][];
2299
- };
2300
- FullFormatInstanceDTO: {
2301
- format: components["schemas"]["FormatDAO"];
2302
- formatInstance: components["schemas"]["FormatInstanceDAO"];
2303
- parent?: components["schemas"]["FullFormatInstanceDTO"] | null;
2304
- parentFormatNode?: components["schemas"]["FormatNodeDAO"] | null;
2305
- /**
2306
- * @description The folder names [Self::parent_format_node] sits in, outermost first.
2307
- * Empty when that node is not inside a folder or when there is no such node.
2308
- */
2309
- parentFormatNodeFolderPath: string[];
2310
- };
2311
- /** @description The node `format_node_id` in the format instance `format_instance_id`. */
2312
- FullNodeInstance: {
2313
- formatId: components["schemas"]["FormatId"];
2314
- formatInstanceId: components["schemas"]["FormatInstanceHash"];
2315
- formatNodeId: components["schemas"]["FormatNodeId"];
2316
- };
2317
- GTFilterKind: {
2318
- /** @constant */
2319
- type: "class-filter";
2320
- } | {
2321
- /** @constant */
2322
- type: "gender";
2323
- } | {
2324
- /** @constant */
2325
- type: "comparison-filter";
2326
- data: components["schemas"]["ComparisonOp"];
2327
- } | {
2328
- /** @constant */
2329
- type: "custom";
2330
- };
2331
- GameDAO: {
2332
- attributes: components["schemas"]["RecordValue_for_Primitive"];
2333
2373
  eventId: components["schemas"]["EventId"];
2334
- extensionData: {
2335
- [key: string]: string;
2336
- };
2337
2374
  /**
2338
2375
  * Format: uint32
2339
2376
  * @description The game depth of the game's entry table.
@@ -2347,7 +2384,7 @@ declare interface components {
2347
2384
  };
2348
2385
  GameDTO: {
2349
2386
  attributes: components["schemas"]["RecordValue_for_Primitive"];
2350
- extensionData: {
2387
+ customData?: {
2351
2388
  [key: string]: string;
2352
2389
  };
2353
2390
  gameFormatId: components["schemas"]["GameFormatId"];
@@ -2362,11 +2399,18 @@ declare interface components {
2362
2399
  GameFormatDAO: {
2363
2400
  description: string;
2364
2401
  attributesType: components["schemas"]["RecordTypeWithDefaults"];
2365
- entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2366
- eventId: components["schemas"]["EventId"];
2367
- extensionData: {
2402
+ customData: {
2368
2403
  [key: string]: string;
2369
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"];
2370
2414
  id: components["schemas"]["GameFormatId"];
2371
2415
  name: string;
2372
2416
  /** @description Run in order on every result row. */
@@ -2385,10 +2429,17 @@ declare interface components {
2385
2429
  /** @default */
2386
2430
  description: string;
2387
2431
  attributesType: components["schemas"]["RecordTypeWithDefaults"];
2388
- entryListColumns: components["schemas"]["RecordTypeWithDefaults"];
2389
- extensionData: {
2432
+ customData?: {
2390
2433
  [key: string]: string;
2391
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"];
2392
2443
  name: string;
2393
2444
  /** @description Run in order on every result row. */
2394
2445
  postProcessingSteps: components["schemas"]["GameFormatPostProcessingStep"][];
@@ -2410,22 +2461,7 @@ declare interface components {
2410
2461
  * result, after the result has been entered. They never change the stored result of the game, only
2411
2462
  * the result table the game node outputs.
2412
2463
  */
2413
- GameFormatPostProcessingStep: {
2414
- /** @constant */
2415
- type: "disqualify";
2416
- data: {
2417
- expression: string;
2418
- key: components["schemas"]["DqKey"];
2419
- };
2420
- } | {
2421
- /** @constant */
2422
- type: "set-output-column";
2423
- data: {
2424
- column: string;
2425
- columnType: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
2426
- expression: string;
2427
- };
2428
- };
2464
+ GameFormatPostProcessingStep: GameFormatPostProcessingStep;
2429
2465
  /**
2430
2466
  * Format: uuid
2431
2467
  * @description Identifies a game, the primary key of `games`. Comes from one of:
@@ -2437,32 +2473,9 @@ declare interface components {
2437
2473
  * Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
2438
2474
  */
2439
2475
  GameId: GameId;
2440
- GameNodeDTO: {
2441
- /**
2442
- * @description Caught disqualifications are not thrown. [DqStrategy] decides how they are surfaced.
2443
- * @default {}
2444
- */
2445
- catchDqs: {
2446
- [key: string]: components["schemas"]["DqStrategy"];
2447
- };
2448
- gameFormatId: components["schemas"]["GameFormatId"];
2449
- variant: components["schemas"]["GameNodeVariant"];
2450
- };
2476
+ GameNodeDTO: GameNodeDTO;
2451
2477
  /** @description How many games a game node plays and how they depend on each other. */
2452
- GameNodeVariant: {
2453
- /** @constant */
2454
- type: "single";
2455
- } | {
2456
- /** @constant */
2457
- type: "parallel";
2458
- } | {
2459
- /** @constant */
2460
- type: "sequential";
2461
- data: {
2462
- /** Format: uint */
2463
- gameCount: number;
2464
- };
2465
- };
2478
+ GameNodeVariant: GameNodeVariant;
2466
2479
  GamePathVariables_for_CommonWorkspaceId: {
2467
2480
  eventId: components["schemas"]["EventId"];
2468
2481
  gameId: components["schemas"]["GameId"];
@@ -2510,21 +2523,12 @@ declare interface components {
2510
2523
  strategy: components["schemas"]["UniqueBibStrategy"];
2511
2524
  };
2512
2525
  /** @description Location of a validation error in the graph. */
2513
- GraphLocation: {
2514
- /** @constant */
2515
- type: "Edge";
2516
- /** Format: uint */
2517
- data: number;
2518
- } | {
2519
- /** @constant */
2520
- type: "InputPort";
2521
- data: {
2522
- /** Format: uint */
2523
- inputIdx: number;
2524
- /** Format: uint */
2525
- nodeIdx: number;
2526
- };
2527
- };
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;
2528
2532
  /**
2529
2533
  * @description The Header Object follows the structure of the Parameter Object with the
2530
2534
  * following changes:
@@ -2657,28 +2661,8 @@ declare interface components {
2657
2661
  /** @constant */
2658
2662
  type: "missing-dependency";
2659
2663
  };
2660
- InvalidNodeReason: {
2661
- /** @constant */
2662
- type: "invalid-node";
2663
- } | {
2664
- /** @constant */
2665
- type: "node-is-not-variadic-but-vargs-to-array-set";
2666
- } | {
2667
- /** @constant */
2668
- type: "illegal-control-values";
2669
- } | ({
2670
- /** @constant */
2671
- type: "node-configuration-error";
2672
- } & components["schemas"]["NodeConfigurationError"]) | {
2673
- /** @constant */
2674
- type: "catching-disqualifications-of-variadic-format";
2675
- } | {
2676
- /** @constant */
2677
- type: "appending-disqualifications-to-incompatible-output";
2678
- } | {
2679
- /** @constant */
2680
- type: "game-result-not-assignable-to-entry";
2681
- };
2664
+ InvalidLinkedFormatPolicy: "empty-table" | "node-error" | "last-known-table";
2665
+ InvalidNodeReason: InvalidNodeReason;
2682
2666
  /** @description License information for the exposed API. */
2683
2667
  License: {
2684
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. */
@@ -2762,7 +2746,7 @@ declare interface components {
2762
2746
  * @description Identifies a type parameter within a type expression or node signature.
2763
2747
  * Can be created from a single character (e.g. `'T'`) or a string (hashed for multi-char names).
2764
2748
  */
2765
- LocalParamID: number;
2749
+ LocalParamID: LocalParamID;
2766
2750
  /** @description An error that originated in a node, identified independently of the unstable `NodeIndex`. */
2767
2751
  LocatedNodeError: {
2768
2752
  error: components["schemas"]["NodeRuntimeError"];
@@ -2770,6 +2754,21 @@ declare interface components {
2770
2754
  formatId: components["schemas"]["FormatId"];
2771
2755
  formatInstanceId: components["schemas"]["FormatInstanceHash"];
2772
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"];
2773
2772
  };
2774
2773
  /** Format: uuid */
2775
2774
  LogBatchId: string;
@@ -2845,6 +2844,10 @@ declare interface components {
2845
2844
  /** @constant */
2846
2845
  type: "update-game-table";
2847
2846
  data: components["schemas"]["UpdateTableMutation"];
2847
+ } | {
2848
+ /** @constant */
2849
+ type: "update-standalone-table";
2850
+ data: components["schemas"]["UpdateStandaloneTableMutation"];
2848
2851
  } | {
2849
2852
  /** @constant */
2850
2853
  type: "delete-game-table";
@@ -2961,6 +2964,10 @@ declare interface components {
2961
2964
  /** @constant */
2962
2965
  type: "link-to-template";
2963
2966
  data: components["schemas"]["LinkToTemplateMutation"];
2967
+ } | {
2968
+ /** @constant */
2969
+ type: "set-custom-data";
2970
+ data: components["schemas"]["SetCustomDataMutation"];
2964
2971
  };
2965
2972
  LogEntrySmall: {
2966
2973
  description: string;
@@ -2998,9 +3005,7 @@ declare interface components {
2998
3005
  /** @description The exact name to give the copied format. */
2999
3006
  name: string;
3000
3007
  };
3001
- MakeValidError: {
3002
- missingDefaultField: string;
3003
- };
3008
+ MakeValidError: MakeValidError;
3004
3009
  Map_of_TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: {
3005
3010
  [key: string]: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3006
3011
  };
@@ -3008,7 +3013,7 @@ declare interface components {
3008
3013
  [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
3009
3014
  };
3010
3015
  /** @enum {string} */
3011
- MathNodeOp: "addition" | "subtraction" | "multiplication" | "division-float" | "division-integer" | "modulo" | "power" | "logarithm" | "sqrt" | "absolute" | "minimum" | "maximum" | "ceil" | "floor" | "round";
3016
+ MathNodeOp: MathNodeOp;
3012
3017
  MediaType: {
3013
3018
  encoding?: {
3014
3019
  [key: string]: components["schemas"]["Encoding"];
@@ -3021,43 +3026,21 @@ declare interface components {
3021
3026
  } & {
3022
3027
  [key: string]: unknown;
3023
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;
3024
3034
  /** @enum {string} */
3025
- MultiplexingStrategy: "serpentine" | "round-robin";
3035
+ MultiplexingStrategy: MultiplexingStrategy;
3026
3036
  NameQuery: {
3027
3037
  name: string;
3028
3038
  };
3029
- NoSupertypeLayerReason: "UnknownTypeParam" | "NodeSignatureInputsVarg" | "NodeSignatureInputs" | "NodeSignatureOutputs" | "NodeSignatureTags" | "NodeSignatureRequiredTags" | "PortTypesVarg" | "PortTypesArity" | "PortTypesPort" | "Index" | "ConstructorArity" | "ConstructorParam";
3039
+ NoSupertypeLayerReason: NoSupertypeLayerReason;
3030
3040
  NoSupertypeLayer_for_Type: NoSupertypeLayer<Type>;
3031
3041
  /** @enum {string} */
3032
3042
  NodeCategory: "logic" | "game" | "tables" | "arrays" | "math" | "class" | "input-output" | "invalid" | "other" | "root";
3033
- NodeConfigurationError: {
3034
- /** @constant */
3035
- type: "extract-record-field-error";
3036
- data: components["schemas"]["ExtractRecordFieldError_for_Primitive"];
3037
- } | {
3038
- /** @constant */
3039
- type: "invalid-value";
3040
- data: {
3041
- givenValue: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
3042
- identifier: string;
3043
- message: string;
3044
- };
3045
- } | {
3046
- /** @constant */
3047
- type: "node-is-not-variadic-but-vargs-to-array-set";
3048
- } | {
3049
- /** @constant */
3050
- type: "found-closure-input-node-in-non-closure";
3051
- } | {
3052
- /** @constant */
3053
- type: "invalid-node";
3054
- } | {
3055
- /** @constant */
3056
- type: "illegal-vargs-to-array";
3057
- } | {
3058
- /** @constant */
3059
- type: "illegal-control-values";
3060
- };
3043
+ NodeConfigurationError: NodeConfigurationError;
3061
3044
  NodeDocTest: {
3062
3045
  description?: string | null;
3063
3046
  format: components["schemas"]["FormatDTO"];
@@ -3107,12 +3090,22 @@ declare interface components {
3107
3090
  result: components["schemas"]["SerializableNodeResult"];
3108
3091
  testId: components["schemas"]["FormatNodeTestId"];
3109
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;
3110
3098
  NodePathVariables_for_CommonWorkspaceId: {
3111
3099
  eventId: components["schemas"]["EventId"];
3112
3100
  formatId: components["schemas"]["FormatId"];
3113
3101
  nodeId: components["schemas"]["FormatNodeId"];
3114
3102
  workspaceId: components["schemas"]["CommonWorkspaceId"];
3115
3103
  };
3104
+ NodePlacement: {
3105
+ group?: components["schemas"]["SimplifiedGroupId"] | null;
3106
+ link?: components["schemas"]["NodeLinkId"] | null;
3107
+ section: components["schemas"]["SimplifiedSectionId"];
3108
+ };
3116
3109
  NodePrototype: {
3117
3110
  /**
3118
3111
  * @description If there is only one variant, the node should not display a select for the variants.
@@ -3214,289 +3207,15 @@ declare interface components {
3214
3207
  * @description Function-like type for a node: generic parameters, inputs, outputs, and defaults.
3215
3208
  * Written in notation as `<T>(T) -> (T)` for the identity node.
3216
3209
  */
3217
- NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type: {
3218
- /**
3219
- * @description Types that get used when there is no connection to the input.
3220
- * These get ignored for nested NodeSignatures.
3221
- */
3222
- defaultInputTypes: {
3223
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3224
- };
3225
- /**
3226
- * @description inputs and outputs are no PortTypes because having them TypeExpr
3227
- * Enables one to express `() -> Never` which is the node signature
3228
- * assignable to all other node signatures. Useful for inferring what
3229
- * type a closure should be.
3230
- */
3231
- inputs: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3232
- outputs: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
3233
- /** @description Generic parameters with their bounds and defaults. */
3234
- parameters: components["schemas"]["TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type"];
3235
- /**
3236
- * @description Tags this node *requires* from every incoming edge.
3237
- *
3238
- * During validation, each incoming edge's source tags are checked against
3239
- * this set. Any tag present here but missing from an incoming edge
3240
- * produces a [`TagMissing`](crate::validation::ValidationErrorKind::TagMissing)
3241
- * error.
3242
- *
3243
- * Defaults to `∅` (no requirements).
3244
- */
3245
- requiredTags: number[];
3246
- /**
3247
- * @description Tags this node *provides* to downstream consumers.
3248
- *
3249
- * - `Some(set)` — the node carries exactly the listed tags.
3250
- * - `None` — the node carries *every* tag (universal set), making it a
3251
- * supertype of all other tag sets.
3252
- *
3253
- * Tags propagate forward through the graph: a node's effective tag set
3254
- * is the intersection of its own `tags` with every incoming edge's tags.
3255
- *
3256
- * Defaults to `Some(∅)` (no tags).
3257
- *
3258
- * `u32` is used instead of `usize` for wasm compatibility (JS has 32-bit
3259
- * integers).
3260
- */
3261
- tags?: number[] | null;
3262
- };
3210
+ NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type: NodeSignature<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
3263
3211
  /**
3264
3212
  * @description Function-like type for a node: generic parameters, inputs, outputs, and defaults.
3265
3213
  * Written in notation as `<T>(T) -> (T)` for the identity node.
3266
3214
  */
3267
3215
  NodeSignature_for_Type_and_ParamRef: NodeSignature<Type, ParamRef>;
3268
- NodeType: {
3269
- /** @constant */
3270
- type: "input";
3271
- } | {
3272
- /** @constant */
3273
- type: "output";
3274
- } | {
3275
- /** @constant */
3276
- type: "format";
3277
- data: {
3278
- /**
3279
- * @description Each of these get caught and handled according to [`DqStrategy`].
3280
- * @default {}
3281
- */
3282
- catchDqs: {
3283
- [key: string]: components["schemas"]["DqStrategy"];
3284
- };
3285
- formatId: components["schemas"]["FormatId"];
3286
- };
3287
- } | {
3288
- /** @constant */
3289
- type: "math";
3290
- data: {
3291
- op: components["schemas"]["MathNodeOp"];
3292
- };
3293
- } | {
3294
- /** @constant */
3295
- type: "game";
3296
- data: components["schemas"]["GameNodeDTO"];
3297
- } | {
3298
- /** @constant */
3299
- type: "output-table";
3300
- } | {
3301
- /** @constant */
3302
- type: "input-table";
3303
- data: {
3304
- tableId: components["schemas"]["TableId"];
3305
- };
3306
- } | {
3307
- /** @constant */
3308
- type: "portal";
3309
- data: {
3310
- sourceNodeId: components["schemas"]["FormatNodeId"];
3311
- sourceOutput: components["schemas"]["OutputIdx"];
3312
- };
3313
- } | {
3314
- /** @constant */
3315
- type: "class";
3316
- data: {
3317
- classId: components["schemas"]["ClassId"];
3318
- };
3319
- } | {
3320
- /** @constant */
3321
- type: "catch-dq";
3322
- data: components["schemas"]["CatchDqNode"];
3323
- } | {
3324
- /** @constant */
3325
- type: "disqualify";
3326
- data: components["schemas"]["DisqualifyNode"];
3327
- } | {
3328
- /** @constant */
3329
- type: "folder";
3330
- data: {
3331
- folderName: string;
3332
- };
3333
- } | {
3334
- /** @constant */
3335
- type: "group";
3336
- data: {
3337
- name: string;
3338
- };
3339
- } | {
3340
- /** @constant */
3341
- type: "string-concat";
3342
- } | {
3343
- /** @constant */
3344
- type: "string-format";
3345
- } | {
3346
- /** @constant */
3347
- type: "sort-node";
3348
- } | {
3349
- /** @constant */
3350
- type: "constant";
3351
- } | {
3352
- /** @constant */
3353
- type: "merge-tables";
3354
- } | {
3355
- /** @constant */
3356
- type: "divide-table";
3357
- } | {
3358
- /** @constant */
3359
- type: "distribute-table";
3360
- } | {
3361
- /** @constant */
3362
- type: "split-table";
3363
- data: components["schemas"]["SplitTableNode"];
3364
- } | {
3365
- /** @constant */
3366
- type: "concat";
3367
- data: {
3368
- sorted: boolean;
3369
- };
3370
- } | {
3371
- /** @constant */
3372
- type: "remove-places";
3373
- } | {
3374
- /** @constant */
3375
- type: "table-map";
3376
- } | {
3377
- /** @constant */
3378
- type: "length";
3379
- } | {
3380
- /** @constant */
3381
- type: "boolean-op";
3382
- data: {
3383
- op: components["schemas"]["BooleanOp"];
3384
- };
3385
- } | {
3386
- /** @constant */
3387
- type: "record-field";
3388
- data: {
3389
- op: components["schemas"]["RecordFieldOp"];
3390
- };
3391
- } | {
3392
- /** @constant */
3393
- type: "add-record-fields";
3394
- data: components["schemas"]["AddRecordFieldsNode"];
3395
- } | {
3396
- /** @constant */
3397
- type: "fallback";
3398
- } | {
3399
- /** @constant */
3400
- type: "gt-row";
3401
- data: {
3402
- errorOnNotFound: boolean;
3403
- };
3404
- } | {
3405
- /** @constant */
3406
- type: "filter-gt";
3407
- data: {
3408
- filter: components["schemas"]["GTFilterKind"];
3409
- };
3410
- } | {
3411
- /** @constant */
3412
- type: "comparison";
3413
- data: {
3414
- op: components["schemas"]["ComparisonOp"];
3415
- };
3416
- } | {
3417
- /** @constant */
3418
- type: "comment";
3419
- data: {
3420
- comment: string;
3421
- };
3422
- } | {
3423
- /** @constant */
3424
- type: "ternary";
3425
- } | {
3426
- /** @constant */
3427
- type: "separate-row";
3428
- } | {
3429
- /** @constant */
3430
- type: "update-row";
3431
- } | {
3432
- /** @constant */
3433
- type: "array-map";
3434
- } | {
3435
- /** @constant */
3436
- type: "create-array";
3437
- } | {
3438
- /** @constant */
3439
- type: "create-table";
3440
- } | {
3441
- /** @constant */
3442
- type: "array-access";
3443
- data: {
3444
- errorOnNotFound: boolean;
3445
- };
3446
- } | {
3447
- /** @constant */
3448
- type: "unpack-array";
3449
- data: {
3450
- errorOnNotFound: boolean;
3451
- };
3452
- } | {
3453
- /** @constant */
3454
- type: "promotion-relegation";
3455
- data: {
3456
- /** Format: uint */
3457
- finalCount?: number | null;
3458
- };
3459
- } | {
3460
- /** @constant */
3461
- type: "age-at";
3462
- } | {
3463
- /** @constant */
3464
- type: "split-by-class";
3465
- data: {
3466
- /** Format: uint */
3467
- classCount: number;
3468
- };
3469
- } | {
3470
- /** @constant */
3471
- type: "invalid";
3472
- data: {
3473
- nodeType: components["schemas"]["NodeType"];
3474
- };
3475
- } | {
3476
- /** @constant */
3477
- type: "empty-record";
3478
- } | {
3479
- /** @constant */
3480
- type: "event-competitors";
3481
- data: components["schemas"]["EventCompetitorsNode"];
3482
- } | {
3483
- /** @constant */
3484
- type: "add-columns";
3485
- data: components["schemas"]["AddColumnsNode"];
3486
- } | {
3487
- /** @constant */
3488
- type: "matrix-transpose";
3489
- } | {
3490
- /** @constant */
3491
- type: "simple-scoring";
3492
- data: components["schemas"]["SimpleScoringNode"];
3493
- } | {
3494
- /** @constant */
3495
- type: "classes-competitors";
3496
- data: components["schemas"]["ClassesCompetitorsNode"];
3497
- };
3216
+ NodeType: NodeType;
3498
3217
  /** @description Auto-generated discriminant enum variants */
3499
- 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";
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";
3500
3219
  NodeVariantDoc: {
3501
3220
  description?: string | null;
3502
3221
  /** @default other */
@@ -3532,23 +3251,7 @@ declare interface components {
3532
3251
  /** @description For the docs of format nodes */
3533
3252
  userDefinedDocs?: components["schemas"]["NodeVariantDoc"] | null;
3534
3253
  };
3535
- NodetyError: {
3536
- /** @constant */
3537
- type: "NodeHasChildren";
3538
- } | {
3539
- /** @constant */
3540
- type: "ParentNotFound";
3541
- } | {
3542
- /** @constant */
3543
- type: "NodeNotFound";
3544
- } | {
3545
- /** @constant */
3546
- type: "CycleDetected";
3547
- } | {
3548
- /** @constant */
3549
- type: "TypeExprValidationError";
3550
- error: components["schemas"]["TypeExprValidationError"];
3551
- };
3254
+ NodetyError: NodetyError;
3552
3255
  OAuth2Flows: ({
3553
3256
  implicit: {
3554
3257
  authorizationUrl: string;
@@ -3845,14 +3548,7 @@ declare interface components {
3845
3548
  /** Format: uint16 */
3846
3549
  OutputIdx: OutputIdx;
3847
3550
  /** @description References a local type parameter. This is context sensitive because parameters are scoped. */
3848
- ParamRef: {
3849
- /**
3850
- * @description If false, this reference will not be used to collect candidates for the parameter.
3851
- * In the notation this is written as `!T`.
3852
- */
3853
- infer: boolean;
3854
- paramId: components["schemas"]["LocalParamID"];
3855
- };
3551
+ ParamRef: ParamRef;
3856
3552
  Parameter: (({
3857
3553
  /**
3858
3554
  * @description A brief description of the parameter. This could
@@ -4101,37 +3797,8 @@ declare interface components {
4101
3797
  [key: string]: components["schemas"]["MediaType"];
4102
3798
  };
4103
3799
  }));
4104
- ParentType: {
4105
- /** @constant */
4106
- type: "format-root";
4107
- } | {
4108
- /** @constant */
4109
- type: "closure-node";
4110
- data: components["schemas"]["FormatNodeId"];
4111
- };
4112
- ParseError: {
4113
- kind: components["schemas"]["ParseErrorKind"];
4114
- location: components["schemas"]["SourceLocation"];
4115
- };
4116
- ParseErrorKind: {
4117
- /** @constant */
4118
- type: "invalid-token";
4119
- } | {
4120
- /** @constant */
4121
- type: "unexpected-token";
4122
- } | {
4123
- /** @constant */
4124
- type: "expected-token";
4125
- data: {
4126
- expected: string;
4127
- };
4128
- } | {
4129
- /** @constant */
4130
- type: "invalid-number";
4131
- } | {
4132
- /** @constant */
4133
- type: "unterminated-string";
4134
- };
3800
+ ParentType: ParentType;
3801
+ ParseErrorKind: ParseErrorKind;
4135
3802
  PatchTableStateMutation: {
4136
3803
  /** @description None resets the table state */
4137
3804
  state?: components["schemas"]["TableState"] | null;
@@ -4231,10 +3898,7 @@ declare interface components {
4231
3898
  data: string;
4232
3899
  };
4233
3900
  /** @description A list of port types, optionally with a variadic type (`...T`). */
4234
- PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type: {
4235
- ports: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"][];
4236
- varg?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
4237
- };
3901
+ PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type: PortTypes<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
4238
3902
  /** @description A list of port types, optionally with a variadic type (`...T`). */
4239
3903
  PortTypes_for_Type_and_ParamRef: PortTypes<Type, ParamRef>;
4240
3904
  PortsDoc: {
@@ -4253,7 +3917,7 @@ declare interface components {
4253
3917
  minAge: number;
4254
3918
  };
4255
3919
  /** @description Crate local version of [std::convert::Infallible] */
4256
- Primitive: unknown;
3920
+ Primitive: Primitive;
4257
3921
  PushTableRowMutationsMutation: {
4258
3922
  /**
4259
3923
  * @description Challenge for a client to prevent accidentally
@@ -4275,11 +3939,8 @@ declare interface components {
4275
3939
  seed: components["schemas"]["Seed"];
4276
3940
  };
4277
3941
  /** @enum {string} */
4278
- RecordFieldOp: "read-field" | "write-field";
4279
- RecordMakeValidMutation: {
4280
- columnName: string;
4281
- newValue: components["schemas"]["Value_for_Primitive"];
4282
- };
3942
+ RecordFieldOp: RecordFieldOp;
3943
+ RecordMakeValidMutation: RecordMakeValidMutation;
4283
3944
  RecordModifications: {
4284
3945
  /**
4285
3946
  * Format: uint
@@ -4311,9 +3972,7 @@ declare interface components {
4311
3972
  };
4312
3973
  };
4313
3974
  RecordValue_for_Primitive: RecordValue<Primitive>;
4314
- RecordValue_for_SerializableNonPrimitiveValue: {
4315
- [key: string]: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
4316
- };
3975
+ RecordValue_for_SerializableNonPrimitiveValue: RecordValue<SerializableNonPrimitiveValue>;
4317
3976
  ReferenceOr_for_Example: {
4318
3977
  /**
4319
3978
  * @description A description which by default SHOULD override that of the
@@ -4568,6 +4227,8 @@ declare interface components {
4568
4227
  hash: number[];
4569
4228
  id: components["schemas"]["LogId"];
4570
4229
  };
4230
+ /** @enum {string} */
4231
+ ReplicationSide: "source" | "target";
4571
4232
  ReplicationTargetMultipart: {
4572
4233
  /** Format: binary */
4573
4234
  file: Blob;
@@ -4599,7 +4260,7 @@ declare interface components {
4599
4260
  [key: string]: unknown;
4600
4261
  };
4601
4262
  Resolve: {
4602
- keep: components["schemas"]["Side"];
4263
+ keep: components["schemas"]["ReplicationSide"];
4603
4264
  };
4604
4265
  /** @description A table as nodes see it, without the results whose competitor is not in the entry of their game. */
4605
4266
  ResolvedTable: {
@@ -4679,67 +4340,28 @@ declare interface components {
4679
4340
  parentTableId?: components["schemas"]["TableId"] | null;
4680
4341
  /** @description The operations between the parent row and this one, in order. */
4681
4342
  steps: components["schemas"]["Step"][];
4682
- tableId: components["schemas"]["TableId"];
4683
- };
4684
- RowMutationChangeEvent: {
4685
- gameTableId: components["schemas"]["TableId"];
4686
- };
4687
- RowMutationDAO: {
4688
- /**
4689
- * Format: int64
4690
- * @description When performing batch actions like delete all, then all these will have the same batch id.
4691
- * Otherwise it will get incremented. Used for undo & redo.
4692
- */
4693
- batch: number;
4694
- competitorId: components["schemas"]["CompetitorId"];
4695
- gameTableId: components["schemas"]["TableId"];
4696
- /** @description Counts per table, so it is unique only together with `game_table_id`. */
4697
- idx: components["schemas"]["RowMutationIdx"];
4698
- kind: components["schemas"]["RowMutationKind"];
4699
- };
4700
- /** Format: int64 */
4701
- RowMutationIdx: RowMutationIdx;
4702
- RowMutationKind: {
4703
- /** @constant */
4704
- type: "set-record-field";
4705
- field: string;
4706
- value: components["schemas"]["Value_for_Primitive"];
4707
- } | {
4708
- /** @constant */
4709
- type: "push-unranked";
4710
- columns: components["schemas"]["RecordValue_for_Primitive"];
4711
- } | {
4712
- /** @constant */
4713
- type: "remove";
4714
- } | {
4715
- /** @constant */
4716
- type: "set-place";
4717
- /** Format: uint */
4718
- place: number;
4719
- } | {
4720
- /** @constant */
4721
- type: "set-unranked";
4722
- /** Format: uint */
4723
- tiebraker: number;
4724
- } | {
4725
- /** @constant */
4726
- type: "set-place-and-tie-braker";
4727
- /** Format: uint */
4728
- place: number;
4729
- /** Format: uint */
4730
- tiebraker: number;
4343
+ tableId: components["schemas"]["TableId"];
4344
+ };
4345
+ RowMutationChangeEvent: {
4346
+ gameTableId: components["schemas"]["TableId"];
4731
4347
  };
4732
- RowMutationWithBatch: {
4348
+ RowMutationDAO: {
4733
4349
  /**
4734
4350
  * Format: int64
4735
4351
  * @description When performing batch actions like delete all, then all these will have the same batch id.
4736
4352
  * Otherwise it will get incremented. Used for undo & redo.
4737
4353
  */
4738
4354
  batch: number;
4739
- /** Format: int64 */
4740
- competitorId: number;
4355
+ competitorId: components["schemas"]["CompetitorId"];
4356
+ gameTableId: components["schemas"]["TableId"];
4357
+ /** @description Counts per table, so it is unique only together with `game_table_id`. */
4358
+ idx: components["schemas"]["RowMutationIdx"];
4741
4359
  kind: components["schemas"]["RowMutationKind"];
4742
4360
  };
4361
+ /** Format: int64 */
4362
+ RowMutationIdx: RowMutationIdx;
4363
+ RowMutationKind: RowMutationKind;
4364
+ RowMutationWithBatch: RowMutationWithBatch;
4743
4365
  RowQuery: {
4744
4366
  /** @description The competitor of the row */
4745
4367
  competitorId: components["schemas"]["CompetitorId"];
@@ -4752,52 +4374,10 @@ declare interface components {
4752
4374
  timestamp: string;
4753
4375
  };
4754
4376
  /** @description GameTableTypes types should **only** be manipulated though this helper to have a single source of truth for the structure. */
4755
- RowTypeHelper_for_ParamRef: {
4756
- columns: components["schemas"]["RecordTypeHelper_for_ParamRef"];
4757
- };
4377
+ RowTypeHelper_for_ParamRef: RowTypeHelper<ParamRef>;
4758
4378
  Rows_for_Sorted: Rows<Sorted>;
4759
4379
  Rows_for_Unsorted: Rows<Unsorted>;
4760
- RuntimeErrorKind: {
4761
- /** @constant */
4762
- type: "division-by-zero";
4763
- } | {
4764
- /** @constant */
4765
- type: "variable-not-found";
4766
- data: {
4767
- name: string;
4768
- };
4769
- } | {
4770
- /** @constant */
4771
- type: "function-not-found";
4772
- data: {
4773
- name: string;
4774
- };
4775
- } | {
4776
- /** @constant */
4777
- type: "index-out-of-bounds";
4778
- } | {
4779
- /** @constant */
4780
- type: "invalid-index";
4781
- } | {
4782
- /** @constant */
4783
- type: "invalid-math-operands";
4784
- } | {
4785
- /** @constant */
4786
- type: "non-boolean-condition";
4787
- } | {
4788
- /** @constant */
4789
- type: "non-boolean-operand";
4790
- } | {
4791
- /** @constant */
4792
- type: "invalid-comparison-operands";
4793
- } | {
4794
- /** @constant */
4795
- type: "argument";
4796
- data: {
4797
- expected: string;
4798
- got: string;
4799
- };
4800
- };
4380
+ RuntimeErrorKind: RuntimeErrorKind;
4801
4381
  SchemaObject: {
4802
4382
  /**
4803
4383
  * @description A free-form property to include an example of an instance for this
@@ -4881,27 +4461,7 @@ declare interface components {
4881
4461
  errorState: components["schemas"]["NodeErrorState_for_NodeRuntimeError"];
4882
4462
  values: components["schemas"]["SerializablePortValues_for_OutputIdx"];
4883
4463
  };
4884
- SerializableNonPrimitiveValue: {
4885
- /** @constant */
4886
- type: "game-table";
4887
- data: components["schemas"]["Table_for_Unsorted_and_StateMetadata"];
4888
- } | {
4889
- /** @constant */
4890
- type: "game-table-sorted";
4891
- data: components["schemas"]["Table_for_Sorted_and_StateMetadata"];
4892
- } | {
4893
- /** @constant */
4894
- type: "row";
4895
- data: components["schemas"]["Row"];
4896
- } | {
4897
- /** @constant */
4898
- type: "class";
4899
- /** Format: uuid */
4900
- data: string;
4901
- } | {
4902
- /** @constant */
4903
- type: "closure";
4904
- };
4464
+ SerializableNonPrimitiveValue: SerializableNonPrimitiveValue;
4905
4465
  SerializablePortValues_for_InputIdx: {
4906
4466
  values: {
4907
4467
  [key: string]: components["schemas"]["Value_for_SerializableNonPrimitiveValue"];
@@ -4965,6 +4525,12 @@ declare interface components {
4965
4525
  } & {
4966
4526
  [key: string]: unknown;
4967
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
+ };
4968
4534
  /** @description Adds or sets the extension to the given version */
4969
4535
  SetExtensionMutation: {
4970
4536
  eventId: components["schemas"]["EventId"];
@@ -4978,8 +4544,6 @@ declare interface components {
4978
4544
  SetFormatsFormatGroupQuery: {
4979
4545
  formatGroupId?: components["schemas"]["FormatGroupId"] | null;
4980
4546
  };
4981
- /** @enum {string} */
4982
- Side: "source" | "target";
4983
4547
  /**
4984
4548
  * @description Place 1 = 1 point, Place 2 = 2 points, etc.
4985
4549
  * On tie, whoever won the part with the highest priority wins.
@@ -4993,20 +4557,43 @@ declare interface components {
4993
4557
  * Competitors are the union of all parts: a competitor without a place in a part
4994
4558
  * (missing from the table of that part, or in it without a place) scores one point
4995
4559
  * more than that part has rows, so not finishing a part is always worse than
4996
- * 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.
4997
4566
  */
4998
- SimpleScoringNode: {
4999
- parts: components["schemas"]["SimpleScoringPart"][];
5000
- };
4567
+ SimpleScoringNode: SimpleScoringNode;
5001
4568
  /** @description One scored part, e.g. a single race of a series. */
5002
- SimpleScoringPart: {
5003
- /** @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"];
5004
4572
  name: string;
5005
- /**
5006
- * Format: uint32
5007
- * @description Higher priority parts break ties first.
5008
- */
5009
- 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"][];
5010
4597
  };
5011
4598
  SnapshotMultipart: {
5012
4599
  /** Format: binary */
@@ -5051,12 +4638,7 @@ declare interface components {
5051
4638
  type: "internal";
5052
4639
  };
5053
4640
  /** @description 1-based line and column at the start of a token. */
5054
- SourceLocation: {
5055
- /** Format: uint */
5056
- column: number;
5057
- /** Format: uint */
5058
- line: number;
5059
- };
4641
+ SourceLocation: SourceLocation;
5060
4642
  /**
5061
4643
  * @description Splits a sorted table at the given places, see `Table::split_n`.
5062
4644
  *
@@ -5069,35 +4651,15 @@ declare interface components {
5069
4651
  * <C extends {}>(Table<C, Sorted>, Array<Integer>) -> (Array<Table<C, Sorted>>)
5070
4652
  * ```
5071
4653
  */
5072
- SplitTableNode: {
5073
- /** @constant */
5074
- type: "static";
5075
- data: {
5076
- /** Format: uint16 */
5077
- splitCount: number;
5078
- };
5079
- } | {
5080
- /** @constant */
5081
- type: "dynamic";
5082
- };
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. */
5083
4656
  StandaloneTableDTO: {
5084
4657
  columnTypes: components["schemas"]["RecordTypeWithDefaults"];
5085
4658
  name: string;
5086
- /** @description If Some, sets either layer one or layer two state depending on who issues the request. */
5087
- state?: components["schemas"]["TableState"] | null;
5088
- tableKind: components["schemas"]["TableKind"];
5089
- };
5090
- Step: {
5091
- /**
5092
- * Format: uuid
5093
- * @description Whoever ran the operation, see [Origin::attributed]: the engine's `NodeInstanceHash`, a raw uuid because this
5094
- * crate doesn't know engine types. None until it is attributed.
5095
- */
5096
- node?: string | null;
5097
- op: components["schemas"]["StepOp"];
5098
4659
  };
4660
+ Step: Step;
5099
4661
  /** @description An operation that moved rows between or within tables. */
5100
- StepOp: ("sort" | "split" | "concat" | "merge" | "divide" | "filter" | "remove-places" | "set-places" | "promote-relegate" | "score") | "create";
4662
+ StepOp: StepOp;
5101
4663
  StoreExtensionValueMutation: {
5102
4664
  eventId: components["schemas"]["EventId"];
5103
4665
  extension: string;
@@ -5216,9 +4778,9 @@ declare interface components {
5216
4778
  rows: components["schemas"]["Row"][];
5217
4779
  };
5218
4780
  /** @enum {string} */
5219
- TableSorting: "unsorted" | "sorted";
4781
+ TableSorting: TableSorting;
5220
4782
  /** Format: int64 */
5221
- TableState: number;
4783
+ TableState: TableState;
5222
4784
  /** @description Encodes the two columns `game_id` and `column_types` (exactly one of which must be NON NULL). */
5223
4785
  TableVariant: {
5224
4786
  /** @constant */
@@ -5238,15 +4800,9 @@ declare interface components {
5238
4800
  table: components["schemas"]["TableDAO"];
5239
4801
  };
5240
4802
  /** @description Combines rows with table attributes and state */
5241
- Table_for_Sorted_and_StateMetadata: {
5242
- rows: components["schemas"]["Rows_for_Sorted"];
5243
- state: components["schemas"]["TableState"];
5244
- };
4803
+ Table_for_Sorted_and_StateMetadata: Table<Sorted, StateMetadata>;
5245
4804
  /** @description Combines rows with table attributes and state */
5246
- Table_for_Unsorted_and_StateMetadata: {
5247
- rows: components["schemas"]["Rows_for_Unsorted"];
5248
- state: components["schemas"]["TableState"];
5249
- };
4805
+ Table_for_Unsorted_and_StateMetadata: Table<Unsorted, StateMetadata>;
5250
4806
  /**
5251
4807
  * @description Adds metadata to a single tag that is used by the
5252
4808
  * Operation Object. It is not mandatory to have a
@@ -5391,6 +4947,8 @@ declare interface components {
5391
4947
  number,
5392
4948
  number
5393
4949
  ];
4950
+ /** @description One way a row got to where it is. */
4951
+ Trail: Trail;
5394
4952
  Type: Type;
5395
4953
  /**
5396
4954
  * @description Can be parsed from string with the following syntax:
@@ -5401,67 +4959,11 @@ declare interface components {
5401
4959
  * - `{a: Integer} -> Float`
5402
4960
  * - `{} -> Any`
5403
4961
  */
5404
- TypeContext: {
5405
- returnType: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5406
- variables: {
5407
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5408
- };
5409
- };
5410
- TypeError: {
5411
- kind: components["schemas"]["TypeErrorKind"];
5412
- location: components["schemas"]["SourceLocation"];
5413
- };
5414
- TypeErrorKind: {
5415
- /** @constant */
5416
- type: "unknown-variable";
5417
- data: {
5418
- name: string;
5419
- };
5420
- } | {
5421
- /** @constant */
5422
- type: "unknown-function";
5423
- data: {
5424
- name: string;
5425
- };
5426
- } | {
5427
- /** @constant */
5428
- type: "wrong-arity";
5429
- data: {
5430
- /** Format: uint */
5431
- expected: number;
5432
- /** Format: uint */
5433
- got: number;
5434
- name: string;
5435
- };
5436
- } | {
5437
- /** @constant */
5438
- type: "type-mismatch";
5439
- data: {
5440
- expected: string;
5441
- got: string;
5442
- };
5443
- } | {
5444
- /** @constant */
5445
- type: "non-integer-index";
5446
- } | {
5447
- /** @constant */
5448
- type: "non-record-property-access";
5449
- } | {
5450
- /** @constant */
5451
- type: "nodety";
5452
- data: {
5453
- message: string;
5454
- };
5455
- };
5456
- TypeErrors: components["schemas"]["TypeError"][];
5457
- TypeExprValidationError: {
5458
- /** @constant */
5459
- type: "UnknownVar";
5460
- var: components["schemas"]["LocalParamID"];
5461
- } | {
5462
- /** @constant */
5463
- type: "CyclicReference";
5464
- };
4962
+ TypeContext: TypeContext;
4963
+ TypeError: TypeError_2;
4964
+ TypeErrorKind: TypeErrorKind;
4965
+ TypeErrors: TypeErrors;
4966
+ TypeExprValidationError: TypeExprValidationError;
5465
4967
  /**
5466
4968
  * @description Type expression—the core type representation in nodety.
5467
4969
  *
@@ -5471,74 +4973,7 @@ declare interface components {
5471
4973
  * [`PartialEq`], [`Eq`] and [`Hash`] are structural: `A | B` is not equal to `B | A`.
5472
4974
  * [`Eq`] and [`Hash`] are available when `T: Eq + Hash`.
5473
4975
  */
5474
- TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: {
5475
- /** @constant */
5476
- type: "Type";
5477
- data: components["schemas"]["Type"];
5478
- } | {
5479
- /** @constant */
5480
- type: "Constructor";
5481
- data: {
5482
- inner: components["schemas"]["Type"];
5483
- /** @description Type arguments / record fields. Iterates in insertion order; equality ignores order. */
5484
- parameters: components["schemas"]["Map_of_TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5485
- };
5486
- } | {
5487
- /** @constant */
5488
- type: "Operation";
5489
- data: {
5490
- a: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5491
- b: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5492
- operator: components["schemas"]["ArithmeticOperator"];
5493
- };
5494
- } | {
5495
- /** @constant */
5496
- type: "NodeSignature";
5497
- data: components["schemas"]["NodeSignature_for_Type_and_ErasedScopedTypeRef_for_Type"];
5498
- } | {
5499
- /** @constant */
5500
- type: "PortTypes";
5501
- data: components["schemas"]["PortTypes_for_Type_and_ErasedScopedTypeRef_for_Type"];
5502
- } | {
5503
- /** @constant */
5504
- type: "Union";
5505
- data: [
5506
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"],
5507
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"]
5508
- ];
5509
- } | {
5510
- /** @constant */
5511
- type: "KeyOf";
5512
- data: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5513
- } | {
5514
- /** @constant */
5515
- type: "Index";
5516
- data: {
5517
- expr: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5518
- index: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"];
5519
- };
5520
- } | {
5521
- /** @constant */
5522
- type: "Intersection";
5523
- data: [
5524
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"],
5525
- components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"]
5526
- ];
5527
- } | {
5528
- /** @constant */
5529
- type: "Conditional";
5530
- data: components["schemas"]["Conditional_for_Type_and_ErasedScopedTypeRef_for_Type"];
5531
- } | {
5532
- /** @constant */
5533
- type: "Any";
5534
- } | {
5535
- /** @constant */
5536
- type: "Never";
5537
- } | {
5538
- /** @constant */
5539
- type: "Ref";
5540
- data: components["schemas"]["ErasedScopedTypeRef_for_Type"];
5541
- };
4976
+ TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type: TypeExpr<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5542
4977
  /**
5543
4978
  * @description Type expression—the core type representation in nodety.
5544
4979
  *
@@ -5548,108 +4983,25 @@ declare interface components {
5548
4983
  * [`PartialEq`], [`Eq`] and [`Hash`] are structural: `A | B` is not equal to `B | A`.
5549
4984
  * [`Eq`] and [`Hash`] are available when `T: Eq + Hash`.
5550
4985
  */
5551
- TypeExpr_for_Type_and_ParamRef: {
5552
- /** @constant */
5553
- type: "Type";
5554
- data: components["schemas"]["Type"];
5555
- } | {
5556
- /** @constant */
5557
- type: "Constructor";
5558
- data: {
5559
- inner: components["schemas"]["Type"];
5560
- /** @description Type arguments / record fields. Iterates in insertion order; equality ignores order. */
5561
- parameters: components["schemas"]["Map_of_TypeExpr_for_Type_and_ParamRef"];
5562
- };
5563
- } | {
5564
- /** @constant */
5565
- type: "Operation";
5566
- data: {
5567
- a: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5568
- b: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5569
- operator: components["schemas"]["ArithmeticOperator"];
5570
- };
5571
- } | {
5572
- /** @constant */
5573
- type: "NodeSignature";
5574
- data: components["schemas"]["NodeSignature_for_Type_and_ParamRef"];
5575
- } | {
5576
- /** @constant */
5577
- type: "PortTypes";
5578
- data: components["schemas"]["PortTypes_for_Type_and_ParamRef"];
5579
- } | {
5580
- /** @constant */
5581
- type: "Union";
5582
- data: [
5583
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"],
5584
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"]
5585
- ];
5586
- } | {
5587
- /** @constant */
5588
- type: "KeyOf";
5589
- data: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5590
- } | {
5591
- /** @constant */
5592
- type: "Index";
5593
- data: {
5594
- expr: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5595
- index: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5596
- };
5597
- } | {
5598
- /** @constant */
5599
- type: "Intersection";
5600
- data: [
5601
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"],
5602
- components["schemas"]["TypeExpr_for_Type_and_ParamRef"]
5603
- ];
5604
- } | {
5605
- /** @constant */
5606
- type: "Conditional";
5607
- data: components["schemas"]["Conditional_for_Type_and_ParamRef"];
5608
- } | {
5609
- /** @constant */
5610
- type: "Any";
5611
- } | {
5612
- /** @constant */
5613
- type: "Never";
5614
- } | {
5615
- /** @constant */
5616
- type: "Ref";
5617
- data: components["schemas"]["ParamRef"];
5618
- };
4986
+ TypeExpr_for_Type_and_ParamRef: TypeExpr<Type, ParamRef>;
5619
4987
  /** @description Type hints for pre-inference annotations (e.g. `T = Integer, U = String`). */
5620
- TypeHints_for_Type_and_ParamRef: {
5621
- [key: string]: components["schemas"]["TypeExpr_for_Type_and_ParamRef"];
5622
- };
4988
+ TypeHints_for_Type_and_ParamRef: TypeHints<Type, ParamRef>;
5623
4989
  /** @description A generic type parameter with optional bound and default. */
5624
- TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type: {
5625
- /** @description Upper bound (e.g. `T extends Comparable`). */
5626
- bound?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
5627
- /** @description Default when not inferred (e.g. `T = Any`). */
5628
- default?: components["schemas"]["TypeExpr_for_Type_and_ErasedScopedTypeRef_for_Type"] | null;
5629
- };
4990
+ TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type: TypeParameter<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5630
4991
  /** @description A generic type parameter with optional bound and default. */
5631
- TypeParameter_for_Type_and_ParamRef: {
5632
- /** @description Upper bound (e.g. `T extends Comparable`). */
5633
- bound?: components["schemas"]["TypeExpr_for_Type_and_ParamRef"] | null;
5634
- /** @description Default when not inferred (e.g. `T = Any`). */
5635
- default?: components["schemas"]["TypeExpr_for_Type_and_ParamRef"] | null;
5636
- };
4992
+ TypeParameter_for_Type_and_ParamRef: TypeParameter<Type, ParamRef>;
5637
4993
  /**
5638
4994
  * @description Wrapper for BtreeMap
5639
4995
  *
5640
4996
  * Exists so that it can implement traits like [std::str::FromStr]
5641
4997
  */
5642
- TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type: {
5643
- [key: string]: components["schemas"]["TypeParameter_for_Type_and_ErasedScopedTypeRef_for_Type"];
5644
- };
4998
+ TypeParameters_for_Type_and_ErasedScopedTypeRef_for_Type: TypeParameters<Type, components["schemas"]["ErasedScopedTypeRef_for_Type"]>;
5645
4999
  /**
5646
5000
  * @description Wrapper for BtreeMap
5647
5001
  *
5648
5002
  * Exists so that it can implement traits like [std::str::FromStr]
5649
5003
  */
5650
- TypeParameters_for_Type_and_ParamRef: {
5651
- [key: string]: components["schemas"]["TypeParameter_for_Type_and_ParamRef"];
5652
- };
5004
+ TypeParameters_for_Type_and_ParamRef: TypeParameters<Type, ParamRef>;
5653
5005
  UninstalledExtensionPath: {
5654
5006
  extensionIdent: components["schemas"]["ExtensionIdentifier"];
5655
5007
  };
@@ -5750,6 +5102,24 @@ declare interface components {
5750
5102
  game: components["schemas"]["GameDTO"];
5751
5103
  id: components["schemas"]["GameId"];
5752
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
+ };
5753
5123
  UpdateTableMutation: {
5754
5124
  table: components["schemas"]["TableDTO"];
5755
5125
  tableId: components["schemas"]["TableId"];
@@ -5856,6 +5226,14 @@ export declare interface Conditional<T, R> {
5856
5226
 
5857
5227
  export declare function confirmDeleteItem(modalControls: ModalControls, itemName: string): Promise<boolean>;
5858
5228
 
5229
+ /**
5230
+ * A pin that reroutes a connection
5231
+ */
5232
+ declare interface ConnectionPin {
5233
+ x: number;
5234
+ y: number;
5235
+ }
5236
+
5859
5237
  /**
5860
5238
  * Named type arguments of a [`TypeExpr::Constructor`](crate::TypeExpr::Constructor).
5861
5239
  *
@@ -5919,8 +5297,73 @@ export declare interface DialogButton<T> {
5919
5297
  theme?: 'primary' | 'default' | 'danger';
5920
5298
  }
5921
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
+
5922
5355
  export declare type DraggableChildProps = React_2.HTMLAttributes<HTMLElement> & React_2.RefAttributes<HTMLElement>;
5923
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
+
5924
5367
  /** Spelled out because the inferred `queryOptions` type references TanStack's unexported `dataTagSymbol`, which breaks the SDK's declaration rollup. */
5925
5368
  export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T, readonly unknown[]> & {
5926
5369
  queryKey: DataTag<readonly unknown[], T, Error>;
@@ -5931,9 +5374,15 @@ export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T,
5931
5374
  */
5932
5375
  declare type ErasedScopedTypeRef<T> = { type: "Param"; data: ParamRef } | { type: "ScopedExpr"; data: { expr: TypeExpr<T, ErasedScopedTypeRef<T>> } };
5933
5376
 
5377
+ declare type EventCompetitorsNode = CompetitorType_2;
5378
+
5934
5379
  export declare const eventFoldersByEventQueryOptions: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<ContentInEventFolderDTO[]>;
5935
5380
 
5936
- 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' };
5937
5386
 
5938
5387
  export declare interface EventPath {
5939
5388
  workspaceId: CommonWorkspaceId;
@@ -6039,6 +5488,8 @@ export declare interface ExtensionSidebarContribution {
6039
5488
 
6040
5489
  export declare type ExtensionSidebarProps = EventPath;
6041
5490
 
5491
+ declare type ExtractRecordFieldError<T> = { type: "field-does-not-exist"; data: string } | { type: "invalid-type"; data: { field: string; value: Value<T> | null } };
5492
+
6042
5493
  export declare interface FieldTypeWithDefault {
6043
5494
  fieldType: TypeExpr<Type>;
6044
5495
  /**
@@ -6047,24 +5498,89 @@ export declare interface FieldTypeWithDefault {
6047
5498
  default: Value | null;
6048
5499
  }
6049
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
+
6050
5512
  /**
6051
5513
  * How a competitor is written out. Kept apart from the components that show competitors so both
6052
5514
  * the picker and the selector can reach it without importing each other.
6053
5515
  */
6054
5516
  export declare function formatCompetitorName(competitor: CompetitorDAO): string;
6055
5517
 
5518
+ declare interface FormatConnectionDTO {
5519
+ sourceFormatNodeId: FormatNodeId;
5520
+ targetFormatNodeId: FormatNodeId;
5521
+ sourceOutput: OutputIdx;
5522
+ targetInput: InputIdx;
5523
+ pins: ConnectionPin[];
5524
+ }
5525
+
6056
5526
  declare type FormatGroupId = Brand<string, 'formatGroupId'>;
6057
5527
 
6058
- 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' };
6059
5538
 
6060
5539
  export declare type FormatInstanceHash = Brand<string, 'formatInstanceHash'>;
6061
5540
 
6062
- 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
+ }
5565
+
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' };
6063
5572
 
6064
- declare type FormatNodeTestId = Brand<string, 'formatNodeTestId'>;
5573
+ declare type FormatNodeTestId = string & { readonly __brand: 'formatNodeTestId' };
6065
5574
 
6066
5575
  declare type FormatTestId = Brand<string, 'formatTestId'>;
6067
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
+
6068
5584
  export declare type FormContribution<Props, DTO> = FC<Props & {
6069
5585
  formFieldRegistry: FormFieldRegistry;
6070
5586
  ref: Ref<ContributionHandle<DTO>>;
@@ -6111,6 +5627,11 @@ export declare interface FormFieldProps<I, O = I> {
6111
5627
  isNew?: boolean;
6112
5628
  registry?: FormFieldRegistry;
6113
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;
6114
5635
  }
6115
5636
 
6116
5637
  export declare interface FormFieldRegistry {
@@ -6137,11 +5658,26 @@ export declare type FormFieldState<T> = [value: T, setValue: (value: T | ((oldVa
6137
5658
 
6138
5659
  export declare type GameDAO = components['schemas']['GameDAO'];
6139
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
+
6140
5672
  export declare type GameDTO = components['schemas']['GameDTO'];
6141
5673
 
6142
5674
  export declare type GameFormatDTO = components['schemas']['GameFormatDTO'];
6143
5675
 
6144
- 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' };
6145
5681
 
6146
5682
  export declare type GameFormatPageContribution = FormContribution<GameFormatPageProps & {
6147
5683
  gameFormat: GameFormatDTO;
@@ -6151,8 +5687,40 @@ export declare type GameFormatPageProps = EventPath & {
6151
5687
  gameFormatId: GameFormatId | null;
6152
5688
  };
6153
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
+
6154
5697
  export declare type GameId = Brand<string, 'gameId'>;
6155
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
+
6156
5724
  export declare type GamePageContribution = FormContribution<GamePageProps & {
6157
5725
  game: WorkingGameDTO;
6158
5726
  }, WorkingGameDTO>;
@@ -6161,6 +5729,9 @@ export declare type GamePageProps = EventPath & {
6161
5729
  gameId: GameId | null;
6162
5730
  };
6163
5731
 
5732
+ /** Where a game goes in the simplified view of the root format. */
5733
+ declare type GamePlace = Omit<AddGameEdit, 'type' | 'game' | 'division'>;
5734
+
6164
5735
  export declare const gamesWithTablesMappedByEventQO: (workspaceId: CommonWorkspaceId, eventId: EventId) => EngineQueryOptions<Map<GameId, GameWithTables>>;
6165
5736
 
6166
5737
  export declare type GameWithTables = components['schemas']['GameWithTables'];
@@ -6192,6 +5763,39 @@ export declare const getTableByIdQueryOptions: (workspaceId: CommonWorkspaceId,
6192
5763
  */
6193
5764
  declare type GraphLocation = { type: "Edge"; data: number } | { type: "InputPort"; data: { nodeIdx: number; inputIdx: number } };
6194
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
+
6195
5799
  export declare const H1: FC<H1Props>;
6196
5800
 
6197
5801
  export declare interface H1Props {
@@ -6213,7 +5817,7 @@ export declare type HRProps = {
6213
5817
  className?: string;
6214
5818
  };
6215
5819
 
6216
- declare type InputIdx = Brand<number, 'inputIdx'>;
5820
+ declare type InputIdx = number & { readonly __brand: 'inputIdx' };
6217
5821
 
6218
5822
  export declare enum InputLayout {
6219
5823
  Normal = 0,
@@ -6225,6 +5829,23 @@ export declare enum InputLayout {
6225
5829
  Fill = 2
6226
5830
  }
6227
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
+
6228
5849
  /** Loads graphite-script from the host's wasm on demand, a static import would make this entry an async module. */
6229
5850
  export declare const loadGraphiteScript: () => Promise<{
6230
5851
  primValueToTypeExpr: typeof primValueToTypeExpr;
@@ -6261,10 +5882,320 @@ export declare interface LogOperation {
6261
5882
  entries: LogEntry[];
6262
5883
  }
6263
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
+
6264
6189
  export declare type MergePathParams<A, B> = {
6265
6190
  [K in keyof A | keyof B]: K extends keyof B ? B[K] : K extends keyof A ? A[K] : never;
6266
6191
  };
6267
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
+
6268
6199
  export declare function Modal({ children, isOpen, onClose, closable, height, width, verticalPosition, horizontalPosition, lightbox, blockBackground, }: ModalProps): null;
6269
6200
 
6270
6201
  /** Modal inner body: explicit width; shell uses `width: 'fit'` and shrink-wraps to this. */
@@ -6280,6 +6211,14 @@ export declare interface ModalConfig {
6280
6211
  horizontalPosition?: 'center' | 'left' | 'right';
6281
6212
  lightbox?: boolean;
6282
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
+ };
6283
6222
  onClose?: () => void;
6284
6223
  }
6285
6224
 
@@ -6307,8 +6246,38 @@ export declare interface ModalProps {
6307
6246
  blockBackground?: boolean;
6308
6247
  }
6309
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
+
6310
6274
  declare type NodeInstanceHash = Brand<string, 'nodeInstanceHash'>;
6311
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
+
6312
6281
  /**
6313
6282
  * Function-like type for a node: generic parameters, inputs, outputs, and defaults.
6314
6283
  * Written in notation as `<T>(T) -> (T)` for the identity node.
@@ -6360,6 +6329,13 @@ export declare interface NodeSignature<T, R = ParamRef> {
6360
6329
  requiredTags: number[];
6361
6330
  }
6362
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
+
6363
6339
  declare type NoMetadata = Record<never, never>;
6364
6340
 
6365
6341
  declare interface NoSupertypeLayer<T> {
@@ -6409,7 +6385,7 @@ export declare interface OptionalQueryField<T> {
6409
6385
  codec: QueryCodec<T>;
6410
6386
  }
6411
6387
 
6412
- declare type OutputIdx = Brand<number, 'outputIdx'>;
6388
+ declare type OutputIdx = number & { readonly __brand: 'outputIdx' };
6413
6389
 
6414
6390
  export declare const Page: FC<PageProps>;
6415
6391
 
@@ -6433,6 +6409,8 @@ export declare interface ParamRef {
6433
6409
  infer: boolean;
6434
6410
  }
6435
6411
 
6412
+ declare type ParentType = { type: "format-root" } | { type: "closure-node"; data: FormatNodeId };
6413
+
6436
6414
  export declare interface ParsedQuery<Values> {
6437
6415
  values: Values;
6438
6416
  /** The original search with malformed known values removed and valid values normalized. */
@@ -6440,6 +6418,8 @@ export declare interface ParsedQuery<Values> {
6440
6418
  malformedKeys: string[];
6441
6419
  }
6442
6420
 
6421
+ declare type ParseErrorKind = { type: "invalid-token" } | { type: "unexpected-token" } | { type: "expected-token"; data: { expected: string } } | { type: "invalid-number" } | { type: "unterminated-string" };
6422
+
6443
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>;
6444
6424
 
6445
6425
  export declare type PathSegmentParam<S extends string> = S extends `:${infer P}` ? {
@@ -6507,6 +6487,12 @@ export declare function putTableRows(workspaceId: CommonWorkspaceId, eventId: Ev
6507
6487
  } | {
6508
6488
  type: "row-not-hidden";
6509
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"];
6510
6496
  };
6511
6497
  }>;
6512
6498
 
@@ -6540,6 +6526,13 @@ export declare interface QuerySchema<Fields extends QueryFields> {
6540
6526
  set<Key extends keyof Fields>(search: string, key: Key, value: QueryFieldValue<Fields[Key]>): string;
6541
6527
  }
6542
6528
 
6529
+ declare type RecordFieldOp = "read-field" | "write-field";
6530
+
6531
+ declare interface RecordMakeValidMutation {
6532
+ columnName: string;
6533
+ newValue: Value;
6534
+ }
6535
+
6543
6536
  /**
6544
6537
  * RecordTypes should **only** be manipulated though this helper to have a single source of truth for the structure.
6545
6538
  */
@@ -6600,9 +6593,10 @@ export declare interface RouterContextType {
6600
6593
  /** The complete reactive browser location. */
6601
6594
  location: RouterLocation;
6602
6595
  /**
6603
- * 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.
6604
6598
  */
6605
- navigate: (to: string) => void;
6599
+ navigate: (to: string, onArrive?: (location: RouterLocation) => void) => void;
6606
6600
  /**
6607
6601
  * Programmatic redirect replacing the current history entry. Bypasses route guards.
6608
6602
  */
@@ -6644,6 +6638,18 @@ export declare interface RowAction<T> {
6644
6638
 
6645
6639
  declare type RowMutationIdx = Brand<number, 'rowMutationIdx'>;
6646
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
+
6647
6653
  declare interface Rows<SortingState> {
6648
6654
  /**
6649
6655
  * Competitors are guaranteed to be unique per game table.
@@ -6663,16 +6669,50 @@ export declare enum RowState {
6663
6669
  Added = 3
6664
6670
  }
6665
6671
 
6666
- 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;
6667
6698
 
6668
6699
  export declare type SearchInputProps = {
6669
6700
  value: string;
6670
6701
  onChange: (value: string) => void;
6671
6702
  placeholder?: string;
6672
6703
  className?: string;
6704
+ autoFocus?: boolean;
6705
+ ref?: Ref<HTMLInputElement>;
6706
+ onKeyDown?: (event: KeyboardEvent_2<HTMLInputElement>) => void;
6673
6707
  };
6674
6708
 
6675
- 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" };
6676
6716
 
6677
6717
  /**
6678
6718
  * A keyboard shortcut as the keys to press together, e.g. `['Mod', 'Shift', 'Z']`. `Mod` is Ctrl, or
@@ -6682,10 +6722,10 @@ declare type SerializableNonPrimitiveValue = { type: "game-table"; data: Table<U
6682
6722
  export declare type Shortcut = readonly string[];
6683
6723
 
6684
6724
  /**
6685
- * 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)
6686
6726
  * Returns the selected value or null if dismissed
6687
6727
  */
6688
- 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>;
6689
6729
 
6690
6730
  /**
6691
6731
  * A panel as a column of its own, next to the content. Keeping it out of the content gives toolbars the whole
@@ -6746,7 +6786,69 @@ export declare type SidePanelIcon = ComponentType<SVGProps<SVGSVGElement>>;
6746
6786
 
6747
6787
  export declare type SidePanelVariant = 'dock' | 'drawer';
6748
6788
 
6749
- declare type Sorted = Brand<'sorted', 'sorted'>;
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' };
6839
+
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
+ };
6750
6852
 
6751
6853
  /**
6752
6854
  * Sorted game tables have the following guarantees:
@@ -6758,12 +6860,64 @@ declare type Sorted = Brand<'sorted', 'sorted'>;
6758
6860
  * - 1, 2, 2, 2, 5, None, None
6759
6861
  * - None, None
6760
6862
  */
6761
- 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'>>;
6762
6902
 
6763
6903
  declare interface StateMetadata {
6764
6904
  state: TableState;
6765
6905
  }
6766
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
+
6767
6921
  export declare enum StorageType {
6768
6922
  Session = 0,
6769
6923
  Local = 1
@@ -6793,7 +6947,18 @@ export declare type TableDropTarget = EventPath & {
6793
6947
  table: TableDAO;
6794
6948
  };
6795
6949
 
6796
- export declare type TableId = Brand<string, 'tableId'>;
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' };
6797
6962
 
6798
6963
  export declare interface TableProps<TData extends RowData> {
6799
6964
  data: TData[];
@@ -6802,6 +6967,7 @@ export declare interface TableProps<TData extends RowData> {
6802
6967
  allowSelect?: boolean;
6803
6968
  getRowId?: (row: TData, index: number) => string;
6804
6969
  getRowState?: (row: TData) => RowState;
6970
+ getRowClassName?: (row: TData) => string | undefined;
6805
6971
  rowClicked?: (row: TData) => void;
6806
6972
  /**
6807
6973
  * Route a row leads to. Clicking the row routes there (after `rowClicked`); a middle or Ctrl click
@@ -6829,6 +6995,11 @@ export declare interface TableProps<TData extends RowData> {
6829
6995
  * Columns with `enableHiding: false` are excluded.
6830
6996
  */
6831
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;
6832
7003
  }
6833
7004
 
6834
7005
  export declare type TableSortedDTO = components['schemas']['Table_for_Sorted_and_StateMetadata'];
@@ -6853,6 +7024,21 @@ export declare interface TimeDeltaInputProps {
6853
7024
 
6854
7025
  export { toast }
6855
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
+
6856
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" };
6857
7043
 
6858
7044
  /**
@@ -6869,6 +7055,15 @@ export declare interface TypeContext {
6869
7055
  returnType: TypeExpr<Type, ParamRef>;
6870
7056
  }
6871
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
+
6872
7067
  /**
6873
7068
  * Type expression—the core type representation in nodety.
6874
7069
  *
@@ -6882,6 +7077,11 @@ export declare type TypeExpr<T, R = ParamRef> = { type: "Type"; data: T } | { ty
6882
7077
 
6883
7078
  declare type TypeExprValidationError = { type: "UnknownVar"; var: LocalParamID } | { type: "CyclicReference" };
6884
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
+
6885
7085
  export declare interface TypeOperators { graphite: [Type, ArithmeticOperator] }
6886
7086
 
6887
7087
  export declare interface TypeOperators {}
@@ -6907,13 +7107,11 @@ export declare interface TypeParameter<T, R = ParamRef> {
6907
7107
  */
6908
7108
  export declare type TypeParameters<T, R = ParamRef> = Record<LocalParamID, TypeParameter<T, R>>;
6909
7109
 
6910
- declare type Unsorted = Brand<'unsorted', 'unsorted'>;
6911
-
6912
7110
  /**
6913
7111
  * The places of unsorted game can be arbitrary values in arbitrary order.
6914
7112
  * Dublicated places are allowed. However competitors must still be unique.
6915
7113
  */
6916
- declare type Unsorted_2 = null;
7114
+ declare type Unsorted = null;
6917
7115
 
6918
7116
  /** The engine's active locale. Extensions ship their own dictionaries and select them by it. */
6919
7117
  export declare function useEngineLocale(): Locales;
@@ -6921,9 +7119,16 @@ export declare function useEngineLocale(): Locales;
6921
7119
  /** Returns a `fetch` for `path` (relative, e.g. `"items"`) on the calling extension's own backend in the current event. */
6922
7120
  export declare function useExtensionBackend(): ExtensionHost['backend'];
6923
7121
 
6924
- /** 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`. */
6925
7123
  export declare function useExtensionIdentifier(): string;
6926
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
+
6927
7132
  export declare function useMediaQuery(query: string): boolean;
6928
7133
 
6929
7134
  export declare function useModal(): ModalControls;
@@ -6936,9 +7141,10 @@ export declare function useModal(): ModalControls;
6936
7141
  *
6937
7142
  * @param storageKey Key used for persisting the state. Only the key passed
6938
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.
6939
7145
  * @param initialState The initial state. Equal to useStates initial value
6940
7146
  */
6941
- 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];
6942
7148
 
6943
7149
  /** Hook to use the router context. Must be called within a <Router> provider. */
6944
7150
  export declare function useRouter(): RouterContextType;
@@ -6949,8 +7155,9 @@ export declare function useRouter(): RouterContextType;
6949
7155
  */
6950
7156
  export declare function useRunLogBatch(): (workspaceId: CommonWorkspaceId, operations: LogOperation[], label: ReactNode) => Promise<boolean | null>;
6951
7157
 
6952
- /** The `:` params that are uuids, by name. All other `:` params are numbers. */
7158
+ /** The `:` params that are uuids, by name. All other `:` params are numbers. Workspace ids are uuids on root only. */
6953
7159
  declare type UuidPathParams = {
7160
+ workspaceId: CommonWorkspaceId;
6954
7161
  classId: ClassId;
6955
7162
  eventId: EventId;
6956
7163
  formatId: FormatId;
@@ -6976,6 +7183,10 @@ declare interface ValidationError<T> {
6976
7183
 
6977
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> };
6978
7185
 
7186
+ /**
7187
+ * # Important
7188
+ * Changes in here are breaking changes for logs
7189
+ */
6979
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 };
6980
7191
 
6981
7192
  /**
@@ -6997,7 +7208,7 @@ export declare type WorkingGameDTO = Omit<GameDTO, 'gameFormatId'> & {
6997
7208
  gameFormatId: GameFormatId | null;
6998
7209
  };
6999
7210
 
7000
- export declare type WorkspaceRootId = Brand<number, 'workspaceRootId'>;
7211
+ export declare type WorkspaceRootId = Brand<string, 'workspaceRootId'>;
7001
7212
 
7002
7213
  export declare type WorkspaceSelfHostedId = Brand<number, 'workspaceSelfHostedId'>;
7003
7214