@graphite-sports/sdk 0.2.0 → 0.3.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 +385 -191
  2. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ChangeEventHandler } from 'react';
2
2
  import { ColumnDef } from '@tanstack/react-table';
3
3
  import { ColumnHelper } from '@tanstack/table-core';
4
+ import { ColumnVisibilityState } from '@tanstack/react-table';
4
5
  import { ComponentProps } from 'react';
5
6
  import { CSSProperties } from 'react';
6
7
  import type { DataTag } from '@tanstack/react-query';
@@ -9,6 +10,7 @@ import { FocusEventHandler } from 'react';
9
10
  import { HTMLInputTypeAttribute } from 'react';
10
11
  import { JSX } from 'react/jsx-runtime';
11
12
  import { KeyboardEventHandler } from 'react';
13
+ import { OnChangeFn } from '@tanstack/react-table';
12
14
  import { default as React_2 } from 'react';
13
15
  import * as React_3 from 'react';
14
16
  import { ReactNode } from 'react';
@@ -29,7 +31,7 @@ import type { UnusedSkipTokenOptions } from '@tanstack/react-query';
29
31
 
30
32
  export declare type AnyQuerySchema = QuerySchema<QueryFields>;
31
33
 
32
- export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, }: AppButtonProps): JSX.Element;
34
+ export declare function AppButton({ type, onClick, disabled: disabledProp, mutates, children, submit, className, loading, value, ref, href, autoFocus, }: AppButtonProps): JSX.Element;
33
35
 
