@fivenet-app/gen 2026.5.0 → 2026.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/clients.ts +6 -0
  2. package/codegen/perms/perms.ts +74 -40
  3. package/codegen/sanitizer/sanitizer.ts +6 -0
  4. package/google/protobuf/descriptor.ts +11 -3
  5. package/google/protobuf/timestamp.ts +7 -6
  6. package/package.json +1 -1
  7. package/perms.ts +387 -41
  8. package/resources/access/access.ts +481 -0
  9. package/resources/accounts/accounts.ts +41 -30
  10. package/resources/audit/audit.ts +5 -1
  11. package/resources/calendar/access/access.ts +0 -330
  12. package/resources/calendar/calendar.ts +307 -25
  13. package/resources/calendar/entries/entries.ts +204 -11
  14. package/resources/centrum/units/access/access.ts +0 -373
  15. package/resources/centrum/units/units.ts +20 -8
  16. package/resources/citizens/labels/access.ts +0 -191
  17. package/resources/citizens/labels/labels.ts +20 -8
  18. package/resources/common/content/diff_activity.ts +1 -1
  19. package/resources/cron/cron.ts +1 -1
  20. package/resources/documents/access/access.ts +0 -329
  21. package/resources/documents/activity/activity.ts +49 -45
  22. package/resources/documents/documents.ts +1 -1
  23. package/resources/documents/requests/requests.ts +1 -1
  24. package/resources/documents/stamps/stamp.ts +40 -210
  25. package/resources/documents/templates/templates.ts +158 -318
  26. package/resources/jobs/colleagues/activity/activity.ts +2 -2
  27. package/resources/jobs/conduct/conduct.ts +2 -2
  28. package/resources/jobs/jobs.ts +22 -0
  29. package/resources/jobs/labels/labels.ts +9 -9
  30. package/resources/laws/laws.ts +96 -50
  31. package/resources/livemap/markers/marker_marker.ts +311 -4
  32. package/resources/mailer/access/access.ts +0 -457
  33. package/resources/mailer/emails/email.ts +4 -4
  34. package/resources/notifications/events/events.ts +18 -1
  35. package/resources/permissions/attributes/attributes.ts +51 -39
  36. package/resources/permissions/permissions/permissions.ts +46 -34
  37. package/resources/qualifications/access/access.ts +0 -248
  38. package/resources/qualifications/qualifications.ts +9 -9
  39. package/resources/settings/config.ts +53 -5
  40. package/resources/settings/data.ts +1 -1
  41. package/resources/stats/stats.ts +32 -20
  42. package/resources/sync/data/data.ts +22 -10
  43. package/resources/userinfo/userinfo.ts +202 -51
  44. package/resources/users/activity/activity.ts +70 -77
  45. package/resources/wiki/access/access.ts +0 -330
  46. package/resources/wiki/activity/activity.ts +45 -45
  47. package/resources/wiki/page.ts +9 -9
  48. package/services/auth/auth.ts +1 -1
  49. package/services/calendar/calendar.ts +1 -1
  50. package/services/calendar/entries.ts +13 -2
  51. package/services/centrum/dispatches.ts +32 -12
  52. package/services/centrum/units.client.ts +15 -2
  53. package/services/centrum/units.ts +237 -129
  54. package/services/citizens/citizens.ts +1 -1
  55. package/services/citizens/labels.client.ts +13 -0
  56. package/services/citizens/labels.ts +135 -4
  57. package/services/completor/completor.client.ts +0 -13
  58. package/services/completor/completor.ts +2 -116
  59. package/services/documents/approval.ts +20 -9
  60. package/services/documents/categories.ts +1 -1
  61. package/services/documents/collab.ts +1 -1
  62. package/services/documents/comments.ts +4 -4
  63. package/services/documents/documents.ts +38 -38
  64. package/services/documents/stats.ts +14 -2
  65. package/services/documents/templates.ts +1 -1
  66. package/services/filestore/filestore.ts +4 -4
  67. package/services/jobs/colleagues.ts +4 -4
  68. package/services/jobs/conduct.ts +2 -2
  69. package/services/jobs/groups.client.ts +22 -0
  70. package/services/jobs/groups.ts +9 -0
  71. package/services/jobs/timeclock.ts +2 -2
  72. package/services/mailer/settings.ts +1 -1
  73. package/services/mailer/thread.ts +3 -3
  74. package/services/qualifications/exam.ts +5 -5
  75. package/services/qualifications/qualifications.ts +52 -34
  76. package/services/settings/accounts.ts +19 -6
  77. package/services/settings/config.ts +2 -2
  78. package/services/settings/cron.ts +2 -2
  79. package/services/settings/laws.client.ts +44 -5
  80. package/services/settings/laws.ts +357 -4
  81. package/services/settings/system.ts +6 -6
  82. package/services/sync/sync.client.ts +42 -14
  83. package/services/sync/sync.ts +162 -13
  84. package/services/wiki/collab.ts +1 -1
  85. package/services/wiki/wiki.client.ts +15 -2
  86. package/services/wiki/wiki.ts +122 -0
  87. package/svcs.ts +19 -1
@@ -28,7 +28,7 @@ import { TemplateData } from "../../resources/documents/templates/templates";
28
28
  import { ContentType } from "../../resources/common/content/content";
29
29
  import { DocumentRelation } from "../../resources/documents/relations/relations";
30
30
  import { DocumentReference } from "../../resources/documents/references/references";
