@altnovatrail/contracts 0.8.2 → 0.8.3

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.
@@ -11,6 +11,7 @@
11
11
 
12
12
  import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
13
13
  import type { Message } from "@bufbuild/protobuf";
14
+ import type { LessonRunRef, OpenAttemptRef } from "./learning_pb.js";
14
15
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
15
16
  import type { OwnKey } from "./attempt_pb.js";
16
17
  import type { Outcome } from "./cause_pb.js";
@@ -147,9 +148,9 @@ export declare type Account = Message<"novatrail.api.v1.Account"> & {
147
148
  export declare const AccountSchema: GenMessage<Account>;
148
149
 
149
150
  /**
150
- * A profile, a learner in the account (concepts 13), as `api` keeps it. Its date of the age given
151
- * and its last activity stay in `api`; its interests come only once the module format gives a
152
- * task a look by interests (concepts 13; R51).
151
+ * A profile, a learner in the account (concepts 13), as `api` keeps it, with its open attempt and
152
+ * its open lesson runs. Its date of the age given and its last activity stay in `api`; its
153
+ * interests come only once the module format gives a task a look by interests (concepts 13; R51).
153
154
  *
154
155
  * @generated from message novatrail.api.v1.Profile
155
156
  */
@@ -235,6 +236,20 @@ export declare type Profile = Message<"novatrail.api.v1.Profile"> & {
235
236
  * @generated from field: bool ask_before_showing = 11;
236
237
  */
237
238
  askBeforeShowing: boolean;
239
+
240
+ /**
241
+ * The profile's open attempt: absent when it has none. A profile has one open attempt at most.
242
+ *
243
+ * @generated from field: novatrail.api.v1.OpenAttemptRef open_attempt = 12;
244
+ */
245
+ openAttempt?: OpenAttemptRef | undefined;
246
+
247
+ /**
248
+ * The profile's open lesson runs, one at most for each lesson.
249
+ *
250
+ * @generated from field: repeated novatrail.api.v1.LessonRunRef open_lesson_runs = 13;
251
+ */
252
+ openLessonRuns: LessonRunRef[];
238
253
  };
239
254
 
240
255
  /**
@@ -1322,11 +1337,12 @@ export declare const OwnKeyCheckSchema: GenEnum<OwnKeyCheck>;
1322
1337
  */
1323
1338
  export declare const AccountService: GenService<{
1324
1339
  /**
1325
- * The account and its profiles, each with its fields, and the consents that have no profile yet.
1326
- * `app` reads it when it starts and after signing in, and erases the databases of the profiles
1327
- * that the list does not hold: only by an answer that came, and for the account the registry of
1328
- * the device names; a failure of the network erases nothing. A user with no account gets
1329
- * `CAUSE_NO_ACCESS`, and `app` asks for an invite code.
1340
+ * The account and its profiles, each with its fields, its open attempt and its open lesson runs,
1341
+ * and the consents that have no profile yet. `app` reads it when it starts and after signing in,
1342
+ * and erases the databases of the profiles that the list does not hold: only by an answer that
1343
+ * came, and for the account the registry of the device names; a failure of the network erases
1344
+ * nothing. By the open attempt and runs a device that keeps no state of them finds them. A user
1345
+ * with no account gets `CAUSE_NO_ACCESS`, and `app` asks for an invite code.
1330
1346
  *
1331
1347
  * @generated from rpc novatrail.api.v1.AccountService.GetAccount
1332
1348
  */
@@ -13,12 +13,13 @@ import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/
13
13
  import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
14
14
  import { file_novatrail_api_v1_attempt } from "./attempt_pb.js";
15
15
  import { file_novatrail_api_v1_cause } from "./cause_pb.js";
16
+ import { file_novatrail_api_v1_learning } from "./learning_pb.js";
16
17
 
17
18
  /**
18
19
  * Describes the file novatrail/api/v1/account.proto.
19
20
  */
20
21
  export const file_novatrail_api_v1_account = /*@__PURE__*/
21
- fileDesc("Ch5ub3ZhdHJhaWwvYXBpL3YxL2FjY291bnQucHJvdG8SEG5vdmF0cmFpbC5hcGkudjEiEwoRR2V0QWNjb3VudFJlcXVlc3QiQAoSR2V0QWNjb3VudFJlc3BvbnNlEioKB2FjY291bnQYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLkFjY291bnQiQQoUQ3JlYXRlQWNjb3VudFJlcXVlc3QSEwoLaW52aXRlX2NvZGUYASABKAkSFAoMYWR1bHRfc3RhdGVkGAIgASgIIkMKFUNyZWF0ZUFjY291bnRSZXNwb25zZRIqCgdhY2NvdW50GAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5BY2NvdW50IpMBCgdBY2NvdW50EhIKCmFjY291bnRfaWQYASABKAkSDwoHcGluX3NldBgCIAEoCBIrCghwcm9maWxlcxgDIAMoCzIZLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZRI2Cg5jaGlsZF9jb25zZW50cxgEIAMoCzIeLm5vdmF0cmFpbC5hcGkudjEuQ2hpbGRDb25zZW50ItcCCgdQcm9maWxlEhIKCnByb2ZpbGVfaWQYASABKAkSDQoFb3duZXIYAiABKAgSEQoJcHNldWRvbnltGAMgASgJEg4KBmF2YXRhchgEIAEoCRIUCgxhZ2VfY2F0ZWdvcnkYBSABKAkSDwoHY291bnRyeRgGIAEoCRI/ChJwcmVzZW50YXRpb25fc3R5bGUYByABKAsyIy5ub3ZhdHJhaWwuYXBpLnYxLlByZXNlbnRhdGlvblN0eWxlEiwKDGRlZmF1bHRfbW9kZRgIIAEoDjIWLm5vdmF0cmFpbC5hcGkudjEuTW9kZRIfChJpbnRlcmZhY2VfbGFuZ3VhZ2UYCSABKAlIAIgBARISCgVncmFkZRgKIAEoBUgBiAEBEhoKEmFza19iZWZvcmVfc2hvd2luZxgLIAEoCEIVChNfaW50ZXJmYWNlX2xhbmd1YWdlQggKBl9ncmFkZSI/ChFQcmVzZW50YXRpb25TdHlsZRIqCgd2b2ljaW5nGAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nIloKB1ZvaWNpbmcSFAoHZW5hYmxlZBgBIAEoCEgAiAEBEi0KBXNwZWVkGAIgASgOMh4ubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nU3BlZWRCCgoIX2VuYWJsZWQivwIKD1Byb2ZpbGVTZXR0aW5ncxIWCglwc2V1ZG9ueW0YASABKAlIAIgBARITCgZhdmF0YXIYAiABKAlIAYgBARIqCgd2b2ljaW5nGAMgASgLMhkubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nEiwKDGRlZmF1bHRfbW9kZRgEIAEoDjIWLm5vdmF0cmFpbC5hcGkudjEuTW9kZRIfChJpbnRlcmZhY2VfbGFuZ3VhZ2UYBSABKAlIAogBARISCgVncmFkZRgGIAEoBUgDiAEBEh8KEmFza19iZWZvcmVfc2hvd2luZxgHIAEoCEgEiAEBQgwKCl9wc2V1ZG9ueW1CCQoHX2F2YXRhckIVChNfaW50ZXJmYWNlX2xhbmd1YWdlQggKBl9ncmFkZUIVChNfYXNrX2JlZm9yZV9zaG93aW5nIngKDENoaWxkQ29uc2VudBISCgpjb25zZW50X2lkGAEgASgJEhQKDGFnZV9jYXRlZ29yeRgCIAEoCRIPCgdjb3VudHJ5GAMgASgJEi0KBXN0YXRlGAQgASgOMh4ubm92YXRyYWlsLmFwaS52MS5Db25zZW50U3RhdGUiNQoNU2V0UGluUmVxdWVzdBILCgNwaW4YASABKAkSFwoPaWRlbXBvdGVuY3lfa2V5GAIgASgJIhAKDlNldFBpblJlc3BvbnNlIjgKEFZlcmlmeVBpblJlcXVlc3QSCwoDcGluGAEgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgCIAEoCSI+ChFWZXJpZnlQaW5SZXNwb25zZRIpCgVjaGVjaxgBIAEoCzIaLm5vdmF0cmFpbC5hcGkudjEuUGluQ2hlY2siSQoQQ2hhbmdlUGluUmVxdWVzdBILCgNwaW4YASABKAkSDwoHbmV3X3BpbhgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkiPgoRQ2hhbmdlUGluUmVzcG9uc2USKQoFY2hlY2sYASABKAsyGi5ub3ZhdHJhaWwuYXBpLnYxLlBpbkNoZWNrImQKCFBpbkNoZWNrEg8KB21hdGNoZXMYASABKAgSFQoNYXR0ZW1wdHNfbGVmdBgCIAEoBRIwCgxsb2NrZWRfdW50aWwYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIjsKD1Jlc2V0UGluUmVxdWVzdBIPCgduZXdfcGluGAEgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgCIAEoCSISChBSZXNldFBpblJlc3BvbnNlImEKGUNyZWF0ZU93bmVyUHJvZmlsZVJlcXVlc3QSDwoHY291bnRyeRgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkgKGkNyZWF0ZU93bmVyUHJvZmlsZVJlc3BvbnNlEioKB3Byb2ZpbGUYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLlByb2ZpbGUibAoaUmVxdWVzdENoaWxkQ29uc2VudFJlcXVlc3QSFwoPaWRlbXBvdGVuY3lfa2V5GAEgASgJEhYKCWFnZV95ZWFycxgCIAEoBUgAiAEBEg8KB2NvdW50cnkYAyABKAlCDAoKX2FnZV95ZWFycyJOChtSZXF1ZXN0Q2hpbGRDb25zZW50UmVzcG9uc2USLwoHY29uc2VudBgBIAEoCzIeLm5vdmF0cmFpbC5hcGkudjEuQ2hpbGRDb25zZW50ImQKGUNyZWF0ZUNoaWxkUHJvZmlsZVJlcXVlc3QSEgoKY29uc2VudF9pZBgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkgKGkNyZWF0ZUNoaWxkUHJvZmlsZVJlc3BvbnNlEioKB3Byb2ZpbGUYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLlByb2ZpbGUiXwoUVXBkYXRlUHJvZmlsZVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkMKFVVwZGF0ZVByb2ZpbGVSZXNwb25zZRIqCgdwcm9maWxlGAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5Qcm9maWxlIlMKEVNldFZvaWNpbmdSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSKgoHdm9pY2luZxgCIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuVm9pY2luZyJAChJTZXRWb2ljaW5nUmVzcG9uc2USKgoHcHJvZmlsZRgBIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZSIqChREZWxldGVQcm9maWxlUmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJIhcKFURlbGV0ZVByb2ZpbGVSZXNwb25zZSIWChREZWxldGVBY2NvdW50UmVxdWVzdCIXChVEZWxldGVBY2NvdW50UmVzcG9uc2UiKgoURXhwb3J0UHJvZmlsZVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCSJEChVFeHBvcnRQcm9maWxlUmVzcG9uc2USDAoEcGFydBgBIAEoDBIdChVleHBvcnRfZm9ybWF0X3ZlcnNpb24YAiABKAkiFgoURXhwb3J0QWNjb3VudFJlcXVlc3QiRAoVRXhwb3J0QWNjb3VudFJlc3BvbnNlEgwKBHBhcnQYASABKAwSHQoVZXhwb3J0X2Zvcm1hdF92ZXJzaW9uGAIgASgJIlMKEkNoZWNrT3duS2V5UmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEikKB293bl9rZXkYAiABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleSJvChNDaGVja093bktleVJlc3BvbnNlEiwKBWNoZWNrGAEgASgOMh0ubm92YXRyYWlsLmFwaS52MS5Pd25LZXlDaGVjaxIqCgdvdXRjb21lGAIgASgLMhkubm92YXRyYWlsLmFwaS52MS5PdXRjb21lIjAKGkxpc3RPd25LZXlQcm92aWRlcnNSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkiUgobTGlzdE93bktleVByb3ZpZGVyc1Jlc3BvbnNlEjMKCXByb3ZpZGVycxgBIAMoCzIgLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5UHJvdmlkZXIiMAoOT3duS2V5UHJvdmlkZXISEAoIcHJvdmlkZXIYASABKAkSDAoEbmFtZRgCIAEoCSpfCgxWb2ljaW5nU3BlZWQSHQoZVk9JQ0lOR19TUEVFRF9VTlNQRUNJRklFRBAAEhgKFFZPSUNJTkdfU1BFRURfTk9STUFMEAESFgoSVk9JQ0lOR19TUEVFRF9TTE9XEAIqPgoETW9kZRIUChBNT0RFX1VOU1BFQ0lGSUVEEAASEQoNTU9ERV9CWV9TVEVQUxABEg0KCU1PREVfU0VMRhACKmUKDENvbnNlbnRTdGF0ZRIdChlDT05TRU5UX1NUQVRFX1VOU1BFQ0lGSUVEEAASGQoVQ09OU0VOVF9TVEFURV9XQUlUSU5HEAESGwoXQ09OU0VOVF9TVEFURV9DT05GSVJNRUQQAiqnAQoLT3duS2V5Q2hlY2sSHQoZT1dOX0tFWV9DSEVDS19VTlNQRUNJRklFRBAAEhoKFk9XTl9LRVlfQ0hFQ0tfQUNDRVBURUQQARIZChVPV05fS0VZX0NIRUNLX0lOVkFMSUQQAhIfChtPV05fS0VZX0NIRUNLX05PX1BFUk1JU1NJT04QAxIhCh1PV05fS0VZX0NIRUNLX1BST1ZJREVSX0NMT1NFRBAEMoANCg5BY2NvdW50U2VydmljZRJXCgpHZXRBY2NvdW50EiMubm92YXRyYWlsLmFwaS52MS5HZXRBY2NvdW50UmVxdWVzdBokLm5vdmF0cmFpbC5hcGkudjEuR2V0QWNjb3VudFJlc3BvbnNlEmAKDUNyZWF0ZUFjY291bnQSJi5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZUFjY291bnRSZXF1ZXN0Gicubm92YXRyYWlsLmFwaS52MS5DcmVhdGVBY2NvdW50UmVzcG9uc2USSwoGU2V0UGluEh8ubm92YXRyYWlsLmFwaS52MS5TZXRQaW5SZXF1ZXN0GiAubm92YXRyYWlsLmFwaS52MS5TZXRQaW5SZXNwb25zZRJUCglWZXJpZnlQaW4SIi5ub3ZhdHJhaWwuYXBpLnYxLlZlcmlmeVBpblJlcXVlc3QaIy5ub3ZhdHJhaWwuYXBpLnYxLlZlcmlmeVBpblJlc3BvbnNlElQKCUNoYW5nZVBpbhIiLm5vdmF0cmFpbC5hcGkudjEuQ2hhbmdlUGluUmVxdWVzdBojLm5vdmF0cmFpbC5hcGkudjEuQ2hhbmdlUGluUmVzcG9uc2USUQoIUmVzZXRQaW4SIS5ub3ZhdHJhaWwuYXBpLnYxLlJlc2V0UGluUmVxdWVzdBoiLm5vdmF0cmFpbC5hcGkudjEuUmVzZXRQaW5SZXNwb25zZRJvChJDcmVhdGVPd25lclByb2ZpbGUSKy5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZU93bmVyUHJvZmlsZVJlcXVlc3QaLC5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZU93bmVyUHJvZmlsZVJlc3BvbnNlEnIKE1JlcXVlc3RDaGlsZENvbnNlbnQSLC5ub3ZhdHJhaWwuYXBpLnYxLlJlcXVlc3RDaGlsZENvbnNlbnRSZXF1ZXN0Gi0ubm92YXRyYWlsLmFwaS52MS5SZXF1ZXN0Q2hpbGRDb25zZW50UmVzcG9uc2USbwoSQ3JlYXRlQ2hpbGRQcm9maWxlEisubm92YXRyYWlsLmFwaS52MS5DcmVhdGVDaGlsZFByb2ZpbGVSZXF1ZXN0Giwubm92YXRyYWlsLmFwaS52MS5DcmVhdGVDaGlsZFByb2ZpbGVSZXNwb25zZRJgCg1VcGRhdGVQcm9maWxlEiYubm92YXRyYWlsLmFwaS52MS5VcGRhdGVQcm9maWxlUmVxdWVzdBonLm5vdmF0cmFpbC5hcGkudjEuVXBkYXRlUHJvZmlsZVJlc3BvbnNlElcKClNldFZvaWNpbmcSIy5ub3ZhdHJhaWwuYXBpLnYxLlNldFZvaWNpbmdSZXF1ZXN0GiQubm92YXRyYWlsLmFwaS52MS5TZXRWb2ljaW5nUmVzcG9uc2USYAoNRGVsZXRlUHJvZmlsZRImLm5vdmF0cmFpbC5hcGkudjEuRGVsZXRlUHJvZmlsZVJlcXVlc3QaJy5ub3ZhdHJhaWwuYXBpLnYxLkRlbGV0ZVByb2ZpbGVSZXNwb25zZRJgCg1EZWxldGVBY2NvdW50EiYubm92YXRyYWlsLmFwaS52MS5EZWxldGVBY2NvdW50UmVxdWVzdBonLm5vdmF0cmFpbC5hcGkudjEuRGVsZXRlQWNjb3VudFJlc3BvbnNlEmAKDUV4cG9ydFByb2ZpbGUSJi5ub3ZhdHJhaWwuYXBpLnYxLkV4cG9ydFByb2ZpbGVSZXF1ZXN0Gicubm92YXRyYWlsLmFwaS52MS5FeHBvcnRQcm9maWxlUmVzcG9uc2USYAoNRXhwb3J0QWNjb3VudBImLm5vdmF0cmFpbC5hcGkudjEuRXhwb3J0QWNjb3VudFJlcXVlc3QaJy5ub3ZhdHJhaWwuYXBpLnYxLkV4cG9ydEFjY291bnRSZXNwb25zZRJaCgtDaGVja093bktleRIkLm5vdmF0cmFpbC5hcGkudjEuQ2hlY2tPd25LZXlSZXF1ZXN0GiUubm92YXRyYWlsLmFwaS52MS5DaGVja093bktleVJlc3BvbnNlEnIKE0xpc3RPd25LZXlQcm92aWRlcnMSLC5ub3ZhdHJhaWwuYXBpLnYxLkxpc3RPd25LZXlQcm92aWRlcnNSZXF1ZXN0Gi0ubm92YXRyYWlsLmFwaS52MS5MaXN0T3duS2V5UHJvdmlkZXJzUmVzcG9uc2VCxQEKFGNvbS5ub3ZhdHJhaWwuYXBpLnYxQgxBY2NvdW50UHJvdG9QAVo9Z2l0aHViLmNvbS9hbHRub3ZhdHJhaWwvc3BlYy9jb250cmFjdHMvbm92YXRyYWlsL2FwaS92MTthcGl2MaICA05BWKoCEE5vdmF0cmFpbC5BcGkuVjHKAhBOb3ZhdHJhaWxcQXBpXFYx4gIcTm92YXRyYWlsXEFwaVxWMVxHUEJNZXRhZGF0YeoCEk5vdmF0cmFpbDo6QXBpOjpWMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_novatrail_api_v1_attempt, file_novatrail_api_v1_cause]);
22
+ fileDesc("Ch5ub3ZhdHJhaWwvYXBpL3YxL2FjY291bnQucHJvdG8SEG5vdmF0cmFpbC5hcGkudjEiEwoRR2V0QWNjb3VudFJlcXVlc3QiQAoSR2V0QWNjb3VudFJlc3BvbnNlEioKB2FjY291bnQYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLkFjY291bnQiQQoUQ3JlYXRlQWNjb3VudFJlcXVlc3QSEwoLaW52aXRlX2NvZGUYASABKAkSFAoMYWR1bHRfc3RhdGVkGAIgASgIIkMKFUNyZWF0ZUFjY291bnRSZXNwb25zZRIqCgdhY2NvdW50GAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5BY2NvdW50IpMBCgdBY2NvdW50EhIKCmFjY291bnRfaWQYASABKAkSDwoHcGluX3NldBgCIAEoCBIrCghwcm9maWxlcxgDIAMoCzIZLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZRI2Cg5jaGlsZF9jb25zZW50cxgEIAMoCzIeLm5vdmF0cmFpbC5hcGkudjEuQ2hpbGRDb25zZW50IskDCgdQcm9maWxlEhIKCnByb2ZpbGVfaWQYASABKAkSDQoFb3duZXIYAiABKAgSEQoJcHNldWRvbnltGAMgASgJEg4KBmF2YXRhchgEIAEoCRIUCgxhZ2VfY2F0ZWdvcnkYBSABKAkSDwoHY291bnRyeRgGIAEoCRI/ChJwcmVzZW50YXRpb25fc3R5bGUYByABKAsyIy5ub3ZhdHJhaWwuYXBpLnYxLlByZXNlbnRhdGlvblN0eWxlEiwKDGRlZmF1bHRfbW9kZRgIIAEoDjIWLm5vdmF0cmFpbC5hcGkudjEuTW9kZRIfChJpbnRlcmZhY2VfbGFuZ3VhZ2UYCSABKAlIAIgBARISCgVncmFkZRgKIAEoBUgBiAEBEhoKEmFza19iZWZvcmVfc2hvd2luZxgLIAEoCBI2CgxvcGVuX2F0dGVtcHQYDCABKAsyIC5ub3ZhdHJhaWwuYXBpLnYxLk9wZW5BdHRlbXB0UmVmEjgKEG9wZW5fbGVzc29uX3J1bnMYDSADKAsyHi5ub3ZhdHJhaWwuYXBpLnYxLkxlc3NvblJ1blJlZkIVChNfaW50ZXJmYWNlX2xhbmd1YWdlQggKBl9ncmFkZSI/ChFQcmVzZW50YXRpb25TdHlsZRIqCgd2b2ljaW5nGAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nIloKB1ZvaWNpbmcSFAoHZW5hYmxlZBgBIAEoCEgAiAEBEi0KBXNwZWVkGAIgASgOMh4ubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nU3BlZWRCCgoIX2VuYWJsZWQivwIKD1Byb2ZpbGVTZXR0aW5ncxIWCglwc2V1ZG9ueW0YASABKAlIAIgBARITCgZhdmF0YXIYAiABKAlIAYgBARIqCgd2b2ljaW5nGAMgASgLMhkubm92YXRyYWlsLmFwaS52MS5Wb2ljaW5nEiwKDGRlZmF1bHRfbW9kZRgEIAEoDjIWLm5vdmF0cmFpbC5hcGkudjEuTW9kZRIfChJpbnRlcmZhY2VfbGFuZ3VhZ2UYBSABKAlIAogBARISCgVncmFkZRgGIAEoBUgDiAEBEh8KEmFza19iZWZvcmVfc2hvd2luZxgHIAEoCEgEiAEBQgwKCl9wc2V1ZG9ueW1CCQoHX2F2YXRhckIVChNfaW50ZXJmYWNlX2xhbmd1YWdlQggKBl9ncmFkZUIVChNfYXNrX2JlZm9yZV9zaG93aW5nIngKDENoaWxkQ29uc2VudBISCgpjb25zZW50X2lkGAEgASgJEhQKDGFnZV9jYXRlZ29yeRgCIAEoCRIPCgdjb3VudHJ5GAMgASgJEi0KBXN0YXRlGAQgASgOMh4ubm92YXRyYWlsLmFwaS52MS5Db25zZW50U3RhdGUiNQoNU2V0UGluUmVxdWVzdBILCgNwaW4YASABKAkSFwoPaWRlbXBvdGVuY3lfa2V5GAIgASgJIhAKDlNldFBpblJlc3BvbnNlIjgKEFZlcmlmeVBpblJlcXVlc3QSCwoDcGluGAEgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgCIAEoCSI+ChFWZXJpZnlQaW5SZXNwb25zZRIpCgVjaGVjaxgBIAEoCzIaLm5vdmF0cmFpbC5hcGkudjEuUGluQ2hlY2siSQoQQ2hhbmdlUGluUmVxdWVzdBILCgNwaW4YASABKAkSDwoHbmV3X3BpbhgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkiPgoRQ2hhbmdlUGluUmVzcG9uc2USKQoFY2hlY2sYASABKAsyGi5ub3ZhdHJhaWwuYXBpLnYxLlBpbkNoZWNrImQKCFBpbkNoZWNrEg8KB21hdGNoZXMYASABKAgSFQoNYXR0ZW1wdHNfbGVmdBgCIAEoBRIwCgxsb2NrZWRfdW50aWwYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIjsKD1Jlc2V0UGluUmVxdWVzdBIPCgduZXdfcGluGAEgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgCIAEoCSISChBSZXNldFBpblJlc3BvbnNlImEKGUNyZWF0ZU93bmVyUHJvZmlsZVJlcXVlc3QSDwoHY291bnRyeRgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkgKGkNyZWF0ZU93bmVyUHJvZmlsZVJlc3BvbnNlEioKB3Byb2ZpbGUYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLlByb2ZpbGUibAoaUmVxdWVzdENoaWxkQ29uc2VudFJlcXVlc3QSFwoPaWRlbXBvdGVuY3lfa2V5GAEgASgJEhYKCWFnZV95ZWFycxgCIAEoBUgAiAEBEg8KB2NvdW50cnkYAyABKAlCDAoKX2FnZV95ZWFycyJOChtSZXF1ZXN0Q2hpbGRDb25zZW50UmVzcG9uc2USLwoHY29uc2VudBgBIAEoCzIeLm5vdmF0cmFpbC5hcGkudjEuQ2hpbGRDb25zZW50ImQKGUNyZWF0ZUNoaWxkUHJvZmlsZVJlcXVlc3QSEgoKY29uc2VudF9pZBgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkgKGkNyZWF0ZUNoaWxkUHJvZmlsZVJlc3BvbnNlEioKB3Byb2ZpbGUYASABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLlByb2ZpbGUiXwoUVXBkYXRlUHJvZmlsZVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRIzCghzZXR0aW5ncxgCIAEoCzIhLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZVNldHRpbmdzIkMKFVVwZGF0ZVByb2ZpbGVSZXNwb25zZRIqCgdwcm9maWxlGAEgASgLMhkubm92YXRyYWlsLmFwaS52MS5Qcm9maWxlIlMKEVNldFZvaWNpbmdSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSKgoHdm9pY2luZxgCIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuVm9pY2luZyJAChJTZXRWb2ljaW5nUmVzcG9uc2USKgoHcHJvZmlsZRgBIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuUHJvZmlsZSIqChREZWxldGVQcm9maWxlUmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJIhcKFURlbGV0ZVByb2ZpbGVSZXNwb25zZSIWChREZWxldGVBY2NvdW50UmVxdWVzdCIXChVEZWxldGVBY2NvdW50UmVzcG9uc2UiKgoURXhwb3J0UHJvZmlsZVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCSJEChVFeHBvcnRQcm9maWxlUmVzcG9uc2USDAoEcGFydBgBIAEoDBIdChVleHBvcnRfZm9ybWF0X3ZlcnNpb24YAiABKAkiFgoURXhwb3J0QWNjb3VudFJlcXVlc3QiRAoVRXhwb3J0QWNjb3VudFJlc3BvbnNlEgwKBHBhcnQYASABKAwSHQoVZXhwb3J0X2Zvcm1hdF92ZXJzaW9uGAIgASgJIlMKEkNoZWNrT3duS2V5UmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEikKB293bl9rZXkYAiABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleSJvChNDaGVja093bktleVJlc3BvbnNlEiwKBWNoZWNrGAEgASgOMh0ubm92YXRyYWlsLmFwaS52MS5Pd25LZXlDaGVjaxIqCgdvdXRjb21lGAIgASgLMhkubm92YXRyYWlsLmFwaS52MS5PdXRjb21lIjAKGkxpc3RPd25LZXlQcm92aWRlcnNSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkiUgobTGlzdE93bktleVByb3ZpZGVyc1Jlc3BvbnNlEjMKCXByb3ZpZGVycxgBIAMoCzIgLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5UHJvdmlkZXIiMAoOT3duS2V5UHJvdmlkZXISEAoIcHJvdmlkZXIYASABKAkSDAoEbmFtZRgCIAEoCSpfCgxWb2ljaW5nU3BlZWQSHQoZVk9JQ0lOR19TUEVFRF9VTlNQRUNJRklFRBAAEhgKFFZPSUNJTkdfU1BFRURfTk9STUFMEAESFgoSVk9JQ0lOR19TUEVFRF9TTE9XEAIqPgoETW9kZRIUChBNT0RFX1VOU1BFQ0lGSUVEEAASEQoNTU9ERV9CWV9TVEVQUxABEg0KCU1PREVfU0VMRhACKmUKDENvbnNlbnRTdGF0ZRIdChlDT05TRU5UX1NUQVRFX1VOU1BFQ0lGSUVEEAASGQoVQ09OU0VOVF9TVEFURV9XQUlUSU5HEAESGwoXQ09OU0VOVF9TVEFURV9DT05GSVJNRUQQAiqnAQoLT3duS2V5Q2hlY2sSHQoZT1dOX0tFWV9DSEVDS19VTlNQRUNJRklFRBAAEhoKFk9XTl9LRVlfQ0hFQ0tfQUNDRVBURUQQARIZChVPV05fS0VZX0NIRUNLX0lOVkFMSUQQAhIfChtPV05fS0VZX0NIRUNLX05PX1BFUk1JU1NJT04QAxIhCh1PV05fS0VZX0NIRUNLX1BST1ZJREVSX0NMT1NFRBAEMoANCg5BY2NvdW50U2VydmljZRJXCgpHZXRBY2NvdW50EiMubm92YXRyYWlsLmFwaS52MS5HZXRBY2NvdW50UmVxdWVzdBokLm5vdmF0cmFpbC5hcGkudjEuR2V0QWNjb3VudFJlc3BvbnNlEmAKDUNyZWF0ZUFjY291bnQSJi5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZUFjY291bnRSZXF1ZXN0Gicubm92YXRyYWlsLmFwaS52MS5DcmVhdGVBY2NvdW50UmVzcG9uc2USSwoGU2V0UGluEh8ubm92YXRyYWlsLmFwaS52MS5TZXRQaW5SZXF1ZXN0GiAubm92YXRyYWlsLmFwaS52MS5TZXRQaW5SZXNwb25zZRJUCglWZXJpZnlQaW4SIi5ub3ZhdHJhaWwuYXBpLnYxLlZlcmlmeVBpblJlcXVlc3QaIy5ub3ZhdHJhaWwuYXBpLnYxLlZlcmlmeVBpblJlc3BvbnNlElQKCUNoYW5nZVBpbhIiLm5vdmF0cmFpbC5hcGkudjEuQ2hhbmdlUGluUmVxdWVzdBojLm5vdmF0cmFpbC5hcGkudjEuQ2hhbmdlUGluUmVzcG9uc2USUQoIUmVzZXRQaW4SIS5ub3ZhdHJhaWwuYXBpLnYxLlJlc2V0UGluUmVxdWVzdBoiLm5vdmF0cmFpbC5hcGkudjEuUmVzZXRQaW5SZXNwb25zZRJvChJDcmVhdGVPd25lclByb2ZpbGUSKy5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZU93bmVyUHJvZmlsZVJlcXVlc3QaLC5ub3ZhdHJhaWwuYXBpLnYxLkNyZWF0ZU93bmVyUHJvZmlsZVJlc3BvbnNlEnIKE1JlcXVlc3RDaGlsZENvbnNlbnQSLC5ub3ZhdHJhaWwuYXBpLnYxLlJlcXVlc3RDaGlsZENvbnNlbnRSZXF1ZXN0Gi0ubm92YXRyYWlsLmFwaS52MS5SZXF1ZXN0Q2hpbGRDb25zZW50UmVzcG9uc2USbwoSQ3JlYXRlQ2hpbGRQcm9maWxlEisubm92YXRyYWlsLmFwaS52MS5DcmVhdGVDaGlsZFByb2ZpbGVSZXF1ZXN0Giwubm92YXRyYWlsLmFwaS52MS5DcmVhdGVDaGlsZFByb2ZpbGVSZXNwb25zZRJgCg1VcGRhdGVQcm9maWxlEiYubm92YXRyYWlsLmFwaS52MS5VcGRhdGVQcm9maWxlUmVxdWVzdBonLm5vdmF0cmFpbC5hcGkudjEuVXBkYXRlUHJvZmlsZVJlc3BvbnNlElcKClNldFZvaWNpbmcSIy5ub3ZhdHJhaWwuYXBpLnYxLlNldFZvaWNpbmdSZXF1ZXN0GiQubm92YXRyYWlsLmFwaS52MS5TZXRWb2ljaW5nUmVzcG9uc2USYAoNRGVsZXRlUHJvZmlsZRImLm5vdmF0cmFpbC5hcGkudjEuRGVsZXRlUHJvZmlsZVJlcXVlc3QaJy5ub3ZhdHJhaWwuYXBpLnYxLkRlbGV0ZVByb2ZpbGVSZXNwb25zZRJgCg1EZWxldGVBY2NvdW50EiYubm92YXRyYWlsLmFwaS52MS5EZWxldGVBY2NvdW50UmVxdWVzdBonLm5vdmF0cmFpbC5hcGkudjEuRGVsZXRlQWNjb3VudFJlc3BvbnNlEmAKDUV4cG9ydFByb2ZpbGUSJi5ub3ZhdHJhaWwuYXBpLnYxLkV4cG9ydFByb2ZpbGVSZXF1ZXN0Gicubm92YXRyYWlsLmFwaS52MS5FeHBvcnRQcm9maWxlUmVzcG9uc2USYAoNRXhwb3J0QWNjb3VudBImLm5vdmF0cmFpbC5hcGkudjEuRXhwb3J0QWNjb3VudFJlcXVlc3QaJy5ub3ZhdHJhaWwuYXBpLnYxLkV4cG9ydEFjY291bnRSZXNwb25zZRJaCgtDaGVja093bktleRIkLm5vdmF0cmFpbC5hcGkudjEuQ2hlY2tPd25LZXlSZXF1ZXN0GiUubm92YXRyYWlsLmFwaS52MS5DaGVja093bktleVJlc3BvbnNlEnIKE0xpc3RPd25LZXlQcm92aWRlcnMSLC5ub3ZhdHJhaWwuYXBpLnYxLkxpc3RPd25LZXlQcm92aWRlcnNSZXF1ZXN0Gi0ubm92YXRyYWlsLmFwaS52MS5MaXN0T3duS2V5UHJvdmlkZXJzUmVzcG9uc2VCxQEKFGNvbS5ub3ZhdHJhaWwuYXBpLnYxQgxBY2NvdW50UHJvdG9QAVo9Z2l0aHViLmNvbS9hbHRub3ZhdHJhaWwvc3BlYy9jb250cmFjdHMvbm92YXRyYWlsL2FwaS92MTthcGl2MaICA05BWKoCEE5vdmF0cmFpbC5BcGkuVjHKAhBOb3ZhdHJhaWxcQXBpXFYx4gIcTm92YXRyYWlsXEFwaVxWMVxHUEJNZXRhZGF0YeoCEk5vdmF0cmFpbDo6QXBpOjpWMWIGcHJvdG8z", [file_google_protobuf_timestamp, file_novatrail_api_v1_attempt, file_novatrail_api_v1_cause, file_novatrail_api_v1_learning]);
22
23
 
23
24
  /**
24
25
  * Describes the message novatrail.api.v1.GetAccountRequest.
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
11
11
  import type { Message } from "@bufbuild/protobuf";
12
- import type { CloseReason, Outcome } from "./cause_pb.js";
12
+ import type { CloseReason, EngineChoice, Outcome } from "./cause_pb.js";
13
13
  import type { AnswerSlotPlace, CropBox } from "../../observation/v1/observation_pb.js";
14
14
 
15
15
  /**
@@ -117,6 +117,13 @@ export declare type SubmitWorkResponse = Message<"novatrail.api.v1.SubmitWorkRes
117
117
  * @generated from field: novatrail.api.v1.SolvedTask solved = 4;
118
118
  */
119
119
  solved?: SolvedTask | undefined;
120
+
121
+ /**
122
+ * What comes next, beside `solved`.
123
+ *
124
+ * @generated from field: novatrail.api.v1.Next next = 5;
125
+ */
126
+ next?: Next | undefined;
120
127
  };
121
128
 
122
129
  /**
@@ -288,6 +295,13 @@ export declare type DoneResponse = Message<"novatrail.api.v1.DoneResponse"> & {
288
295
  * @generated from field: novatrail.api.v1.SolvedTask solved = 1;
289
296
  */
290
297
  solved?: SolvedTask | undefined;
298
+
299
+ /**
300
+ * What comes next.
301
+ *
302
+ * @generated from field: novatrail.api.v1.Next next = 2;
303
+ */
304
+ next?: Next | undefined;
291
305
  };
292
306
 
293
307
  /**
@@ -808,6 +822,13 @@ export declare type ShowSolutionResponse = Message<"novatrail.api.v1.ShowSolutio
808
822
  * @generated from field: novatrail.api.v1.SolvedTask solved = 1;
809
823
  */
810
824
  solved?: SolvedTask | undefined;
825
+
826
+ /**
827
+ * What comes next.
828
+ *
829
+ * @generated from field: novatrail.api.v1.Next next = 2;
830
+ */
831
+ next?: Next | undefined;
811
832
  };