34
36
  export declare type AppButtonProps = {
35
37
  type?: AppButtonType;
@@ -43,6 +45,8 @@ export declare type AppButtonProps = {
43
45
  loading?: boolean;
44
46
  value?: string;
45
47
  ref?: RefObject<HTMLButtonElement | null>;
48
+ /** Focuses the button on mount, and with `href` also when this turns true later. */
49
+ autoFocus?: boolean;
46
50
  /** Makes the button a link to this route, so it can also be opened in a new tab. `onClick` runs before routing. */
47
51
  href?: string;
48
52
  };
@@ -162,7 +166,7 @@ export declare function AppTab({ className, ...props }: ComponentProps<typeof Ta
162
166
 
163
167
  export declare function AppTabGroup(props: ComponentProps<typeof TabGroup>): JSX.Element;
164
168
 
165
- export declare function AppTable<TData extends RowData>({ data, columns, actions, allowSelect, getRowId, getRowState, rowClicked, rowHref, initialPageSize, initialSorting, pageSizes, enableSorting, autoResetPageIndex, emptyTableText, columnVisibilityStorageKey, }: TableProps<TData>): JSX.Element;
169
+ export declare function AppTable<TData extends RowData>({ data, columns, actions, allowSelect, getRowId, getRowState, rowClicked, rowHref, initialPageSize, initialSorting, pageSizes, enableSorting, autoResetPageIndex, emptyTableText, columnVisibility: columnVisibilityState, }: TableProps<TData>): JSX.Element;
166
170
 
167
171
  export declare type AppTableFeatures = typeof appTableFeatures;
168
172
 
@@ -233,7 +237,9 @@ export declare function buildCompetitorsMapped(competitors: CompetitorDAO[]): Co
233
237
  export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspaceId" | "/workspace/:workspaceId/event/:eventId" | "/download" | "/login" | "/register" | "/preferences" | "/crate-workspace" | "/workspace/:workspaceId/create-event" | "/workspace/:workspaceId/event/:eventId/dashboard" | "/workspace/:workspaceId/event/:eventId/create-class" | "/workspace/:workspaceId/event/:eventId/class/:classId" | "/workspace/:workspaceId/event/:eventId/create-competitor" | "/workspace/:workspaceId/event/:eventId/create-team" | "/workspace/:workspaceId/event/:eventId/competitor/:competitorId" | "/workspace/:workspaceId/event/:eventId/create-format" | "/workspace/:workspaceId/event/:eventId/format/:formatId" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests" | "/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId" | "/workspace/:workspaceId/event/:eventId/graph" | "/workspace/:workspaceId/event/:eventId/lineage" | "/workspace/:workspaceId/event/:eventId/create-game" | "/workspace/:workspaceId/event/:eventId/game/:gameId" | "/workspace/:workspaceId/event/:eventId/table/:tableId" | "/workspace/:workspaceId/event/:eventId/create-game-format" | "/workspace/:workspaceId/event/:eventId/game-format/:gameFormatId" | "/workspace/:workspaceId/event/:eventId/create-template" | "/workspace/:workspaceId/event/:eventId/template/:templateId" | "/workspace/:workspaceId/event/:eventId/extension/$extensionIdentifier">(path: Path, params: PathParams<Path>, ...query: {
234
238
  '/': undefined;
235
239
  '/download': undefined;
236
- '/login': undefined;
240
+ '/login': QuerySchema< {
241
+ readonly returnTo: OptionalQueryField<ReturnPath>;
242
+ }>;
237
243
  '/register': undefined;
238
244
  '/preferences': undefined;
239
245
  '/crate-workspace': undefined;
@@ -248,11 +254,11 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
248
254
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
249
255
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
250
256
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
251
- readonly formatInstance: OptionalQueryField<FormatInstanceId>;
257
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
252
258
  }>;
253
259
  '/workspace/:workspaceId/event/:eventId/format/:formatId': QuerySchema< {
254
260
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
255
- readonly formatInstance: OptionalQueryField<FormatInstanceId>;
261
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
256
262
  }>;
257
263
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': undefined;
258
264
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId': undefined;
@@ -267,7 +273,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
267
273
  /** Picks what these nodes own, or the steps they did. */
268
274
  readonly node: RepeatedQueryField<FormatNodeId>;
269
275
  /** Narrows `node` down to its instances in these format instances. */
270
- readonly formatInstance: RepeatedQueryField<FormatInstanceId>;
276
+ readonly formatInstance: RepeatedQueryField<FormatInstanceHash>;
271
277
  }>;
272
278
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
273
279
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
@@ -281,7 +287,9 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
281
287
  }[Path] extends infer T ? T extends {
282
288
  '/': undefined;
283
289
  '/download': undefined;
284
- '/login': undefined;
290
+ '/login': QuerySchema< {
291
+ readonly returnTo: OptionalQueryField<ReturnPath>;
292
+ }>;
285
293
  '/register': undefined;
286
294
  '/preferences': undefined;
287
295
  '/crate-workspace': undefined;
@@ -296,11 +304,11 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
296
304
  '/workspace/:workspaceId/event/:eventId/competitor/:competitorId': undefined;
297
305
  '/workspace/:workspaceId/event/:eventId/create-format': QuerySchema< {
298
306
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
299
- readonly formatInstance: OptionalQueryField<FormatInstanceId>;
307
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
300
308
  }>;
301
309
  '/workspace/:workspaceId/event/:eventId/format/:formatId': QuerySchema< {
302
310
  readonly focusNode: RepeatedQueryField<FormatNodeId>;
303
- readonly formatInstance: OptionalQueryField<FormatInstanceId>;
311
+ readonly formatInstance: OptionalQueryField<FormatInstanceHash>;
304
312
  }>;
305
313
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests': undefined;
306
314
  '/workspace/:workspaceId/event/:eventId/format/:formatId/tests/:formatTestId': undefined;
@@ -315,7 +323,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
315
323
  /** Picks what these nodes own, or the steps they did. */
316
324
  readonly node: RepeatedQueryField<FormatNodeId>;
317
325
  /** Narrows `node` down to its instances in these format instances. */
318
- readonly formatInstance: RepeatedQueryField<FormatInstanceId>;
326
+ readonly formatInstance: RepeatedQueryField<FormatInstanceHash>;
319
327
  }>;
320
328
  '/workspace/:workspaceId/event/:eventId/create-game': undefined;
321
329
  '/workspace/:workspaceId/event/:eventId/game/:gameId': undefined;
@@ -330,7 +338,7 @@ export declare const buildRoute: <Path extends "*" | "/" | "/workspace/:workspac
330
338
 
331
339
  export declare type ClassDAO = components['schemas']['ClassDAO'];
332
340
 
333
- export declare type ClassId = Brand<number, 'classId'>;
341
+ export declare type ClassId = Brand<string, 'classId'>;
334
342
 
335
343
  export declare type ClassResponse = components['schemas']['ClassResponse'];
336
344
 
@@ -396,15 +404,24 @@ declare interface components {
396
404
  APIVersion: {
397
405
  /** Format: uint32 */
398
406
  engineVersion: number;
407
+ /** @description Base URL of the web app that uses this server, configured with `GRAPHITE_UI_URL`. */
408
+ uiUrl: string;
399
409
  version: components["schemas"]["SemVer"];
400
410
  };
401
411
  AddClassMutation: {
402
412
  classDto: components["schemas"]["ClassDTO"];
413
+ /** @description The id of the new class, see [ClassId::new_random]. It must not exist yet. */
414
+ classId: components["schemas"]["ClassId"];
403
415
  eventId: components["schemas"]["EventId"];
404
416
  };
405
417
  AddClassesMutation: {
406
418
  classDtos: components["schemas"]["ClassDTO"][];
407
419
  eventId: components["schemas"]["EventId"];
420
+ /**
421
+ * @description The classes get ids derived from it, see [ClassId::nth_of_seed]. Random, picked by the endpoint; reusing a seed
422
+ * reproduces the same ids.
423
+ */
424
+ idSeed: components["schemas"]["Seed"];
408
425
  };
409
426
  /** @description <C extends {}, P extends Primitive, S extends Sorted|Unsorted>(Table<C, S>, P) -> (Table<C & {<self.key>: P}, S>) */
410
427
  AddColumnsNode: {
@@ -414,37 +431,53 @@ declare interface components {
414
431
  competitorDtos: components["schemas"]["CompetitorDTO"][];
415
432
  competitorType: components["schemas"]["CompetitorType"];
416
433
  eventId: components["schemas"]["EventId"];
434
+ /** @description The competitors get consecutive ids starting here. The endpoint picks [CompetitorDAO::next_id] inside [GraphiteEngine::mutate_with](crate::graphite_engine::GraphiteEngine::mutate_with). */
435
+ firstCompetitorId: components["schemas"]["CompetitorId"];
417
436
  };
418
437
  AddEventMutation: {
419
438
  eventDto: components["schemas"]["EventDTO"];
439
+ /** @description The id of the new event, see [EventId::new_random]. It must not exist yet. */
440
+ eventId: components["schemas"]["EventId"];
420
441
  };
421
442
  AddFormatGroupMutation: {
422
443
  eventId: components["schemas"]["EventId"];
423
444
  formatGroup: components["schemas"]["FormatGroupDTO"];
445
+ /** @description The id of the new format group, see [FormatGroupId::new_random]. It must not exist yet. */
446
+ formatGroupId: components["schemas"]["FormatGroupId"];
424
447
  };
425
448
  AddFormatMutation: {
426
449
  format: components["schemas"]["FormatDTO"];
427
450
  eventId: components["schemas"]["EventId"];
428
451
  force: boolean;
452
+ /** @description The id of the new format, see [FormatId::new_random]. It must not exist yet. */
453
+ formatId: components["schemas"]["FormatId"];
429
454
  };
430
455
  AddFormatTestMutation: {
431
456
  /** @default */
432
457
  description: string;
433
458
  formatId: components["schemas"]["FormatId"];
459
+ /** @description The id of the new format test, see [FormatTestId::new_random]. It must not exist yet. */
460
+ formatTestId: components["schemas"]["FormatTestId"];
434
461
  name: string;
435
462
  test: components["schemas"]["FormatTestDefinition"];
436
463
  };
437
464
  AddGameFormatMutation: {
438
465
  eventId: components["schemas"]["EventId"];
439
466
  gameFormat: components["schemas"]["GameFormatDTO"];
467
+ /** @description The id of the new game format, see [GameFormatId::new_random]. It must not exist yet. */
468
+ gameFormatId: components["schemas"]["GameFormatId"];
440
469
  };
441
470
  AddGameMutation: {
442
471
  eventId: components["schemas"]["EventId"];
443
472
  game: components["schemas"]["GameDTO"];
473
+ /** @description The id of the new game, see [GameId::new_random]. It must not exist yet. */
474
+ gameId: components["schemas"]["GameId"];
444
475
  };
445
476
  AddGameTableMutation: {
446
477
  eventId: components["schemas"]["EventId"];
447
478
  gameTable: components["schemas"]["TableDTO"];
479
+ /** @description The id of the new table, see [TableId::new_random]. It must not exist yet. */
480
+ tableId: components["schemas"]["TableId"];
448
481
  variant: components["schemas"]["TableVariant"];
449
482
  };
450
483
  /** @description <#0 extends {}, #1>(#0, #1) -> (#0 & {<self.key>: #1}) */
@@ -473,6 +506,15 @@ declare interface components {
473
506
  type: "at-date";
474
507
  date: string;
475
508
  };
509
+ /** @description Query of every endpoint with write access to a workspace. */
510
+ AllowNewGraphErrorsQuery: {
511
+ /**
512
+ * @description Applies mutations even if they cause node errors that did not exist before.
513
+ * Without it such mutations are rolled back with HTTP 409 and the new node errors.
514
+ * @default false
515
+ */
516
+ allowNewGraphErrors: boolean;
517
+ };
476
518
  AlterTeamCompetitorsMutation: {
477
519
  additions: components["schemas"]["CompetitorId"][];
478
520
  removals: components["schemas"]["CompetitorId"][];
@@ -667,7 +709,12 @@ declare interface components {
667
709
  };
668
710
  /** @enum {string} */
669
711
  ClassGender: "female-only" | "male-only" | "all-genders";
670
- /** Format: int64 */
712
+ /**
713
+ * Format: uuid
714
+ * @description Identifies a class. Random ([Self::new_random]) from the endpoint, [Self::nth_of_seed] for `AddClassesMutation`,
715
+ * or derived by `ImportArchiveMutation`.
716
+ * Deserializing one only yields a reference to an existing class; it does not check that it exists.
717
+ */
671
718
  ClassId: ClassId;
672
719
  ClassPathVariables_for_CommonWorkspaceId: {
673
720
  classId: components["schemas"]["ClassId"];
@@ -722,7 +769,12 @@ declare interface components {
722
769
  lastName?: string | null;
723
770
  teamName?: string | null;
724
771
  };
725
- /** Format: int64 */
772
+ /**
773
+ * Format: int64
774
+ * @description Identifies a competitor in the workspace, at least [Self::FIRST]. Not autoincrement: the endpoint picks
775
+ * [CompetitorDAO::next_id] inside `GraphiteEngine::mutate_with` and `AddCompetitorsMutation` carries it. The ids of deleted competitors can come back,
776
+ * so don't hold on to the id of a deleted competitor.
777
+ */
726
778
  CompetitorId: CompetitorId;
727
779
  CompetitorInClassDTO: {
728
780
  classId: components["schemas"]["ClassId"];
@@ -730,19 +782,14 @@ declare interface components {
730
782
  /** Format: int64 */
731
783
  place: number;
732
784
  };
733
- /** Format: int64 */
734
- CompetitorInClassId: number;
735
785
  CompetitorInTeamDAO: {
736
786
  competitorId: components["schemas"]["CompetitorId"];
737
787
  from: string;
738
- id: components["schemas"]["CompetitorInTeamId"];
739
788
  /** @description Id of competitor */
740
789
  teamId: components["schemas"]["CompetitorId"];
741
790
  to?: string | null;
742
791
  };
743
792
  /** Format: int64 */
744
- CompetitorInTeamId: number;
745
- /** Format: int64 */
746
793
  CompetitorNotUniqueError: number;
747
794
  CompetitorPathVariables_for_CommonWorkspaceId: {
748
795
  competitorId: components["schemas"]["CompetitorId"];
@@ -886,12 +933,27 @@ declare interface components {
886
933
  ContentInEventFolderDTO: {
887
934
  classIds: components["schemas"]["ClassId"][];
888
935
  eventId: components["schemas"]["EventId"];
936
+ /** @description Exactly one of `game_id` and `game_table_id` is set (SQL CHECK). */
889
937
  gameId?: components["schemas"]["GameId"] | null;
938
+ /** @description Any table, not only tables of games. */
890
939
  gameTableId?: components["schemas"]["TableId"] | null;
891
- /** Format: int64 */
892
- id: number;
893
940
  path: components["schemas"]["FolderPath"];
894
941
  };
942
+ /** @description Who created a game or a table. Encodes the columns `format_instance_id`, `format_node_id` and `node_key`. */
943
+ ContentOwner: {
944
+ /** @constant */
945
+ type: "user";
946
+ } | {
947
+ /** @constant */
948
+ type: "node";
949
+ data: {
950
+ nodeInstance: components["schemas"]["FormatNodeInstanceId"];
951
+ /** Format: int64 */
952
+ nodeKey: number;
953
+ };
954
+ };
955
+ /** @description Whether the content a node owns is the output of its last execution. */
956
+ ContentState: "ok" | "stale" | "node-error";
895
957
  /** @enum {string} */
896
958
  CookieStyle: "form";
897
959
  CreateApiKeyBody: {
@@ -959,38 +1021,6 @@ declare interface components {
959
1021
  /** @constant */
960
1022
  type: "unknown";
961
1023
  };
962
- DefaultChangeEvent_for_CompetitorInClassId: {
963
- /** @constant */
964
- type: "created";
965
- data: components["schemas"]["CompetitorInClassId"];
966
- } | {
967
- /** @constant */
968
- type: "updated";
969
- data: components["schemas"]["CompetitorInClassId"];
970
- } | {
971
- /** @constant */
972
- type: "deleted";
973
- data: components["schemas"]["CompetitorInClassId"];
974
- } | {
975
- /** @constant */
976
- type: "unknown";
977
- };
978
- DefaultChangeEvent_for_CompetitorInTeamId: {
979
- /** @constant */
980
- type: "created";
981
- data: components["schemas"]["CompetitorInTeamId"];
982
- } | {
983
- /** @constant */
984
- type: "updated";
985
- data: components["schemas"]["CompetitorInTeamId"];
986
- } | {
987
- /** @constant */
988
- type: "deleted";
989
- data: components["schemas"]["CompetitorInTeamId"];
990
- } | {
991
- /** @constant */
992
- type: "unknown";
993
- };
994
1024
  DefaultChangeEvent_for_EventId: {
995
1025
  /** @constant */
996
1026
  type: "created";
@@ -1168,7 +1198,7 @@ declare interface components {
1168
1198
  DeleteGameMutation: {
1169
1199
  id: components["schemas"]["GameId"];
1170
1200
  };
1171
- /** @enum {string} */
1201
+ /** @description What happens to the games and tables of node instances that get deleted. */
1172
1202
  DeleteInstanceSettings: "errorOnContent" | "keepContentAsCopy" | "deleteContent";
1173
1203
  DeleteTableMutation: {
1174
1204
  id: components["schemas"]["TableId"];
@@ -1205,12 +1235,14 @@ declare interface components {
1205
1235
  DuplicateFormatShallowMutation: {
1206
1236
  formatId: components["schemas"]["FormatId"];
1207
1237
  /**
1208
- * Format: uint64
1209
- * @description Seed for regenerating node ids
1238
+ * @description Random, picked when the mutation is built. The node ids of the copy and its id ([FormatId::of_copy]) derive
1239
+ * from it, so reusing a seed reproduces the same ids.
1210
1240
  */
1211
- nodeUuidSeed: number;
1241
+ nodeUuidSeed: components["schemas"]["Seed"];
1212
1242
  };
1213
1243
  DuplicateGameFormatMutation: {
1244
+ /** @description The id of the new copy, see [GameFormatId::new_random]. It must not exist yet. */
1245
+ copyId: components["schemas"]["GameFormatId"];
1214
1246
  gameFormatId: components["schemas"]["GameFormatId"];
1215
1247
  };
1216
1248
  /** @description A single encoding definition applied to a single schema property. */
@@ -1324,11 +1356,11 @@ declare interface components {
1324
1356
  } | {
1325
1357
  /** @constant */
1326
1358
  type: "competitor-in-team";
1327
- data: components["schemas"]["DefaultChangeEvent_for_CompetitorInTeamId"];
1359
+ data: components["schemas"]["DefaultChangeEvent_for_CompetitorId"];
1328
1360
  } | {
1329
1361
  /** @constant */
1330
1362
  type: "competitor-in-class";
1331
- data: components["schemas"]["DefaultChangeEvent_for_CompetitorInClassId"];
1363
+ data: components["schemas"]["DefaultChangeEvent_for_ClassId"];
1332
1364
  } | {
1333
1365
  /** @constant */
1334
1366
  type: "format-test";
@@ -1341,11 +1373,8 @@ declare interface components {
1341
1373
  /** @constant */
1342
1374
  type: "content-in-event-folder";
1343
1375
  };
1344
- /**
1345
- * @description Auto-generated discriminant enum variants
1346
- * @enum {string}
1347
- */
1348
- EntityChangeEventDiscriminants: "Event" | "Game" | "Table" | "GameFormat" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "CompetitorInTeam" | "CompetitorInClass" | "FormatTest" | "Log" | "ContentInEventFolder";
1376
+ /** @description Auto-generated discriminant enum variants */
1377
+ EntityChangeEventDiscriminants: ("Event" | "Game" | "Table" | "GameFormat" | "FormatGroup" | "Row" | "RowMutation" | "FormatNode" | "Format" | "Class" | "Extension" | "Competitor" | "FormatTest" | "Log" | "ContentInEventFolder") | "CompetitorInTeam" | "CompetitorInClass";
1349
1378
  /** @description A scope portal that used to be there but got removed in order to be serializable */
1350
1379
  ErasedScopedTypeRef_for_Type: {
1351
1380
  /** @constant */
@@ -1411,7 +1440,11 @@ declare interface components {
1411
1440
  */
1412
1441
  testMode: boolean;
1413
1442
  };
1414
- /** Format: int64 */
1443
+ /**
1444
+ * Format: uuid
1445
+ * @description Identifies an event. Random ([Self::new_random]): the endpoint picks it and `AddEventMutation` carries it.
1446
+ * Deserializing one only yields a reference to an existing event; it does not check that it exists.
1447
+ */
1415
1448
  EventId: EventId;
1416
1449
  /**
1417
1450
  * @description Everything needed to draw how the tables of an event come from each other, without their rows (see
@@ -1428,7 +1461,7 @@ declare interface components {
1428
1461
  /** @description Without stale tables. */
1429
1462
  tables: components["schemas"]["EventLineageTable"][];
1430
1463
  };
1431
- /** @description A way from `parent_table_id` into `table_id`. */
1464
+ /** @description A way from `parent_table_id` into `id.table_id`. */
1432
1465
  EventLineageEdge: {
1433
1466
  /** @description Referenced by [EventRowLineageEdge::id]. */
1434
1467
  id: components["schemas"]["TableLineageId"];
@@ -1444,22 +1477,22 @@ declare interface components {
1444
1477
  * @description How many rows took this way.
1445
1478
  */
1446
1479
  rowCount: number;
1447
- tableId: components["schemas"]["TableId"];
1448
1480
  };
1449
1481
  EventLineageGame: {
1450
1482
  entryTableId?: components["schemas"]["TableId"] | null;
1451
1483
  id: components["schemas"]["GameId"];
1452
1484
  name: string;
1453
- owningFormatNodeInstanceId?: components["schemas"]["FormatNodeInstanceId"] | null;
1485
+ owningFormatNodeInstanceId?: components["schemas"]["NodeInstanceHash"] | null;
1454
1486
  resultTableId?: components["schemas"]["TableId"] | null;
1455
1487
  };
1456
1488
  EventLineageNode: {
1457
1489
  /** @description Set for class nodes, the rows they create are the competitors of the class. */
1458
1490
  classId?: components["schemas"]["ClassId"] | null;
1459
1491
  formatId: components["schemas"]["FormatId"];
1460
- formatInstanceId: components["schemas"]["FormatInstanceId"];
1492
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
1461
1493
  formatNodeId: components["schemas"]["FormatNodeId"];
1462
- id: components["schemas"]["FormatNodeInstanceId"];
1494
+ /** @description Referenced by [Step::node]. */
1495
+ id: components["schemas"]["NodeInstanceHash"];
1463
1496
  nodeType: components["schemas"]["NodeTypeDiscriminants"];
1464
1497
  };
1465
1498
  EventLineageRow: {
@@ -1472,7 +1505,7 @@ declare interface components {
1472
1505
  gameId?: components["schemas"]["GameId"] | null;
1473
1506
  id: components["schemas"]["TableId"];
1474
1507
  name: string;
1475
- owningNodeInstanceId?: components["schemas"]["FormatNodeInstanceId"] | null;
1508
+ owningNodeInstanceId?: components["schemas"]["NodeInstanceHash"] | null;
1476
1509
  /** Format: uint */
1477
1510
  rowCount: number;
1478
1511
  state: components["schemas"]["TableState"];
@@ -1723,14 +1756,27 @@ declare interface components {
1723
1756
  category: components["schemas"]["NodeCategory"];
1724
1757
  name: string;
1725
1758
  };
1726
- /** Format: int64 */
1759
+ /**
1760
+ * Format: uuid
1761
+ * @description Identifies a format group. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
1762
+ * Deserializing one only yields a reference to an existing format group; it does not check that it exists.
1763
+ */
1727
1764
  FormatGroupId: FormatGroupId;
1728
1765
  FormatGroupPathVariables_for_CommonWorkspaceId: {
1729
1766
  eventId: components["schemas"]["EventId"];
1730
1767
  formatGroupId: components["schemas"]["FormatGroupId"];
1731
1768
  workspaceId: components["schemas"]["CommonWorkspaceId"];
1732
1769
  };
1733
- /** Format: int64 */
1770
+ /**
1771
+ * Format: uuid
1772
+ * @description Identifies a format. Comes from one of:
1773
+ * - [Self::new_random]: the endpoint picks it and `AddFormatMutation` carries it.
1774
+ * - [Self::root_of]: the root format of an event.
1775
+ * - [Self::of_copy]: the copy a mutation makes with a seed.
1776
+ * - `ImportArchiveMutation`: derived from the seed, the event and the archive entry.
1777
+ *
1778
+ * Deserializing one only yields a reference to an existing format; it does not check that it exists.
1779
+ */
1734
1780
  FormatId: FormatId;
1735
1781
  FormatInstanceDAO: {
1736
1782
  /** @description Temporary solution. Needed to know the event of an invalidated node instance. */
@@ -1744,14 +1790,19 @@ declare interface components {
1744
1790
  * additionally need some sort of closure key.
1745
1791
  */
1746
1792
  formatNodeId?: components["schemas"]["FormatNodeId"] | null;
1747
- id: components["schemas"]["FormatInstanceId"];
1793
+ /**
1794
+ * @description Always [Self::derived_id]. Private so that it can only come from [Self::root], [Self::new_child] or the DB, and
1795
+ * [Self::update_with_new_id] re-derives it when the parent changes.
1796
+ */
1797
+ id: components["schemas"]["FormatInstanceHash"];
1748
1798
  /**
1749
1799
  * Format: int64
1750
1800
  * @description Same concept as keys in react
1751
1801
  */
1752
1802
  key: number;
1753
- /** @description None if root format */
1754
- parentFormatNodeInstanceId?: components["schemas"]["FormatNodeInstanceId"] | null;
1803
+ /** @description None if root format. See [Self::parent]. */
1804
+ parentId?: components["schemas"]["FormatInstanceHash"] | null;
1805
+ parentNodeId?: components["schemas"]["FormatNodeId"] | null;
1755
1806
  /**
1756
1807
  * @description True if this instance was not hit the last time it should
1757
1808
  * have gotten executed. Example: Map node maps 10 times (creates
@@ -1763,12 +1814,23 @@ declare interface components {
1763
1814
  */
1764
1815
  stale: boolean;
1765
1816
  };
1766
- /** Format: int64 */
1767
- FormatInstanceId: FormatInstanceId;
1817
+ /**
1818
+ * Format: uuid
1819
+ * @description Identifies a format instance, the primary key of `format_instances`.
1820
+ *
1821
+ * Derived from where the instance sits in the tree of instances: the root instance of an event from its root format,
1822
+ * every other instance from the [NodeInstanceHash] of the node that instantiated it and the key the node gave it.
1823
+ * So executing a graph creates the same hashes every time.
1824
+ *
1825
+ * New hashes only come from these derivations. Deserializing one (client requests, the DB) only yields a reference to
1826
+ * an existing instance; it does not check that it exists or how it was made. Changing a derivation changes what
1827
+ * replaying a log produces and needs an `ENGINE_VERSION` increment.
1828
+ */
1829
+ FormatInstanceHash: FormatInstanceHash;
1768
1830
  FormatInstancePathVariables_for_CommonWorkspaceId: {
1769
1831
  eventId: components["schemas"]["EventId"];
1770
1832
  formatId: components["schemas"]["FormatId"];
1771
- formatInstanceId: components["schemas"]["FormatInstanceId"];
1833
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
1772
1834
  workspaceId: components["schemas"]["CommonWorkspaceId"];
1773
1835
  };
1774
1836
  FormatInstanceTestResult: {
@@ -1776,8 +1838,6 @@ declare interface components {
1776
1838
  nodeStates: components["schemas"]["NodeInstanceStateDTO"][];
1777
1839
  };
1778
1840
  FormatNodeConnectionDAO: {
1779
- /** Format: int64 */
1780
- id: number;
1781
1841
  pins: components["schemas"]["ConnectionPin"][];
1782
1842
  sourceFormatNodeId: components["schemas"]["FormatNodeId"];
1783
1843
  sourceOutput: components["schemas"]["OutputIdx"];
@@ -1842,8 +1902,11 @@ declare interface components {
1842
1902
  outputVargsToArray: boolean;
1843
1903
  parentNodeId?: components["schemas"]["FormatNodeId"] | null;
1844
1904
  settings: components["schemas"]["RecordValue_for_Primitive"];
1845
- /** @description Ignored for existing nodes, because a node's test id never changes. */
1846
- testId: components["schemas"]["FormatNodeTestId"];
1905
+ /**
1906
+ * @description Ignored for existing nodes, because a node's test id never changes. Defaults to the node id.
1907
+ * @default null
1908
+ */
1909
+ testId: components["schemas"]["FormatNodeTestId"] | null;
1847
1910
  typeHints: components["schemas"]["TypeHints_for_Type_and_ParamRef"];
1848
1911
  /** Format: int64 */
1849
1912
  xPos: number;
@@ -1852,14 +1915,11 @@ declare interface components {
1852
1915
  };
1853
1916
  /** Format: uuid */
1854
1917
  FormatNodeId: FormatNodeId;
1855
- FormatNodeInstanceDAO: {
1856
- formatInstanceId: components["schemas"]["FormatInstanceId"];
1857
- /** @description Set if the node instance is a child of at least one NodeFolderNode */
1918
+ /** @description The node `format_node_id` in the format instance `format_instance_id`. */
1919
+ FormatNodeInstanceId: {
1920
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
1858
1921
  formatNodeId: components["schemas"]["FormatNodeId"];
1859
- id: components["schemas"]["FormatNodeInstanceId"];
1860
1922
  };
1861
- /** Format: int64 */
1862
- FormatNodeInstanceId: FormatNodeInstanceId;
1863
1923
  /** Format: uuid */
1864
1924
  FormatNodeTestId: FormatNodeTestId;
1865
1925
  FormatPathVariables_for_CommonWorkspaceId: {
@@ -1878,6 +1938,14 @@ declare interface components {
1878
1938
  /** @constant */
1879
1939
  type: "non-unique-node-id";
1880
1940
  data: components["schemas"]["FormatNodeId"];
1941
+ } | {
1942
+ /** @constant */
1943
+ type: "non-unique-test-id";
1944
+ data: components["schemas"]["FormatNodeTestId"];
1945
+ } | {
1946
+ /** @constant */
1947
+ type: "non-unique-connection";
1948
+ data: components["schemas"]["FormatConnectionDTO"];
1881
1949
  } | {
1882
1950
  /** @constant */
1883
1951
  type: "parent-does-not-exist";
@@ -1923,10 +1991,6 @@ declare interface components {
1923
1991
  FormatRevalidationError: {
1924
1992
  invalidatedFormats: components["schemas"]["FormatId"][];
1925
1993
  };
1926
- FormatRuntimeError: {
1927
- location: components["schemas"]["FormatNodeInstanceDAO"];
1928
- nodeError: components["schemas"]["NodeRuntimeError"];
1929
- };
1930
1994
  FormatTest: {
1931
1995
  description: string;
1932
1996
  formatId: components["schemas"]["FormatId"];
@@ -2011,8 +2075,8 @@ declare interface components {
2011
2075
  data: components["schemas"]["ImportArchiveError"];
2012
2076
  } | {
2013
2077
  /** @constant */
2014
- type: "format-error";
2015
- data: components["schemas"]["FormatRuntimeError"];
2078
+ type: "node-error";
2079
+ data: components["schemas"]["LocatedNodeError"];
2016
2080
  } | {
2017
2081
  /** @constant */
2018
2082
  type: "outputs-do-not-match";
@@ -2090,7 +2154,12 @@ declare interface components {
2090
2154
  name: string;
2091
2155
  };
2092
2156
  };
2093
- /** Format: int64 */
2157
+ /**
2158
+ * Format: uuid
2159
+ * @description Identifies a format test. Random ([Self::new_random]) from the endpoint, or [Self::nth_imported] for the tests
2160
+ * of an imported format.
2161
+ * Deserializing one only yields a reference to an existing format test; it does not check that it exists.
2162
+ */
2094
2163
  FormatTestId: FormatTestId;
2095
2164
  FormatTestPathVariables_for_CommonWorkspaceId: {
2096
2165
  eventId: components["schemas"]["EventId"];
@@ -2115,7 +2184,7 @@ declare interface components {
2115
2184
  * @description The id of the root format instance that for the tests.
2116
2185
  * The results of this format instance are in [Self::format_instance_states]
2117
2186
  */
2118
- testFormatInstanceId: components["schemas"]["FormatInstanceId"];
2187
+ testFormatInstanceId: components["schemas"]["FormatInstanceHash"];
2119
2188
  };
2120
2189
  /** @description Represents a state in which the format is not valid for execution but can be stored in the db. */
2121
2190
  FormatValidationError: {
@@ -2236,12 +2305,11 @@ declare interface components {
2236
2305
  */
2237
2306
  parentFormatNodeFolderPath: string[];
2238
2307
  };
2308
+ /** @description The node `format_node_id` in the format instance `format_instance_id`. */
2239
2309
  FullNodeInstance: {
2240
2310
  formatId: components["schemas"]["FormatId"];
2241
- formatInstanceId: components["schemas"]["FormatInstanceId"];
2242
- /** @description Set if the node instance is a child of at least one NodeFolderNode */
2311
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
2243
2312
  formatNodeId: components["schemas"]["FormatNodeId"];
2244
- id: components["schemas"]["FormatNodeInstanceId"];
2245
2313
  };
2246
2314
  GTFilterKind: {
2247
2315
  /** @constant */
@@ -2271,15 +2339,8 @@ declare interface components {
2271
2339
  gameFormatId: components["schemas"]["GameFormatId"];
2272
2340
  id: components["schemas"]["GameId"];
2273
2341
  name: string;
2274
- /** Format: int64 */
2275
- nodeKey?: number | null;
2276
- owningFormatNodeInstanceId?: components["schemas"]["FormatNodeInstanceId"] | null;
2277
- /**
2278
- * @description True if
2279
- * - created by a node but the last execution of the node did not touch this game.
2280
- * - Or the owning node was deleted.
2281
- */
2282
- stale: boolean;
2342
+ owner: components["schemas"]["ContentOwner"];
2343
+ state: components["schemas"]["ContentState"];
2283
2344
  };
2284
2345
  GameDTO: {
2285
2346
  attributes: components["schemas"]["RecordValue_for_Primitive"];
@@ -2330,7 +2391,11 @@ declare interface components {
2330
2391
  postProcessingSteps: components["schemas"]["GameFormatPostProcessingStep"][];
2331
2392
  resultListColumns: components["schemas"]["RecordTypeWithDefaults"];
2332
2393
  };
2333
- /** Format: int64 */
2394
+ /**
2395
+ * Format: uuid
2396
+ * @description Identifies a game format. Random ([Self::new_random]) from the endpoint, or derived by `ImportArchiveMutation`.
2397
+ * Deserializing one only yields a reference to an existing game format; it does not check that it exists.
2398
+ */
2334
2399
  GameFormatId: GameFormatId;
2335
2400
  GameFormatPathVariables_for_CommonWorkspaceId: {
2336
2401
  eventId: components["schemas"]["EventId"];
@@ -2358,7 +2423,16 @@ declare interface components {
2358
2423
  expression: string;
2359
2424
  };
2360
2425
  };
2361
- /** Format: int64 */
2426
+ /**
2427
+ * Format: uuid
2428
+ * @description Identifies a game, the primary key of `games`. Comes from one of:
2429
+ * - [Self::new_random]: a game of the user. The endpoint picks the id and the mutation carries it.
2430
+ * - [Self::of_node]: a game of a node, see [GameDAO::derived_id]. Executing a graph creates the same ids every time.
2431
+ * - [GameDAO::keep_as_user_copy]: a game of a node that the user kept when the node instance got deleted.
2432
+ *
2433
+ * Deserializing one only yields a reference to an existing game; it does not check that it exists or how it was made.
2434
+ * Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
2435
+ */
2362
2436
  GameId: GameId;
2363
2437
  GameNodeDTO: {
2364
2438
  /**
@@ -2420,7 +2494,7 @@ declare interface components {
2420
2494
  /** @enum {string} */
2421
2495
  GenderGuess: "male" | "female" | "may-be-male" | "may-be-female" | "both-male-female" | "not-sure" | "not-found";
2422
2496
  GetFormatInstancesStateQuery: {
2423
- formatInstanceIds: components["schemas"]["FormatInstanceId"][];
2497
+ formatInstanceIds: components["schemas"]["FormatInstanceHash"][];
2424
2498
  };
2425
2499
  GetIsBibUniqueQuery: {
2426
2500
  bib: components["schemas"]["BIB"];
@@ -2529,11 +2603,12 @@ declare interface components {
2529
2603
  */
2530
2604
  linkTemplate: boolean;
2531
2605
  /**
2532
- * Format: uint64
2533
2606
  * @description When `Some`, regenerates format node ids from this seed (deterministic log replay).
2534
2607
  * When `None`, preserves archive node ids — for one-shot imports such as format tests.
2608
+ * Mixed with the event, the ids of the imported entities derive from it too. Random, picked when the mutation is
2609
+ * built; reusing a seed in the same event reproduces the same ids.
2535
2610
  */
2536
- nodeUuidSeed?: number | null;
2611
+ nodeUuidSeed?: components["schemas"]["Seed"] | null;
2537
2612
  /** @default as-format */
2538
2613
  rootFormat: components["schemas"]["RootFormatImport"];
2539
2614
  };
@@ -2698,6 +2773,14 @@ declare interface components {
2698
2773
  * Can be created from a single character (e.g. `'T'`) or a string (hashed for multi-char names).
2699
2774
  */
2700
2775
  LocalParamID: number;
2776
+ /** @description An error that originated in a node, identified independently of the unstable `NodeIndex`. */
2777
+ LocatedNodeError: {
2778
+ error: components["schemas"]["NodeRuntimeError"];
2779
+ eventId: components["schemas"]["EventId"];
2780
+ formatId: components["schemas"]["FormatId"];
2781
+ formatInstanceId: components["schemas"]["FormatInstanceHash"];
2782
+ formatNodeId: components["schemas"]["FormatNodeId"];
2783
+ };
2701
2784
  /** Format: uuid */
2702
2785
  LogBatchId: string;
2703
2786
  LogEntry: {
@@ -2852,6 +2935,10 @@ declare interface components {
2852
2935
  /** @constant */
2853
2936
  type: "update-full-resolved-game-table-layer-one";
2854
2937
  data: components["schemas"]["UpdateTableRowsLayerOneMutation"];
2938
+ } | {
2939
+ /** @constant */
2940
+ type: "remove-hidden-row";
2941
+ data: components["schemas"]["RemoveHiddenRowMutation"];
2855
2942
  } | {
2856
2943
  /** @constant */
2857
2944
  type: "add-extension";
@@ -2916,10 +3003,10 @@ declare interface components {
2916
3003
  name: string;
2917
3004
  nodeId: components["schemas"]["FormatNodeId"];
2918
3005
  /**
2919
- * Format: uint64
2920
- * @description Persist the seed so later log entries can refer to the same copied node IDs on replay.
3006
+ * @description Persist the seed so later log entries can refer to the same copied node IDs on replay. Random, picked when the
3007
+ * mutation is built; the id of the copied format derives from it too ([FormatId::of_copy]).
2921
3008
  */
2922
- nodeUuidSeed: number;
3009
+ nodeUuidSeed: components["schemas"]["Seed"];
2923
3010
  };
2924
3011
  MakeNodeSingleUserRequest: {
2925
3012
  /** @description The exact name to give the copied format. */
@@ -2992,7 +3079,40 @@ declare interface components {
2992
3079
  nodeType: components["schemas"]["NodeType"];
2993
3080
  test: components["schemas"]["FormatTestDefinition"];
2994
3081
  };
3082
+ NodeErrorState_for_NodeRuntimeError: {
3083
+ /** @constant */
3084
+ type: "ok";
3085
+ } | {
3086
+ /** @constant */
3087
+ type: "partial-errors";
3088
+ data: {
3089
+ errorPorts: {
3090
+ [key: string]: components["schemas"]["NodeRuntimeError"];
3091
+ };
3092
+ };
3093
+ } | {
3094
+ /** @constant */
3095
+ type: "full-error";
3096
+ data: components["schemas"]["NodeRuntimeError"];
3097
+ } | {
3098
+ /** @constant */
3099
+ type: "skipped";
3100
+ data: components["schemas"]["NodeRuntimeError"];
3101
+ };
2995
3102
  NodeHasContentError: null;
3103
+ /**
3104
+ * Format: uuid
3105
+ * @description Identifies a node instance: a node of a format within one [FormatInstanceHash].
3106
+ *
3107
+ * Derived from the format instance and the node id, see [Self::of]. It is the parent of the format instances the node
3108
+ * creates ([FormatInstanceHash::new_child]) and the origin that table lineage attributes the steps of the node to. Like
3109
+ * [FormatInstanceHash], new hashes only come from the derivation, deserializing only yields a reference, and changing
3110
+ * the derivation needs an `ENGINE_VERSION` increment.
3111
+ *
3112
+ * A node that gets a new id, like the nodes copied by `MakeNodeSingleUserMutation`, gets new node instance hashes.
3113
+ * Everything derived from them has to move along.
3114
+ */
3115
+ NodeInstanceHash: NodeInstanceHash;
2996
3116
  NodeInstanceStateDTO: {
2997
3117
  /** @description Effective execution folder of this node, used as the root of its owned-content tree. */
2998
3118
  folderPath: components["schemas"]["FolderPath"];
@@ -3032,6 +3152,10 @@ declare interface components {
3032
3152
  name: string;
3033
3153
  };
3034
3154
  };
3155
+ /**
3156
+ * @description Error that happened while executing a node. Caused by invalid input to
3157
+ * the node or other factors caused by invalid use of the node.
3158
+ */
3035
3159
  NodeRuntimeError: {
3036
3160
  /** @constant */
3037
3161
  type: "table-kind-mismatch";
@@ -3067,15 +3191,6 @@ declare interface components {
3067
3191
  } | {
3068
3192
  /** @constant */
3069
3193
  type: "integer-overflow";
3070
- } | {
3071
- /** @constant */
3072
- type: "mux-invalid-multiplexing-strategy";
3073
- } | {
3074
- /** @constant */
3075
- type: "mux-competitor-not-unique";
3076
- data: {
3077
- competitorId: components["schemas"]["CompetitorId"];
3078
- };
3079
3194
  } | {
3080
3195
  /** @constant */
3081
3196
  type: "record-field-does-not-exist";
@@ -3100,10 +3215,6 @@ declare interface components {
3100
3215
  /** Format: uint */
3101
3216
  rowIndex: number;
3102
3217
  };
3103
- } | {
3104
- /** @constant */
3105
- type: "closure-failed";
3106
- data: components["schemas"]["FormatRuntimeError"];
3107
3218
  } | {
3108
3219
  /** @constant */
3109
3220
  type: "invalid-row-types";
@@ -4175,12 +4286,7 @@ declare interface components {
4175
4286
  QueryStyle: "form" | "spaceDelimited" | "pipeDelimited" | "deepObject";
4176
4287
  RandomizeClassPlacesMutation: {
4177
4288
  classId: components["schemas"]["ClassId"];
4178
- /**
4179
- * Format: uint64
4180
- * @description Defaults so log entries written before the seed existed still deserialize.
4181
- * @default 0
4182
- */
4183
- seed: number;
4289
+ seed: components["schemas"]["Seed"];
4184
4290
  };
4185
4291
  /** @enum {string} */
4186
4292
  RecordFieldOp: "read-field" | "write-field";
@@ -4416,6 +4522,11 @@ declare interface components {
4416
4522
  eventId: components["schemas"]["EventId"];
4417
4523
  identifier: string;
4418
4524
  };
4525
+ /** @description Removes a row nodes don't see, see [ResolvedTable::hidden_rows]. */
4526
+ RemoveHiddenRowMutation: {
4527
+ competitorId: components["schemas"]["CompetitorId"];
4528
+ tableId: components["schemas"]["TableId"];
4529
+ };
4419
4530
  RemoveTargetQuery: {
4420
4531
  /**
4421
4532
  * @description Only forget the target, without pushing the remaining rows and resetting the remote.
@@ -4447,6 +4558,8 @@ declare interface components {
4447
4558
  id: components["schemas"]["LogId"];
4448
4559
  /** Format: date-time */
4449
4560
  timestamp: string;
4561
+ /** Format: uint32 */
4562
+ version: number;
4450
4563
  };
4451
4564
  ReplicationConflict: {
4452
4565
  /** @constant */
@@ -4456,6 +4569,12 @@ declare interface components {
4456
4569
  /** @constant */
4457
4570
  type: "hash-mismatch";
4458
4571
  head: components["schemas"]["LogHead"];
4572
+ } | {
4573
+ /** @constant */
4574
+ type: "unsupported-version";
4575
+ id: components["schemas"]["LogId"];
4576
+ /** Format: uint32 */
4577
+ version: number;
4459
4578
  };
4460
4579
  ReplicationHead: {
4461
4580
  /** Format: uuid */
@@ -4500,6 +4619,13 @@ declare interface components {
4500
4619
  Resolve: {
4501
4620
  keep: components["schemas"]["Side"];
4502
4621
  };
4622
+ /** @description A table as nodes see it, without the results whose competitor is not in the entry of their game. */
4623
+ ResolvedTable: {
4624
+ /** @description The results whose competitor is not in the entry of their game. Nodes don't see them. */
4625
+ hiddenRows: components["schemas"]["Row"][];
4626
+ rows: components["schemas"]["Rows_for_Sorted"];
4627
+ state: components["schemas"]["TableState"];
4628
+ };
4503
4629
  Response: {
4504
4630
  /**
4505
4631
  * @description REQUIRED. A description of the response.
@@ -4551,7 +4677,7 @@ declare interface components {
4551
4677
  RootFormatResponse: {
4552
4678
  rootFormat: components["schemas"]["FullFormatDAO"];
4553
4679
  /** @description None if the format was never executed */
4554
- rootFormatInstanceId?: components["schemas"]["FormatInstanceId"] | null;
4680
+ rootFormatInstanceId?: components["schemas"]["FormatInstanceHash"] | null;
4555
4681
  };
4556
4682
  /** @description Rows can only be created and moved by this crate, so that their [Origin] stays truthful. */
4557
4683
  Row: Row;
@@ -4573,10 +4699,6 @@ declare interface components {
4573
4699
  steps: components["schemas"]["Step"][];
4574
4700
  tableId: components["schemas"]["TableId"];
4575
4701
  };
4576
- RowLineageQuery: {
4577
- /** @description The competitor of the row */
4578
- competitorId: components["schemas"]["CompetitorId"];
4579
- };
4580
4702
  RowMutationChangeEvent: {
4581
4703
  gameTableId: components["schemas"]["TableId"];
4582
4704
  };
@@ -4589,11 +4711,12 @@ declare interface components {
4589
4711
  batch: number;
4590
4712
  competitorId: components["schemas"]["CompetitorId"];
4591
4713
  gameTableId: components["schemas"]["TableId"];
4592
- id: components["schemas"]["RowMutationId"];
4714
+ /** @description Counts per table, so it is unique only together with `game_table_id`. */
4715
+ idx: components["schemas"]["RowMutationIdx"];
4593
4716
  kind: components["schemas"]["RowMutationKind"];
4594
4717
  };
4595
4718
  /** Format: int64 */
4596
- RowMutationId: RowMutationId;
4719
+ RowMutationIdx: RowMutationIdx;
4597
4720
  RowMutationKind: {
4598
4721
  /** @constant */
4599
4722
  type: "set-record-field";
@@ -4635,6 +4758,10 @@ declare interface components {
4635
4758
  competitorId: number;
4636
4759
  kind: components["schemas"]["RowMutationKind"];
4637
4760
  };
4761
+ RowQuery: {
4762
+ /** @description The competitor of the row */
4763
+ competitorId: components["schemas"]["CompetitorId"];
4764
+ };
4638
4765
  RowSummary: {
4639
4766
  description: string;
4640
4767
  hash: number[];
@@ -4758,8 +4885,18 @@ declare interface components {
4758
4885
  } & {
4759
4886
  [key: string]: unknown;
4760
4887
  });
4888
+ /**
4889
+ * Format: uuid
4890
+ * @description The random seed a log entry stores so that replaying it derives the same ids, see [IdSeed].
4891
+ *
4892
+ * A uuid instead of a `u64` (as it used to be): JSON clients like the frontend read numbers as JavaScript doubles,
4893
+ * which round integers above 2^53, so a seed that went through them derived different ids on replay. A uuid is
4894
+ * serialized as a string and survives that unchanged.
4895
+ */
4896
+ Seed: string;
4761
4897
  SemVer: string;
4762
4898
  SerializableNodeResult: {
4899
+ errorState: components["schemas"]["NodeErrorState_for_NodeRuntimeError"];
4763
4900
  values: components["schemas"]["SerializablePortValues_for_OutputIdx"];
4764
4901
  };
4765
4902
  SerializableNonPrimitiveValue: {
@@ -4777,8 +4914,8 @@ declare interface components {
4777
4914
  } | {
4778
4915
  /** @constant */
4779
4916
  type: "class";
4780
- /** Format: int64 */
4781
- data: number;
4917
+ /** Format: uuid */
4918
+ data: string;
4782
4919
  } | {
4783
4920
  /** @constant */
4784
4921
  type: "closure";
@@ -4970,10 +5107,11 @@ declare interface components {
4970
5107
  };
4971
5108
  Step: {
4972
5109
  /**
4973
- * Format: int64
4974
- * @description Whoever ran the operation, see [Origin::attributed]. None until it is attributed.
5110
+ * Format: uuid
5111
+ * @description Whoever ran the operation, see [Origin::attributed]: the engine's `NodeInstanceHash`, a raw uuid because this
5112
+ * crate doesn't know engine types. None until it is attributed.
4975
5113
  */
4976
- node?: number | null;
5114
+ node?: string | null;
4977
5115
  op: components["schemas"]["StepOp"];
4978
5116
  };
4979
5117
  /** @description An operation that moved rows between or within tables. */
@@ -5009,19 +5147,8 @@ declare interface components {
5009
5147
  /** @description The owner of the tables data (items, attributes and state) */
5010
5148
  layerOneOwner: components["schemas"]["TableOwner"];
5011
5149
  name: string;
5012
- /**
5013
- * Format: int64
5014
- * @description The key provided by the creating node. None if not created by a node.
5015
- */
5016
- nodeKey?: number | null;
5017
- /** @description Set only if the table is owned by a node and is not part of a game. */
5018
- owningNodeInstanceId?: components["schemas"]["FormatNodeInstanceId"] | null;
5019
- /**
5020
- * @description True if
5021
- * - created by a node but the last execution of the node did not touch this table.
5022
- * - Or the owning node was deleted.
5023
- */
5024
- stale: boolean;
5150
+ owner: components["schemas"]["ContentOwner"];
5151
+ state: components["schemas"]["ContentState"];
5025
5152
  /** @description Set by nodes. */
5026
5153
  stateLayerOne: components["schemas"]["TableState"];
5027
5154
  /** @description Overwrites layer one if Some */
@@ -5035,7 +5162,18 @@ declare interface components {
5035
5162
  state?: components["schemas"]["TableState"] | null;
5036
5163
  tableKind: components["schemas"]["TableKind"];
5037
5164
  };
5038
- /** Format: int64 */
5165
+ /**
5166
+ * Format: uuid
5167
+ * @description Identifies a table, the primary key of `tables`. Comes from one of:
5168
+ * - [Self::new_random]: a table the user adds. The endpoint picks the id and the mutation carries it.
5169
+ * - [Self::of_user_game]: the entry and result table of a game of the user.
5170
+ * - [Self::of_game] and [Self::of_node]: a table of a node, see [TableDAO::derived_id]. Executing a graph creates the
5171
+ * same ids every time.
5172
+ * - [TableDAO::keep_as_user_copy]: a table of a node that the user kept when the node instance got deleted.
5173
+ *
5174
+ * Deserializing one only yields a reference to an existing table; it does not check that it exists or how it was
5175
+ * made. Changing a derivation changes what replaying a log produces and needs an `ENGINE_VERSION` increment.
5176
+ */
5039
5177
  TableId: TableId;
5040
5178
  TableItemsMutationDTO: {
5041
5179
  challenge: components["schemas"]["TableMutationChallenge"];
@@ -5046,8 +5184,12 @@ declare interface components {
5046
5184
  * @enum {string}
5047
5185
  */
5048
5186
  TableKind: "entry-list" | "result-list" | "other";
5049
- /** Format: int64 */
5050
- TableLineageId: TableLineageId;
5187
+ /** @description The way number `idx` into `table_id`. */
5188
+ TableLineageId: {
5189
+ /** Format: int64 */
5190
+ idx: number;
5191
+ tableId: components["schemas"]["TableId"];
5192
+ };
5051
5193
  TableMutationChallenge: {
5052
5194
  /** @constant */
5053
5195
  type: "force-push";
@@ -5056,9 +5198,9 @@ declare interface components {
5056
5198
  type: "controlled-push";
5057
5199
  /**
5058
5200
  * @description If None, expect this mutation to be the first one.
5059
- * Otherwise expect `head` to be the id of the currently most recent mutation.
5201
+ * Otherwise expect `head` to be the id of the currently most recent mutation of the table.
5060
5202
  */
5061
- head?: components["schemas"]["RowMutationId"] | null;
5203
+ head?: components["schemas"]["RowMutationIdx"] | null;
5062
5204
  };
5063
5205
  /**
5064
5206
  * @description Overwrites a table. See [`TableOverwrite::for_game_result`]/[`TableOverwrite::for_game_entry`]
@@ -5152,17 +5294,20 @@ declare interface components {
5152
5294
  /** Format: uuid */
5153
5295
  id: string;
5154
5296
  remoteWorkspaceId: components["schemas"]["CommonWorkspaceId"];
5155
- /** Format: int64 */
5156
- rowsBehind: number;
5157
- status: components["schemas"]["TargetStatus"];
5297
+ status: components["schemas"]["TargetStatusDTO"];
5298
+ /** @description Base URL of the web app of the target server, as it last reported it. */
5299
+ uiUrl?: string | null;
5158
5300
  };
5159
5301
  TargetPath: {
5160
5302
  /** Format: uuid */
5161
5303
  targetId: string;
5162
5304
  };
5163
- TargetStatus: {
5305
+ /** @description The status of a target as clients see it, so up-to-date can not have rows behind. */
5306
+ TargetStatusDTO: {
5164
5307
  /** @constant */
5165
5308
  type: "pushing";
5309
+ /** Format: int64 */
5310
+ rowsBehind?: number | null;
5166
5311
  } | {
5167
5312
  /** @constant */
5168
5313
  type: "up-to-date";
@@ -5170,6 +5315,8 @@ declare interface components {
5170
5315
  /** @constant */
5171
5316
  type: "retrying";
5172
5317
  lastError: components["schemas"]["SourceError"];
5318
+ /** Format: int64 */
5319
+ rowsBehind?: number | null;
5173
5320
  } | {
5174
5321
  /** @constant */
5175
5322
  type: "conflicted";
@@ -5622,8 +5769,20 @@ declare interface components {
5622
5769
  ValidationErrorKind_for_Type: ValidationErrorKind<Type>;
5623
5770
  /** @description A validation error with its location and kind. */
5624
5771
  ValidationError_for_Type: ValidationError<Type>;
5772
+ /**
5773
+ * Important
5774
+ * @description Changes in here are breaking changes for logs
5775
+ */
5625
5776
  Value_for_Primitive: Value<Primitive>;
5777
+ /**
5778
+ * Important
5779
+ * @description Changes in here are breaking changes for logs
5780
+ */
5626
5781
  Value_for_SerializableNonPrimitiveValue: Value<SerializableNonPrimitiveValue>;
5782
+ /**
5783
+ * @description The ids inside an archive (in its format DTO and here) are archive-local join keys, not ids of a workspace: each
5784
+ * maps to the [Archive::uuid] of the dependency it refers to. Importing gives the entities new ids.
5785
+ */
5627
5786
  Wiring: {
5628
5787
  classes: {
5629
5788
  [key: string]: string;
@@ -5655,6 +5814,16 @@ declare interface components {
5655
5814
  WorkspacePathVariables_for_CommonWorkspaceId: {
5656
5815
  workspaceId: components["schemas"]["CommonWorkspaceId"];
5657
5816
  };
5817
+ /** @enum {string} */
5818
+ WorkspaceState: "normal" | "checked-out" | "replication-target";
5819
+ /** @description The state of a workspace that clients display live. More workspace state goes here. */
5820
+ WorkspaceStateDTO: {
5821
+ /** @description All errors that originated in a node, sorted by their location. */
5822
+ nodeErrors: components["schemas"]["LocatedNodeError"][];
5823
+ replicationTargets: components["schemas"]["TargetDTO"][];
5824
+ /** @description Anything but normal makes the workspace read-only. */
5825
+ state: components["schemas"]["WorkspaceState"];
5826
+ };
5658
5827
  };
5659
5828
  responses: never;
5660
5829
  parameters: never;
@@ -5728,6 +5897,8 @@ export declare const DateTimeText: FC<DateTimeTextProps>;
5728
5897
  export declare interface DateTimeTextProps {
5729
5898
  value: Date | number | string;
5730
5899
  className?: string;
5900
+ /** Shows the time passed since `value` ("5 minutes ago") instead of the timestamp. */
5901
+ relative?: boolean;
5731
5902
  }
5732
5903
 
5733
5904
  declare interface DetailedSupertypeDiagnostics<T> {
@@ -5736,7 +5907,7 @@ declare interface DetailedSupertypeDiagnostics<T> {
5736
5907
 
5737
5908
  export declare interface DialogButton<T> {
5738
5909
  value: T;
5739
- label: string;
5910
+ label: ReactNode;
5740
5911
  theme?: 'primary' | 'default' | 'danger';
5741
5912
  }
5742
5913
 
@@ -5750,7 +5921,7 @@ export declare type EngineQueryOptions<T> = UnusedSkipTokenOptions<T, Error, T,
5750
5921
  */
5751
5922
  declare type ErasedScopedTypeRef<T> = { type: "Param"; data: ParamRef } | { type: "ScopedExpr"; data: { expr: TypeExpr<T, ErasedScopedTypeRef<T>> } };
5752
5923
 
5753
- export declare type EventId = Brand<number, 'eventId'>;
5924
+ export declare type EventId = Brand<string, 'eventId'>;
5754
5925
 
5755
5926
  export declare interface EventPath {
5756
5927
  workspaceId: CommonWorkspaceId;
@@ -5852,19 +6023,17 @@ declare interface FieldTypeWithDefault {
5852
6023
  */
5853
6024
  export declare function formatCompetitorName(competitor: CompetitorDAO): string;
5854
6025
 
5855
- declare type FormatGroupId = Brand<number, 'formatGroupId'>;
6026
+ declare type FormatGroupId = Brand<string, 'formatGroupId'>;
5856
6027
 
5857
- declare type FormatId = Brand<number, 'formatId'>;
6028
+ declare type FormatId = Brand<string, 'formatId'>;
5858
6029
 
5859
- export declare type FormatInstanceId = Brand<number, 'formatInstanceId'>;
6030
+ export declare type FormatInstanceHash = Brand<string, 'formatInstanceHash'>;
5860
6031
 
5861
6032
  export declare type FormatNodeId = Brand<string, 'formatNodeId'>;
5862
6033
 
5863
- declare type FormatNodeInstanceId = Brand<number, 'formatNodeInstanceId'>;
5864
-
5865
6034
  declare type FormatNodeTestId = Brand<string, 'formatNodeTestId'>;
5866
6035
 
5867
- declare type FormatTestId = Brand<number, 'formatTestId'>;
6036
+ declare type FormatTestId = Brand<string, 'formatTestId'>;
5868
6037
 
5869
6038
  export declare type FormContribution<Props, DTO> = FC<Props & {
5870
6039
  formFieldRegistry: FormFieldRegistry;
@@ -5942,7 +6111,7 @@ export declare type GameDTO = components['schemas']['GameDTO'];
5942
6111
 
5943
6112
  export declare type GameFormatDTO = components['schemas']['GameFormatDTO'];
5944
6113
 
5945
- export declare type GameFormatId = Brand<number, 'gameFormatId'>;
6114
+ export declare type GameFormatId = Brand<string, 'gameFormatId'>;
5946
6115
 
5947
6116
  export declare type GameFormatPageContribution = FormContribution<GameFormatPageProps & {
5948
6117
  gameFormat: GameFormatDTO;
@@ -5952,7 +6121,7 @@ export declare type GameFormatPageProps = EventPath & {
5952
6121
  gameFormatId: GameFormatId | null;
5953
6122
  };
5954
6123
 
5955
- export declare type GameId = Brand<number, 'gameId'>;
6124
+ export declare type GameId = Brand<string, 'gameId'>;
5956
6125
 
5957
6126
  export declare type GamePageContribution = FormContribution<GamePageProps & {
5958
6127
  game: WorkingGameDTO;
@@ -5975,7 +6144,7 @@ export declare const getCompetitorInTeamMappingAtQueryOptions: (workspaceId: Com
5975
6144
  */
5976
6145
  export declare const getCompetitorsQO: (workspaceId: CommonWorkspaceId, eventId: EventId, competitorTypeFilter?: CompetitorType) => EngineQueryOptions<CompetitorDAO[]>;
5977
6146
 
5978
- export declare const getGameTableResolvedByGameQO: (workspaceId: CommonWorkspaceId, eventId: EventId, gameID: GameId, tableKind: "EntryList" | "ResultList") => EngineQueryOptions<TableSortedDTO>;
6147
+ export declare const getGameTableResolvedByGameQO: (workspaceId: CommonWorkspaceId, eventId: EventId, gameID: GameId, tableKind: "EntryList" | "ResultList") => EngineQueryOptions<ResolvedTableDTO>;
5979
6148
 
5980
6149
  /**
5981
6150
  * Location of a validation error in the graph.
@@ -6015,6 +6184,12 @@ export declare enum InputLayout {
6015
6184
  Fill = 2
6016
6185
  }
6017
6186
 
6187
+ /** Loads graphite-script from the host's wasm on demand, a static import would make this entry an async module. */
6188
+ export declare const loadGraphiteScript: () => Promise<{
6189
+ primValueToTypeExpr: typeof primValueToTypeExpr;
6190
+ validateExpression: typeof validateExpression;
6191
+ }>;
6192
+
6018
6193
  export declare const LoadingOverlay: FC<LoadingOverlayProps>;
6019
6194
 
6020
6195
  export declare type LoadingOverlayProps = {
@@ -6082,6 +6257,8 @@ export declare interface ModalProps {
6082
6257
  blockBackground?: boolean;
6083
6258
  }
6084
6259
 
6260
+ declare type NodeInstanceHash = Brand<string, 'nodeInstanceHash'>;
6261
+
6085
6262
  /**
6086
6263
  * Function-like type for a node: generic parameters, inputs, outputs, and defaults.
6087
6264
  * Written in notation as `<T>(T) -> (T)` for the identity node.
@@ -6201,7 +6378,7 @@ export declare interface ParsedQuery<Values> {
6201
6378
  export declare type PathParams<Path extends string> = Path extends `${infer Base}/*` ? PathParams<Base> : Path extends `${infer _}/${infer Rest}` ? MergePathParams<PathSegmentParam<_>, PathParams<Rest>> : PathSegmentParam<Path>;
6202
6379
 
6203
6380
  export declare type PathSegmentParam<S extends string> = S extends `:${infer P}` ? {
6204
- [K in P]: number;
6381
+ [K in P]: K extends keyof UuidPathParams ? UuidPathParams[K] : number;
6205
6382
  } : S extends `$${infer P}` ? {
6206
6383
  [K in P]: string;
6207
6384
  } : Record<never, never>;
@@ -6231,7 +6408,7 @@ export declare interface PortTypes<T, R = ParamRef> {
6231
6408
  */
6232
6409
  export declare type Primitive = never;
6233
6410
 
6234
- export declare function primValueToTypeExpr(value: Value<Primitive>): TypeExpr<Type, ParamRef>;
6411
+ declare function primValueToTypeExpr(value: Value<Primitive>): TypeExpr<Type, ParamRef>;
6235
6412
 
6236
6413
  export declare interface QueryCodec<T> {
6237
6414
  parse(value: string): T | null;
@@ -6307,6 +6484,14 @@ export declare interface ResizablePanelProps {
6307
6484
 
6308
6485
  export declare type ResizeEdge = 'left' | 'right' | 'top' | 'bottom';
6309
6486
 
6487
+ export declare type ResolvedTableDTO = components['schemas']['ResolvedTable'];
6488
+
6489
+ /** A path on this origin, so navigating to it can never leave the app. */
6490
+ export declare type ReturnPath = Brand<string, 'returnPath'>;
6491
+
6492
+ /** The only way to get a {@link ReturnPath}. Rejects URLs leaving the origin like `//evil.com` or `/\evil.com`. */
6493
+ export declare const returnPath: QueryCodec<ReturnPath>;
6494
+
6310
6495
  export declare interface RouterContextType {
6311
6496
  /** The pathname used for route matching and persistence keys. */
6312
6497
  path: string;
@@ -6355,7 +6540,7 @@ export declare interface RowAction<T> {
6355
6540
  readOnlySafe?: boolean;
6356
6541
  }
6357
6542
 
6358
- declare type RowMutationId = Brand<number, 'rowMutationId'>;
6543
+ declare type RowMutationIdx = Brand<number, 'rowMutationIdx'>;
6359
6544
 
6360
6545
  declare interface Rows<SortingState> {
6361
6546
  /**
@@ -6385,7 +6570,7 @@ export declare type SearchInputProps = {
6385
6570
  className?: string;
6386
6571
  };
6387
6572
 
6388
- 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: number } | { type: "closure" };
6573
+ 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" };
6389
6574
 
6390
6575
  /**
6391
6576
  * A keyboard shortcut as the keys to press together, e.g. `['Mod', 'Shift', 'Z']`. `Mod` is Ctrl, or
@@ -6428,9 +6613,7 @@ export declare enum StorageType {
6428
6613
  */
6429
6614
  declare type Table<SortingState, M = NoMetadata> = { rows: Rows<SortingState> } & M;
6430
6615
 
6431
- export declare type TableId = Brand<number, 'tableId'>;
6432
-
6433
- declare type TableLineageId = Brand<number, 'tableLineageId'>;
6616
+ export declare type TableId = Brand<string, 'tableId'>;
6434
6617
 
6435
6618
  export declare interface TableProps<TData extends RowData> {
6436
6619
  data: TData[];
@@ -6462,10 +6645,10 @@ export declare interface TableProps<TData extends RowData> {
6462
6645
  /** Text to be displayed when there is no data */
6463
6646
  emptyTableText?: ReactNode;
6464
6647
  /**
6465
- * When provided, shows a "Columns" toggle button above the table and persists column
6466
- * visibility to localStorage under this key. Columns with `enableHiding: false` are excluded.
6648
+ * When provided, shows a "Columns" toggle button above the table, e.g. with the state of `usePersistedState`.
6649
+ * Columns with `enableHiding: false` are excluded.
6467
6650
  */
6468
- columnVisibilityStorageKey?: string;
6651
+ columnVisibility?: [ColumnVisibilityState, OnChangeFn<ColumnVisibilityState>];
6469
6652
  }
6470
6653
 
6471
6654
  export declare type TableSortedDTO = components['schemas']['Table_for_Sorted_and_StateMetadata'];
@@ -6578,11 +6761,22 @@ export declare function usePersistedState<S>(storageKey: string, initialState: S
6578
6761
  /** Hook to use the router context. Must be called within a <Router> provider. */
6579
6762
  export declare function useRouter(): RouterContextType;
6580
6763
 
6764
+ /** The `:` params that are uuids, by name. All other `:` params are numbers. */
6765
+ declare type UuidPathParams = {
6766
+ classId: ClassId;
6767
+ eventId: EventId;
6768
+ formatId: FormatId;
6769
+ formatTestId: FormatTestId;
6770
+ gameFormatId: GameFormatId;
6771
+ gameId: GameId;
6772
+ tableId: TableId;
6773
+ };
6774
+
6581
6775
  /**
6582
6776
  * Validates the expression and returns a `ExpressionInContextWasm` if the expression is valid.
6583
6777
  * @throws {ValidateExpressionError} if the expression is not valid.
6584
6778
  */
6585
- export declare function validateExpression(expression: string, context: TypeContext): ExpressionInContextWasm;
6779
+ declare function validateExpression(expression: string, context: TypeContext): ExpressionInContextWasm;
6586
6780
 
6587
6781
  /**
6588
6782
  * A validation error with its location and kind.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graphite-sports/sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "license": "MIT",
5
5
  "repository": "github:Graphite-sports/starter-extension",
6
6
  "homepage": "https://github.com/Graphite-sports/starter-extension",