31
- import { DocumentAccess } from "../../resources/documents/access/access";
31
+ import { Access } from "../../resources/access/access";
32
32
  import { Document } from "../../resources/documents/documents";
33
33
  import { DocumentShort } from "../../resources/documents/documents";
34
34
  import { PaginationResponse } from "../../resources/common/database/database";
@@ -124,9 +124,9 @@ export interface GetDocumentResponse {
124
124
  */
125
125
  document?: Document;
126
126
  /**
127
- * @generated from protobuf field: resources.documents.access.DocumentAccess access = 2
127
+ * @generated from protobuf field: resources.access.Access access = 2
128
128
  */
129
- access?: DocumentAccess;
129
+ access?: Access;
130
130
  }
131
131
  /**
132
132
  * @generated from protobuf message services.documents.GetDocumentReferencesRequest
@@ -350,9 +350,9 @@ export interface UpdateDocumentRequest {
350
350
  */
351
351
  meta?: DocumentMeta;
352
352
  /**
353
- * @generated from protobuf field: optional resources.documents.access.DocumentAccess access = 11
353
+ * @generated from protobuf field: optional resources.access.Access access = 11
354
354
  */
355
- access?: DocumentAccess;
355
+ access?: Access;
356
356
  /**
357
357
  * @generated from protobuf field: repeated resources.file.File files = 12
358
358
  */
@@ -512,9 +512,9 @@ export interface GetDocumentAccessRequest {
512
512
  */
513
513
  export interface GetDocumentAccessResponse {
514
514
  /**
515
- * @generated from protobuf field: resources.documents.access.DocumentAccess access = 1
515
+ * @generated from protobuf field: resources.access.Access access = 1
516
516
  */
517
- access?: DocumentAccess;
517
+ access?: Access;
518
518
  }
519
519
  /**
520
520
  * @generated from protobuf message services.documents.SetDocumentAccessRequest
@@ -525,9 +525,9 @@ export interface SetDocumentAccessRequest {
525
525
  */
526
526
  documentId: number;
527
527
  /**
528
- * @generated from protobuf field: resources.documents.access.DocumentAccess access = 2
528
+ * @generated from protobuf field: resources.access.Access access = 2
529
529
  */
530
- access?: DocumentAccess;
530
+ access?: Access;
531
531
  }
532
532
  /**
533
533
  * @generated from protobuf message services.documents.SetDocumentAccessResponse
@@ -914,7 +914,7 @@ class GetDocumentResponse$Type extends MessageType<GetDocumentResponse> {
914
914
  constructor() {
915
915
  super("services.documents.GetDocumentResponse", [
916
916
  { no: 1, name: "document", kind: "message", T: () => Document },
917
- { no: 2, name: "access", kind: "message", T: () => DocumentAccess }
917
+ { no: 2, name: "access", kind: "message", T: () => Access }
918
918
  ]);
919
919
  }
920
920
  create(value?: PartialMessage<GetDocumentResponse>): GetDocumentResponse {
@@ -931,8 +931,8 @@ class GetDocumentResponse$Type extends MessageType<GetDocumentResponse> {
931
931
  case /* resources.documents.Document document */ 1:
932
932
  message.document = Document.internalBinaryRead(reader, reader.uint32(), options, message.document);
933
933
  break;
934
- case /* resources.documents.access.DocumentAccess access */ 2:
935
- message.access = DocumentAccess.internalBinaryRead(reader, reader.uint32(), options, message.access);
934
+ case /* resources.access.Access access */ 2:
935
+ message.access = Access.internalBinaryRead(reader, reader.uint32(), options, message.access);
936
936
  break;
937
937
  default:
938
938
  let u = options.readUnknownField;