812
833
 
813
834
  /**
@@ -1093,6 +1114,53 @@ export declare type SolvedTask = Message<"novatrail.api.v1.SolvedTask"> & {
1093
1114
  */
1094
1115
  export declare const SolvedTaskSchema: GenMessage<SolvedTask>;
1095
1116
 
1117
+ /**
1118
+ * What comes next once an attempt is closed by a correct answer, by the solution shown or by "Done".
1119
+ * A repeat gets the same: of `SubmitWork` and `ShowSolution` with the same idempotency key, and of
1120
+ * `Done` by the state of the attempt.
1121
+ *
1122
+ * @generated from message novatrail.api.v1.Next
1123
+ */
1124
+ export declare type Next = Message<"novatrail.api.v1.Next"> & {
1125
+ /**
1126
+ * In a lesson, the segment that comes next; outside a lesson, the engine's choice.
1127
+ *
1128
+ * @generated from oneof novatrail.api.v1.Next.next
1129
+ */
1130
+ next: {
1131
+ /**
1132
+ * In a lesson: the place of the next segment, from 1.
1133
+ *
1134
+ * @generated from field: int32 segment = 1;
1135
+ */
1136
+ value: number;
1137
+ case: "segment";
1138
+ } | {
1139
+ /**
1140
+ * In a lesson: no segment is left after the one that ended. The lesson run stays open until
1141
+ * "lesson done", `CompleteLesson`, which `app` sends when the learner presses "Continue".
1142
+ *
1143
+ * @generated from field: bool segments_ended = 2;
1144
+ */
1145
+ value: boolean;
1146
+ case: "segmentsEnded";
1147
+ } | {
1148
+ /**
1149
+ * Outside a lesson: the engine's choice.
1150
+ *
1151
+ * @generated from field: novatrail.api.v1.EngineChoice choice = 3;
1152
+ */
1153
+ value: EngineChoice;
1154
+ case: "choice";
1155
+ } | { case: undefined; value?: undefined };
1156
+ };
1157
+
1158
+ /**
1159
+ * Describes the message novatrail.api.v1.Next.
1160
+ * Use `create(NextSchema)` to create a new message.
1161
+ */
1162
+ export declare const NextSchema: GenMessage<Next>;
1163
+
1096
1164
  /**
1097
1165
  * The key of an answer slot.
1098
1166
  *
@@ -1272,7 +1340,9 @@ export declare const MarkKindSchema: GenEnum<MarkKind>;
1272
1340
  * take — gets the code `invalid_argument` with no `Refusal`. Every method carries the token of the
1273
1341
  * sign-in service and may get the refusals of every request with a token, which the comment of
1274
1342
  * `AccountService` names with what `app` does on each; a request of a profile whose consent is not
1275
- * confirmed gets `CAUSE_NO_CONSENT`.
1343
+ * confirmed gets `CAUSE_NO_CONSENT`. An answer that closes the attempt by a correct answer, by the
1344
+ * solution shown or by "Done" says what comes next, `next`: an attempt begins by
1345
+ * `LearningService`.
1276
1346
  *
1277
1347
  * @generated from service novatrail.api.v1.AttemptService
1278
1348
  */
