@fivenet-app/gen 2026.8.5 → 2026.10.2

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 (63) hide show
  1. package/LICENSE +201 -0
  2. package/clients.ts +12 -0
  3. package/codegen/perms/perms.ts +331 -2
  4. package/google/protobuf/any.ts +47 -103
  5. package/google/protobuf/descriptor.ts +39 -32
  6. package/google/protobuf/struct.ts +33 -22
  7. package/google/protobuf/timestamp.ts +9 -8
  8. package/package.json +2 -2
  9. package/perms.ts +41 -13
  10. package/resources/centrum/dispatches/dispatches.ts +206 -13
  11. package/resources/centrum/units/units.ts +207 -0
  12. package/resources/cron/cron.ts +44 -3
  13. package/resources/documents/templates/templates.ts +3 -3
  14. package/resources/file/file.ts +3 -3
  15. package/resources/file/filestore.ts +26 -10
  16. package/resources/jobs/colleagues/activity/activity.ts +50 -8
  17. package/resources/jobs/colleagues/colleagues.ts +14 -1
  18. package/resources/jobs/groups/short/group_member_short.ts +129 -0
  19. package/resources/jobs/job_asset.ts +116 -0
  20. package/resources/jobs/user_selector.ts +1 -15
  21. package/resources/notifications/clientview/clientview.ts +5 -1
  22. package/resources/notifications/events/events.ts +35 -1
  23. package/resources/notifications/notifications.ts +322 -2
  24. package/resources/permissions/attributes/attributes.ts +164 -2
  25. package/resources/permissions/authorization/authorization.ts +86 -0
  26. package/resources/permissions/permissions/permissions.ts +16 -1
  27. package/resources/properties/properties.ts +1648 -0
  28. package/resources/qualifications/activity/activity.ts +328 -0
  29. package/resources/qualifications/exam/exam.ts +108 -4
  30. package/resources/qualifications/qualifications.ts +36 -2
  31. package/resources/settings/config.ts +3 -3
  32. package/resources/sync/activity/activity.ts +4 -4
  33. package/resources/sync/data/data.ts +16 -4
  34. package/resources/users/activity/activity.ts +220 -3
  35. package/resources/users/props/props.ts +13 -1
  36. package/resources/users/user.ts +13 -1
  37. package/resources/vehicles/activity/activity.ts +222 -3
  38. package/resources/vehicles/props/props.ts +13 -1
  39. package/resources/vehicles/vehicles.ts +13 -1
  40. package/services/auth/auth.ts +61 -67
  41. package/services/centrum/centrum.ts +103 -1
  42. package/services/centrum/dispatches.ts +25 -1
  43. package/services/centrum/units.ts +25 -1
  44. package/services/citizens/citizens.client.ts +49 -0
  45. package/services/citizens/citizens.ts +384 -7
  46. package/services/documents/documents.ts +1 -0
  47. package/services/documents/templates.ts +12 -1
  48. package/services/jobs/colleagues.ts +26 -1
  49. package/services/jobs/conduct.ts +1 -0
  50. package/services/jobs/groups.ts +62 -4
  51. package/services/notifications/notifications.client.ts +40 -1
  52. package/services/notifications/notifications.ts +483 -3
  53. package/services/qualifications/qualifications.client.ts +20 -7
  54. package/services/qualifications/qualifications.ts +265 -4
  55. package/services/settings/job_assets.client.ts +105 -0
  56. package/services/settings/job_assets.ts +373 -0
  57. package/services/settings/properties.client.ts +194 -0
  58. package/services/settings/properties.ts +1555 -0
  59. package/services/settings/system.ts +29 -9
  60. package/services/sync/sync.ts +115 -12
  61. package/services/vehicles/vehicles.client.ts +52 -0
  62. package/services/vehicles/vehicles.ts +385 -7
  63. package/svcs.ts +58 -0