@@ -949,9 +949,9 @@ class GetDocumentResponse$Type extends MessageType<GetDocumentResponse> {
949
949
  /* resources.documents.Document document = 1; */
950
950
  if (message.document)
951
951
  Document.internalBinaryWrite(message.document, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
952
- /* resources.documents.access.DocumentAccess access = 2; */
952
+ /* resources.access.Access access = 2; */
953
953
  if (message.access)
954
- DocumentAccess.internalBinaryWrite(message.access, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
954
+ Access.internalBinaryWrite(message.access, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
955
955
  let u = options.writeUnknownFields;
956
956
  if (u !== false)
957
957
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -1948,8 +1948,8 @@ class UpdateDocumentRequest$Type extends MessageType<UpdateDocumentRequest> {
1948
1948
  { no: 5, name: "content_type", kind: "enum", T: () => ["resources.common.content.ContentType", ContentType, "CONTENT_TYPE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
1949
1949
  { no: 6, name: "data", kind: "message", T: () => DocumentData },
1950
1950
  { no: 7, name: "meta", kind: "message", T: () => DocumentMeta, options: { "buf.validate.field": { required: true } } },
1951
- { no: 11, name: "access", kind: "message", T: () => DocumentAccess },
1952
- { no: 12, name: "files", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => File, options: { "tagger.tags": "alias:\"files\"" } }
1951
+ { no: 11, name: "access", kind: "message", T: () => Access },
1952
+ { no: 12, name: "files", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => File, options: { "buf.validate.field": { repeated: { maxItems: "5" } }, "tagger.tags": "alias:\"files\"" } }
1953
1953
  ]);
1954
1954
  }
1955
1955
  create(value?: PartialMessage<UpdateDocumentRequest>): UpdateDocumentRequest {
@@ -1988,8 +1988,8 @@ class UpdateDocumentRequest$Type extends MessageType<UpdateDocumentRequest> {
1988
1988
  case /* resources.documents.DocumentMeta meta */ 7:
1989
1989
  message.meta = DocumentMeta.internalBinaryRead(reader, reader.uint32(), options, message.meta);
1990
1990
  break;
1991
- case /* optional resources.documents.access.DocumentAccess access */ 11:
1992
- message.access = DocumentAccess.internalBinaryRead(reader, reader.uint32(), options, message.access);
1991
+ case /* optional resources.access.Access access */ 11:
1992
+ message.access = Access.internalBinaryRead(reader, reader.uint32(), options, message.access);
1993
1993
  break;
1994
1994
  case /* repeated resources.file.File files */ 12:
1995
1995
  message.files.push(File.internalBinaryRead(reader, reader.uint32(), options));
@@ -2027,9 +2027,9 @@ class UpdateDocumentRequest$Type extends MessageType<UpdateDocumentRequest> {
2027
2027
  /* resources.documents.DocumentMeta meta = 7; */
2028
2028
  if (message.meta)
2029
2029
  DocumentMeta.internalBinaryWrite(message.meta, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
2030
- /* optional resources.documents.access.DocumentAccess access = 11; */
2030
+ /* optional resources.access.Access access = 11; */
2031
2031
  if (message.access)
2032
- DocumentAccess.internalBinaryWrite(message.access, writer.tag(11, WireType.LengthDelimited).fork(), options).join();
2032
+ Access.internalBinaryWrite(message.access, writer.tag(11, WireType.LengthDelimited).fork(), options).join();
2033
2033
  /* repeated resources.file.File files = 12; */
2034
2034
  for (let i = 0; i < message.files.length; i++)
2035
2035
  File.internalBinaryWrite(message.files[i], writer.tag(12, WireType.LengthDelimited).fork(), options).join();
@@ -2049,7 +2049,7 @@ class ListDocumentActivityRequest$Type extends MessageType<ListDocumentActivityR
2049
2049
  super("services.documents.ListDocumentActivityRequest", [
2050
2050
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
2051
2051
  { no: 2, name: "document_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
2052
- { no: 3, name: "activity_types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.documents.activity.DocActivityType", DocActivityType, "DOC_ACTIVITY_TYPE_"], options: { "buf.validate.field": { repeated: { maxItems: "10", items: { enum: { in: [13, 14, 15, 16, 17, 18] } } } } } }
2052
+ { no: 3, name: "activity_types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.documents.activity.DocActivityType", DocActivityType, "DOC_ACTIVITY_TYPE_"], options: { "buf.validate.field": { repeated: { maxItems: "10", items: { enum: { definedOnly: true, in: [13, 14, 15, 16, 17, 18] } } } } } }
2053
2053
  ]);
2054
2054
  }
2055
2055
  create(value?: PartialMessage<ListDocumentActivityRequest>): ListDocumentActivityRequest {
@@ -2280,7 +2280,7 @@ class CreateDocumentReqRequest$Type extends MessageType<CreateDocumentReqRequest
2280
2280
  constructor() {
2281
2281
  super("services.documents.CreateDocumentReqRequest", [
2282
2282
  { no: 1, name: "document_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
2283
- { no: 2, name: "request_type", kind: "enum", T: () => ["resources.documents.activity.DocActivityType", DocActivityType, "DOC_ACTIVITY_TYPE_"], options: { "buf.validate.field": { enum: { in: [13, 14, 15, 16, 17, 18] } } } },
2283
+ { no: 2, name: "request_type", kind: "enum", T: () => ["resources.documents.activity.DocActivityType", DocActivityType, "DOC_ACTIVITY_TYPE_"], options: { "buf.validate.field": { enum: { definedOnly: true, in: [13, 14, 15, 16, 17, 18] } } } },
2284
2284
  { no: 3, name: "reason", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } }, "codegen.sanitizer.sanitizer": { enabled: true } } },
2285
2285
  { no: 4, name: "data", kind: "message", T: () => DocActivityData }
2286
2286
  ]);
@@ -2649,7 +2649,7 @@ export const GetDocumentAccessRequest = new GetDocumentAccessRequest$Type();
2649
2649
  class GetDocumentAccessResponse$Type extends MessageType<GetDocumentAccessResponse> {
2650
2650
  constructor() {
2651
2651
  super("services.documents.GetDocumentAccessResponse", [
2652
- { no: 1, name: "access", kind: "message", T: () => DocumentAccess, options: { "buf.validate.field": { required: true } } }
2652
+ { no: 1, name: "access", kind: "message", T: () => Access, options: { "buf.validate.field": { required: true } } }
2653
2653
  ]);
2654
2654
  }
2655
2655
  create(value?: PartialMessage<GetDocumentAccessResponse>): GetDocumentAccessResponse {
@@ -2663,8 +2663,8 @@ class GetDocumentAccessResponse$Type extends MessageType<GetDocumentAccessRespon
2663
2663
  while (reader.pos < end) {
2664
2664
  let [fieldNo, wireType] = reader.tag();
2665
2665
  switch (fieldNo) {
2666
- case /* resources.documents.access.DocumentAccess access */ 1:
2667
- message.access = DocumentAccess.internalBinaryRead(reader, reader.uint32(), options, message.access);
2666
+ case /* resources.access.Access access */ 1:
2667
+ message.access = Access.internalBinaryRead(reader, reader.uint32(), options, message.access);
2668
2668
  break;
2669
2669
  default:
2670
2670
  let u = options.readUnknownField;
@@ -2678,9 +2678,9 @@ class GetDocumentAccessResponse$Type extends MessageType<GetDocumentAccessRespon
2678
2678
  return message;
2679
2679
  }
2680
2680
  internalBinaryWrite(message: GetDocumentAccessResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
2681
- /* resources.documents.access.DocumentAccess access = 1; */
2681
+ /* resources.access.Access access = 1; */
2682
2682
  if (message.access)
2683
- DocumentAccess.internalBinaryWrite(message.access, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
2683
+ Access.internalBinaryWrite(message.access, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
2684
2684
  let u = options.writeUnknownFields;
2685
2685
  if (u !== false)
2686
2686
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -2696,7 +2696,7 @@ class SetDocumentAccessRequest$Type extends MessageType<SetDocumentAccessRequest
2696
2696
  constructor() {
2697
2697
  super("services.documents.SetDocumentAccessRequest", [
2698
2698
  { no: 1, name: "document_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
2699
- { no: 2, name: "access", kind: "message", T: () => DocumentAccess, options: { "buf.validate.field": { required: true } } }
2699
+ { no: 2, name: "access", kind: "message", T: () => Access, options: { "buf.validate.field": { required: true } } }
2700
2700
  ]);
2701
2701
  }
2702
2702
  create(value?: PartialMessage<SetDocumentAccessRequest>): SetDocumentAccessRequest {
@@ -2714,8 +2714,8 @@ class SetDocumentAccessRequest$Type extends MessageType<SetDocumentAccessRequest
2714
2714
  case /* int64 document_id */ 1:
2715
2715
  message.documentId = reader.int64().toNumber();
2716
2716
  break;
2717
- case /* resources.documents.access.DocumentAccess access */ 2:
2718
- message.access = DocumentAccess.internalBinaryRead(reader, reader.uint32(), options, message.access);
2717
+ case /* resources.access.Access access */ 2:
2718
+ message.access = Access.internalBinaryRead(reader, reader.uint32(), options, message.access);
2719
2719
  break;
2720
2720
  default:
2721
2721
  let u = options.readUnknownField;
@@ -2732,9 +2732,9 @@ class SetDocumentAccessRequest$Type extends MessageType<SetDocumentAccessRequest
2732
2732
  /* int64 document_id = 1; */
2733
2733
  if (message.documentId !== 0)
2734
2734
  writer.tag(1, WireType.Varint).int64(message.documentId);
2735
- /* resources.documents.access.DocumentAccess access = 2; */
2735
+ /* resources.access.Access access = 2; */
2736
2736
  if (message.access)
2737
- DocumentAccess.internalBinaryWrite(message.access, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
2737
+ Access.internalBinaryWrite(message.access, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
2738
2738
  let u = options.writeUnknownFields;
2739
2739
  if (u !== false)
2740
2740
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -2790,7 +2790,7 @@ class ListUserDocumentsRequest$Type extends MessageType<ListUserDocumentsRequest
2790
2790
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
2791
2791
  { no: 2, name: "sort", kind: "message", T: () => Sort },
2792
2792
  { no: 3, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { gt: 0 } } } },
2793
- { no: 4, name: "relations", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.documents.relations.DocRelation", DocRelation, "DOC_RELATION_"], options: { "buf.validate.field": { repeated: { maxItems: "3" } } } },
2793
+ { no: 4, name: "relations", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.documents.relations.DocRelation", DocRelation, "DOC_RELATION_"], options: { "buf.validate.field": { repeated: { maxItems: "3", items: { enum: { definedOnly: true } } } } } },
2794
2794
  { no: 5, name: "closed", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
2795
2795
  { no: 6, name: "include_created", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
2796
2796
  ]);
@@ -3257,16 +3257,16 @@ export const DocumentsService = new ServiceType("services.documents.DocumentsSer
3257
3257
  { name: "ListDocuments", options: { "codegen.perms.perms": { enabled: true } }, I: ListDocumentsRequest, O: ListDocumentsResponse },
3258
3258
  { name: "GetDocument", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: GetDocumentRequest, O: GetDocumentResponse },
3259
3259
  { name: "CreateDocument", options: { "codegen.perms.perms": { enabled: true, name: "UpdateDocument" } }, I: CreateDocumentRequest, O: CreateDocumentResponse },
3260
- { name: "UpdateDocument", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Access", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["Own", "Lower_Rank", "Same_Rank", "Any"] }] } }, I: UpdateDocumentRequest, O: UpdateDocumentResponse },
3260
+ { name: "UpdateDocument", options: { "codegen.perms.perms": { enabled: true, names: ["UpdateDocument", "ListDocuments"], attrs: [{ key: "Access", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["Own", "Lower_Rank", "Same_Rank", "Any"] }] } }, I: UpdateDocumentRequest, O: UpdateDocumentResponse },
3261
3261
  { name: "DeleteDocument", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Access", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["Own", "Lower_Rank", "Same_Rank", "Any"] }] } }, I: DeleteDocumentRequest, O: DeleteDocumentResponse },
3262
3262
  { name: "ToggleDocument", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Access", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["Own", "Lower_Rank", "Same_Rank", "Any"] }] } }, I: ToggleDocumentRequest, O: ToggleDocumentResponse },
3263
3263
  { name: "ChangeDocumentOwner", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Access", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["Own", "Lower_Rank", "Same_Rank", "Any"] }] } }, I: ChangeDocumentOwnerRequest, O: ChangeDocumentOwnerResponse },
3264
3264
  { name: "GetDocumentReferences", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: GetDocumentReferencesRequest, O: GetDocumentReferencesResponse },
3265
3265
  { name: "GetDocumentRelations", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: GetDocumentRelationsRequest, O: GetDocumentRelationsResponse },
3266
- { name: "AddDocumentReference", options: { "codegen.perms.perms": { enabled: true } }, I: AddDocumentReferenceRequest, O: AddDocumentReferenceResponse },
3267
- { name: "RemoveDocumentReference", options: { "codegen.perms.perms": { enabled: true, name: "AddDocumentReference" } }, I: RemoveDocumentReferenceRequest, O: RemoveDocumentReferenceResponse },
3268
- { name: "AddDocumentRelation", options: { "codegen.perms.perms": { enabled: true } }, I: AddDocumentRelationRequest, O: AddDocumentRelationResponse },
3269
- { name: "RemoveDocumentRelation", options: { "codegen.perms.perms": { enabled: true, name: "AddDocumentRelation" } }, I: RemoveDocumentRelationRequest, O: RemoveDocumentRelationResponse },
3266
+ { name: "AddDocumentReference", options: { "codegen.perms.perms": { enabled: true, names: ["AddDocumentReference", "ListDocuments"] } }, I: AddDocumentReferenceRequest, O: AddDocumentReferenceResponse },
3267
+ { name: "RemoveDocumentReference", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: RemoveDocumentReferenceRequest, O: RemoveDocumentReferenceResponse },
3268
+ { name: "AddDocumentRelation", options: { "codegen.perms.perms": { enabled: true, names: ["AddDocumentRelation", "ListDocuments"] } }, I: AddDocumentRelationRequest, O: AddDocumentRelationResponse },
3269
+ { name: "RemoveDocumentRelation", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: RemoveDocumentRelationRequest, O: RemoveDocumentRelationResponse },
3270
3270
  { name: "GetDocumentAccess", options: { "codegen.perms.perms": { enabled: true, name: "ListDocuments" } }, I: GetDocumentAccessRequest, O: GetDocumentAccessResponse },
3271
3271
  { name: "SetDocumentAccess", options: { "codegen.perms.perms": { enabled: true, name: "UpdateDocument" } }, I: SetDocumentAccessRequest, O: SetDocumentAccessResponse },
3272
3272
  { name: "ListDocumentActivity", options: { "codegen.perms.perms": { enabled: true } }, I: ListDocumentActivityRequest, O: ListDocumentActivityResponse },
@@ -39,6 +39,10 @@ export interface GetStatsRequest {
39
39
  * @generated from protobuf field: resources.stats.StatsCategory category = 4
40
40
  */
41
41
  category: StatsCategory;
42
+ /**
43
+ * @generated from protobuf field: repeated string jobs = 5
44
+ */
45
+ jobs: string[];
42
46
  }
43
47
  /**
44
48
  * @generated from protobuf message services.documents.GetStatsResponse
@@ -80,13 +84,15 @@ class GetStatsRequest$Type extends MessageType<GetStatsRequest> {
80
84
  { no: 1, name: "start", kind: "message", T: () => Timestamp },
81
85
  { no: 2, name: "end", kind: "message", T: () => Timestamp },
82
86
  { no: 3, name: "period", kind: "enum", T: () => ["resources.stats.StatsPeriod", StatsPeriod, "STATS_PERIOD_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
83
- { no: 4, name: "category", kind: "enum", T: () => ["resources.stats.StatsCategory", StatsCategory, "STATS_CATEGORY_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } }
87
+ { no: 4, name: "category", kind: "enum", T: () => ["resources.stats.StatsCategory", StatsCategory, "STATS_CATEGORY_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
88
+ { no: 5, name: "jobs", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { repeated: { maxItems: "15", items: { string: { maxLen: "40" } } } } } }
84
89
  ]);
85
90
  }
86
91
  create(value?: PartialMessage<GetStatsRequest>): GetStatsRequest {
87
92
  const message = globalThis.Object.create((this.messagePrototype!));
88
93
  message.period = 0;
89
94
  message.category = 0;
95
+ message.jobs = [];
90
96
  if (value !== undefined)
91
97
  reflectionMergePartial<GetStatsRequest>(this, message, value);
92
98
  return message;
@@ -108,6 +114,9 @@ class GetStatsRequest$Type extends MessageType<GetStatsRequest> {
108
114
  case /* resources.stats.StatsCategory category */ 4:
109
115
  message.category = reader.int32();
110
116
  break;
117
+ case /* repeated string jobs */ 5:
118
+ message.jobs.push(reader.string());
119
+ break;
111
120
  default:
112
121
  let u = options.readUnknownField;
113
122
  if (u === "throw")
@@ -132,6 +141,9 @@ class GetStatsRequest$Type extends MessageType<GetStatsRequest> {
132
141
  /* resources.stats.StatsCategory category = 4; */
133
142
  if (message.category !== 0)
134
143
  writer.tag(4, WireType.Varint).int32(message.category);
144
+ /* repeated string jobs = 5; */
145
+ for (let i = 0; i < message.jobs.length; i++)
146
+ writer.tag(5, WireType.LengthDelimited).string(message.jobs[i]);
135
147
  let u = options.writeUnknownFields;
136
148
  if (u !== false)
137
149
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -241,5 +253,5 @@ export const GetStatsResponse = new GetStatsResponse$Type();
241
253
  * @generated ServiceType for protobuf service services.documents.StatsService
242
254
  */
243
255
  export const StatsService = new ServiceType("services.documents.StatsService", [
244
- { name: "GetStats", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Categories", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["PenaltyCalculator"] }] } }, I: GetStatsRequest, O: GetStatsResponse }
256
+ { name: "GetStats", options: { "codegen.perms.perms": { enabled: true, attrs: [{ key: "Categories", type: "ATTRIBUTE_TYPE_STRING_LIST", validStringList: ["PenaltyCalculator"] }, { key: "Jobs", type: "ATTRIBUTE_TYPE_JOB_LIST" }] } }, I: GetStatsRequest, O: GetStatsResponse }
245
257
  ], { "codegen.perms.perms_svc": { order: 58, icon: "i-mdi-graph-box-multiple-outline" } });
@@ -588,4 +588,4 @@ export const TemplatesService = new ServiceType("services.documents.TemplatesSer
588
588
  { name: "CreateTemplate", options: { "codegen.perms.perms": { enabled: true } }, I: CreateTemplateRequest, O: CreateTemplateResponse },
589
589
  { name: "UpdateTemplate", options: { "codegen.perms.perms": { enabled: true, name: "CreateTemplate" } }, I: UpdateTemplateRequest, O: UpdateTemplateResponse },
590
590
  { name: "DeleteTemplate", options: { "codegen.perms.perms": { enabled: true } }, I: DeleteTemplateRequest, O: DeleteTemplateResponse }
591
- ], { "codegen.perms.perms_svc": { name: "documents.DocumentsService" } });
591
+ ], { "codegen.perms.perms_svc": { order: 55, icon: "i-mdi-file-code" } });
@@ -255,8 +255,8 @@ export const DeleteFileByPathResponse = new DeleteFileByPathResponse$Type();
255
255
  * @generated ServiceType for protobuf service services.filestore.FilestoreService
256
256
  */
257
257
  export const FilestoreService = new ServiceType("services.filestore.FilestoreService", [
258
- { name: "Upload", clientStreaming: true, options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: UploadFileRequest, O: UploadFileResponse },
259
- { name: "ListFiles", options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: ListFilesRequest, O: ListFilesResponse },
260
- { name: "DeleteFile", options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: DeleteFileRequest, O: DeleteFileResponse },
261
- { name: "DeleteFileByPath", options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: DeleteFileByPathRequest, O: DeleteFileByPathResponse }
258
+ { name: "Upload", clientStreaming: true, options: { "codegen.perms.perms": { enabled: true, name: "ConfigAdmin" } }, I: UploadFileRequest, O: UploadFileResponse },
259
+ { name: "ListFiles", options: { "codegen.perms.perms": { enabled: true, name: "ConfigAdmin" } }, I: ListFilesRequest, O: ListFilesResponse },
260
+ { name: "DeleteFile", options: { "codegen.perms.perms": { enabled: true, name: "ConfigAdmin" } }, I: DeleteFileRequest, O: DeleteFileResponse },
261
+ { name: "DeleteFileByPath", options: { "codegen.perms.perms": { enabled: true, name: "ConfigAdmin" } }, I: DeleteFileByPathRequest, O: DeleteFileByPathResponse }
262
262
  ]);
@@ -234,10 +234,10 @@ class ListColleaguesRequest$Type extends MessageType<ListColleaguesRequest> {
234
234
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
235
235
  { no: 2, name: "sort", kind: "message", T: () => Sort },
236
236
  { no: 3, name: "search", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "64" } } } },
237
- { no: 4, name: "user_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { repeated: { items: { int32: { gte: 0 } } } } } },
237
+ { no: 4, name: "user_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { repeated: { maxItems: "10", items: { int32: { gte: 0 } } } } } },
238
238
  { no: 5, name: "user_only", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
239
239
  { no: 6, name: "absent", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
240
- { no: 7, name: "label_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
240
+ { no: 7, name: "label_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/, options: { "buf.validate.field": { repeated: { maxItems: "10" } } } },
241
241
  { no: 8, name: "name_prefix", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "12" } } } },
242
242
  { no: 9, name: "name_suffix", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "12" } } } }
243
243
  ]);
@@ -593,7 +593,7 @@ class ListColleagueActivityRequest$Type extends MessageType<ListColleagueActivit
593
593
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
594
594
  { no: 2, name: "sort", kind: "message", T: () => Sort },
595
595
  { no: 3, name: "user_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 5 /*ScalarType.INT32*/ },
596
- { no: 4, name: "activity_types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.jobs.colleagues.activity.ColleagueActivityType", ColleagueActivityType, "COLLEAGUE_ACTIVITY_TYPE_"], options: { "buf.validate.field": { repeated: { maxItems: "10" } } } }
596
+ { no: 4, name: "activity_types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.jobs.colleagues.activity.ColleagueActivityType", ColleagueActivityType, "COLLEAGUE_ACTIVITY_TYPE_"], options: { "buf.validate.field": { repeated: { maxItems: "10", items: { enum: { definedOnly: true } } } } } }
597
597
  ]);
598
598
  }
599
599
  create(value?: PartialMessage<ListColleagueActivityRequest>): ListColleagueActivityRequest {
@@ -1126,4 +1126,4 @@ export const ColleaguesService = new ServiceType("services.jobs.ColleaguesServic
1126
1126
  { name: "GetColleagueLabels", options: { "codegen.perms.perms": { enabled: true, name: "GetColleague" } }, I: GetColleagueLabelsRequest, O: GetColleagueLabelsResponse },
1127
1127
  { name: "ManageLabels", options: { "codegen.perms.perms": { enabled: true } }, I: ManageLabelsRequest, O: ManageLabelsResponse },
1128
1128
  { name: "GetColleagueLabelsStats", options: { "codegen.perms.perms": { enabled: true, name: "GetColleague" } }, I: GetColleagueLabelsStatsRequest, O: GetColleagueLabelsStatsResponse }
1129
- ], { "codegen.perms.perms_svc": { name: "jobs.JobsService" } });
1129
+ ], { "codegen.perms.perms_svc": { order: 61, icon: "i-mdi-account-group" } });
@@ -143,7 +143,7 @@ class ListConductEntriesRequest$Type extends MessageType<ListConductEntriesReque
143
143
  super("services.jobs.ListConductEntriesRequest", [
144
144
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
145
145
  { no: 2, name: "sort", kind: "message", T: () => Sort },
146
- { no: 3, name: "types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.jobs.conduct.ConductType", ConductType, "CONDUCT_TYPE_"] },
146
+ { no: 3, name: "types", kind: "enum", repeat: 1 /*RepeatType.PACKED*/, T: () => ["resources.jobs.conduct.ConductType", ConductType, "CONDUCT_TYPE_"], options: { "buf.validate.field": { repeated: { items: { enum: { definedOnly: true } } } } } },
147
147
  { no: 4, name: "show_expired", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
148
148
  { no: 5, name: "show_drafts", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
149
149
  { no: 6, name: "user_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 5 /*ScalarType.INT32*/ },
@@ -678,4 +678,4 @@ export const ConductService = new ServiceType("services.jobs.ConductService", [
678
678
  { name: "UpdateConductEntry", options: { "codegen.perms.perms": { enabled: true } }, I: UpdateConductEntryRequest, O: UpdateConductEntryResponse },
679
679
  { name: "DeleteConductEntry", options: { "codegen.perms.perms": { enabled: true } }, I: DeleteConductEntryRequest, O: DeleteConductEntryResponse },
680
680
  { name: "UploadFile", clientStreaming: true, options: { "codegen.perms.perms": { enabled: true, names: ["CreateConductEntry", "UpdateConductEntry"] } }, I: UploadFileRequest, O: UploadFileResponse }
681
- ], { "codegen.perms.perms_svc": { order: 67, icon: "i-mdi-list-status" } });
681
+ ], { "codegen.perms.perms_svc": { order: 65, icon: "i-mdi-list-status" } });
@@ -0,0 +1,22 @@
1
+ // @generated by protobuf-ts 2.11.1 with parameter force_server_none,long_type_number,optimize_speed,ts_nocheck
2
+ // @generated from protobuf file "services/jobs/groups.proto" (package "services.jobs", syntax proto3)
3
+ // tslint:disable
4
+ // @ts-nocheck
5
+ import type { RpcTransport } from "@protobuf-ts/runtime-rpc";
6
+ import type { ServiceInfo } from "@protobuf-ts/runtime-rpc";
7
+ import { GroupsService } from "./groups";
8
+ /**
9
+ * @generated from protobuf service services.jobs.GroupsService
10
+ */
11
+ export interface IGroupsServiceClient {
12
+ }
13
+ /**
14
+ * @generated from protobuf service services.jobs.GroupsService
15
+ */
16
+ export class GroupsServiceClient implements IGroupsServiceClient, ServiceInfo {
17
+ typeName = GroupsService.typeName;
18
+ methods = GroupsService.methods;
19
+ options = GroupsService.options;
20
+ constructor(private readonly _transport: RpcTransport) {
21
+ }
22
+ }
@@ -0,0 +1,9 @@
1
+ // @generated by protobuf-ts 2.11.1 with parameter force_server_none,long_type_number,optimize_speed,ts_nocheck
2
+ // @generated from protobuf file "services/jobs/groups.proto" (package "services.jobs", syntax proto3)
3
+ // tslint:disable
4
+ // @ts-nocheck
5
+ import { ServiceType } from "@protobuf-ts/runtime-rpc";
6
+ /**
7
+ * @generated ServiceType for protobuf service services.jobs.GroupsService
8
+ */
9
+ export const GroupsService = new ServiceType("services.jobs.GroupsService", [], { "codegen.perms.perms_svc": { order: 66, icon: "i-mdi-account-group-outline" } });
@@ -212,8 +212,8 @@ class ListTimeclockRequest$Type extends MessageType<ListTimeclockRequest> {
212
212
  super("services.jobs.ListTimeclockRequest", [
213
213
  { no: 1, name: "pagination", kind: "message", T: () => PaginationRequest, options: { "buf.validate.field": { required: true } } },
214
214
  { no: 2, name: "sort", kind: "message", T: () => Sort },
215
- { no: 3, name: "user_mode", kind: "enum", T: () => ["resources.jobs.timeclock.TimeclockViewMode", TimeclockViewMode, "TIMECLOCK_VIEW_MODE_"] },
216
- { no: 4, name: "mode", kind: "enum", T: () => ["resources.jobs.timeclock.TimeclockMode", TimeclockMode, "TIMECLOCK_MODE_"] },
215
+ { no: 3, name: "user_mode", kind: "enum", T: () => ["resources.jobs.timeclock.TimeclockViewMode", TimeclockViewMode, "TIMECLOCK_VIEW_MODE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
216
+ { no: 4, name: "mode", kind: "enum", T: () => ["resources.jobs.timeclock.TimeclockMode", TimeclockMode, "TIMECLOCK_MODE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
217
217
  { no: 5, name: "date", kind: "message", T: () => DateRange },
218
218
  { no: 6, name: "per_day", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
219
219
  { no: 7, name: "user_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { repeated: { maxItems: "15" } } } }
@@ -705,4 +705,4 @@ export const SettingsService = new ServiceType("services.mailer.SettingsService"
705
705
  { name: "DeleteTemplate", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: DeleteTemplateRequest, O: DeleteTemplateResponse },
706
706
  { name: "GetEmailSettings", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: GetEmailSettingsRequest, O: GetEmailSettingsResponse },
707
707
  { name: "SetEmailSettings", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: SetEmailSettingsRequest, O: SetEmailSettingsResponse }
708
- ], { "codegen.perms.perms_svc": { name: "mailer.MailerService" } });
708
+ ], { "codegen.perms.perms_svc": { namespace: "mailer", service: "MailerService" } });
@@ -1333,11 +1333,11 @@ export const ThreadService = new ServiceType("services.mailer.ThreadService", [
1333
1333
  { name: "ListThreads", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: ListThreadsRequest, O: ListThreadsResponse },
1334
1334
  { name: "GetThread", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: GetThreadRequest, O: GetThreadResponse },
1335
1335
  { name: "CreateThread", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: CreateThreadRequest, O: CreateThreadResponse },
1336
- { name: "DeleteThread", options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: DeleteThreadRequest, O: DeleteThreadResponse },
1336
+ { name: "DeleteThread", options: { "codegen.perms.perms": { enabled: true, name: "JobAdmin" } }, I: DeleteThreadRequest, O: DeleteThreadResponse },
1337
1337
  { name: "GetThreadState", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: GetThreadStateRequest, O: GetThreadStateResponse },
1338
1338
  { name: "SetThreadState", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: SetThreadStateRequest, O: SetThreadStateResponse },
1339
1339
  { name: "SearchThreads", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: SearchThreadsRequest, O: SearchThreadsResponse },
1340
1340
  { name: "ListThreadMessages", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: ListThreadMessagesRequest, O: ListThreadMessagesResponse },
1341
1341
  { name: "PostMessage", options: { "codegen.perms.perms": { enabled: true, name: "ListEmails" } }, I: PostMessageRequest, O: PostMessageResponse },
1342
- { name: "DeleteMessage", options: { "codegen.perms.perms": { enabled: true, name: "Superuser" } }, I: DeleteMessageRequest, O: DeleteMessageResponse }
1343
- ], { "codegen.perms.perms_svc": { name: "mailer.MailerService" } });
1342
+ { name: "DeleteMessage", options: { "codegen.perms.perms": { enabled: true, name: "JobAdmin" } }, I: DeleteMessageRequest, O: DeleteMessageResponse }
1343
+ ], { "codegen.perms.perms_svc": { namespace: "mailer", service: "MailerService" } });
@@ -602,8 +602,8 @@ export const GetUserExamResponse = new GetUserExamResponse$Type();
602
602
  * @generated ServiceType for protobuf service services.qualifications.ExamService
603
603
  */
604
604
  export const ExamService = new ServiceType("services.qualifications.ExamService", [
605
- { name: "GetExamInfo", options: { "codegen.perms.perms": { enabled: true, name: "ListQualifications" } }, I: GetExamInfoRequest, O: GetExamInfoResponse },
606
- { name: "TakeExam", options: { "codegen.perms.perms": { enabled: true, name: "ListQualifications" } }, I: TakeExamRequest, O: TakeExamResponse },
607
- { name: "SubmitExam", options: { "codegen.perms.perms": { enabled: true, name: "ListQualifications" } }, I: SubmitExamRequest, O: SubmitExamResponse },
608
- { name: "GetUserExam", options: { "codegen.perms.perms": { enabled: true, name: "ListQualifications" } }, I: GetUserExamRequest, O: GetUserExamResponse }
609
- ], { "codegen.perms.perms_svc": { name: "qualifications.QualificationsService" } });
605
+ { name: "GetExamInfo", options: { "codegen.perms.perms": { enabled: true, namespace: "qualifications", service: "QualificationsService", name: "ListQualifications" } }, I: GetExamInfoRequest, O: GetExamInfoResponse },
606
+ { name: "TakeExam", options: { "codegen.perms.perms": { enabled: true, namespace: "qualifications", service: "QualificationsService", name: "ListQualifications" } }, I: TakeExamRequest, O: TakeExamResponse },
607
+ { name: "SubmitExam", options: { "codegen.perms.perms": { enabled: true, namespace: "qualifications", service: "QualificationsService", name: "ListQualifications" } }, I: SubmitExamRequest, O: SubmitExamResponse },
608
+ { name: "GetUserExam", options: { "codegen.perms.perms": { enabled: true, namespace: "qualifications", service: "QualificationsService", name: "ListQualifications" } }, I: GetUserExamRequest, O: GetUserExamResponse }
609
+ ]);