@@ -15,7 +15,7 @@ import { file_novatrail_observation_v1_observation } from "../../observation/v1/
15
15
  * Describes the file novatrail/api/v1/attempt.proto.
16
16
  */
17
17
  export const file_novatrail_api_v1_attempt = /*@__PURE__*/
18
- fileDesc("Ch5ub3ZhdHJhaWwvYXBpL3YxL2F0dGVtcHQucHJvdG8SEG5vdmF0cmFpbC5hcGkudjEimQIKEVN1Ym1pdFdvcmtSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkSJAoEd29yaxgEIAEoCzIWLm5vdmF0cmFpbC5hcGkudjEuV29yaxI2Cg50YXBwZWRfY2hvaWNlcxgFIAMoCzIeLm5vdmF0cmFpbC5hcGkudjEuVGFwcGVkQ2hvaWNlEikKB293bl9rZXkYBiABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleRIhChRjbG9ja19vZmZzZXRfbWludXRlcxgHIAEoBUgAiAEBQhcKFV9jbG9ja19vZmZzZXRfbWludXRlcyKzAQoSU3VibWl0V29ya1Jlc3BvbnNlEiwKBWl0ZW1zGAEgAygLMh0ubm92YXRyYWlsLmFwaS52MS5JdGVtVmVyZGljdBIqCgdvdXRjb21lGAIgASgLMhkubm92YXRyYWlsLmFwaS52MS5PdXRjb21lEhUKDXdyb25nX2Fuc3dlcnMYAyABKAUSLAoGc29sdmVkGAQgASgLMhwubm92YXRyYWlsLmFwaS52MS5Tb2x2ZWRUYXNrIsoBChJTdWJtaXRFc3NheVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgDIAEoCRIMCgRjcm9wGAQgASgMEikKB293bl9rZXkYBSABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleRIhChRjbG9ja19vZmZzZXRfbWludXRlcxgGIAEoBUgAiAEBQhcKFV9jbG9ja19vZmZzZXRfbWludXRlcyKAAgoTU3VibWl0RXNzYXlSZXNwb25zZRIsCgNlbmQYASABKA4yHy5ub3ZhdHJhaWwuYXBpLnYxLlN1Ym1pc3Npb25FbmQSEQoEdGV4dBgCIAEoCUgAiAEBEg4KBnJlYXNvbhgDIAEoCRIVCghmZWVkYmFjaxgEIAEoCUgBiAEBEioKB291dGNvbWUYBSABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLk91dGNvbWUSLQoGY2xvc2VkGAYgASgOMh0ubm92YXRyYWlsLmFwaS52MS5DbG9zZVJlYXNvbhIQCghyZXBlYXRlZBgHIAEoCEIHCgVfdGV4dEILCglfZmVlZGJhY2siNQoLRG9uZVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJIjwKDERvbmVSZXNwb25zZRIsCgZzb2x2ZWQYASABKAsyHC5ub3ZhdHJhaWwuYXBpLnYxLlNvbHZlZFRhc2sikQIKE0dldFJ1bmdXb3Jkc1JlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgDIAEoCRIaCg13cm9uZ19hbnN3ZXJzGAQgASgFSACIAQESJAoEd29yaxgFIAEoCzIWLm5vdmF0cmFpbC5hcGkudjEuV29yaxIpCgdvd25fa2V5GAYgASgLMhgubm92YXRyYWlsLmFwaS52MS5Pd25LZXkSIQoUY2xvY2tfb2Zmc2V0X21pbnV0ZXMYByABKAVIAYgBAUIQCg5fd3JvbmdfYW5zd2Vyc0IXChVfY2xvY2tfb2Zmc2V0X21pbnV0ZXMimAEKFEdldFJ1bmdXb3Jkc1Jlc3BvbnNlEgwKBHJ1bmcYASABKAUSDQoFd29yZHMYAiABKAkSJQoFbWFya3MYAyADKAsyFi5ub3ZhdHJhaWwuYXBpLnYxLk1hcmsSKgoHb3V0Y29tZRgEIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuT3V0Y29tZRIQCghyZXBlYXRlZBgFIAEoCCLsAQocR2V0Q29ycmVjdEFuc3dlcldvcmRzUmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEhIKCmF0dGVtcHRfaWQYAiABKAkSFwoPaWRlbXBvdGVuY3lfa2V5GAMgASgJEiQKBHdvcmsYBCABKAsyFi5ub3ZhdHJhaWwuYXBpLnYxLldvcmsSKQoHb3duX2tleRgFIAEoCzIYLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5EiEKFGNsb2NrX29mZnNldF9taW51dGVzGAYgASgFSACIAQFCFwoVX2Nsb2NrX29mZnNldF9taW51dGVzInsKHUdldENvcnJlY3RBbnN3ZXJXb3Jkc1Jlc3BvbnNlEhIKBXdvcmRzGAEgASgJSACIAQESKgoHb3V0Y29tZRgCIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuT3V0Y29tZRIQCghyZXBlYXRlZBgDIAEoCEIICgZfd29yZHMi8QEKGUV4cGxhaW5EaWZmZXJlbnRseVJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgDIAEoCRIpCgdvd25fa2V5GAQgASgLMhgubm92YXRyYWlsLmFwaS52MS5Pd25LZXkSIQoUY2xvY2tfb2Zmc2V0X21pbnV0ZXMYBSABKAVIAIgBARIaCg13cm9uZ19hbnN3ZXJzGAYgASgFSAGIAQFCFwoVX2Nsb2NrX29mZnNldF9taW51dGVzQhAKDl93cm9uZ19hbnN3ZXJzIlcKGkV4cGxhaW5EaWZmZXJlbnRseVJlc3BvbnNlEg0KBXdvcmRzGAEgASgJEioKB291dGNvbWUYAiABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLk91dGNvbWUiOAoOR2V0SGludFJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJInkKD0dldEhpbnRSZXNwb25zZRIyCgp0ZWNobmlxdWVzGAEgASgLMhwubm92YXRyYWlsLmFwaS52MS5UZWNobmlxdWVzSAASKgoEcnVuZxgCIAEoCzIaLm5vdmF0cmFpbC5hcGkudjEuUnVuZ0hpbnRIAEIGCgRoaW50IiMKClRlY2huaXF1ZXMSFQoNdGVjaG5pcXVlX2lkcxgBIAMoCSInCghSdW5nSGludBIMCgRydW5nGAEgASgFEg0KBXdvcmRzGAIgASgJIkgKEEJlZ2luU3RlcFJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEgwKBHN0ZXAYAyABKAUiRQoRQmVnaW5TdGVwUmVzcG9uc2USMAoKdGVjaG5pcXVlcxgBIAEoCzIcLm5vdmF0cmFpbC5hcGkudjEuVGVjaG5pcXVlcyKAAQoTU2hvd1NvbHV0aW9uUmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEhIKCmF0dGVtcHRfaWQYAiABKAkSFwoPaWRlbXBvdGVuY3lfa2V5GAMgASgJEigKBmFjdGlvbhgEIAEoDjIYLm5vdmF0cmFpbC5hcGkudjEuQWN0aW9uIkQKFFNob3dTb2x1dGlvblJlc3BvbnNlEiwKBnNvbHZlZBgBIAEoCzIcLm5vdmF0cmFpbC5hcGkudjEuU29sdmVkVGFzayJzCgRXb3JrEiwKBXNoZWV0GAEgASgLMhsubm92YXRyYWlsLmFwaS52MS5TaGVldFdvcmtIABIyCgh3b3JrYm9vaxgCIAEoCzIeLm5vdmF0cmFpbC5hcGkudjEuV29ya2Jvb2tXb3JrSABCCQoHc3VyZmFjZSIZCglTaGVldFdvcmsSDAoEY3JvcBgBIAEoDCI4CgxXb3JrYm9va1dvcmsSKAoFYm94ZXMYASADKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLkJveENyb3AiVwoHQm94Q3JvcBI+CgthbnN3ZXJfc2xvdBgBIAEoCzIpLm5vdmF0cmFpbC5vYnNlcnZhdGlvbi52MS5BbnN3ZXJTbG90UGxhY2USDAoEY3JvcBgCIAEoDCJdCgxUYXBwZWRDaG9pY2USPgoLYW5zd2VyX3Nsb3QYASABKAsyKS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQW5zd2VyU2xvdFBsYWNlEg0KBXZhbHVlGAIgASgJIicKBk93bktleRIQCghwcm92aWRlchgBIAEoCRILCgNrZXkYAiABKAkiWQoLSXRlbVZlcmRpY3QSDwoHdmVyZGljdBgBIAEoCRI5CgxhbnN3ZXJfc2xvdHMYAiADKAsyIy5ub3ZhdHJhaWwuYXBpLnYxLkFuc3dlclNsb3RWZXJkaWN0IpIBChFBbnN3ZXJTbG90VmVyZGljdBI+CgthbnN3ZXJfc2xvdBgBIAEoCzIpLm5vdmF0cmFpbC5vYnNlcnZhdGlvbi52MS5BbnN3ZXJTbG90UGxhY2USDwoHdmVyZGljdBgCIAEoCRIOCgZyZWFzb24YAyABKAkSEgoFdmFsdWUYBCABKAlIAIgBAUIICgZfdmFsdWUifgoKU29sdmVkVGFzaxItCgRrZXlzGAEgAygLMh8ubm92YXRyYWlsLmFwaS52MS5BbnN3ZXJTbG90S2V5EhAKCHNvbHV0aW9uGAIgASgMEh0KFW1vZHVsZV9mb3JtYXRfdmVyc2lvbhgDIAEoCRIQCghjcml0ZXJpYRgEIAMoCSJcCg1BbnN3ZXJTbG90S2V5Ej4KC2Fuc3dlcl9zbG90GAEgASgLMikubm92YXRyYWlsLm9ic2VydmF0aW9uLnYxLkFuc3dlclNsb3RQbGFjZRILCgNrZXkYAiABKAkisgEKBE1hcmsSKAoEa2luZBgBIAEoDjIaLm5vdmF0cmFpbC5hcGkudjEuTWFya0tpbmQSQAoLYW5zd2VyX3Nsb3QYAiABKAsyKS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQW5zd2VyU2xvdFBsYWNlSAASNQoIY3JvcF9ib3gYAyABKAsyIS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQ3JvcEJveEgAQgcKBXBsYWNlKokBCg1TdWJtaXNzaW9uRW5kEh4KGlNVQk1JU1NJT05fRU5EX1VOU1BFQ0lGSUVEEAASGwoXU1VCTUlTU0lPTl9FTkRfRkVFREJBQ0sQARIdChlTVUJNSVNTSU9OX0VORF9VTlJFQURBQkxFEAISHAoYU1VCTUlTU0lPTl9FTkRfVU5DSEVDS0VEEAMqRwoGQWN0aW9uEhYKEkFDVElPTl9VTlNQRUNJRklFRBAAEhMKD0FDVElPTl9MRUFSTklORxABEhAKDEFDVElPTl9BRFVMVBACKjoKCE1hcmtLaW5kEhkKFU1BUktfS0lORF9VTlNQRUNJRklFRBAAEhMKD01BUktfS0lORF9GUkFNRRABMtsGCg5BdHRlbXB0U2VydmljZRJXCgpTdWJtaXRXb3JrEiMubm92YXRyYWlsLmFwaS52MS5TdWJtaXRXb3JrUmVxdWVzdBokLm5vdmF0cmFpbC5hcGkudjEuU3VibWl0V29ya1Jlc3BvbnNlEloKC1N1Ym1pdEVzc2F5EiQubm92YXRyYWlsLmFwaS52MS5TdWJtaXRFc3NheVJlcXVlc3QaJS5ub3ZhdHJhaWwuYXBpLnYxLlN1Ym1pdEVzc2F5UmVzcG9uc2USRQoERG9uZRIdLm5vdmF0cmFpbC5hcGkudjEuRG9uZVJlcXVlc3QaHi5ub3ZhdHJhaWwuYXBpLnYxLkRvbmVSZXNwb25zZRJdCgxHZXRSdW5nV29yZHMSJS5ub3ZhdHJhaWwuYXBpLnYxLkdldFJ1bmdXb3Jkc1JlcXVlc3QaJi5ub3ZhdHJhaWwuYXBpLnYxLkdldFJ1bmdXb3Jkc1Jlc3BvbnNlEngKFUdldENvcnJlY3RBbnN3ZXJXb3JkcxIuLm5vdmF0cmFpbC5hcGkudjEuR2V0Q29ycmVjdEFuc3dlcldvcmRzUmVxdWVzdBovLm5vdmF0cmFpbC5hcGkudjEuR2V0Q29ycmVjdEFuc3dlcldvcmRzUmVzcG9uc2USbwoSRXhwbGFpbkRpZmZlcmVudGx5Eisubm92YXRyYWlsLmFwaS52MS5FeHBsYWluRGlmZmVyZW50bHlSZXF1ZXN0Giwubm92YXRyYWlsLmFwaS52MS5FeHBsYWluRGlmZmVyZW50bHlSZXNwb25zZRJOCgdHZXRIaW50EiAubm92YXRyYWlsLmFwaS52MS5HZXRIaW50UmVxdWVzdBohLm5vdmF0cmFpbC5hcGkudjEuR2V0SGludFJlc3BvbnNlElQKCUJlZ2luU3RlcBIiLm5vdmF0cmFpbC5hcGkudjEuQmVnaW5TdGVwUmVxdWVzdBojLm5vdmF0cmFpbC5hcGkudjEuQmVnaW5TdGVwUmVzcG9uc2USXQoMU2hvd1NvbHV0aW9uEiUubm92YXRyYWlsLmFwaS52MS5TaG93U29sdXRpb25SZXF1ZXN0GiYubm92YXRyYWlsLmFwaS52MS5TaG93U29sdXRpb25SZXNwb25zZULFAQoUY29tLm5vdmF0cmFpbC5hcGkudjFCDEF0dGVtcHRQcm90b1ABWj1naXRodWIuY29tL2FsdG5vdmF0cmFpbC9zcGVjL2NvbnRyYWN0cy9ub3ZhdHJhaWwvYXBpL3YxO2FwaXYxogIDTkFYqgIQTm92YXRyYWlsLkFwaS5WMcoCEE5vdmF0cmFpbFxBcGlcVjHiAhxOb3ZhdHJhaWxcQXBpXFYxXEdQQk1ldGFkYXRh6gISTm92YXRyYWlsOjpBcGk6OlYxYgZwcm90bzM", [file_novatrail_api_v1_cause, file_novatrail_observation_v1_observation]);
18
+ fileDesc("Ch5ub3ZhdHJhaWwvYXBpL3YxL2F0dGVtcHQucHJvdG8SEG5vdmF0cmFpbC5hcGkudjEimQIKEVN1Ym1pdFdvcmtSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkSJAoEd29yaxgEIAEoCzIWLm5vdmF0cmFpbC5hcGkudjEuV29yaxI2Cg50YXBwZWRfY2hvaWNlcxgFIAMoCzIeLm5vdmF0cmFpbC5hcGkudjEuVGFwcGVkQ2hvaWNlEikKB293bl9rZXkYBiABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleRIhChRjbG9ja19vZmZzZXRfbWludXRlcxgHIAEoBUgAiAEBQhcKFV9jbG9ja19vZmZzZXRfbWludXRlcyLZAQoSU3VibWl0V29ya1Jlc3BvbnNlEiwKBWl0ZW1zGAEgAygLMh0ubm92YXRyYWlsLmFwaS52MS5JdGVtVmVyZGljdBIqCgdvdXRjb21lGAIgASgLMhkubm92YXRyYWlsLmFwaS52MS5PdXRjb21lEhUKDXdyb25nX2Fuc3dlcnMYAyABKAUSLAoGc29sdmVkGAQgASgLMhwubm92YXRyYWlsLmFwaS52MS5Tb2x2ZWRUYXNrEiQKBG5leHQYBSABKAsyFi5ub3ZhdHJhaWwuYXBpLnYxLk5leHQiygEKElN1Ym1pdEVzc2F5UmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEhIKCmF0dGVtcHRfaWQYAiABKAkSFwoPaWRlbXBvdGVuY3lfa2V5GAMgASgJEgwKBGNyb3AYBCABKAwSKQoHb3duX2tleRgFIAEoCzIYLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5EiEKFGNsb2NrX29mZnNldF9taW51dGVzGAYgASgFSACIAQFCFwoVX2Nsb2NrX29mZnNldF9taW51dGVzIoACChNTdWJtaXRFc3NheVJlc3BvbnNlEiwKA2VuZBgBIAEoDjIfLm5vdmF0cmFpbC5hcGkudjEuU3VibWlzc2lvbkVuZBIRCgR0ZXh0GAIgASgJSACIAQESDgoGcmVhc29uGAMgASgJEhUKCGZlZWRiYWNrGAQgASgJSAGIAQESKgoHb3V0Y29tZRgFIAEoCzIZLm5vdmF0cmFpbC5hcGkudjEuT3V0Y29tZRItCgZjbG9zZWQYBiABKA4yHS5ub3ZhdHJhaWwuYXBpLnYxLkNsb3NlUmVhc29uEhAKCHJlcGVhdGVkGAcgASgIQgcKBV90ZXh0QgsKCV9mZWVkYmFjayI1CgtEb25lUmVxdWVzdBISCgpwcm9maWxlX2lkGAEgASgJEhIKCmF0dGVtcHRfaWQYAiABKAkiYgoMRG9uZVJlc3BvbnNlEiwKBnNvbHZlZBgBIAEoCzIcLm5vdmF0cmFpbC5hcGkudjEuU29sdmVkVGFzaxIkCgRuZXh0GAIgASgLMhYubm92YXRyYWlsLmFwaS52MS5OZXh0IpECChNHZXRSdW5nV29yZHNSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkSGgoNd3JvbmdfYW5zd2VycxgEIAEoBUgAiAEBEiQKBHdvcmsYBSABKAsyFi5ub3ZhdHJhaWwuYXBpLnYxLldvcmsSKQoHb3duX2tleRgGIAEoCzIYLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5EiEKFGNsb2NrX29mZnNldF9taW51dGVzGAcgASgFSAGIAQFCEAoOX3dyb25nX2Fuc3dlcnNCFwoVX2Nsb2NrX29mZnNldF9taW51dGVzIpgBChRHZXRSdW5nV29yZHNSZXNwb25zZRIMCgRydW5nGAEgASgFEg0KBXdvcmRzGAIgASgJEiUKBW1hcmtzGAMgAygLMhYubm92YXRyYWlsLmFwaS52MS5NYXJrEioKB291dGNvbWUYBCABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLk91dGNvbWUSEAoIcmVwZWF0ZWQYBSABKAgi7AEKHEdldENvcnJlY3RBbnN3ZXJXb3Jkc1JlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgDIAEoCRIkCgR3b3JrGAQgASgLMhYubm92YXRyYWlsLmFwaS52MS5Xb3JrEikKB293bl9rZXkYBSABKAsyGC5ub3ZhdHJhaWwuYXBpLnYxLk93bktleRIhChRjbG9ja19vZmZzZXRfbWludXRlcxgGIAEoBUgAiAEBQhcKFV9jbG9ja19vZmZzZXRfbWludXRlcyJ7Ch1HZXRDb3JyZWN0QW5zd2VyV29yZHNSZXNwb25zZRISCgV3b3JkcxgBIAEoCUgAiAEBEioKB291dGNvbWUYAiABKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLk91dGNvbWUSEAoIcmVwZWF0ZWQYAyABKAhCCAoGX3dvcmRzIvEBChlFeHBsYWluRGlmZmVyZW50bHlSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCRIXCg9pZGVtcG90ZW5jeV9rZXkYAyABKAkSKQoHb3duX2tleRgEIAEoCzIYLm5vdmF0cmFpbC5hcGkudjEuT3duS2V5EiEKFGNsb2NrX29mZnNldF9taW51dGVzGAUgASgFSACIAQESGgoNd3JvbmdfYW5zd2VycxgGIAEoBUgBiAEBQhcKFV9jbG9ja19vZmZzZXRfbWludXRlc0IQCg5fd3JvbmdfYW5zd2VycyJXChpFeHBsYWluRGlmZmVyZW50bHlSZXNwb25zZRINCgV3b3JkcxgBIAEoCRIqCgdvdXRjb21lGAIgASgLMhkubm92YXRyYWlsLmFwaS52MS5PdXRjb21lIjgKDkdldEhpbnRSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCSJ5Cg9HZXRIaW50UmVzcG9uc2USMgoKdGVjaG5pcXVlcxgBIAEoCzIcLm5vdmF0cmFpbC5hcGkudjEuVGVjaG5pcXVlc0gAEioKBHJ1bmcYAiABKAsyGi5ub3ZhdHJhaWwuYXBpLnYxLlJ1bmdIaW50SABCBgoEaGludCIjCgpUZWNobmlxdWVzEhUKDXRlY2huaXF1ZV9pZHMYASADKAkiJwoIUnVuZ0hpbnQSDAoEcnVuZxgBIAEoBRINCgV3b3JkcxgCIAEoCSJIChBCZWdpblN0ZXBSZXF1ZXN0EhIKCnByb2ZpbGVfaWQYASABKAkSEgoKYXR0ZW1wdF9pZBgCIAEoCRIMCgRzdGVwGAMgASgFIkUKEUJlZ2luU3RlcFJlc3BvbnNlEjAKCnRlY2huaXF1ZXMYASABKAsyHC5ub3ZhdHJhaWwuYXBpLnYxLlRlY2huaXF1ZXMigAEKE1Nob3dTb2x1dGlvblJlcXVlc3QSEgoKcHJvZmlsZV9pZBgBIAEoCRISCgphdHRlbXB0X2lkGAIgASgJEhcKD2lkZW1wb3RlbmN5X2tleRgDIAEoCRIoCgZhY3Rpb24YBCABKA4yGC5ub3ZhdHJhaWwuYXBpLnYxLkFjdGlvbiJqChRTaG93U29sdXRpb25SZXNwb25zZRIsCgZzb2x2ZWQYASABKAsyHC5ub3ZhdHJhaWwuYXBpLnYxLlNvbHZlZFRhc2sSJAoEbmV4dBgCIAEoCzIWLm5vdmF0cmFpbC5hcGkudjEuTmV4dCJzCgRXb3JrEiwKBXNoZWV0GAEgASgLMhsubm92YXRyYWlsLmFwaS52MS5TaGVldFdvcmtIABIyCgh3b3JrYm9vaxgCIAEoCzIeLm5vdmF0cmFpbC5hcGkudjEuV29ya2Jvb2tXb3JrSABCCQoHc3VyZmFjZSIZCglTaGVldFdvcmsSDAoEY3JvcBgBIAEoDCI4CgxXb3JrYm9va1dvcmsSKAoFYm94ZXMYASADKAsyGS5ub3ZhdHJhaWwuYXBpLnYxLkJveENyb3AiVwoHQm94Q3JvcBI+CgthbnN3ZXJfc2xvdBgBIAEoCzIpLm5vdmF0cmFpbC5vYnNlcnZhdGlvbi52MS5BbnN3ZXJTbG90UGxhY2USDAoEY3JvcBgCIAEoDCJdCgxUYXBwZWRDaG9pY2USPgoLYW5zd2VyX3Nsb3QYASABKAsyKS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQW5zd2VyU2xvdFBsYWNlEg0KBXZhbHVlGAIgASgJIicKBk93bktleRIQCghwcm92aWRlchgBIAEoCRILCgNrZXkYAiABKAkiWQoLSXRlbVZlcmRpY3QSDwoHdmVyZGljdBgBIAEoCRI5CgxhbnN3ZXJfc2xvdHMYAiADKAsyIy5ub3ZhdHJhaWwuYXBpLnYxLkFuc3dlclNsb3RWZXJkaWN0IpIBChFBbnN3ZXJTbG90VmVyZGljdBI+CgthbnN3ZXJfc2xvdBgBIAEoCzIpLm5vdmF0cmFpbC5vYnNlcnZhdGlvbi52MS5BbnN3ZXJTbG90UGxhY2USDwoHdmVyZGljdBgCIAEoCRIOCgZyZWFzb24YAyABKAkSEgoFdmFsdWUYBCABKAlIAIgBAUIICgZfdmFsdWUifgoKU29sdmVkVGFzaxItCgRrZXlzGAEgAygLMh8ubm92YXRyYWlsLmFwaS52MS5BbnN3ZXJTbG90S2V5EhAKCHNvbHV0aW9uGAIgASgMEh0KFW1vZHVsZV9mb3JtYXRfdmVyc2lvbhgDIAEoCRIQCghjcml0ZXJpYRgEIAMoCSJtCgROZXh0EhEKB3NlZ21lbnQYASABKAVIABIYCg5zZWdtZW50c19lbmRlZBgCIAEoCEgAEjAKBmNob2ljZRgDIAEoCzIeLm5vdmF0cmFpbC5hcGkudjEuRW5naW5lQ2hvaWNlSABCBgoEbmV4dCJcCg1BbnN3ZXJTbG90S2V5Ej4KC2Fuc3dlcl9zbG90GAEgASgLMikubm92YXRyYWlsLm9ic2VydmF0aW9uLnYxLkFuc3dlclNsb3RQbGFjZRILCgNrZXkYAiABKAkisgEKBE1hcmsSKAoEa2luZBgBIAEoDjIaLm5vdmF0cmFpbC5hcGkudjEuTWFya0tpbmQSQAoLYW5zd2VyX3Nsb3QYAiABKAsyKS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQW5zd2VyU2xvdFBsYWNlSAASNQoIY3JvcF9ib3gYAyABKAsyIS5ub3ZhdHJhaWwub2JzZXJ2YXRpb24udjEuQ3JvcEJveEgAQgcKBXBsYWNlKokBCg1TdWJtaXNzaW9uRW5kEh4KGlNVQk1JU1NJT05fRU5EX1VOU1BFQ0lGSUVEEAASGwoXU1VCTUlTU0lPTl9FTkRfRkVFREJBQ0sQARIdChlTVUJNSVNTSU9OX0VORF9VTlJFQURBQkxFEAISHAoYU1VCTUlTU0lPTl9FTkRfVU5DSEVDS0VEEAMqRwoGQWN0aW9uEhYKEkFDVElPTl9VTlNQRUNJRklFRBAAEhMKD0FDVElPTl9MRUFSTklORxABEhAKDEFDVElPTl9BRFVMVBACKjoKCE1hcmtLaW5kEhkKFU1BUktfS0lORF9VTlNQRUNJRklFRBAAEhMKD01BUktfS0lORF9GUkFNRRABMtsGCg5BdHRlbXB0U2VydmljZRJXCgpTdWJtaXRXb3JrEiMubm92YXRyYWlsLmFwaS52MS5TdWJtaXRXb3JrUmVxdWVzdBokLm5vdmF0cmFpbC5hcGkudjEuU3VibWl0V29ya1Jlc3BvbnNlEloKC1N1Ym1pdEVzc2F5EiQubm92YXRyYWlsLmFwaS52MS5TdWJtaXRFc3NheVJlcXVlc3QaJS5ub3ZhdHJhaWwuYXBpLnYxLlN1Ym1pdEVzc2F5UmVzcG9uc2USRQoERG9uZRIdLm5vdmF0cmFpbC5hcGkudjEuRG9uZVJlcXVlc3QaHi5ub3ZhdHJhaWwuYXBpLnYxLkRvbmVSZXNwb25zZRJdCgxHZXRSdW5nV29yZHMSJS5ub3ZhdHJhaWwuYXBpLnYxLkdldFJ1bmdXb3Jkc1JlcXVlc3QaJi5ub3ZhdHJhaWwuYXBpLnYxLkdldFJ1bmdXb3Jkc1Jlc3BvbnNlEngKFUdldENvcnJlY3RBbnN3ZXJXb3JkcxIuLm5vdmF0cmFpbC5hcGkudjEuR2V0Q29ycmVjdEFuc3dlcldvcmRzUmVxdWVzdBovLm5vdmF0cmFpbC5hcGkudjEuR2V0Q29ycmVjdEFuc3dlcldvcmRzUmVzcG9uc2USbwoSRXhwbGFpbkRpZmZlcmVudGx5Eisubm92YXRyYWlsLmFwaS52MS5FeHBsYWluRGlmZmVyZW50bHlSZXF1ZXN0Giwubm92YXRyYWlsLmFwaS52MS5FeHBsYWluRGlmZmVyZW50bHlSZXNwb25zZRJOCgdHZXRIaW50EiAubm92YXRyYWlsLmFwaS52MS5HZXRIaW50UmVxdWVzdBohLm5vdmF0cmFpbC5hcGkudjEuR2V0SGludFJlc3BvbnNlElQKCUJlZ2luU3RlcBIiLm5vdmF0cmFpbC5hcGkudjEuQmVnaW5TdGVwUmVxdWVzdBojLm5vdmF0cmFpbC5hcGkudjEuQmVnaW5TdGVwUmVzcG9uc2USXQoMU2hvd1NvbHV0aW9uEiUubm92YXRyYWlsLmFwaS52MS5TaG93U29sdXRpb25SZXF1ZXN0GiYubm92YXRyYWlsLmFwaS52MS5TaG93U29sdXRpb25SZXNwb25zZULFAQoUY29tLm5vdmF0cmFpbC5hcGkudjFCDEF0dGVtcHRQcm90b1ABWj1naXRodWIuY29tL2FsdG5vdmF0cmFpbC9zcGVjL2NvbnRyYWN0cy9ub3ZhdHJhaWwvYXBpL3YxO2FwaXYxogIDTkFYqgIQTm92YXRyYWlsLkFwaS5WMcoCEE5vdmF0cmFpbFxBcGlcVjHiAhxOb3ZhdHJhaWxcQXBpXFYxXEdQQk1ldGFkYXRh6gISTm92YXRyYWlsOjpBcGk6OlYxYgZwcm90bzM", [file_novatrail_api_v1_cause, file_novatrail_observation_v1_observation]);
19
19
 
