@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
@@ -57,6 +57,27 @@ export interface UserInfo {
57
57
  * @generated from protobuf field: bool superuser = 10
58
58
  */
59
59
  superuser: boolean;
60
+ /**
61
+ * @generated from protobuf field: bool can_be_config_admin = 12
62
+ */
63
+ canBeConfigAdmin: boolean;
64
+ /**
65
+ * @generated from protobuf field: optional resources.userinfo.OriginalJob original_job = 11
66
+ */
67
+ originalJob?: OriginalJob;
68
+ }
69
+ /**
70
+ * @generated from protobuf message resources.userinfo.OriginalJob
71
+ */
72
+ export interface OriginalJob {
73
+ /**
74
+ * @generated from protobuf field: string job = 1
75
+ */
76
+ job: string;
77
+ /**
78
+ * @generated from protobuf field: int32 job_grade = 2
79
+ */
80
+ jobGrade: number;
60
81
  }
61
82
  /**
62
83
  * PollReq: published to `userinfo.poll.request` when an active user connects or requests a refresh.
@@ -78,7 +99,7 @@ export interface PollReq {
78
99
  userId: number;
79
100
  }
80
101
  /**
81
- * UserInfoChanged used to signal Job or JobGrade changes.
102
+ * UserInfoChanged used to signal live primary job or job grade changes.
82
103
  *
83
104
  * @generated from protobuf message resources.userinfo.UserInfoChanged
84
105
  */
@@ -101,12 +122,6 @@ export interface UserInfoChanged {
101
122
  * @generated from protobuf field: resources.timestamp.Timestamp changed_at = 3
102
123
  */
103
124
  changedAt?: Timestamp;
104
- /**
105
- * Previous job title
106
- *
107
- * @generated from protobuf field: string old_job = 4
108
- */
109
- oldJob: string;
110
125
  /**
111
126
  * New job title
112
127
  *
@@ -117,12 +132,6 @@ export interface UserInfoChanged {
117
132
  * @generated from protobuf field: optional string new_job_label = 6
118
133
  */
119
134
  newJobLabel?: string;
120
- /**
121
- * Previous job grade
122
- *
123
- * @generated from protobuf field: int32 old_job_grade = 7
124
- */
125
- oldJobGrade: number;
126
135
  /**
127
136
  * New job grade
128
137
  *
@@ -135,18 +144,43 @@ export interface UserInfoChanged {
135
144
  * @generated from protobuf field: optional string new_job_grade_label = 9
136
145
  */
137
146
  newJobGradeLabel?: string;
147
+ }
148
+ /**
149
+ * AccountGroupsChanged used to signal live account group changes.
150
+ *
151
+ * @generated from protobuf message resources.userinfo.AccountGroupsChanged
152
+ */
153
+ export interface AccountGroupsChanged {
154
+ /**
155
+ * The account the user belongs to
156
+ *
157
+ * @generated from protobuf field: int64 account_id = 1
158
+ */
159
+ accountId: number;
160
+ /**
161
+ * Timestamp of when the change was detected
162
+ *
163
+ * @generated from protobuf field: resources.timestamp.Timestamp changed_at = 2
164
+ */
165
+ changedAt?: Timestamp;
138
166
  /**
139
- * Can the user be superuser (by group or license)
167
+ * New account groups
140
168
  *
141
- * @generated from protobuf field: optional bool can_be_superuser = 10
169
+ * @generated from protobuf field: resources.accounts.AccountGroups new_groups = 3
142
170
  */
143
- canBeSuperuser?: boolean;
171
+ newGroups?: AccountGroups;
144
172
  /**
145
- * Superuser state
173
+ * Whether the account can enter superuser mode after the change
146
174
  *
147
- * @generated from protobuf field: optional bool superuser = 11
175
+ * @generated from protobuf field: bool can_be_superuser = 4
148
176
  */
149
- superuser?: boolean;
177
+ canBeSuperuser: boolean;
178
+ /**
179
+ * Whether the account can access config-admin gated screens and RPCs after the change
180
+ *
181
+ * @generated from protobuf field: bool can_be_config_admin = 5
182
+ */
183
+ canBeConfigAdmin: boolean;
150
184
  }