@@ -0,0 +1,328 @@
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 "resources/qualifications/activity/activity.proto" (package "resources.qualifications.activity", syntax proto3)
3
+ // tslint:disable
4
+ // @ts-nocheck
5
+ import type { BinaryWriteOptions } from "@protobuf-ts/runtime";
6
+ import type { IBinaryWriter } from "@protobuf-ts/runtime";
7
+ import { WireType } from "@protobuf-ts/runtime";
8
+ import type { BinaryReadOptions } from "@protobuf-ts/runtime";
9
+ import type { IBinaryReader } from "@protobuf-ts/runtime";
10
+ import { UnknownFieldHandler } from "@protobuf-ts/runtime";
11
+ import type { PartialMessage } from "@protobuf-ts/runtime";
12
+ import { reflectionMergePartial } from "@protobuf-ts/runtime";
13
+ import { MessageType } from "@protobuf-ts/runtime";
14
+ import { ResultStatus } from "../qualifications";
15
+ import { RequestStatus } from "../qualifications";
16
+ import { Timestamp } from "../../timestamp/timestamp";
17
+ import { UserShort } from "../../users/short/user";
18
+ /**
19
+ * @generated from protobuf message resources.qualifications.activity.QualificationActivity
20
+ */
21
+ export interface QualificationActivity {
22
+ /**
23
+ * @generated from protobuf field: int64 id = 1
24
+ */
25
+ id: number;
26
+ /**
27
+ * @generated from protobuf field: int64 qualification_id = 2
28
+ */
29
+ qualificationId: number;
30
+ /**
31
+ * @generated from protobuf field: resources.qualifications.activity.QualificationActivityType type = 3
32
+ */
33
+ type: QualificationActivityType;
34
+ /**
35
+ * @generated from protobuf field: optional int32 actor_user_id = 4
36
+ */
37
+ actorUserId?: number;
38
+ /**
39
+ * @generated from protobuf field: optional resources.users.short.UserShort actor_user = 5
40
+ */
41
+ actorUser?: UserShort;
42
+ /**
43
+ * @generated from protobuf field: optional int32 target_user_id = 6
44
+ */
45
+ targetUserId?: number;
46
+ /**
47
+ * @generated from protobuf field: optional resources.users.short.UserShort target_user = 7
48
+ */
49
+ targetUser?: UserShort;
50
+ /**
51
+ * @generated from protobuf field: resources.timestamp.Timestamp created_at = 8
52
+ */
53
+ createdAt?: Timestamp;
54
+ /**
55
+ * @generated from protobuf field: optional resources.qualifications.activity.QualificationActivityData data = 9
56
+ */
57
+ data?: QualificationActivityData;
58
+ /**
59
+ * Internal exam-attempt correlation key. Services clear this before
60
+ * returning activity records to clients.
61
+ *
62
+ * @generated from protobuf field: string attempt_id = 10
63
+ */
64
+ attemptId: string;
65
+ }
66
+ /**
67
+ * @generated from protobuf message resources.qualifications.activity.QualificationActivityData
68
+ */
69
+ export interface QualificationActivityData {
70
+ /**
71
+ * @generated from protobuf field: optional resources.qualifications.RequestStatus request_status = 1
72
+ */
73
+ requestStatus?: RequestStatus;
74
+ /**
75
+ * @generated from protobuf field: optional resources.qualifications.ResultStatus result_status = 2
76
+ */
77
+ resultStatus?: ResultStatus;
78
+ /**
79
+ * @generated from protobuf field: optional float score = 3
80
+ */
81
+ score?: number;
82
+ }
83
+ /**
84
+ * @generated from protobuf enum resources.qualifications.activity.QualificationActivityType
85
+ */
86
+ export enum QualificationActivityType {
87
+ /**
88
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_UNSPECIFIED = 0;
89
+ */
90
+ UNSPECIFIED = 0,
91
+ /**
92
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_CREATED = 1;
93
+ */
94
+ CREATED = 1,
95
+ /**
96
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_UPDATED = 2;
97
+ */
98
+ UPDATED = 2,
99
+ /**
100
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_DELETED = 3;
101
+ */
102
+ DELETED = 3,
103
+ /**
104
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_RESTORED = 4;
105
+ */
106
+ RESTORED = 4,
107
+ /**
108
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_ACCESS_UPDATED = 5;
109
+ */
110
+ ACCESS_UPDATED = 5,
111
+ /**
112
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_REQUEST_CREATED = 10;
113
+ */
114
+ REQUEST_CREATED = 10,
115
+ /**
116
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_REQUEST_UPDATED = 11;
117
+ */
118
+ REQUEST_UPDATED = 11,
119
+ /**
120
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_REQUEST_DELETED = 12;
121
+ */
122
+ REQUEST_DELETED = 12,
123
+ /**
124
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_EXAM_STARTED = 20;
125
+ */
126
+ EXAM_STARTED = 20,
127
+ /**
128
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_EXAM_CANCELLED = 21;
129
+ */
130
+ EXAM_CANCELLED = 21,
131
+ /**
132
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_EXAM_SUBMITTED = 22;
133
+ */
134
+ EXAM_SUBMITTED = 22,
135
+ /**
136
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_EXAM_EXPIRED = 23;
137
+ */
138
+ EXAM_EXPIRED = 23,
139
+ /**
140
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_RESULT_CREATED = 30;
141
+ */
142
+ RESULT_CREATED = 30,
143
+ /**
144
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_RESULT_UPDATED = 31;
145
+ */
146
+ RESULT_UPDATED = 31,
147
+ /**
148
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_RESULT_DELETED = 32;
149
+ */
150
+ RESULT_DELETED = 32,
151
+ /**
152
+ * @generated from protobuf enum value: QUALIFICATION_ACTIVITY_TYPE_RESULT_RESTORED = 33;
153
+ */
154
+ RESULT_RESTORED = 33
155
+ }
156
+ // @generated message type with reflection information, may provide speed optimized methods
157
+ class QualificationActivity$Type extends MessageType<QualificationActivity> {
158
+ constructor() {
159
+ super("resources.qualifications.activity.QualificationActivity", [
160
+ { no: 1, name: "id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
161
+ { no: 2, name: "qualification_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
162
+ { no: 3, name: "type", kind: "enum", T: () => ["resources.qualifications.activity.QualificationActivityType", QualificationActivityType, "QUALIFICATION_ACTIVITY_TYPE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
163
+ { no: 4, name: "actor_user_id", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/ },
164
+ { no: 5, name: "actor_user", kind: "message", T: () => UserShort },
165
+ { no: 6, name: "target_user_id", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/ },
166
+ { no: 7, name: "target_user", kind: "message", T: () => UserShort },
167
+ { no: 8, name: "created_at", kind: "message", T: () => Timestamp },
168
+ { no: 9, name: "data", kind: "message", T: () => QualificationActivityData },
169
+ { no: 10, name: "attempt_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
170
+ ]);
171
+ }
172
+ create(value?: PartialMessage<QualificationActivity>): QualificationActivity {
173
+ const message = globalThis.Object.create((this.messagePrototype!));
174
+ message.id = 0;
175
+ message.qualificationId = 0;
176
+ message.type = 0;
177
+ message.attemptId = "";
178
+ if (value !== undefined)
179
+ reflectionMergePartial<QualificationActivity>(this, message, value);
180
+ return message;
181
+ }
182
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QualificationActivity): QualificationActivity {
183
+ let message = target ?? this.create(), end = reader.pos + length;
184
+ while (reader.pos < end) {
185
+ let [fieldNo, wireType] = reader.tag();
186
+ switch (fieldNo) {
187
+ case /* int64 id */ 1:
188
+ message.id = reader.int64().toNumber();
189
+ break;
190
+ case /* int64 qualification_id */ 2:
191
+ message.qualificationId = reader.int64().toNumber();
192
+ break;
193
+ case /* resources.qualifications.activity.QualificationActivityType type */ 3:
194
+ message.type = reader.int32();
195
+ break;
196
+ case /* optional int32 actor_user_id */ 4:
197
+ message.actorUserId = reader.int32();
198
+ break;
199
+ case /* optional resources.users.short.UserShort actor_user */ 5:
200
+ message.actorUser = UserShort.internalBinaryRead(reader, reader.uint32(), options, message.actorUser);
201
+ break;
202
+ case /* optional int32 target_user_id */ 6:
203
+ message.targetUserId = reader.int32();
204
+ break;
205
+ case /* optional resources.users.short.UserShort target_user */ 7:
206
+ message.targetUser = UserShort.internalBinaryRead(reader, reader.uint32(), options, message.targetUser);
207
+ break;
208
+ case /* resources.timestamp.Timestamp created_at */ 8:
209
+ message.createdAt = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt);
210
+ break;
211
+ case /* optional resources.qualifications.activity.QualificationActivityData data */ 9:
212
+ message.data = QualificationActivityData.internalBinaryRead(reader, reader.uint32(), options, message.data);
213
+ break;
214
+ case /* string attempt_id */ 10:
215
+ message.attemptId = reader.string();
216
+ break;
217
+ default:
218
+ let u = options.readUnknownField;
219
+ if (u === "throw")
220
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
221
+ let d = reader.skip(wireType);
222
+ if (u !== false)
223
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
224
+ }
225
+ }
226
+ return message;
227
+ }
228
+ internalBinaryWrite(message: QualificationActivity, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
229
+ /* int64 id = 1; */
230
+ if (message.id !== 0)
231
+ writer.tag(1, WireType.Varint).int64(message.id);
232
+ /* int64 qualification_id = 2; */
233
+ if (message.qualificationId !== 0)
234
+ writer.tag(2, WireType.Varint).int64(message.qualificationId);
235
+ /* resources.qualifications.activity.QualificationActivityType type = 3; */
236
+ if (message.type !== 0)
237
+ writer.tag(3, WireType.Varint).int32(message.type);
238
+ /* optional int32 actor_user_id = 4; */
239
+ if (message.actorUserId !== undefined)
240
+ writer.tag(4, WireType.Varint).int32(message.actorUserId);
241
+ /* optional resources.users.short.UserShort actor_user = 5; */
242
+ if (message.actorUser)
243
+ UserShort.internalBinaryWrite(message.actorUser, writer.tag(5, WireType.LengthDelimited).fork(), options).join();
244
+ /* optional int32 target_user_id = 6; */
245
+ if (message.targetUserId !== undefined)
246
+ writer.tag(6, WireType.Varint).int32(message.targetUserId);
247
+ /* optional resources.users.short.UserShort target_user = 7; */
248
+ if (message.targetUser)
249
+ UserShort.internalBinaryWrite(message.targetUser, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
250
+ /* resources.timestamp.Timestamp created_at = 8; */
251
+ if (message.createdAt)
252
+ Timestamp.internalBinaryWrite(message.createdAt, writer.tag(8, WireType.LengthDelimited).fork(), options).join();
253
+ /* optional resources.qualifications.activity.QualificationActivityData data = 9; */
254
+ if (message.data)
255
+ QualificationActivityData.internalBinaryWrite(message.data, writer.tag(9, WireType.LengthDelimited).fork(), options).join();
256
+ /* string attempt_id = 10; */
257
+ if (message.attemptId !== "")
258
+ writer.tag(10, WireType.LengthDelimited).string(message.attemptId);
259
+ let u = options.writeUnknownFields;
260
+ if (u !== false)
261
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
262
+ return writer;
263
+ }
264
+ }
265
+ /**
266
+ * @generated MessageType for protobuf message resources.qualifications.activity.QualificationActivity
267
+ */
268
+ export const QualificationActivity = new QualificationActivity$Type();
269
+ // @generated message type with reflection information, may provide speed optimized methods
270
+ class QualificationActivityData$Type extends MessageType<QualificationActivityData> {
271
+ constructor() {
272
+ super("resources.qualifications.activity.QualificationActivityData", [
273
+ { no: 1, name: "request_status", kind: "enum", opt: true, T: () => ["resources.qualifications.RequestStatus", RequestStatus, "REQUEST_STATUS_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
274
+ { no: 2, name: "result_status", kind: "enum", opt: true, T: () => ["resources.qualifications.ResultStatus", ResultStatus, "RESULT_STATUS_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
275
+ { no: 3, name: "score", kind: "scalar", opt: true, T: 2 /*ScalarType.FLOAT*/ }
276
+ ], { "codegen.dbscanner.dbscanner": { enabled: true } });
277
+ }
278
+ create(value?: PartialMessage<QualificationActivityData>): QualificationActivityData {
279
+ const message = globalThis.Object.create((this.messagePrototype!));
280
+ if (value !== undefined)
281
+ reflectionMergePartial<QualificationActivityData>(this, message, value);
282
+ return message;
283
+ }
284
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: QualificationActivityData): QualificationActivityData {
285
+ let message = target ?? this.create(), end = reader.pos + length;
286
+ while (reader.pos < end) {
287
+ let [fieldNo, wireType] = reader.tag();
288
+ switch (fieldNo) {
289
+ case /* optional resources.qualifications.RequestStatus request_status */ 1:
290
+ message.requestStatus = reader.int32();
291
+ break;
292
+ case /* optional resources.qualifications.ResultStatus result_status */ 2:
293
+ message.resultStatus = reader.int32();
294
+ break;
295
+ case /* optional float score */ 3:
296
+ message.score = reader.float();
297
+ break;
298
+ default:
299
+ let u = options.readUnknownField;
300
+ if (u === "throw")
301
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
302
+ let d = reader.skip(wireType);
303
+ if (u !== false)
304
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
305
+ }
306
+ }
307
+ return message;
308
+ }
309
+ internalBinaryWrite(message: QualificationActivityData, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
310
+ /* optional resources.qualifications.RequestStatus request_status = 1; */
311
+ if (message.requestStatus !== undefined)
312
+ writer.tag(1, WireType.Varint).int32(message.requestStatus);
313
+ /* optional resources.qualifications.ResultStatus result_status = 2; */
314
+ if (message.resultStatus !== undefined)
315
+ writer.tag(2, WireType.Varint).int32(message.resultStatus);
316
+ /* optional float score = 3; */
317
+ if (message.score !== undefined)
318
+ writer.tag(3, WireType.Bit32).float(message.score);
319
+ let u = options.writeUnknownFields;
320
+ if (u !== false)
321
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
322
+ return writer;
323
+ }
324
+ }
325
+ /**
326
+ * @generated MessageType for protobuf message resources.qualifications.activity.QualificationActivityData
327
+ */
328
+ export const QualificationActivityData = new QualificationActivityData$Type();
@@ -263,6 +263,30 @@ export interface ExamUser {
263
263
  * @generated from protobuf field: optional resources.timestamp.Timestamp ended_at = 6
264
264
  */
265
265
  endedAt?: Timestamp;
266
+ /**
267
+ * @generated from protobuf field: optional resources.qualifications.exam.ExamSnapshot snapshot = 7
268
+ */
269
+ snapshot?: ExamSnapshot;
270
+ /**
271
+ * @generated from protobuf field: string attempt_id = 8
272
+ */
273
+ attemptId: string;
274
+ }
275
+ /**
276
+ * ExamSnapshot is immutable once an attempt has started. It ensures later
277
+ * edits to an exam cannot change an in-progress or historical attempt.
278
+ *
279
+ * @generated from protobuf message resources.qualifications.exam.ExamSnapshot
280
+ */
281
+ export interface ExamSnapshot {
282
+ /**
283
+ * @generated from protobuf field: resources.qualifications.exam.ExamQuestions exam = 1
284
+ */
285
+ exam?: ExamQuestions;
286
+ /**
287
+ * @generated from protobuf field: resources.qualifications.exam.QualificationExamSettings settings = 2
288
+ */
289
+ settings?: QualificationExamSettings;
266
290
  }
267
291
  /**
268
292
  * @generated from protobuf message resources.qualifications.exam.ExamResponses
@@ -280,6 +304,10 @@ export interface ExamResponses {
280
304
  * @generated from protobuf field: repeated resources.qualifications.exam.ExamResponse responses = 3
281
305
  */
282
306
  responses: ExamResponse[];
307
+ /**
308
+ * @generated from protobuf field: string attempt_id = 4
309
+ */
310
+ attemptId: string;
283
311
  }
284
312
  /**
285
313
  * @generated from protobuf message resources.qualifications.exam.ExamResponse
@@ -452,10 +480,10 @@ export enum AutoGradeMode {
452
480
  class QualificationExamSettings$Type extends MessageType<QualificationExamSettings> {
453
481
  constructor() {
454
482
  super("resources.qualifications.exam.QualificationExamSettings", [
455
- { no: 1, name: "time", kind: "message", T: () => Duration, options: { "buf.validate.field": { required: true, duration: { lt: { seconds: "1036800" }, gte: { seconds: "300" } } } } },
483
+ { no: 1, name: "time", kind: "message", T: () => Duration, options: { "buf.validate.field": { required: true, duration: { lt: { seconds: "86401" }, gte: { seconds: "300" } } } } },
456
484
  { no: 2, name: "auto_grade", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
457
485
  { no: 3, name: "auto_grade_mode", kind: "enum", T: () => ["resources.qualifications.exam.AutoGradeMode", AutoGradeMode, "AUTO_GRADE_MODE_"], options: { "buf.validate.field": { enum: { definedOnly: true } } } },
458
- { no: 4, name: "minimum_points", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
486
+ { no: 4, name: "minimum_points", kind: "scalar", T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { lte: 10000, gte: 0 } } } }
459
487
  ], { "codegen.dbscanner.dbscanner": { enabled: true } });
460
488
  }
461
489
  create(value?: PartialMessage<QualificationExamSettings>): QualificationExamSettings {
@@ -1160,13 +1188,16 @@ class ExamUser$Type extends MessageType<ExamUser> {
1160
1188
  { no: 3, name: "created_at", kind: "message", T: () => Timestamp },
1161
1189
  { no: 4, name: "started_at", kind: "message", T: () => Timestamp },
1162
1190
  { no: 5, name: "ends_at", kind: "message", T: () => Timestamp },
1163
- { no: 6, name: "ended_at", kind: "message", T: () => Timestamp }
1191
+ { no: 6, name: "ended_at", kind: "message", T: () => Timestamp },
1192
+ { no: 7, name: "snapshot", kind: "message", T: () => ExamSnapshot },
1193
+ { no: 8, name: "attempt_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
1164
1194
  ]);
1165
1195
  }
1166
1196
  create(value?: PartialMessage<ExamUser>): ExamUser {
1167
1197
  const message = globalThis.Object.create((this.messagePrototype!));
1168
1198
  message.qualificationId = 0;
1169
1199
  message.userId = 0;
1200
+ message.attemptId = "";
1170
1201
  if (value !== undefined)
1171
1202
  reflectionMergePartial<ExamUser>(this, message, value);
1172
1203
  return message;
@@ -1194,6 +1225,12 @@ class ExamUser$Type extends MessageType<ExamUser> {
1194
1225
  case /* optional resources.timestamp.Timestamp ended_at */ 6:
1195
1226
  message.endedAt = Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.endedAt);
1196
1227
  break;
1228
+ case /* optional resources.qualifications.exam.ExamSnapshot snapshot */ 7:
1229
+ message.snapshot = ExamSnapshot.internalBinaryRead(reader, reader.uint32(), options, message.snapshot);
1230
+ break;
1231
+ case /* string attempt_id */ 8:
1232
+ message.attemptId = reader.string();
1233
+ break;
1197
1234
  default:
1198
1235
  let u = options.readUnknownField;
1199
1236
  if (u === "throw")
@@ -1224,6 +1261,12 @@ class ExamUser$Type extends MessageType<ExamUser> {
1224
1261
  /* optional resources.timestamp.Timestamp ended_at = 6; */
1225
1262
  if (message.endedAt)
1226
1263
  Timestamp.internalBinaryWrite(message.endedAt, writer.tag(6, WireType.LengthDelimited).fork(), options).join();
1264
+ /* optional resources.qualifications.exam.ExamSnapshot snapshot = 7; */
1265
+ if (message.snapshot)
1266
+ ExamSnapshot.internalBinaryWrite(message.snapshot, writer.tag(7, WireType.LengthDelimited).fork(), options).join();
1267
+ /* string attempt_id = 8; */
1268
+ if (message.attemptId !== "")
1269
+ writer.tag(8, WireType.LengthDelimited).string(message.attemptId);
1227
1270
  let u = options.writeUnknownFields;
1228
1271
  if (u !== false)
1229
1272
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -1235,12 +1278,66 @@ class ExamUser$Type extends MessageType<ExamUser> {
1235
1278
  */
1236
1279
  export const ExamUser = new ExamUser$Type();
1237
1280
  // @generated message type with reflection information, may provide speed optimized methods
1281
+ class ExamSnapshot$Type extends MessageType<ExamSnapshot> {
1282
+ constructor() {
1283
+ super("resources.qualifications.exam.ExamSnapshot", [
1284
+ { no: 1, name: "exam", kind: "message", T: () => ExamQuestions },
1285
+ { no: 2, name: "settings", kind: "message", T: () => QualificationExamSettings }
1286
+ ], { "codegen.dbscanner.dbscanner": { enabled: true } });
1287
+ }
1288
+ create(value?: PartialMessage<ExamSnapshot>): ExamSnapshot {
1289
+ const message = globalThis.Object.create((this.messagePrototype!));
1290
+ if (value !== undefined)
1291
+ reflectionMergePartial<ExamSnapshot>(this, message, value);
1292
+ return message;
1293
+ }
1294
+ internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ExamSnapshot): ExamSnapshot {
1295
+ let message = target ?? this.create(), end = reader.pos + length;
1296
+ while (reader.pos < end) {
1297
+ let [fieldNo, wireType] = reader.tag();
1298
+ switch (fieldNo) {
1299
+ case /* resources.qualifications.exam.ExamQuestions exam */ 1:
1300
+ message.exam = ExamQuestions.internalBinaryRead(reader, reader.uint32(), options, message.exam);
1301
+ break;
1302
+ case /* resources.qualifications.exam.QualificationExamSettings settings */ 2:
1303
+ message.settings = QualificationExamSettings.internalBinaryRead(reader, reader.uint32(), options, message.settings);
1304
+ break;
1305
+ default:
1306
+ let u = options.readUnknownField;
1307
+ if (u === "throw")
1308
+ throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
1309
+ let d = reader.skip(wireType);
1310
+ if (u !== false)
1311
+ (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
1312
+ }
1313
+ }
1314
+ return message;
1315
+ }
1316
+ internalBinaryWrite(message: ExamSnapshot, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter {
1317
+ /* resources.qualifications.exam.ExamQuestions exam = 1; */
1318
+ if (message.exam)
1319
+ ExamQuestions.internalBinaryWrite(message.exam, writer.tag(1, WireType.LengthDelimited).fork(), options).join();
1320
+ /* resources.qualifications.exam.QualificationExamSettings settings = 2; */
1321
+ if (message.settings)
1322
+ QualificationExamSettings.internalBinaryWrite(message.settings, writer.tag(2, WireType.LengthDelimited).fork(), options).join();
1323
+ let u = options.writeUnknownFields;
1324
+ if (u !== false)
1325
+ (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
1326
+ return writer;
1327
+ }
1328
+ }
1329
+ /**
1330
+ * @generated MessageType for protobuf message resources.qualifications.exam.ExamSnapshot
1331
+ */
1332
+ export const ExamSnapshot = new ExamSnapshot$Type();
1333
+ // @generated message type with reflection information, may provide speed optimized methods
1238
1334
  class ExamResponses$Type extends MessageType<ExamResponses> {
1239
1335
  constructor() {
1240
1336
  super("resources.qualifications.exam.ExamResponses", [
1241
1337
  { no: 1, name: "qualification_id", kind: "scalar", T: 3 /*ScalarType.INT64*/, L: 2 /*LongType.NUMBER*/ },
1242
1338
  { no: 2, name: "user_id", kind: "scalar", T: 5 /*ScalarType.INT32*/ },
1243
- { no: 3, name: "responses", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => ExamResponse, options: { "buf.validate.field": { repeated: { maxItems: "100" } } } }
1339
+ { no: 3, name: "responses", kind: "message", repeat: 2 /*RepeatType.UNPACKED*/, T: () => ExamResponse, options: { "buf.validate.field": { repeated: { maxItems: "100" } } } },
1340
+ { no: 4, name: "attempt_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
1244
1341
  ], { "codegen.dbscanner.dbscanner": { enabled: true } });
1245
1342
  }
1246
1343
  create(value?: PartialMessage<ExamResponses>): ExamResponses {
@@ -1248,6 +1345,7 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1248
1345
  message.qualificationId = 0;
1249
1346
  message.userId = 0;
1250
1347
  message.responses = [];
1348
+ message.attemptId = "";
1251
1349
  if (value !== undefined)
1252
1350
  reflectionMergePartial<ExamResponses>(this, message, value);
1253
1351
  return message;
@@ -1266,6 +1364,9 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1266
1364
  case /* repeated resources.qualifications.exam.ExamResponse responses */ 3:
1267
1365
  message.responses.push(ExamResponse.internalBinaryRead(reader, reader.uint32(), options));
1268
1366
  break;
1367
+ case /* string attempt_id */ 4:
1368
+ message.attemptId = reader.string();
1369
+ break;
1269
1370
  default:
1270
1371
  let u = options.readUnknownField;
1271
1372
  if (u === "throw")
@@ -1287,6 +1388,9 @@ class ExamResponses$Type extends MessageType<ExamResponses> {
1287
1388
  /* repeated resources.qualifications.exam.ExamResponse responses = 3; */
1288
1389
  for (let i = 0; i < message.responses.length; i++)
1289
1390
  ExamResponse.internalBinaryWrite(message.responses[i], writer.tag(3, WireType.LengthDelimited).fork(), options).join();
1391
+ /* string attempt_id = 4; */
1392
+ if (message.attemptId !== "")
1393
+ writer.tag(4, WireType.LengthDelimited).string(message.attemptId);
1290
1394
  let u = options.writeUnknownFields;
1291
1395
  if (u !== false)
1292
1396
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -311,6 +311,10 @@ export interface QualificationRequest {
311
311
  * @generated from protobuf field: optional string approver_job = 13
312
312
  */
313
313
  approverJob?: string;
314
+ /**
315
+ * @generated from protobuf field: optional string exam_attempt_id = 14
316
+ */
317
+ examAttemptId?: string;
314
318
  }
315
319
  /**
316
320
  * @generated from protobuf message resources.qualifications.QualificationResult
@@ -368,6 +372,14 @@ export interface QualificationResult {
368
372
  * @generated from protobuf field: string creator_job = 13
369
373
  */
370
374
  creatorJob: string;
375
+ /**
376
+ * @generated from protobuf field: bool auto_graded = 14
377
+ */
378
+ autoGraded: boolean;
379
+ /**
380
+ * @generated from protobuf field: optional string exam_attempt_id = 15
381
+ */
382
+ examAttemptId?: string;
371
383
  }
372
384
  /**
373
385
  * @generated from protobuf enum resources.qualifications.RequestStatus
@@ -1001,7 +1013,8 @@ class QualificationRequest$Type extends MessageType<QualificationRequest> {
1001
1013
  { no: 10, name: "approver_comment", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
1002
1014
  { no: 11, name: "approver_id", kind: "scalar", opt: true, T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { gt: 0 } } } },
1003
1015
  { no: 12, name: "approver", kind: "message", T: () => UserShort, options: { "tagger.tags": "alias:\"approver\"" } },
1004
- { no: 13, name: "approver_job", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ }
1016
+ { no: 13, name: "approver_job", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ },
1017
+ { no: 14, name: "exam_attempt_id", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ }
1005
1018
  ]);
1006
1019
  }
1007
1020
  create(value?: PartialMessage<QualificationRequest>): QualificationRequest {
@@ -1056,6 +1069,9 @@ class QualificationRequest$Type extends MessageType<QualificationRequest> {
1056
1069
  case /* optional string approver_job */ 13:
1057
1070
  message.approverJob = reader.string();
1058
1071
  break;
1072
+ case /* optional string exam_attempt_id */ 14:
1073
+ message.examAttemptId = reader.string();
1074
+ break;
1059
1075
  default:
1060
1076
  let u = options.readUnknownField;
1061
1077
  if (u === "throw")
@@ -1107,6 +1123,9 @@ class QualificationRequest$Type extends MessageType<QualificationRequest> {
1107
1123
  /* optional string approver_job = 13; */
1108
1124
  if (message.approverJob !== undefined)
1109
1125
  writer.tag(13, WireType.LengthDelimited).string(message.approverJob);
1126
+ /* optional string exam_attempt_id = 14; */
1127
+ if (message.examAttemptId !== undefined)
1128
+ writer.tag(14, WireType.LengthDelimited).string(message.examAttemptId);
1110
1129
  let u = options.writeUnknownFields;
1111
1130
  if (u !== false)
1112
1131
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -1133,7 +1152,9 @@ class QualificationResult$Type extends MessageType<QualificationResult> {
1133
1152
  { no: 10, name: "summary", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "512" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
1134
1153
  { no: 11, name: "creator_id", kind: "scalar", T: 5 /*ScalarType.INT32*/, options: { "buf.validate.field": { int32: { gt: 0 } } } },
1135
1154
  { no: 12, name: "creator", kind: "message", T: () => UserShort, options: { "tagger.tags": "alias:\"creator\"" } },
1136
- { no: 13, name: "creator_job", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "20" } } } }
1155
+ { no: 13, name: "creator_job", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "20" } } } },
1156
+ { no: 14, name: "auto_graded", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
1157
+ { no: 15, name: "exam_attempt_id", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/ }
1137
1158
  ]);
1138
1159
  }
1139
1160
  create(value?: PartialMessage<QualificationResult>): QualificationResult {
@@ -1145,6 +1166,7 @@ class QualificationResult$Type extends MessageType<QualificationResult> {
1145
1166
  message.summary = "";
1146
1167
  message.creatorId = 0;
1147
1168
  message.creatorJob = "";
1169
+ message.autoGraded = false;
1148
1170
  if (value !== undefined)
1149
1171
  reflectionMergePartial<QualificationResult>(this, message, value);
1150
1172
  return message;
@@ -1193,6 +1215,12 @@ class QualificationResult$Type extends MessageType<QualificationResult> {
1193
1215
  case /* string creator_job */ 13:
1194
1216
  message.creatorJob = reader.string();
1195
1217
  break;
1218
+ case /* bool auto_graded */ 14:
1219
+ message.autoGraded = reader.bool();
1220
+ break;
1221
+ case /* optional string exam_attempt_id */ 15:
1222
+ message.examAttemptId = reader.string();
1223
+ break;
1196
1224
  default:
1197
1225
  let u = options.readUnknownField;
1198
1226
  if (u === "throw")
@@ -1244,6 +1272,12 @@ class QualificationResult$Type extends MessageType<QualificationResult> {
1244
1272
  /* string creator_job = 13; */
1245
1273
  if (message.creatorJob !== "")
1246
1274
  writer.tag(13, WireType.LengthDelimited).string(message.creatorJob);
1275
+ /* bool auto_graded = 14; */
1276
+ if (message.autoGraded !== false)
1277
+ writer.tag(14, WireType.Varint).bool(message.autoGraded);
1278
+ /* optional string exam_attempt_id = 15; */
1279
+ if (message.examAttemptId !== undefined)
1280
+ writer.tag(15, WireType.LengthDelimited).string(message.examAttemptId);
1247
1281
  let u = options.writeUnknownFields;
1248
1282
  if (u !== false)
1249
1283
  (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
@@ -795,8 +795,8 @@ export const Website = new Website$Type();
795
795
  class Links$Type extends MessageType<Links> {
796
796
  constructor() {
797
797
  super("resources.settings.Links", [
798
- { no: 1, name: "privacy_policy", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } },
799
- { no: 2, name: "imprint", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true } } }
798
+ { no: 1, name: "privacy_policy", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true }, "tagger.tags": "json:\"privacy_policy\"" } },
799
+ { no: 2, name: "imprint", kind: "scalar", opt: true, T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } }, "codegen.sanitizer.sanitizer": { enabled: true, stripHtmlTags: true }, "tagger.tags": "json:\"imprint\"" } }
800
800
  ]);
801
801
  }
802
802
  create(value?: PartialMessage<Links>): Links {
@@ -1520,7 +1520,7 @@ export const PenaltyCalculatorWarn = new PenaltyCalculatorWarn$Type();
1520
1520
  class Livemap$Type extends MessageType<Livemap> {
1521
1521
  constructor() {
1522
1522
  super("resources.settings.Livemap", [
1523
- { no: 1, name: "enable_cayo_perico", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }
1523
+ { no: 1, name: "enable_cayo_perico", kind: "scalar", T: 8 /*ScalarType.BOOL*/, options: { "tagger.tags": "json:\"enableCayoPerico\"" } }
1524
1524
  ]);
1525
1525
  }
1526
1526
  create(value?: PartialMessage<Livemap>): Livemap {
@@ -133,10 +133,10 @@ export interface AccountUpdate {
133
133
  class UserOAuth2Conn$Type extends MessageType<UserOAuth2Conn> {
134
134
  constructor() {
135
135
  super("resources.sync.activity.UserOAuth2Conn", [
136
- { no: 1, name: "provider_name", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
137
- { no: 2, name: "identifier", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
138
- { no: 3, name: "external_id", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
139
- { no: 4, name: "username", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
136
+ { no: 1, name: "provider_name", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } } } },
137
+ { no: 2, name: "identifier", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "64" } } } },
138
+ { no: 3, name: "external_id", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "128" } } } },
139
+ { no: 4, name: "username", kind: "scalar", T: 9 /*ScalarType.STRING*/, options: { "buf.validate.field": { string: { maxLen: "255" } } } }
140
140
  ]);
141
141
  }
142
142
  create(value?: PartialMessage<UserOAuth2Conn>): UserOAuth2Conn {