20
20
  /**
21
21
  * Describes the message novatrail.api.v1.SubmitWorkRequest.
@@ -220,19 +220,26 @@ export const AnswerSlotVerdictSchema = /*@__PURE__*/
220
220
  export const SolvedTaskSchema = /*@__PURE__*/
221
221
  messageDesc(file_novatrail_api_v1_attempt, 28);
222
222
 
223
+ /**
224
+ * Describes the message novatrail.api.v1.Next.
225
+ * Use `create(NextSchema)` to create a new message.
226
+ */
227
+ export const NextSchema = /*@__PURE__*/
228
+ messageDesc(file_novatrail_api_v1_attempt, 29);
229
+
223
230
  /**
224
231
  * Describes the message novatrail.api.v1.AnswerSlotKey.
225
232
  * Use `create(AnswerSlotKeySchema)` to create a new message.
226
233
  */
227
234
  export const AnswerSlotKeySchema = /*@__PURE__*/
228
- messageDesc(file_novatrail_api_v1_attempt, 29);
235
+ messageDesc(file_novatrail_api_v1_attempt, 30);
229
236
 
230
237
  /**
231
238
  * Describes the message novatrail.api.v1.Mark.
232
239
  * Use `create(MarkSchema)` to create a new message.
233
240
  */
234
241
  export const MarkSchema = /*@__PURE__*/