151
185
  // @generated message type with reflection information, may provide speed optimized methods
152
186
  class UserInfo$Type extends MessageType<UserInfo> {
@@ -161,7 +195,9 @@ class UserInfo$Type extends MessageType<UserInfo> {
161
195
  { no: 7, name: "job_grade", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
162
196
  { no: 8, name: "groups", kind: "message", T: () => AccountGroups },
163
197
  { no: 9, name: "can_be_superuser", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
164
- { no: 10, name: "superuser", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
198
+ { no: 10, name: "superuser", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
199
+ { no: 12, name: "can_be_config_admin", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
200
+ { no: 11, name: "original_job", kind: "message", T: () => OriginalJob }
165
201
  ]);
166
202
  }
167
203
  create(value?: PartialMessage<UserInfo>): UserInfo {
@@ -174,6 +210,7 @@ class UserInfo$Type extends MessageType<UserInfo> {
174
210
  message.jobGrade = 0;
175
211
  message.canBeSuperuser = false;
176
212
  message.superuser = false;
213
+ message.canBeConfigAdmin = false;
177
214
  if (value !== undefined)
178
215
  reflectionMergePartial<UserInfo>(this, message, value);
179
216
  return message;
@@ -213,6 +250,12 @@ class UserInfo$Type extends MessageType<UserInfo> {
213
250
  case /* bool superuser */ 10:
214
251
  message.superuser = reader.bool();
215
252
  break;
253
+ case /* bool can_be_config_admin */ 12:
254
+ message.canBeConfigAdmin = reader.bool();
255
+ break;
256
+ case /* optional resources.userinfo.OriginalJob original_job */ 11:
257
+ message.originalJob = OriginalJob.internalBinaryRead(reader, reader.uint32(), options, message.originalJob);
258
+ break;
216
259
  default:
217
260
  let u = options.readUnknownField;
218
261
  if (u === "throw")
@@ -255,6 +298,12 @@ class UserInfo$Type extends MessageType<UserInfo> {
255
298
  /* bool superuser = 10; */
256
299
  if (message.superuser !== false)
257
300
  writer.tag(10, WireType.Varint).bool(message.superuser);
301
+ /* optional resources.userinfo.OriginalJob original_job = 11; */
302
+ if (message.originalJob)
303
+ OriginalJob.internalBinaryWrite(message.originalJob, writer.tag(11, WireType.LengthDelimited).fork(), options).join();
304
+ /* bool can_be_config_admin = 12; */
305
+ if (message.canBeConfigAdmin !== false)
306
+ writer.tag(12, WireType.Varint).bool(message.canBeConfigAdmin);
258
307
  let u = options.writeUnknownFields;
259
308
  if (u !== false)
260
309
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -266,6 +315,61 @@ class UserInfo$Type extends MessageType<UserInfo> {
266
315
  */
267
316
  export const UserInfo = new UserInfo$Type();
268
317
  // @generated message type with reflection information, may provide speed optimized methods
318
+ class OriginalJob$Type extends MessageType<OriginalJob> {
319
+ constructor() {
320
+ super("resources.userinfo.OriginalJob", [
321
+ { no: 1, name: "job", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
322
+ { no: 2, name: "job_grade", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
323
+ ]);
324
+ }
325
+ create(value?: PartialMessage<OriginalJob>): OriginalJob {
326
+ const message = globalThis.Object.create((this.messagePrototype!));
327
+ message.job = "";
328
+ message.jobGrade = 0;
329
+ if (value !== undefined)
330
+ reflectionMergePartial<OriginalJob>(this, message, value);
331
+ return message;
332
+ }
333
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: OriginalJob): OriginalJob {
334
+ let message = target ?? this.create(), end = reader.pos + length;
335
+ while (reader.pos < end) {
336
+ let [fieldNo, wireType] = reader.tag();
337
+ switch (fieldNo) {
338
+ case /* string job */ 1:
339
+ message.job = reader.string();
340
+ break;
341
+ case /* int32 job_grade */ 2:
342
+ message.jobGrade = reader.int32();
343
+ break;
344
+ default:
345
+ let u = options.readUnknownField;
346
+ if (u === "throw")
347
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
348
+ let d = reader.skip(wireType);
349
+ if (u !== false)
350
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
351
+ }
352
+ }
353
+ return message;
354
+ }
355
+ internalBinaryWrite(message: OriginalJob, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
356
+ /* string job = 1; */
357
+ if (message.job !== "")
358
+ writer.tag(1, WireType.LengthDelimited).string(message.job);
359
+ /* int32 job_grade = 2; */
360
+ if (message.jobGrade !== 0)
361
+ writer.tag(2, WireType.Varint).int32(message.jobGrade);
362
+ let u = options.writeUnknownFields;
363
+ if (u !== false)
364
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
365
+ return writer;
366
+ }
367
+ }
368
+ /**
369
+ * @generated MessageType for protobuf message resources.userinfo.OriginalJob
370
+ */
371
+ export const OriginalJob = new OriginalJob$Type();
372
+ // @generated message type with reflection information, may provide speed optimized methods
269
373
  class PollReq$Type extends MessageType<PollReq> {
270
374
  constructor() {
271
375
  super("resources.userinfo.PollReq", [
@@ -327,22 +431,16 @@ class UserInfoChanged$Type extends MessageType<UserInfoChanged> {
327
431
  { no: 1, name: "account_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
328
432
  { no: 2, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
329
433
  { no: 3, name: "changed_at", kind: "message", T: () => Timestamp },
330
- { no: 4, name: "old_job", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
331
434
  { no: 5, name: "new_job", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
332
435
  { no: 6, name: "new_job_label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
333
- { no: 7, name: "old_job_grade", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
334
436
  { no: 8, name: "new_job_grade", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/ },
335
- { no: 9, name: "new_job_grade_label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
336
- { no: 10, name: "can_be_superuser", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ },
337
- { no: 11, name: "superuser", kind: "scalar", opt: true, T: 8 /*ScalarType.BOOL*/ }
437
+ { no: 9, name: "new_job_grade_label", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ }
338
438
  ]);
339
439
  }
340
440
  create(value?: PartialMessage<UserInfoChanged>): UserInfoChanged {
341
441
  const message = globalThis.Object.create((this.messagePrototype!));
342
442
  message.accountId = 0;
343
443
  message.userId = 0;
344
- message.oldJob = "";
345
- message.oldJobGrade = 0;
346
444
  if (value !== undefined)
347
445
  reflectionMergePartial<UserInfoChanged>(this, message, value);
348
446
  return message;
@@ -361,30 +459,18 @@ class UserInfoChanged$Type extends MessageType<UserInfoChanged> {
361
459
  case /* resources.timestamp.Timestamp changed_at */ 3:
362
460
  message.changedAt = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.changedAt);
363
461
  break;
364
- case /* string old_job */ 4:
365
- message.oldJob = reader.string();
366
- break;
367
462
  case /* optional string new_job */ 5:
368
463
  message.newJob = reader.string();
369
464
  break;
370
465
  case /* optional string new_job_label */ 6:
371
466
  message.newJobLabel = reader.string();
372
467
  break;
373
- case /* int32 old_job_grade */ 7:
374
- message.oldJobGrade = reader.int32();
375
- break;
376
468
  case /* optional int32 new_job_grade */ 8:
377
469
  message.newJobGrade = reader.int32();
378
470
  break;
379
471
  case /* optional string new_job_grade_label */ 9:
380
472
  message.newJobGradeLabel = reader.string();
381
473
  break;
382
- case /* optional bool can_be_superuser */ 10:
383
- message.canBeSuperuser = reader.bool();
384
- break;
385
- case /* optional bool superuser */ 11:
386
- message.superuser = reader.bool();
387
- break;
388
474
  default:
389
475
  let u = options.readUnknownField;
390
476
  if (u === "throw")
@@ -406,30 +492,18 @@ class UserInfoChanged$Type extends MessageType<UserInfoChanged> {
406
492
  /* resources.timestamp.Timestamp changed_at = 3; */
407
493
  if (message.changedAt)
408
494
  Timestamp.internalBinaryWrite(message.changedAt, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
409
- /* string old_job = 4; */
410
- if (message.oldJob !== "")
411
- writer.tag(4, WireType.LengthDelimited).string(message.oldJob);
412
495
  /* optional string new_job = 5; */
413
496
  if (message.newJob !== undefined)
414
497
  writer.tag(5, WireType.LengthDelimited).string(message.newJob);
415
498
  /* optional string new_job_label = 6; */
416
499
  if (message.newJobLabel !== undefined)
417
500
  writer.tag(6, WireType.LengthDelimited).string(message.newJobLabel);
418
- /* int32 old_job_grade = 7; */
419
- if (message.oldJobGrade !== 0)
420
- writer.tag(7, WireType.Varint).int32(message.oldJobGrade);
421
501
  /* optional int32 new_job_grade = 8; */
422
502
  if (message.newJobGrade !== undefined)
423
503
  writer.tag(8, WireType.Varint).int32(message.newJobGrade);
424
504
  /* optional string new_job_grade_label = 9; */
425
505
  if (message.newJobGradeLabel !== undefined)
426
506
  writer.tag(9, WireType.LengthDelimited).string(message.newJobGradeLabel);
427
- /* optional bool can_be_superuser = 10; */
428
- if (message.canBeSuperuser !== undefined)
429
- writer.tag(10, WireType.Varint).bool(message.canBeSuperuser);
430
- /* optional bool superuser = 11; */
431
- if (message.superuser !== undefined)
432
- writer.tag(11, WireType.Varint).bool(message.superuser);
433
507
  let u = options.writeUnknownFields;
434
508
  if (u !== false)
435
509
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -440,3 +514,80 @@ class UserInfoChanged$Type extends MessageType<UserInfoChanged> {
440
514
  * @generated MessageType for protobuf message resources.userinfo.UserInfoChanged
441
515
  */
442
516
  export const UserInfoChanged = new UserInfoChanged$Type();
517
+ // @generated message type with reflection information, may provide speed optimized methods
518
+ class AccountGroupsChanged$Type extends MessageType<AccountGroupsChanged> {
519
+ constructor() {
520
+ super("resources.userinfo.AccountGroupsChanged", [
521
+ { no: 1, name: "account_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
522
+ { no: 2, name: "changed_at", kind: "message", T: () => Timestamp },
523
+ { no: 3, name: "new_groups", kind: "message", T: () => AccountGroups },
524
+ { no: 4, name: "can_be_superuser", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
525
+ { no: 5, name: "can_be_config_admin", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
526
+ ]);
527
+ }
528
+ create(value?: PartialMessage<AccountGroupsChanged>): AccountGroupsChanged {
529
+ const message = globalThis.Object.create((this.messagePrototype!));
530
+ message.accountId = 0;
531
+ message.canBeSuperuser = false;
532
+ message.canBeConfigAdmin = false;
533
+ if (value !== undefined)
534
+ reflectionMergePartial<AccountGroupsChanged>(this, message, value);
535
+ return message;
536
+ }
537
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AccountGroupsChanged): AccountGroupsChanged {
538
+ let message = target ?? this.create(), end = reader.pos + length;
539
+ while (reader.pos < end) {
540
+ let [fieldNo, wireType] = reader.tag();
541
+ switch (fieldNo) {
542
+ case /* int64 account_id */ 1:
543
+ message.accountId = reader.int64().toNumber();
544
+ break;
545
+ case /* resources.timestamp.Timestamp changed_at */ 2:
546
+ message.changedAt = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.changedAt);
547
+ break;
548
+ case /* resources.accounts.AccountGroups new_groups */ 3:
549
+ message.newGroups = AccountGroups.internalBinaryRead(reader, reader.uint32(), options, message.newGroups);
550
+ break;
551
+ case /* bool can_be_superuser */ 4:
552
+ message.canBeSuperuser = reader.bool();
553
+ break;
554
+ case /* bool can_be_config_admin */ 5:
555
+ message.canBeConfigAdmin = reader.bool();
556
+ break;
557
+ default:
558
+ let u = options.readUnknownField;
559
+ if (u === "throw")
560
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
561
+ let d = reader.skip(wireType);
562
+ if (u !== false)
563
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
564
+ }
565
+ }
566
+ return message;
567
+ }
568
+ internalBinaryWrite(message: AccountGroupsChanged, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
569
+ /* int64 account_id = 1; */
570
+ if (message.accountId !== 0)
571
+ writer.tag(1, WireType.Varint).int64(message.accountId);
572
+ /* resources.timestamp.Timestamp changed_at = 2; */
573
+ if (message.changedAt)
574
+ Timestamp.internalBinaryWrite(message.changedAt, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
575
+ /* resources.accounts.AccountGroups new_groups = 3; */
576
+ if (message.newGroups)
577
+ AccountGroups.internalBinaryWrite(message.newGroups, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
578
+ /* bool can_be_superuser = 4; */
579
+ if (message.canBeSuperuser !== false)
580
+ writer.tag(4, WireType.Varint).bool(message.canBeSuperuser);
581
+ /* bool can_be_config_admin = 5; */
582
+ if (message.canBeConfigAdmin !== false)
583
+ writer.tag(5, WireType.Varint).bool(message.canBeConfigAdmin);
584
+ let u = options.writeUnknownFields;
585
+ if (u !== false)
586
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
587
+ return writer;
588
+ }
589
+ }
590
+ /**
591
+ * @generated MessageType for protobuf message resources.userinfo.AccountGroupsChanged
592
+ */
593
+ export const AccountGroupsChanged = new AccountGroupsChanged$Type();
@@ -114,12 +114,6 @@ export interface UserActivityData {
114
114
  * @generated from protobuf field: resources.users.activity.LabelsChange labels_change = 6
115
115
  */
116
116
  labelsChange: LabelsChange;
117
- } | {
118
- oneofKind: "labelChange";
119
- /**
120
- * @generated from protobuf field: resources.users.activity.LabelChange label_change = 11
121
- */
122
- labelChange: LabelChange;
123
117
  } | {
124
118
  oneofKind: "jobChange";
125
119
  /**
@@ -216,44 +210,44 @@ export interface MugshotChange {
216
210
  new?: string;
217
211
  }
218
212
  /**
219
- * @deprecated
220
- *
221
213
  * @generated from protobuf message resources.users.activity.LabelsChange
222
214
  */
223
215
  export interface LabelsChange {
224
216
  /**
225
- * @generated from protobuf field: repeated resources.citizens.labels.Label added = 1
217
+ * @deprecated
218
+ * @generated from protobuf field: repeated resources.citizens.labels.Label added = 1 [deprecated = true]
226
219
  */
227
220
  added: Label[];
228
221
  /**
229
- * @generated from protobuf field: repeated resources.citizens.labels.Label removed = 2
222
+ * @deprecated
223
+ * @generated from protobuf field: repeated resources.citizens.labels.Label removed = 2 [deprecated = true]
230
224
  */
231
225
  removed: Label[];
232
226
  /**
233
- * @generated from protobuf field: bool expired = 4
227
+ * @generated from protobuf field: repeated resources.users.activity.LabelAdded added_ids = 3
228
+ */
229
+ addedIds: LabelAdded[];
230
+ /**
231
+ * @generated from protobuf field: repeated int64 removed_ids = 4
232
+ */
233
+ removedIds: number[];
234
+ /**
235
+ * @generated from protobuf field: bool expired = 5
234
236
  */
235
237
  expired: boolean;
236
238
  }
237
239
  /**
238
- * @generated from protobuf message resources.users.activity.LabelChange
240
+ * @generated from protobuf message resources.users.activity.LabelAdded
239
241
  */
240
- export interface LabelChange {
241
- /**
242
- * @generated from protobuf field: resources.citizens.labels.Label label = 1
243
- */
244
- label?: Label;
242
+ export interface LabelAdded {
245
243
  /**
246
- * @generated from protobuf field: bool added = 2
244
+ * @generated from protobuf field: int64 id = 1
247
245
  */
248
- added: boolean;
246
+ id: number;
249
247
  /**
250
- * @generated from protobuf field: optional resources.timestamp.Timestamp expires_at = 3
248
+ * @generated from protobuf field: optional resources.timestamp.Timestamp expires_at = 2
251
249
  */
252
250
  expiresAt?: Timestamp;
253
- /**
254
- * @generated from protobuf field: bool expired = 4
255
- */
256
- expired: boolean;
257
251
  }
258
252
  /**
259
253
  * @generated from protobuf message resources.users.activity.JobChange
@@ -518,7 +512,6 @@ class UserActivityData$Type extends MessageType<UserActivityData> {
518
512
  { no: 4, name: "traffic_infraction_points_change", kind: "message", oneof: "data", T: () => TrafficInfractionPointsChange },
519
513
  { no: 5, name: "mugshot_change", kind: "message", oneof: "data", T: () => MugshotChange },
520
514
  { no: 6, name: "labels_change", kind: "message", oneof: "data", T: () => LabelsChange },
521
- { no: 11, name: "label_change", kind: "message", oneof: "data", T: () => LabelChange },
522
515
  { no: 7, name: "job_change", kind: "message", oneof: "data", T: () => JobChange },
523
516
  { no: 8, name: "document_relation", kind: "message", oneof: "data", T: () => CitizenDocumentRelation },
524
517
  { no: 9, name: "jail_change", kind: "message", oneof: "data", T: () => JailChange },
@@ -573,12 +566,6 @@ class UserActivityData$Type extends MessageType<UserActivityData> {
573
566
  labelsChange: LabelsChange.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).labelsChange)
574
567
  };
575
568
  break;
576
- case /* resources.users.activity.LabelChange label_change */ 11:
577
- message.data = {
578
- oneofKind: "labelChange",
579
- labelChange: LabelChange.internalBinaryRead(reader, reader.uint32(), options, (message.data as any).labelChange)
580
- };
581
- break;
582
569
  case /* resources.users.activity.JobChange job_change */ 7:
583
570
  message.data = {
584
571
  oneofKind: "jobChange",
@@ -645,9 +632,6 @@ class UserActivityData$Type extends MessageType<UserActivityData> {
645
632
  /* resources.users.activity.FineChange fine_change = 10; */
646
633
  if (message.data.oneofKind === "fineChange")
647
634
  FineChange.internalBinaryWrite(message.data.fineChange, writer.tag(10, WireType.LengthDelimited).fork(), options).join();
648
- /* resources.users.activity.LabelChange label_change = 11; */
649
- if (message.data.oneofKind === "labelChange")
650
- LabelChange.internalBinaryWrite(message.data.labelChange, writer.tag(11, WireType.LengthDelimited).fork(), options).join();
651
635
  let u = options.writeUnknownFields;
652
636
  if (u !== false)
653
637
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -930,13 +914,17 @@ class LabelsChange$Type extends MessageType<LabelsChange> {
930
914
  super("resources.users.activity.LabelsChange", [
931
915
  { no: 1, name: "added", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => Label },
932
916
  { no: 2, name: "removed", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => Label },
933
- { no: 4, name: "expired", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
917
+ { no: 3, name: "added_ids", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => LabelAdded },
918
+ { no: 4, name: "removed_ids", kind: "scalar", repeat: 1 /*RepeatType.PACKED*/, T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
919
+ { no: 5, name: "expired", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
934
920
  ]);
935
921
  }
936
922
  create(value?: PartialMessage<LabelsChange>): LabelsChange {
937
923
  const message = globalThis.Object.create((this.messagePrototype!));
938
924
  message.added = [];
939
925
  message.removed = [];
926
+ message.addedIds = [];
927
+ message.removedIds = [];
940
928
  message.expired = false;
941
929
  if (value !== undefined)
942
930
  reflectionMergePartial<LabelsChange>(this, message, value);
@@ -947,13 +935,23 @@ class LabelsChange$Type extends MessageType<LabelsChange> {
947
935
  while (reader.pos < end) {
948
936
  let [fieldNo, wireType] = reader.tag();
949
937
  switch (fieldNo) {
950
- case /* repeated resources.citizens.labels.Label added */ 1:
938
+ case /* repeated resources.citizens.labels.Label added = 1 [deprecated = true] */ 1:
951
939
  message.added.push(Label.internalBinaryRead(reader, reader.uint32(), options));
952
940
  break;
953
- case /* repeated resources.citizens.labels.Label removed */ 2:
941
+ case /* repeated resources.citizens.labels.Label removed = 2 [deprecated = true] */ 2:
954
942
  message.removed.push(Label.internalBinaryRead(reader, reader.uint32(), options));
955
943
  break;
956
- case /* bool expired */ 4:
944
+ case /* repeated resources.users.activity.LabelAdded added_ids */ 3:
945
+ message.addedIds.push(LabelAdded.internalBinaryRead(reader, reader.uint32(), options));
946
+ break;
947
+ case /* repeated int64 removed_ids */ 4:
948
+ if (wireType === WireType.LengthDelimited)
949
+ for (let e = reader.int32() + reader.pos; reader.pos < e;)
950
+ message.removedIds.push(reader.int64().toNumber());
951
+ else
952
+ message.removedIds.push(reader.int64().toNumber());
953
+ break;
954
+ case /* bool expired */ 5:
957
955
  message.expired = reader.bool();
958
956
  break;
959
957
  default:
@@ -968,15 +966,25 @@ class LabelsChange$Type extends MessageType<LabelsChange> {
968
966
  return message;
969
967
  }
970
968
  internalBinaryWrite(message: LabelsChange, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
971
- /* repeated resources.citizens.labels.Label added = 1; */
969
+ /* repeated resources.citizens.labels.Label added = 1 [deprecated = true]; */
972
970
  for (let i = 0; i < message.added.length; i++)
973
971
  Label.internalBinaryWrite(message.added[i], writer.tag(1, WireType.LengthDelimited).fork(), options).join();
974
- /* repeated resources.citizens.labels.Label removed = 2; */
972
+ /* repeated resources.citizens.labels.Label removed = 2 [deprecated = true]; */
975
973
  for (let i = 0; i < message.removed.length; i++)
976
974
  Label.internalBinaryWrite(message.removed[i], writer.tag(2, WireType.LengthDelimited).fork(), options).join();
977
- /* bool expired = 4; */
975
+ /* repeated resources.users.activity.LabelAdded added_ids = 3; */
976
+ for (let i = 0; i < message.addedIds.length; i++)
977
+ LabelAdded.internalBinaryWrite(message.addedIds[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
978
+ /* repeated int64 removed_ids = 4; */
979
+ if (message.removedIds.length) {
980
+ writer.tag(4, WireType.LengthDelimited).fork();
981
+ for (let i = 0; i < message.removedIds.length; i++)
982
+ writer.int64(message.removedIds[i]);
983
+ writer.join();
984
+ }
985
+ /* bool expired = 5; */
978
986
  if (message.expired !== false)
979
- writer.tag(4, WireType.Varint).bool(message.expired);
987
+ writer.tag(5, WireType.Varint).bool(message.expired);
980
988
  let u = options.writeUnknownFields;
981
989
  if (u !== false)
982
990
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -988,40 +996,31 @@ class LabelsChange$Type extends MessageType<LabelsChange> {
988
996
  */
989
997
  export const LabelsChange = new LabelsChange$Type();
990
998
  // @generated message type with reflection information, may provide speed optimized methods
991
- class LabelChange$Type extends MessageType<LabelChange> {
999
+ class LabelAdded$Type extends MessageType<LabelAdded> {
992
1000
  constructor() {
993
- super("resources.users.activity.LabelChange", [
994
- { no: 1, name: "label", kind: "message", T: () => Label },
995
- { no: 2, name: "added", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
996
- { no: 3, name: "expires_at", kind: "message", T: () => Timestamp },
997
- { no: 4, name: "expired", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1001
+ super("resources.users.activity.LabelAdded", [
1002
+ { no: 1, name: "id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1003
+ { no: 2, name: "expires_at", kind: "message", T: () => Timestamp }
998
1004
  ]);
999
1005
  }
1000
- create(value?: PartialMessage<LabelChange>): LabelChange {
1006
+ create(value?: PartialMessage<LabelAdded>): LabelAdded {
1001
1007
  const message = globalThis.Object.create((this.messagePrototype!));
1002
- message.added = false;
1003
- message.expired = false;
1008
+ message.id = 0;
1004
1009
  if (value !== undefined)
1005
- reflectionMergePartial<LabelChange>(this, message, value);
1010
+ reflectionMergePartial<LabelAdded>(this, message, value);
1006
1011
  return message;
1007
1012
  }
1008
- internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LabelChange): LabelChange {
1013
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: LabelAdded): LabelAdded {
1009
1014
  let message = target ?? this.create(), end = reader.pos + length;
1010
1015
  while (reader.pos < end) {
1011
1016
  let [fieldNo, wireType] = reader.tag();
1012
1017
  switch (fieldNo) {
1013
- case /* resources.citizens.labels.Label label */ 1:
1014
- message.label = Label.internalBinaryRead(reader, reader.uint32(), options, message.label);
1015
- break;
1016
- case /* bool added */ 2:
1017
- message.added = reader.bool();
1018
+ case /* int64 id */ 1:
1019
+ message.id = reader.int64().toNumber();
1018
1020
  break;
1019
- case /* optional resources.timestamp.Timestamp expires_at */ 3:
1021
+ case /* optional resources.timestamp.Timestamp expires_at */ 2:
1020
1022
  message.expiresAt = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt);
1021
1023
  break;
1022
- case /* bool expired */ 4:
1023
- message.expired = reader.bool();
1024
- break;
1025
1024
  default:
1026
1025
  let u = options.readUnknownField;
1027
1026
  if (u === "throw")
@@ -1033,19 +1032,13 @@ class LabelChange$Type extends MessageType<LabelChange> {
1033
1032
  }
1034
1033
  return message;
1035
1034
  }
1036
- internalBinaryWrite(message: LabelChange, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
1037
- /* resources.citizens.labels.Label label = 1; */
1038
- if (message.label)
1039
- Label.internalBinaryWrite(message.label, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
1040
- /* bool added = 2; */
1041
- if (message.added !== false)
1042
- writer.tag(2, WireType.Varint).bool(message.added);
1043
- /* optional resources.timestamp.Timestamp expires_at = 3; */
1035
+ internalBinaryWrite(message: LabelAdded, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
1036
+ /* int64 id = 1; */
1037
+ if (message.id !== 0)
1038
+ writer.tag(1, WireType.Varint).int64(message.id);
1039
+ /* optional resources.timestamp.Timestamp expires_at = 2; */
1044
1040
  if (message.expiresAt)
1045
- Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1046
- /* bool expired = 4; */
1047
- if (message.expired !== false)
1048
- writer.tag(4, WireType.Varint).bool(message.expired);
1041
+ Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
1049
1042
  let u = options.writeUnknownFields;
1050
1043
  if (u !== false)
1051
1044
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -1053,9 +1046,9 @@ class LabelChange$Type extends MessageType<LabelChange> {
1053
1046
  }
1054
1047
  }
1055
1048
  /**
1056
- * @generated MessageType for protobuf message resources.users.activity.LabelChange
1049
+ * @generated MessageType for protobuf message resources.users.activity.LabelAdded
1057
1050
  */
1058
- export const LabelChange = new LabelChange$Type();
1051
+ export const LabelAdded = new LabelAdded$Type();
1059
1052
  // @generated message type with reflection information, may provide speed optimized methods
1060
1053
  class JobChange$Type extends MessageType<JobChange> {
1061
1054
  constructor() {
@@ -1129,7 +1122,7 @@ class CitizenDocumentRelation$Type extends MessageType<CitizenDocumentRelation>
1129
1122
  super("resources.users.activity.CitizenDocumentRelation", [
1130
1123
  { no: 1, name: "added", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
1131
1124
  { no: 2, name: "document_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1132
- { no: 3, name: "relation", kind: "enum", T: () => ["resources.documents.relations.DocRelation", DocRelation, "DOC_RELATION_"] }
1125
+ { no: 3, name: "relation", kind: "enum", T: () => ["resources.documents.relations.DocRelation", DocRelation, "DOC_RELATION_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } }
1133
1126
  ]);
1134
1127
  }
1135
1128
  create(value?: PartialMessage<CitizenDocumentRelation>): CitizenDocumentRelation {