@timeback/core 0.1.2 → 0.1.4

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.
package/dist/utils.js CHANGED
@@ -485,6 +485,9 @@ var BEYONDAI_PATHS = {
485
485
  },
486
486
  edubridge: {
487
487
  base: "/edubridge"
488
+ },
489
+ powerpath: {
490
+ base: "/powerpath"
488
491
  }
489
492
  };
490
493
  var LEARNWITHAI_PATHS = {
@@ -500,7 +503,8 @@ var LEARNWITHAI_PATHS = {
500
503
  gradebook: "/gradebook/1.0",
501
504
  resources: "/resources/1.0"
502
505
  },
503
- edubridge: null
506
+ edubridge: null,
507
+ powerpath: null
504
508
  };
505
509
  var PLATFORM_PATHS = {
506
510
  BEYOND_AI: BEYONDAI_PATHS,
@@ -520,7 +524,8 @@ function resolvePathProfiles(pathProfile, customPaths) {
520
524
  return {
521
525
  caliper: customPaths?.caliper ?? basePaths.caliper,
522
526
  oneroster: customPaths?.oneroster ?? basePaths.oneroster,
523
- edubridge: customPaths?.edubridge ?? basePaths.edubridge
527
+ edubridge: customPaths?.edubridge ?? basePaths.edubridge,
528
+ powerpath: customPaths?.powerpath ?? basePaths.powerpath
524
529
  };
525
530
  }
526
531
 
@@ -556,6 +561,10 @@ class TimebackProvider {
556
561
  baseUrl: platformEndpoints.api[env],
557
562
  authUrl: this.authUrl
558
563
  },
564
+ powerpath: {
565
+ baseUrl: platformEndpoints.api[env],
566
+ authUrl: this.authUrl
567
+ },
559
568
  caliper: {
560
569
  baseUrl: platformEndpoints.caliper[env],
561
570
  authUrl: this.authUrl
@@ -572,6 +581,7 @@ class TimebackProvider {
572
581
  this.endpoints = {
573
582
  oneroster: { baseUrl: config.baseUrl, authUrl: this.authUrl },
574
583
  edubridge: { baseUrl: config.baseUrl, authUrl: this.authUrl },
584
+ powerpath: { baseUrl: config.baseUrl, authUrl: this.authUrl },
575
585
  caliper: { baseUrl: config.baseUrl, authUrl: this.authUrl },
576
586
  qti: { baseUrl: config.baseUrl, authUrl: this.authUrl }
577
587
  };
@@ -689,7 +699,17 @@ class TimebackProvider {
689
699
  }
690
700
  function getEnv(key) {
691
701
  try {
692
- return typeof process === "undefined" ? undefined : process.env[key];
702
+ if (typeof process === "undefined")
703
+ return;
704
+ if (typeof key === "string") {
705
+ return process.env[key];
706
+ }
707
+ for (const k of key) {
708
+ const value = process.env[k];
709
+ if (value !== undefined)
710
+ return value;
711
+ }
712
+ return;
693
713
  } catch {
694
714
  return;
695
715
  }
@@ -720,6 +740,18 @@ var DEFAULT_PROVIDER_REGISTRY = {
720
740
  }
721
741
  }
722
742
  };
743
+ function primaryEnvVar(key) {
744
+ if (typeof key === "string") {
745
+ return key;
746
+ }
747
+ if (key.length === 0) {
748
+ throw new Error(`Missing env var key: ${key}`);
749
+ }
750
+ return key[0];
751
+ }
752
+ function formatEnvVarKey(key) {
753
+ return primaryEnvVar(key);
754
+ }
723
755
  function validateEnv(env) {
724
756
  if (env !== "staging" && env !== "production") {
725
757
  throw new Error(`Invalid env "${env}": must be "staging" or "production"`);
@@ -730,10 +762,10 @@ function validateAuth(auth, envVars) {
730
762
  const clientId = auth?.clientId ?? getEnv(envVars.clientId);
731
763
  const clientSecret = auth?.clientSecret ?? getEnv(envVars.clientSecret);
732
764
  if (!clientId) {
733
- throw new Error(`Missing clientId: provide in config or set ${envVars.clientId}`);
765
+ throw new Error(`Missing clientId: provide in config or set ${formatEnvVarKey(envVars.clientId)}`);
734
766
  }
735
767
  if (!clientSecret) {
736
- throw new Error(`Missing clientSecret: provide in config or set ${envVars.clientSecret}`);
768
+ throw new Error(`Missing clientSecret: provide in config or set ${formatEnvVarKey(envVars.clientSecret)}`);
737
769
  }
738
770
  return { clientId, clientSecret };
739
771
  }
@@ -749,21 +781,21 @@ function buildMissingEnvError(envVars) {
749
781
  const clientId = getEnv(envVars.clientId);
750
782
  const clientSecret = getEnv(envVars.clientSecret);
751
783
  if (baseUrl === undefined && clientId === undefined) {
752
- const hint = envVars.env ?? envVars.baseUrl;
784
+ const hint = formatEnvVarKey(envVars.env ?? envVars.baseUrl);
753
785
  return `Missing env: provide in config or set ${hint}`;
754
786
  }
755
787
  const missing = [];
756
788
  if (baseUrl === undefined) {
757
- missing.push(envVars.env ?? envVars.baseUrl);
789
+ missing.push(formatEnvVarKey(envVars.env ?? envVars.baseUrl));
758
790
  }
759
791
  if (baseUrl !== undefined && authUrl === undefined) {
760
- missing.push(envVars.authUrl);
792
+ missing.push(formatEnvVarKey(envVars.authUrl));
761
793
  }
762
794
  if (clientId === undefined) {
763
- missing.push(envVars.clientId);
795
+ missing.push(formatEnvVarKey(envVars.clientId));
764
796
  }
765
797
  if (clientSecret === undefined) {
766
- missing.push(envVars.clientSecret);
798
+ missing.push(formatEnvVarKey(envVars.clientSecret));
767
799
  }
768
800
  return `Missing environment variables: ${missing.join(", ")}`;
769
801
  }
@@ -1254,10 +1286,10 @@ function validateNonEmptyString(value, name) {
1254
1286
  }
1255
1287
  }
1256
1288
  var EDUBRIDGE_ENV_VARS = {
1257
- baseUrl: "EDUBRIDGE_BASE_URL",
1258
- clientId: "EDUBRIDGE_CLIENT_ID",
1259
- clientSecret: "EDUBRIDGE_CLIENT_SECRET",
1260
- authUrl: "EDUBRIDGE_TOKEN_URL"
1289
+ baseUrl: ["TIMEBACK_API_BASE_URL", "TIMEBACK_BASE_URL", "EDUBRIDGE_BASE_URL"],
1290
+ clientId: ["TIMEBACK_API_CLIENT_ID", "TIMEBACK_CLIENT_ID", "EDUBRIDGE_CLIENT_ID"],
1291
+ clientSecret: ["TIMEBACK_API_CLIENT_SECRET", "TIMEBACK_CLIENT_SECRET", "EDUBRIDGE_CLIENT_SECRET"],
1292
+ authUrl: ["TIMEBACK_API_AUTH_URL", "TIMEBACK_AUTH_URL", "EDUBRIDGE_TOKEN_URL"]
1261
1293
  };
1262
1294
  function resolveToProvider2(config, registry = DEFAULT_PROVIDER_REGISTRY) {
1263
1295
  return resolveToProvider(config, EDUBRIDGE_ENV_VARS, registry);
@@ -3585,7 +3617,7 @@ class Doc {
3585
3617
  var version = {
3586
3618
  major: 4,
3587
3619
  minor: 3,
3588
- patch: 5
3620
+ patch: 6
3589
3621
  };
3590
3622
  var $ZodType = /* @__PURE__ */ $constructor("$ZodType", (inst, def) => {
3591
3623
  var _a;
@@ -4869,7 +4901,7 @@ var $ZodRecord = /* @__PURE__ */ $constructor("$ZodRecord", (inst, def) => {
4869
4901
  if (keyResult instanceof Promise) {
4870
4902
  throw new Error("Async schemas not supported in object keys currently");
4871
4903
  }
4872
- const checkNumericKey = typeof key === "string" && number.test(key) && keyResult.issues.length && keyResult.issues.some((iss) => iss.code === "invalid_type" && iss.expected === "number");
4904
+ const checkNumericKey = typeof key === "string" && number.test(key) && keyResult.issues.length;
4873
4905
  if (checkNumericKey) {
4874
4906
  const retryResult = def.keyType._zod.run({ value: Number(key), issues: [] }, ctx);
4875
4907
  if (retryResult instanceof Promise) {
@@ -12186,7 +12218,7 @@ function finalize(ctx, schema) {
12186
12218
  }
12187
12219
  }
12188
12220
  }
12189
- if (refSchema.$ref) {
12221
+ if (refSchema.$ref && refSeen.def) {
12190
12222
  for (const key in schema2) {
12191
12223
  if (key === "$ref" || key === "allOf")
12192
12224
  continue;
@@ -14818,7 +14850,7 @@ var TimebackSubject = exports_external.enum([
14818
14850
  "Math",
14819
14851
  "None",
14820
14852
  "Other"
14821
- ]);
14853
+ ]).meta({ id: "TimebackSubject", description: "Subject area" });
14822
14854
  var TimebackGrade = exports_external.union([
14823
14855
  exports_external.literal(-1),
14824
14856
  exports_external.literal(0),
@@ -14835,7 +14867,10 @@ var TimebackGrade = exports_external.union([
14835
14867
  exports_external.literal(11),
14836
14868
  exports_external.literal(12),
14837
14869
  exports_external.literal(13)
14838
- ]);
14870
+ ]).meta({
14871
+ id: "TimebackGrade",
14872
+ description: "Grade level (-1 = Pre-K, 0 = K, 1-12 = grades, 13 = AP)"
14873
+ });
14839
14874
  var ScoreStatus = exports_external.enum([
14840
14875
  "exempt",
14841
14876
  "fully graded",
@@ -14862,6 +14897,47 @@ var OneRosterUserRole = exports_external.enum([
14862
14897
  "teacher"
14863
14898
  ]);
14864
14899
  var EnrollmentRole = exports_external.enum(["administrator", "proctor", "student", "teacher"]);
14900
+ var ResourceType = exports_external.enum([
14901
+ "qti",
14902
+ "text",
14903
+ "audio",
14904
+ "video",
14905
+ "interactive",
14906
+ "visual",
14907
+ "course-material",
14908
+ "assessment-bank"
14909
+ ]);
14910
+ var QtiSubType = exports_external.enum(["qti-test", "qti-question", "qti-stimulus", "qti-test-bank"]);
14911
+ var CourseMaterialSubType = exports_external.enum(["unit", "course", "resource-collection"]);
14912
+ var QuestionType = exports_external.enum([
14913
+ "choice",
14914
+ "order",
14915
+ "associate",
14916
+ "match",
14917
+ "hotspot",
14918
+ "hottext",
14919
+ "select-point",
14920
+ "graphic-order",
14921
+ "graphic-associate",
14922
+ "graphic-gap-match",
14923
+ "text-entry",
14924
+ "extended-text",
14925
+ "inline-choice",
14926
+ "upload",
14927
+ "slider",
14928
+ "drawing",
14929
+ "media",
14930
+ "custom"
14931
+ ]);
14932
+ var Difficulty = exports_external.enum(["easy", "medium", "hard"]);
14933
+ var LearningObjectiveSetSchema = exports_external.array(exports_external.object({
14934
+ source: exports_external.string(),
14935
+ learningObjectiveIds: exports_external.array(exports_external.string())
14936
+ }));
14937
+ var FastFailConfigSchema = exports_external.object({
14938
+ consecutive_failures: exports_external.number().int().min(1).optional(),
14939
+ stagnation_limit: exports_external.number().int().min(1).optional()
14940
+ }).optional();
14865
14941
  var LessonType = exports_external.enum(["powerpath-100", "quiz", "test-out", "placement", "unit-test", "alpha-read-article"]).nullable();
14866
14942
  var IMSErrorResponse = exports_external.object({
14867
14943
  imsx_codeMajor: exports_external.enum(["failure", "success"]),
@@ -14937,7 +15013,11 @@ var ActivityCompletedInput = exports_external.object({
14937
15013
  eventTime: IsoDateTimeString.optional(),
14938
15014
  metricsId: exports_external.string().optional(),
14939
15015
  id: exports_external.string().optional(),
14940
- extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15016
+ extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
15017
+ attempt: exports_external.number().int().min(1).optional(),
15018
+ generatedExtensions: exports_external.object({
15019
+ pctCompleteApp: exports_external.number().optional()
15020
+ }).loose().optional()
14941
15021
  }).strict();
14942
15022
  var TimeSpentInput = exports_external.object({
14943
15023
  actor: TimebackUser,
@@ -15020,50 +15100,121 @@ var CaliperListEventsParams = exports_external.object({
15020
15100
  actorEmail: exports_external.email().optional()
15021
15101
  }).strict();
15022
15102
  var CourseIds = exports_external.object({
15023
- staging: exports_external.string().optional(),
15024
- production: exports_external.string().optional()
15025
- });
15026
- var CourseType = exports_external.enum(["base", "hole-filling", "optional"]);
15027
- var PublishStatus = exports_external.enum(["draft", "testing", "published", "deactivated"]);
15103
+ staging: exports_external.string().meta({ description: "Course ID in staging environment" }).optional(),
15104
+ production: exports_external.string().meta({ description: "Course ID in production environment" }).optional()
15105
+ }).meta({ id: "CourseIds", description: "Environment-specific course IDs (populated by sync)" });
15106
+ var CourseType = exports_external.enum(["base", "hole-filling", "optional"]).meta({ id: "CourseType", description: "Course classification type" });
15107
+ var PublishStatus = exports_external.enum(["draft", "testing", "published", "deactivated"]).meta({ id: "PublishStatus", description: "Course publication status" });
15028
15108
  var CourseGoals = exports_external.object({
15029
- dailyXp: exports_external.number().int().positive().optional(),
15030
- dailyLessons: exports_external.number().int().positive().optional(),
15031
- dailyActiveMinutes: exports_external.number().int().positive().optional(),
15032
- dailyAccuracy: exports_external.number().int().min(0).max(100).optional(),
15033
- dailyMasteredUnits: exports_external.number().int().positive().optional()
15034
- });
15109
+ dailyXp: exports_external.number().int().positive().meta({ description: "Target XP to earn per day" }).optional(),
15110
+ dailyLessons: exports_external.number().int().positive().meta({ description: "Target lessons to complete per day" }).optional(),
15111
+ dailyActiveMinutes: exports_external.number().int().positive().meta({ description: "Target active learning minutes per day" }).optional(),
15112
+ dailyAccuracy: exports_external.number().int().min(0).max(100).meta({ description: "Target accuracy percentage (0-100)" }).optional(),
15113
+ dailyMasteredUnits: exports_external.number().int().positive().meta({ description: "Target units to master per day" }).optional()
15114
+ }).meta({ id: "CourseGoals", description: "Daily learning goals for a course" });
15035
15115
  var CourseMetrics = exports_external.object({
15036
- totalXp: exports_external.number().int().positive().optional(),
15037
- totalLessons: exports_external.number().int().positive().optional(),
15038
- totalGrades: exports_external.number().int().positive().optional()
15039
- });
15116
+ totalXp: exports_external.number().int().positive().meta({ description: "Total XP available in the course" }).optional(),
15117
+ totalLessons: exports_external.number().int().positive().meta({ description: "Total number of lessons/activities" }).optional(),
15118
+ totalGrades: exports_external.number().int().positive().meta({ description: "Total grade levels covered" }).optional()
15119
+ }).meta({ id: "CourseMetrics", description: "Aggregate metrics for a course" });
15040
15120
  var CourseMetadata = exports_external.object({
15041
15121
  courseType: CourseType.optional(),
15042
- isSupplemental: exports_external.boolean().optional(),
15043
- isCustom: exports_external.boolean().optional(),
15122
+ isSupplemental: exports_external.boolean().meta({ description: "Whether this is supplemental to a base course" }).optional(),
15123
+ isCustom: exports_external.boolean().meta({ description: "Whether this is a custom course for an individual student" }).optional(),
15044
15124
  publishStatus: PublishStatus.optional(),
15045
- contactEmail: exports_external.email().optional(),
15046
- primaryApp: exports_external.string().optional(),
15125
+ contactEmail: exports_external.email().meta({ description: "Contact email for course issues" }).optional(),
15126
+ primaryApp: exports_external.string().meta({ description: "Primary application identifier" }).optional(),
15047
15127
  goals: CourseGoals.optional(),
15048
15128
  metrics: CourseMetrics.optional()
15049
- });
15129
+ }).meta({ id: "CourseMetadata", description: "Course metadata (matches API metadata object)" });
15050
15130
  var CourseDefaults = exports_external.object({
15051
- courseCode: exports_external.string().optional(),
15052
- level: exports_external.string().optional(),
15131
+ courseCode: exports_external.string().meta({ description: "Course code (e.g., 'MATH101')" }).optional(),
15132
+ level: exports_external.string().meta({ description: "Course level (e.g., 'AP', 'Honors')" }).optional(),
15133
+ metadata: CourseMetadata.optional()
15134
+ }).meta({
15135
+ id: "CourseDefaults",
15136
+ description: "Default properties that apply to all courses unless overridden"
15137
+ });
15138
+ var CourseEnvOverrides = exports_external.object({
15139
+ level: exports_external.string().meta({ description: "Course level for this environment" }).optional(),
15140
+ sensor: exports_external.url().meta({ description: "Caliper sensor endpoint URL for this environment" }).optional(),
15141
+ launchUrl: exports_external.url().meta({ description: "LTI launch URL for this environment" }).optional(),
15053
15142
  metadata: CourseMetadata.optional()
15143
+ }).meta({
15144
+ id: "CourseEnvOverrides",
15145
+ description: "Environment-specific course overrides (non-identity fields)"
15054
15146
  });
15147
+ var CourseOverrides = exports_external.object({
15148
+ staging: CourseEnvOverrides.meta({
15149
+ description: "Overrides for staging environment"
15150
+ }).optional(),
15151
+ production: CourseEnvOverrides.meta({
15152
+ description: "Overrides for production environment"
15153
+ }).optional()
15154
+ }).meta({ id: "CourseOverrides", description: "Per-environment course overrides" });
15055
15155
  var CourseConfig = CourseDefaults.extend({
15056
- subject: TimebackSubject,
15057
- grade: TimebackGrade,
15058
- ids: CourseIds.nullable().optional()
15156
+ subject: TimebackSubject.meta({ description: "Subject area for this course" }),
15157
+ grade: TimebackGrade.meta({
15158
+ description: "Grade level (-1 = Pre-K, 0 = K, 1-12 = grades, 13 = AP)"
15159
+ }).optional(),
15160
+ ids: CourseIds.nullable().optional(),
15161
+ sensor: exports_external.url().meta({ description: "Caliper sensor endpoint URL for this course" }).optional(),
15162
+ launchUrl: exports_external.url().meta({ description: "LTI launch URL for this course" }).optional(),
15163
+ overrides: CourseOverrides.optional()
15164
+ }).meta({
15165
+ id: "CourseConfig",
15166
+ description: "Configuration for a single course. Must have either grade or courseCode (or both)."
15059
15167
  });
15060
15168
  var TimebackConfig = exports_external.object({
15061
- name: exports_external.string().min(1, "App name is required"),
15062
- defaults: CourseDefaults.optional(),
15063
- courses: exports_external.array(CourseConfig).min(1, "At least one course is required"),
15064
- sensors: exports_external.array(exports_external.string().url()).optional()
15169
+ $schema: exports_external.string().meta({ description: "JSON Schema reference for editor support" }).optional(),
15170
+ name: exports_external.string().min(1, "App name is required").meta({ description: "Display name for your app" }),
15171
+ defaults: CourseDefaults.meta({
15172
+ description: "Default properties applied to all courses"
15173
+ }).optional(),
15174
+ courses: exports_external.array(CourseConfig).min(1, "At least one course is required").meta({ description: "Courses available in this app" }),
15175
+ sensor: exports_external.url().meta({ description: "Default Caliper sensor endpoint URL for all courses" }).optional(),
15176
+ launchUrl: exports_external.url().meta({ description: "Default LTI launch URL for all courses" }).optional()
15177
+ }).meta({
15178
+ id: "TimebackConfig",
15179
+ title: "Timeback Config",
15180
+ description: "Configuration schema for timeback.config.json files"
15181
+ }).refine((config2) => {
15182
+ return config2.courses.every((c) => c.grade !== undefined || c.courseCode !== undefined);
15183
+ }, {
15184
+ message: "Each course must have either a grade or a courseCode",
15185
+ path: ["courses"]
15186
+ }).refine((config2) => {
15187
+ const withGrade = config2.courses.filter((c) => c.grade !== undefined);
15188
+ const keys = withGrade.map((c) => `${c.subject}:${c.grade}`);
15189
+ return new Set(keys).size === keys.length;
15190
+ }, {
15191
+ message: "Duplicate (subject, grade) pair found; each must be unique",
15192
+ path: ["courses"]
15193
+ }).refine((config2) => {
15194
+ const withCode = config2.courses.filter((c) => c.courseCode !== undefined);
15195
+ const codes = withCode.map((c) => c.courseCode);
15196
+ return new Set(codes).size === codes.length;
15197
+ }, {
15198
+ message: "Duplicate courseCode found; each must be unique",
15199
+ path: ["courses"]
15200
+ }).refine((config2) => {
15201
+ return config2.courses.every((c) => {
15202
+ if (c.sensor !== undefined || config2.sensor !== undefined) {
15203
+ return true;
15204
+ }
15205
+ const launchUrls = [
15206
+ c.launchUrl,
15207
+ config2.launchUrl,
15208
+ c.overrides?.staging?.launchUrl,
15209
+ c.overrides?.production?.launchUrl
15210
+ ].filter(Boolean);
15211
+ return launchUrls.length > 0;
15212
+ });
15213
+ }, {
15214
+ message: "Each course must have an effective sensor. Either set `sensor` explicitly (top-level or per-course), or provide a `launchUrl` so sensor can be derived from its origin.",
15215
+ path: ["courses"]
15065
15216
  });
15066
- var EdubridgeDateString = exports_external.union([IsoDateString, IsoDateTimeString]);
15217
+ var EdubridgeDateString = IsoDateTimeString;
15067
15218
  var EduBridgeEnrollment = exports_external.object({
15068
15219
  id: exports_external.string(),
15069
15220
  role: exports_external.string(),
@@ -15127,13 +15278,11 @@ var EmailOrStudentId = exports_external.object({
15127
15278
  });
15128
15279
  var SubjectTrackInput = exports_external.object({
15129
15280
  subject: NonEmptyString,
15130
- gradeLevel: NonEmptyString,
15131
- targetCourseId: NonEmptyString,
15132
- metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15133
- });
15134
- var SubjectTrackUpsertInput = SubjectTrackInput.extend({
15135
- id: NonEmptyString
15281
+ grade: NonEmptyString,
15282
+ courseId: NonEmptyString,
15283
+ orgSourcedId: NonEmptyString.optional()
15136
15284
  });
15285
+ var SubjectTrackUpsertInput = SubjectTrackInput;
15137
15286
  var EdubridgeListEnrollmentsParams = exports_external.object({
15138
15287
  userId: NonEmptyString
15139
15288
  });
@@ -15310,20 +15459,45 @@ var OneRosterScoreScaleCreateInput = exports_external.object({
15310
15459
  }).strict();
15311
15460
  var OneRosterAssessmentLineItemCreateInput = exports_external.object({
15312
15461
  sourcedId: NonEmptyString2.optional(),
15462
+ status: Status.optional(),
15463
+ dateLastModified: IsoDateTimeString.optional(),
15313
15464
  title: NonEmptyString2.describe("title must be a non-empty string"),
15314
- class: Ref,
15315
- school: Ref,
15316
- category: Ref,
15317
- assignDate: OneRosterDateString,
15318
- dueDate: OneRosterDateString,
15319
- status: Status,
15465
+ description: exports_external.string().nullable().optional(),
15466
+ class: Ref.nullable().optional(),
15467
+ parentAssessmentLineItem: Ref.nullable().optional(),
15468
+ scoreScale: Ref.nullable().optional(),
15469
+ resultValueMin: exports_external.number().nullable().optional(),
15470
+ resultValueMax: exports_external.number().nullable().optional(),
15471
+ component: Ref.nullable().optional(),
15472
+ componentResource: Ref.nullable().optional(),
15473
+ learningObjectiveSet: exports_external.array(exports_external.object({
15474
+ source: exports_external.string(),
15475
+ learningObjectiveIds: exports_external.array(exports_external.string())
15476
+ })).optional().nullable(),
15477
+ course: Ref.nullable().optional(),
15320
15478
  metadata: Metadata
15321
15479
  }).strict();
15480
+ var LearningObjectiveResult = exports_external.object({
15481
+ learningObjectiveId: exports_external.string(),
15482
+ score: exports_external.number().optional(),
15483
+ textScore: exports_external.string().optional()
15484
+ });
15485
+ var LearningObjectiveScoreSetSchema = exports_external.array(exports_external.object({
15486
+ source: exports_external.string(),
15487
+ learningObjectiveResults: exports_external.array(LearningObjectiveResult)
15488
+ }));
15322
15489
  var OneRosterAssessmentResultCreateInput = exports_external.object({
15323
15490
  sourcedId: NonEmptyString2.optional(),
15324
- lineItem: Ref,
15491
+ status: Status.optional(),
15492
+ dateLastModified: IsoDateTimeString.optional(),
15493
+ metadata: Metadata,
15494
+ assessmentLineItem: Ref,
15325
15495
  student: Ref,
15326
- scoreDate: OneRosterDateString,
15496
+ score: exports_external.number().nullable().optional(),
15497
+ textScore: exports_external.string().nullable().optional(),
15498
+ scoreDate: exports_external.string().datetime(),
15499
+ scoreScale: Ref.nullable().optional(),
15500
+ scorePercentile: exports_external.number().nullable().optional(),
15327
15501
  scoreStatus: exports_external.enum([
15328
15502
  "exempt",
15329
15503
  "fully graded",
@@ -15331,9 +15505,12 @@ var OneRosterAssessmentResultCreateInput = exports_external.object({
15331
15505
  "partially graded",
15332
15506
  "submitted"
15333
15507
  ]),
15334
- score: exports_external.string().optional(),
15335
- status: Status,
15336
- metadata: Metadata
15508
+ comment: exports_external.string().nullable().optional(),
15509
+ learningObjectiveSet: LearningObjectiveScoreSetSchema.nullable().optional(),
15510
+ inProgress: exports_external.string().nullable().optional(),
15511
+ incomplete: exports_external.string().nullable().optional(),
15512
+ late: exports_external.string().nullable().optional(),
15513
+ missing: exports_external.string().nullable().optional()
15337
15514
  }).strict();
15338
15515
  var OneRosterOrgCreateInput = exports_external.object({
15339
15516
  sourcedId: NonEmptyString2.optional(),
@@ -15401,6 +15578,75 @@ var OneRosterCredentialInput = exports_external.object({
15401
15578
  var OneRosterDemographicsCreateInput = exports_external.object({
15402
15579
  sourcedId: NonEmptyString2.describe("sourcedId must be a non-empty string")
15403
15580
  }).loose();
15581
+ var CommonResourceMetadataSchema = exports_external.object({
15582
+ type: ResourceType,
15583
+ subject: TimebackSubject.nullish(),
15584
+ grades: exports_external.array(TimebackGrade).nullish(),
15585
+ language: exports_external.string().nullish(),
15586
+ xp: exports_external.number().nullish(),
15587
+ url: exports_external.url().nullish(),
15588
+ keywords: exports_external.array(exports_external.string()).nullish(),
15589
+ learningObjectiveSet: LearningObjectiveSetSchema.nullish(),
15590
+ lessonType: exports_external.string().nullish()
15591
+ }).passthrough();
15592
+ var QtiMetadataSchema = CommonResourceMetadataSchema.extend({
15593
+ type: exports_external.literal("qti"),
15594
+ subType: QtiSubType,
15595
+ questionType: QuestionType.optional(),
15596
+ difficulty: Difficulty.optional()
15597
+ });
15598
+ var TextMetadataSchema = CommonResourceMetadataSchema.extend({
15599
+ type: exports_external.literal("text"),
15600
+ format: exports_external.string(),
15601
+ author: exports_external.string().optional(),
15602
+ pageCount: exports_external.number().optional()
15603
+ });
15604
+ var AudioMetadataSchema = CommonResourceMetadataSchema.extend({
15605
+ type: exports_external.literal("audio"),
15606
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
15607
+ format: exports_external.string(),
15608
+ speaker: exports_external.string().optional()
15609
+ });
15610
+ var VideoMetadataSchema = CommonResourceMetadataSchema.extend({
15611
+ type: exports_external.literal("video"),
15612
+ duration: exports_external.string().regex(/^\d{2}:\d{2}:\d{2}(\.\d{2})?$/).optional(),
15613
+ captionsAvailable: exports_external.boolean().optional(),
15614
+ format: exports_external.string()
15615
+ });
15616
+ var InteractiveMetadataSchema = CommonResourceMetadataSchema.extend({
15617
+ type: exports_external.literal("interactive"),
15618
+ launchUrl: exports_external.url().optional(),
15619
+ toolProvider: exports_external.string().optional(),
15620
+ instructionalMethod: exports_external.string().optional(),
15621
+ courseIdOnFail: exports_external.string().nullable().optional(),
15622
+ fail_fast: FastFailConfigSchema
15623
+ });
15624
+ var VisualMetadataSchema = CommonResourceMetadataSchema.extend({
15625
+ type: exports_external.literal("visual"),
15626
+ format: exports_external.string(),
15627
+ resolution: exports_external.string().optional()
15628
+ });
15629
+ var CourseMaterialMetadataSchema = CommonResourceMetadataSchema.extend({
15630
+ type: exports_external.literal("course-material"),
15631
+ subType: CourseMaterialSubType,
15632
+ author: exports_external.string().optional(),
15633
+ format: exports_external.string(),
15634
+ instructionalMethod: exports_external.string().optional()
15635
+ });
15636
+ var AssessmentBankMetadataSchema = CommonResourceMetadataSchema.extend({
15637
+ type: exports_external.literal("assessment-bank"),
15638
+ resources: exports_external.array(exports_external.string())
15639
+ });
15640
+ var ResourceMetadataSchema = exports_external.discriminatedUnion("type", [
15641
+ QtiMetadataSchema,
15642
+ TextMetadataSchema,
15643
+ AudioMetadataSchema,
15644
+ VideoMetadataSchema,
15645
+ InteractiveMetadataSchema,
15646
+ VisualMetadataSchema,
15647
+ CourseMaterialMetadataSchema,
15648
+ AssessmentBankMetadataSchema
15649
+ ]);
15404
15650
  var OneRosterResourceCreateInput = exports_external.object({
15405
15651
  sourcedId: NonEmptyString2.optional(),
15406
15652
  title: NonEmptyString2.describe("title must be a non-empty string"),
@@ -15410,7 +15656,7 @@ var OneRosterResourceCreateInput = exports_external.object({
15410
15656
  vendorId: exports_external.string().optional(),
15411
15657
  applicationId: exports_external.string().optional(),
15412
15658
  status: Status.optional(),
15413
- metadata: Metadata
15659
+ metadata: ResourceMetadataSchema.nullable().optional()
15414
15660
  }).strict();
15415
15661
  var CourseStructureItem = exports_external.object({
15416
15662
  url: NonEmptyString2.describe("courseStructure.url must be a non-empty string"),
@@ -15435,6 +15681,267 @@ var OneRosterBulkResultItem = exports_external.object({
15435
15681
  student: Ref
15436
15682
  }).loose();
15437
15683
  var OneRosterBulkResultsInput = exports_external.array(OneRosterBulkResultItem).min(1, "results must have at least one item");
15684
+ var NonEmptyString3 = exports_external.string().trim().min(1);
15685
+ var ToolProvider = exports_external.enum(["edulastic", "mastery-track"]);
15686
+ var LessonTypeRequired = exports_external.enum([
15687
+ "powerpath-100",
15688
+ "quiz",
15689
+ "test-out",
15690
+ "placement",
15691
+ "unit-test",
15692
+ "alpha-read-article"
15693
+ ]);
15694
+ var GradeArray = exports_external.array(TimebackGrade);
15695
+ var ResourceMetadata = exports_external.record(exports_external.string(), exports_external.unknown()).optional();
15696
+ var ExternalTestBase = exports_external.object({
15697
+ courseId: NonEmptyString3,
15698
+ lessonTitle: NonEmptyString3.optional(),
15699
+ launchUrl: exports_external.url().optional(),
15700
+ toolProvider: ToolProvider,
15701
+ unitTitle: NonEmptyString3.optional(),
15702
+ courseComponentSourcedId: NonEmptyString3.optional(),
15703
+ vendorId: NonEmptyString3.optional(),
15704
+ description: NonEmptyString3.optional(),
15705
+ resourceMetadata: ResourceMetadata.nullable().optional(),
15706
+ grades: GradeArray
15707
+ });
15708
+ var ExternalTestOut = ExternalTestBase.extend({
15709
+ lessonType: exports_external.literal("test-out"),
15710
+ xp: exports_external.number()
15711
+ });
15712
+ var ExternalPlacement = ExternalTestBase.extend({
15713
+ lessonType: exports_external.literal("placement"),
15714
+ courseIdOnFail: NonEmptyString3.optional(),
15715
+ xp: exports_external.number().optional()
15716
+ });
15717
+ var InternalTestBase = exports_external.object({
15718
+ courseId: NonEmptyString3,
15719
+ lessonType: LessonTypeRequired,
15720
+ lessonTitle: NonEmptyString3.optional(),
15721
+ unitTitle: NonEmptyString3.optional(),
15722
+ courseComponentSourcedId: NonEmptyString3.optional(),
15723
+ resourceMetadata: ResourceMetadata.nullable().optional(),
15724
+ xp: exports_external.number().optional(),
15725
+ grades: GradeArray.optional(),
15726
+ courseIdOnFail: NonEmptyString3.optional()
15727
+ });
15728
+ var PowerPathCreateInternalTestInput = exports_external.union([
15729
+ InternalTestBase.extend({
15730
+ testType: exports_external.literal("qti"),
15731
+ qti: exports_external.object({
15732
+ url: exports_external.url(),
15733
+ title: NonEmptyString3.optional(),
15734
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15735
+ })
15736
+ }),
15737
+ InternalTestBase.extend({
15738
+ testType: exports_external.literal("assessment-bank"),
15739
+ assessmentBank: exports_external.object({
15740
+ resources: exports_external.array(exports_external.object({
15741
+ url: exports_external.url(),
15742
+ title: NonEmptyString3.optional(),
15743
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
15744
+ }))
15745
+ })
15746
+ })
15747
+ ]);
15748
+ var PowerPathCreateNewAttemptInput = exports_external.object({
15749
+ student: NonEmptyString3,
15750
+ lesson: NonEmptyString3
15751
+ });
15752
+ var PowerPathFinalStudentAssessmentResponseInput = exports_external.object({
15753
+ student: NonEmptyString3,
15754
+ lesson: NonEmptyString3
15755
+ });
15756
+ var PowerPathLessonPlansCreateInput = exports_external.object({
15757
+ courseId: NonEmptyString3,
15758
+ userId: NonEmptyString3,
15759
+ classId: NonEmptyString3.optional()
15760
+ });
15761
+ var LessonPlanTarget = exports_external.object({
15762
+ type: exports_external.enum(["component", "resource"]),
15763
+ id: NonEmptyString3
15764
+ });
15765
+ var PowerPathLessonPlanOperationInput = exports_external.union([
15766
+ exports_external.object({
15767
+ type: exports_external.literal("set-skipped"),
15768
+ payload: exports_external.object({
15769
+ target: LessonPlanTarget,
15770
+ value: exports_external.boolean()
15771
+ })
15772
+ }),
15773
+ exports_external.object({
15774
+ type: exports_external.literal("add-custom-resource"),
15775
+ payload: exports_external.object({
15776
+ resource_id: NonEmptyString3,
15777
+ parent_component_id: NonEmptyString3,
15778
+ skipped: exports_external.boolean().optional()
15779
+ })
15780
+ }),
15781
+ exports_external.object({
15782
+ type: exports_external.literal("move-item-before"),
15783
+ payload: exports_external.object({
15784
+ target: LessonPlanTarget,
15785
+ reference_id: NonEmptyString3
15786
+ })
15787
+ }),
15788
+ exports_external.object({
15789
+ type: exports_external.literal("move-item-after"),
15790
+ payload: exports_external.object({
15791
+ target: LessonPlanTarget,
15792
+ reference_id: NonEmptyString3
15793
+ })
15794
+ }),
15795
+ exports_external.object({
15796
+ type: exports_external.literal("move-item-to-start"),
15797
+ payload: exports_external.object({
15798
+ target: LessonPlanTarget
15799
+ })
15800
+ }),
15801
+ exports_external.object({
15802
+ type: exports_external.literal("move-item-to-end"),
15803
+ payload: exports_external.object({
15804
+ target: LessonPlanTarget
15805
+ })
15806
+ }),
15807
+ exports_external.object({
15808
+ type: exports_external.literal("change-item-parent"),
15809
+ payload: exports_external.object({
15810
+ target: LessonPlanTarget,
15811
+ new_parent_id: NonEmptyString3,
15812
+ position: exports_external.enum(["start", "end"]).optional()
15813
+ })
15814
+ })
15815
+ ]);
15816
+ var PowerPathLessonPlanOperationsInput = exports_external.object({
15817
+ operation: exports_external.array(PowerPathLessonPlanOperationInput),
15818
+ reason: NonEmptyString3.optional()
15819
+ });
15820
+ var PowerPathLessonPlanUpdateStudentItemResponseInput = exports_external.object({
15821
+ studentId: NonEmptyString3,
15822
+ componentResourceId: NonEmptyString3,
15823
+ result: exports_external.object({
15824
+ status: exports_external.enum(["active", "tobedeleted"]),
15825
+ metadata: exports_external.record(exports_external.string(), exports_external.unknown()).optional(),
15826
+ score: exports_external.number().optional(),
15827
+ textScore: NonEmptyString3.optional(),
15828
+ scoreDate: NonEmptyString3,
15829
+ scorePercentile: exports_external.number().optional(),
15830
+ scoreStatus: ScoreStatus,
15831
+ comment: NonEmptyString3.optional(),
15832
+ learningObjectiveSet: exports_external.array(exports_external.object({
15833
+ source: NonEmptyString3,
15834
+ learningObjectiveResults: exports_external.array(exports_external.object({
15835
+ learningObjectiveId: NonEmptyString3,
15836
+ score: exports_external.number().optional(),
15837
+ textScore: NonEmptyString3.optional()
15838
+ }))
15839
+ })).optional(),
15840
+ inProgress: NonEmptyString3.optional(),
15841
+ incomplete: NonEmptyString3.optional(),
15842
+ late: NonEmptyString3.optional(),
15843
+ missing: NonEmptyString3.optional()
15844
+ })
15845
+ });
15846
+ var PowerPathMakeExternalTestAssignmentInput = exports_external.object({
15847
+ student: NonEmptyString3,
15848
+ lesson: NonEmptyString3,
15849
+ applicationName: NonEmptyString3.optional(),
15850
+ testId: NonEmptyString3.optional(),
15851
+ skipCourseEnrollment: exports_external.boolean().optional()
15852
+ });
15853
+ var PowerPathPlacementResetUserPlacementInput = exports_external.object({
15854
+ student: NonEmptyString3,
15855
+ subject: TimebackSubject
15856
+ });
15857
+ var PowerPathResetAttemptInput = exports_external.object({
15858
+ student: NonEmptyString3,
15859
+ lesson: NonEmptyString3
15860
+ });
15861
+ var PowerPathScreeningResetSessionInput = exports_external.object({
15862
+ userId: NonEmptyString3
15863
+ });
15864
+ var PowerPathScreeningAssignTestInput = exports_external.object({
15865
+ userId: NonEmptyString3,
15866
+ subject: exports_external.enum(["Math", "Reading", "Language", "Science"])
15867
+ });
15868
+ var PowerPathTestAssignmentsCreateInput = exports_external.object({
15869
+ student: NonEmptyString3,
15870
+ subject: TimebackSubject,
15871
+ grade: TimebackGrade,
15872
+ testName: NonEmptyString3.optional()
15873
+ });
15874
+ var PowerPathTestAssignmentsUpdateInput = exports_external.object({
15875
+ testName: NonEmptyString3
15876
+ });
15877
+ var PowerPathTestAssignmentItemInput = exports_external.object({
15878
+ student: NonEmptyString3,
15879
+ subject: TimebackSubject,
15880
+ grade: TimebackGrade,
15881
+ testName: NonEmptyString3.optional()
15882
+ });
15883
+ var PowerPathTestAssignmentsBulkInput = exports_external.object({
15884
+ items: exports_external.array(PowerPathTestAssignmentItemInput)
15885
+ });
15886
+ var PowerPathTestAssignmentsImportInput = exports_external.object({
15887
+ spreadsheetUrl: exports_external.url(),
15888
+ sheet: NonEmptyString3
15889
+ });
15890
+ var PowerPathTestAssignmentsListParams = exports_external.object({
15891
+ student: NonEmptyString3,
15892
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
15893
+ subject: NonEmptyString3.optional(),
15894
+ grade: TimebackGrade.optional(),
15895
+ limit: exports_external.number().int().positive().max(3000).optional(),
15896
+ offset: exports_external.number().int().nonnegative().optional()
15897
+ });
15898
+ var PowerPathTestAssignmentsAdminParams = exports_external.object({
15899
+ student: NonEmptyString3.optional(),
15900
+ status: exports_external.enum(["assigned", "in_progress", "completed", "failed", "expired", "cancelled"]).optional(),
15901
+ subject: NonEmptyString3.optional(),
15902
+ grade: TimebackGrade.optional(),
15903
+ limit: exports_external.number().int().positive().max(3000).optional(),
15904
+ offset: exports_external.number().int().nonnegative().optional()
15905
+ });
15906
+ var PowerPathUpdateStudentQuestionResponseInput = exports_external.object({
15907
+ student: NonEmptyString3,
15908
+ question: NonEmptyString3,
15909
+ response: exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)]).optional(),
15910
+ responses: exports_external.record(exports_external.string(), exports_external.union([NonEmptyString3, exports_external.array(NonEmptyString3)])).optional(),
15911
+ lesson: NonEmptyString3
15912
+ });
15913
+ var PowerPathGetAssessmentProgressParams = exports_external.object({
15914
+ student: NonEmptyString3,
15915
+ lesson: NonEmptyString3,
15916
+ attempt: exports_external.number().int().positive().optional()
15917
+ });
15918
+ var PowerPathGetNextQuestionParams = exports_external.object({
15919
+ student: NonEmptyString3,
15920
+ lesson: NonEmptyString3
15921
+ });
15922
+ var PowerPathGetAttemptsParams = exports_external.object({
15923
+ student: NonEmptyString3,
15924
+ lesson: NonEmptyString3
15925
+ });
15926
+ var PowerPathTestOutParams = exports_external.object({
15927
+ student: NonEmptyString3,
15928
+ lesson: NonEmptyString3.optional(),
15929
+ finalized: exports_external.boolean().optional(),
15930
+ toolProvider: NonEmptyString3.optional(),
15931
+ attempt: exports_external.number().int().positive().optional()
15932
+ });
15933
+ var PowerPathImportExternalTestAssignmentResultsParams = exports_external.object({
15934
+ student: NonEmptyString3,
15935
+ lesson: NonEmptyString3,
15936
+ applicationName: NonEmptyString3.optional()
15937
+ });
15938
+ var PowerPathPlacementQueryParams = exports_external.object({
15939
+ student: NonEmptyString3,
15940
+ subject: TimebackSubject
15941
+ });
15942
+ var PowerPathSyllabusQueryParams = exports_external.object({
15943
+ status: exports_external.enum(["active", "tobedeleted"]).optional()
15944
+ });
15438
15945
  var QtiAssessmentItemType = exports_external.enum([
15439
15946
  "choice",
15440
15947
  "text-entry",