235
- messageDesc(file_novatrail_api_v1_attempt, 30);
242
+ messageDesc(file_novatrail_api_v1_attempt, 31);
236
243
 
237
244
  /**
238
245
  * Describes the enum novatrail.api.v1.SubmissionEnd.
@@ -284,7 +291,9 @@ export const MarkKind = /*@__PURE__*/
284
291
  * take — gets the code `invalid_argument` with no `Refusal`. Every method carries the token of the
285
292
  * sign-in service and may get the refusals of every request with a token, which the comment of
286
293
  * `AccountService` names with what `app` does on each; a request of a profile whose consent is not
287
- * confirmed gets `CAUSE_NO_CONSENT`.
294
+ * confirmed gets `CAUSE_NO_CONSENT`. An answer that closes the attempt by a correct answer, by the
295
+ * solution shown or by "Done" says what comes next, `next`: an attempt begins by
296
+ * `LearningService`.
288
297
  *
289
298
  * @generated from service novatrail.api.v1.AttemptService
290
299
  */
@@ -4,8 +4,9 @@
4
4
 
5
5
  // The causes of the contract between `app` and `api`: one list for its refusals and for the
6
6
  // outcomes of its calls of AI, the refusal that a method's error carries, and the outcome that its
7
- // answer carries. What they mean, and how `app` reads a cause it does not know, are the rules of
8
- // contracts/README.md, section 15.
7
+ // answer carries; and the values that come both in answers and in the data of a refusal: why an
8
+ // attempt was closed, how a lesson run ended, and the engine's choice. What they mean, and how
9
+ // `app` reads a cause it does not know, are the rules of contracts/README.md, section 15.
9
10
 
10
11
  import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
11
12
  import type { Message } from "@bufbuild/protobuf";
@@ -74,6 +75,24 @@ export declare type Refusal = Message<"novatrail.api.v1.Refusal"> & {
74
75
  */
75
76
  value: number;
76
77
  case: "maxAuthAgeSeconds";
78
+ } | {
79
+ /**
80
+ * Beside `CAUSE_RUN_ENDED`: how the lesson run ended, and the engine's choice when this request
81
+ * ended it.
82
+ *
83
+ * @generated from field: novatrail.api.v1.RunEnd run_end = 7;
84
+ */
85
+ value: RunEnd;
86
+ case: "runEnd";
87
+ } | {
88
+ /**
89
+ * Beside `CAUSE_SEGMENTS_NOT_ENDED` and `CAUSE_SEGMENT_UNAVAILABLE`: the task segments of the
90
+ * lesson run that have ended.
91
+ *
92
+ * @generated from field: novatrail.api.v1.EndedSegments ended_segments = 8;
93
+ */
94
+ value: EndedSegments;
95
+ case: "endedSegments";
77
96
  } | { case: undefined; value?: undefined };
78
97
  };
79
98
 
@@ -84,7 +103,8 @@ export declare type Refusal = Message<"novatrail.api.v1.Refusal"> & {
84
103
  export declare const RefusalSchema: GenMessage<Refusal>;
85
104
 
86
105
  /**
87
- * An outcome: what a call of AI came to when the answer holds no reading, or no words, of AI.
106
+ * An outcome: what a call of AI came to when the answer holds no reading, or no words, of AI; and
107
+ * why the engine's choice gives nothing, when the AI that checks the tasks is closed to the learner.
88
108
  *
89
109
  * @generated from message novatrail.api.v1.Outcome
90
110
  */
@@ -93,7 +113,9 @@ export declare type Outcome = Message<"novatrail.api.v1.Outcome"> & {
93
113
  * The outcome: `CAUSE_AI_FAILURE`, `CAUSE_QUOTA`, `CAUSE_PLATFORM_LIMIT`,
94
114
  * `CAUSE_NOT_ADMITTED`, `CAUSE_LIMIT_REACHED`, `CAUSE_KEY_REFUSED` or `CAUSE_NO_OTHER_WORDS`.
95
115
  * "Explain differently" makes no call without the reserve of the quota: there the quota, the limit
96
- * of platform AI and no admission are refusals, and the right to it on the rung stays.
116
+ * of platform AI and no admission are refusals, and the right to it on the rung stays. Beside an
117
+ * engine's choice that gives nothing: `CAUSE_QUOTA`, `CAUSE_PLATFORM_LIMIT` or
118
+ * `CAUSE_NOT_ADMITTED`.
97
119
  *
98
120
  * @generated from field: novatrail.api.v1.Cause cause = 1;
99
121
  */
@@ -147,6 +169,96 @@ export declare type OwnKeyLimit = Message<"novatrail.api.v1.OwnKeyLimit"> & {
147
169
  */
148
170
  export declare const OwnKeyLimitSchema: GenMessage<OwnKeyLimit>;
149
171
 
172
+ /**
173
+ * The engine's choice: what the learner is given next — a lesson, or a task outside a lesson — or
174
+ * that there is nothing to give (concepts 12). A choice begins nothing: `app` opens a lesson by
175
+ * `OpenLesson` and begins a task by `BeginAttempt`, each naming the choice. Its reason code, which
176
+ * the adult sees, is RUN.md's T65.
177
+ *
178
+ * @generated from message novatrail.api.v1.EngineChoice
179
+ */
180
+ export declare type EngineChoice = Message<"novatrail.api.v1.EngineChoice"> & {
181
+ /**
182
+ * The ID of the choice: empty beside `CHOICE_KIND_NOTHING`.
183
+ *
184
+ * @generated from field: string choice_id = 1;
185
+ */
186
+ choiceId: string;
187
+
188
+ /**
189
+ * What the choice gives.
190
+ *
191
+ * @generated from field: novatrail.api.v1.ChoiceKind kind = 2;
192
+ */
193
+ kind: ChoiceKind;
194
+
195
+ /**
196
+ * Beside `CHOICE_KIND_NOTHING`, when the AI that checks the tasks is closed to the learner and no
197
+ * task that a tap checks is left: `CAUSE_QUOTA`, with when the next family day begins,
198
+ * `CAUSE_PLATFORM_LIMIT` or `CAUSE_NOT_ADMITTED`. Absent when there is nothing to give for
199
+ * another reason, such as no module connected with a current version.
200
+ *
201
+ * @generated from field: novatrail.api.v1.Outcome outcome = 3;
202
+ */
203
+ outcome?: Outcome | undefined;
204
+ };
205
+
206
+ /**
207
+ * Describes the message novatrail.api.v1.EngineChoice.
208
+ * Use `create(EngineChoiceSchema)` to create a new message.
209
+ */
210
+ export declare const EngineChoiceSchema: GenMessage<EngineChoice>;
211
+
212
+ /**
213
+ * How a lesson run ended.
214
+ *
215
+ * @generated from message novatrail.api.v1.RunEnd
216
+ */
217
+ export declare type RunEnd = Message<"novatrail.api.v1.RunEnd"> & {
218
+ /**
219
+ * Why it ended.
220
+ *
221
+ * @generated from field: novatrail.api.v1.RunEndReason reason = 1;
222
+ */
223
+ reason: RunEndReason;
224
+
225
+ /**
226
+ * The engine's choice that the end gave: when the request that carries it ended the run — "lesson
227
+ * done", or a request that found the run's package no longer given, the lesson unsuitable, or the
228
+ * run abandoned —, and on a repeat of the "lesson done" that ended it. Absent when the run had
229
+ * ended before by anything else, such as a job of the operator: `app` then asks `ChooseNext`.
230
+ *
231
+ * @generated from field: novatrail.api.v1.EngineChoice choice = 2;
232
+ */
233
+ choice?: EngineChoice | undefined;
234
+ };
235
+
236
+ /**
237
+ * Describes the message novatrail.api.v1.RunEnd.
238
+ * Use `create(RunEndSchema)` to create a new message.
239
+ */
240
+ export declare const RunEndSchema: GenMessage<RunEnd>;
241
+
242
+ /**
243
+ * The task segments of a lesson run that have ended.
244
+ *
245
+ * @generated from message novatrail.api.v1.EndedSegments
246
+ */
247
+ export declare type EndedSegments = Message<"novatrail.api.v1.EndedSegments"> & {
248
+ /**
249
+ * Their places among the segments of the lesson, from 1, in order.
250
+ *
251
+ * @generated from field: repeated int32 places = 1;
252
+ */
253
+ places: number[];
254
+ };
255
+
256
+ /**
257
+ * Describes the message novatrail.api.v1.EndedSegments.
258
+ * Use `create(EndedSegmentsSchema)` to create a new message.
259
+ */
260
+ export declare const EndedSegmentsSchema: GenMessage<EndedSegments>;
261
+
150
262
  /**
151
263
  * Why a request was refused, or what a call of AI in it came to: one list for the whole contract
152
264
  * (R17 api). A refusal comes as the detail `Refusal` of an error of Connect, with the code that the
@@ -173,8 +285,11 @@ export enum Cause {
173
285
  NO_PROFILE = 1,
174
286
 
175
287
  /**
176
- * The profile has no attempt with the ID named, or the account no consent with the ID named;
177
- * another profile's, or another account's, is the same. Code `not_found`.
288
+ * The profile has no attempt, lesson run or engine's choice with the ID named, no module
289
+ * connected with the ID named, and no skill by the full ID named in the current version of a
290
+ * module connected to it; or the account has no consent with the ID named; or the pinned index
291
+ * of `api` has no module with the ID named. Another profile's, or another account's, is the
292
+ * same. Code `not_found`.
178
293
  *
179
294
  * @generated from enum value: CAUSE_NOT_FOUND = 2;
180
295
  */
@@ -206,16 +321,17 @@ export enum Cause {
206
321
  STILL_GOING = 5,
207
322
 
208
323
  /**
209
- * The learner's own key came with a profile whose age category is not `adult`. Code
210
- * `invalid_argument`.
324
+ * The learner's own key, or the provider of one at the beginning of an attempt, came with a
325
+ * profile whose age category is not `adult`. Code `invalid_argument`.
211
326
  *
212
327
  * @generated from enum value: CAUSE_KEY_NOT_FOR_PROFILE = 6;
213
328
  */
214
329
  KEY_NOT_FOR_PROFILE = 6,
215
330
 
216
331
  /**
217
- * The quota of platform AI for the family day is spent. A refusal holds when the next family day
218
- * begins; so does an outcome. Code `resource_exhausted`.
332
+ * The quota of platform AI for the family day is spent; at the beginning of an attempt on a task
333
+ * that platform AI checks, what is left of it is not enough for a typical task. A refusal holds
334
+ * when the next family day begins; so does an outcome. Code `resource_exhausted`.
219
335
  *
220
336
  * @generated from enum value: CAUSE_QUOTA = 7;
221
337
  */
@@ -364,8 +480,8 @@ export enum Cause {
364
480
  CODE_NOT_ACCEPTED = 25,
365
481
 
366
482
  /**
367
- * What the request creates is there already: the account of the user, the owner's profile, or
368
- * the profile of a consent. Code `already_exists`.
483
+ * What the request creates is there already: the account of the user, the owner's profile, the
484
+ * profile of a consent, or the attempt of an engine's choice of a task. Code `already_exists`.
369
485
  *
370
486
  * @generated from enum value: CAUSE_ALREADY_EXISTS = 26;
371
487
  */
@@ -409,6 +525,67 @@ export enum Cause {
409
525
  * @generated from enum value: CAUSE_NO_PIN = 31;
410
526
  */
411
527
  NO_PIN = 31,
528
+
529
+ /**
530
+ * An open view asked for by the digest of a package whose version the image of `api` no longer
531
+ * gives: its index marks the version withdrawn, or the version's module format is out of the
532
+ * window of formats that `api` reads. `app` asks `CheckPackages` about the digests it keeps,
533
+ * and erases what it keeps of the version. An attempt or a lesson run on such a version is closed
534
+ * or ended `unchecked` instead. Code `failed_precondition`.
535
+ *
536
+ * @generated from enum value: CAUSE_VERSION_NOT_GIVEN = 32;
537
+ */
538
+ VERSION_NOT_GIVEN = 32,
539
+
540
+ /**
541
+ * The index of the image of `api` does not know the package digest: a deployment is going on,
542
+ * and a repeat reaches the new image. Code `unavailable`.
543
+ *
544
+ * @generated from enum value: CAUSE_PACKAGE_UNKNOWN = 33;
545
+ */
546
+ PACKAGE_UNKNOWN = 33,
547
+
548
+ /**
549
+ * The module has no current version for the learner — none at all, or one whose audience the
550
+ * learner is not in — or its current version has no lesson or task by the ID named. Code
551
+ * `failed_precondition`.
552
+ *
553
+ * @generated from enum value: CAUSE_NO_CURRENT_VERSION = 34;
554
+ */
555
+ NO_CURRENT_VERSION = 34,
556
+
557
+ /**
558
+ * The lesson, one of its tasks, or the task does not suit the age category of the profile. Code
559
+ * `failed_precondition`.
560
+ *
561
+ * @generated from enum value: CAUSE_NOT_SUITABLE = 35;
562
+ */
563
+ NOT_SUITABLE = 35,
564
+
565
+ /**
566
+ * The lesson run has ended. The refusal holds how it ended, and the engine's choice when this
567
+ * request ended it. Code `failed_precondition`.
568
+ *
569
+ * @generated from enum value: CAUSE_RUN_ENDED = 36;
570
+ */
571
+ RUN_ENDED = 36,
572
+
573
+ /**
574
+ * "Lesson done" while a task segment of the lesson has not ended. The refusal holds the places
575
+ * of the task segments that have ended. Code `failed_precondition`.
576
+ *
577
+ * @generated from enum value: CAUSE_SEGMENTS_NOT_ENDED = 37;
578
+ */
579
+ SEGMENTS_NOT_ENDED = 37,
580
+
581
+ /**
582
+ * An attempt asked for on a segment out of order: a task segment before it has not ended, or it
583
+ * has ended itself. The refusal holds the places of the task segments that have ended. Code
584
+ * `failed_precondition`.
585
+ *
586
+ * @generated from enum value: CAUSE_SEGMENT_UNAVAILABLE = 38;
587
+ */
588
+ SEGMENT_UNAVAILABLE = 38,
412
589
  }
413
590
 
414
591
  /**
@@ -533,3 +710,94 @@ export enum CloseReason {
533
710
  */
534
711
  export declare const CloseReasonSchema: GenEnum<CloseReason>;
535
712
 
713
+ /**
714
+ * What an engine's choice gives. A kind its build does not know `app` reads as
715
+ * `CHOICE_KIND_NOTHING`.
716
+ *
717
+ * @generated from enum novatrail.api.v1.ChoiceKind
718
+ */
719
+ export enum ChoiceKind {
720
+ /**
721
+ * Not named: never sent.
722
+ *
723
+ * @generated from enum value: CHOICE_KIND_UNSPECIFIED = 0;
724
+ */
725
+ UNSPECIFIED = 0,
726
+
727
+ /**
728
+ * A lesson: `app` opens it by `OpenLesson`. It may be the lesson of a run that is open.
729
+ *
730
+ * @generated from enum value: CHOICE_KIND_LESSON = 1;
731
+ */
732
+ LESSON = 1,
733
+
734
+ /**
735
+ * A task outside a lesson: `app` begins it by `BeginAttempt`.
736
+ *
737
+ * @generated from enum value: CHOICE_KIND_TASK = 2;
738
+ */
739
+ TASK = 2,
740
+
741
+ /**
742
+ * Nothing to give.
743
+ *
744
+ * @generated from enum value: CHOICE_KIND_NOTHING = 3;
745
+ */
746
+ NOTHING = 3,
747
+ }
748
+
749
+ /**
750
+ * Describes the enum novatrail.api.v1.ChoiceKind.
751
+ */
752
+ export declare const ChoiceKindSchema: GenEnum<ChoiceKind>;
753
+
754
+ /**
755
+ * Why a lesson run ended (concepts 5). A reason its build does not know `app` reads as an end other
756
+ * than `RUN_END_REASON_PASSED`, and erases the state of the lesson as at every end.
757
+ *
758
+ * @generated from enum novatrail.api.v1.RunEndReason
759
+ */
760
+ export enum RunEndReason {
761
+ /**
762
+ * Not ended: the run is open.
763
+ *
764
+ * @generated from enum value: RUN_END_REASON_UNSPECIFIED = 0;
765
+ */
766
+ UNSPECIFIED = 0,
767
+
768
+ /**
769
+ * The lesson is done: "lesson done" came once every task segment had ended.
770
+ *
771
+ * @generated from enum value: RUN_END_REASON_PASSED = 1;
772
+ */
773
+ PASSED = 1,
774
+
775
+ /**
776
+ * Unchecked: the run's version of the module is no longer given, withdrawn or out of the window
777
+ * of formats that `api` reads, or an attempt of the run was closed `CLOSE_REASON_UNCHECKED`.
778
+ *
779
+ * @generated from enum value: RUN_END_REASON_UNCHECKED = 2;
780
+ */
781
+ UNCHECKED = 2,
782
+
783
+ /**
784
+ * Not suitable: the module is no longer connected or has no current version for the learner, or
785
+ * the lesson or one of its tasks no longer suits the age category of the profile.
786
+ *
787
+ * @generated from enum value: RUN_END_REASON_NOT_SUITABLE = 3;
788
+ */
789
+ NOT_SUITABLE = 3,
790
+
791
+ /**
792
+ * Abandoned: no request on the run or its attempts for 30 days.
793
+ *
794
+ * @generated from enum value: RUN_END_REASON_ABANDONED = 4;
795
+ */
796
+ ABANDONED = 4,
797
+ }
798
+
799
+ /**
800
+ * Describes the enum novatrail.api.v1.RunEndReason.
801
+ */
802
+ export declare const RunEndReasonSchema: GenEnum<RunEndReason>;
803
+