playcademy 0.30.0 → 0.30.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/bucket.js CHANGED
@@ -42,7 +42,7 @@ var GAME_API_ROUTES_DIRECTORY = `${GAME_SERVER_ROOT_DIRECTORY}/api`;
42
42
  // ../better-auth/package.json
43
43
  var package_default = {
44
44
  name: "@playcademy/better-auth",
45
- version: "0.0.22",
45
+ version: "0.0.23-beta.2",
46
46
  type: "module",
47
47
  exports: {
48
48
  "./server": {
package/dist/cli.js CHANGED
@@ -1208,7 +1208,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1208
1208
  // ../better-auth/package.json
1209
1209
  var package_default = {
1210
1210
  name: "@playcademy/better-auth",
1211
- version: "0.0.22",
1211
+ version: "0.0.23-beta.2",
1212
1212
  type: "module",
1213
1213
  exports: {
1214
1214
  "./server": {
@@ -3045,7 +3045,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
3045
3045
  import { join as join12 } from "node:path";
3046
3046
 
3047
3047
  // src/version.ts
3048
- var cliVersion = false ? "0.0.0-dev" : "0.30.0";
3048
+ var cliVersion = false ? "0.0.0-dev" : "0.30.1-beta.2";
3049
3049
 
3050
3050
  // src/lib/init/database.ts
3051
3051
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
package/dist/constants.js CHANGED
@@ -21,7 +21,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
21
21
  // ../better-auth/package.json
22
22
  var package_default = {
23
23
  name: "@playcademy/better-auth",
24
- version: "0.0.22",
24
+ version: "0.0.23-beta.2",
25
25
  type: "module",
26
26
  exports: {
27
27
  "./server": {
package/dist/db.js CHANGED
@@ -2333,7 +2333,7 @@ var GAME_API_ROUTES_DIRECTORY = `${GAME_SERVER_ROOT_DIRECTORY}/api`;
2333
2333
  // ../better-auth/package.json
2334
2334
  var package_default = {
2335
2335
  name: "@playcademy/better-auth",
2336
- version: "0.0.22",
2336
+ version: "0.0.23-beta.2",
2337
2337
  type: "module",
2338
2338
  exports: {
2339
2339
  "./server": {
package/dist/index.js CHANGED
@@ -2345,7 +2345,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
2345
2345
  // ../better-auth/package.json
2346
2346
  var package_default = {
2347
2347
  name: "@playcademy/better-auth",
2348
- version: "0.0.22",
2348
+ version: "0.0.23-beta.2",
2349
2349
  type: "module",
2350
2350
  exports: {
2351
2351
  "./server": {
@@ -6486,7 +6486,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync2, readFileSync as re
6486
6486
  import { join as join12 } from "node:path";
6487
6487
 
6488
6488
  // src/version.ts
6489
- var cliVersion = false ? "0.0.0-dev" : "0.30.0";
6489
+ var cliVersion = false ? "0.0.0-dev" : "0.30.1-beta.2";
6490
6490
 
6491
6491
  // src/lib/init/database.ts
6492
6492
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -21622,6 +21622,135 @@ var RESPONSE_PROCESSING_TEMPLATES = /* @__PURE__ */ new Set([
21622
21622
  "https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct",
21623
21623
  "https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/map_response_point"
21624
21624
  ]);
21625
+ var PRIVATE_PLAYABLE_KEYS = /* @__PURE__ */ new Set([
21626
+ "answer",
21627
+ "answerkey",
21628
+ "correctanswer",
21629
+ "correctresponse",
21630
+ "correctresponses",
21631
+ "correct",
21632
+ "correctvalue",
21633
+ "correctvalues",
21634
+ "iscorrect",
21635
+ "responseprocessing",
21636
+ "rule",
21637
+ "rules",
21638
+ "scoring",
21639
+ "scoringrules",
21640
+ "solution",
21641
+ "expected",
21642
+ "expectedanswer",
21643
+ "expectedvalue",
21644
+ "expectedvalues"
21645
+ ]);
21646
+ var trimmedNonEmptyString = external_exports.string().min(1).refine((value) => value === value.trim());
21647
+ var finiteNumber2 = external_exports.number().finite();
21648
+ var positiveFiniteNumber = finiteNumber2.positive();
21649
+ var IDENTIFIER_VALUE = /^[A-Za-z_][\w.-]*$/;
21650
+ var DIRECTED_PAIR_VALUE = /^[A-Za-z_][\w.-]* [A-Za-z_][\w.-]*$/;
21651
+ var scoringMatchComparisonSchema = external_exports.object({
21652
+ kind: external_exports.literal("match"),
21653
+ correctValues: external_exports.array(trimmedNonEmptyString).min(1).refine((values) => new Set(values).size === values.length)
21654
+ }).strict();
21655
+ var scoringNumericEqualComparisonSchema = external_exports.object({ kind: external_exports.literal("numeric-equal"), correctValue: finiteNumber2 }).strict();
21656
+ var scoringNumericEqualRoundedComparisonSchema = external_exports.object({
21657
+ kind: external_exports.literal("numeric-equal-rounded"),
21658
+ correctValue: finiteNumber2,
21659
+ roundingMode: external_exports.enum(["decimalPlaces", "significantFigures"]),
21660
+ figures: external_exports.number().int().safe().nonnegative()
21661
+ }).strict();
21662
+ function validNumericMatchValue(value, baseType) {
21663
+ const syntax = baseType === "integer" ? /^[+-]?\d+$/ : /^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i;
21664
+ if (!syntax.test(value.trim())) {
21665
+ return false;
21666
+ }
21667
+ const numeric = Number(value);
21668
+ return Number.isFinite(numeric) && (baseType === "float" || Number.isSafeInteger(numeric));
21669
+ }
21670
+ function sameScore(left, right) {
21671
+ return Number.isFinite(left) && Number.isFinite(right) && Math.abs(left - right) <= Number.EPSILON * Math.max(1, Math.abs(left), Math.abs(right));
21672
+ }
21673
+ var scoringRuleSchema = external_exports.object({
21674
+ responseIdentifier: trimmedNonEmptyString,
21675
+ cardinality: external_exports.enum(["single", "multiple", "ordered"]),
21676
+ baseType: external_exports.enum(["string", "identifier", "integer", "float", "directedPair"]),
21677
+ points: positiveFiniteNumber,
21678
+ comparison: external_exports.discriminatedUnion("kind", [
21679
+ scoringMatchComparisonSchema,
21680
+ scoringNumericEqualComparisonSchema,
21681
+ scoringNumericEqualRoundedComparisonSchema
21682
+ ])
21683
+ }).strict().refine((rule) => rule.comparison.kind === "match" || rule.cardinality === "single" && (rule.baseType === "integer" || rule.baseType === "float")).refine((rule) => rule.baseType !== "directedPair" || rule.cardinality === "multiple" && rule.comparison.kind === "match").refine((rule) => rule.comparison.kind !== "match" || rule.cardinality !== "single" || rule.baseType === "string" || rule.comparison.correctValues.length === 1).refine((rule) => rule.comparison.kind !== "numeric-equal-rounded" || rule.comparison.roundingMode === "decimalPlaces" || rule.comparison.figures > 0).refine((rule) => {
21684
+ if (rule.comparison.kind !== "match") {
21685
+ return rule.baseType !== "integer" || Number.isSafeInteger(rule.comparison.correctValue);
21686
+ }
21687
+ if (rule.baseType === "integer" || rule.baseType === "float") {
21688
+ return rule.comparison.correctValues.every((value) => validNumericMatchValue(value, rule.baseType));
21689
+ }
21690
+ if (rule.baseType === "identifier") {
21691
+ return rule.comparison.correctValues.every((value) => IDENTIFIER_VALUE.test(value));
21692
+ }
21693
+ return rule.baseType !== "directedPair" || rule.comparison.correctValues.every((value) => DIRECTED_PAIR_VALUE.test(value));
21694
+ });
21695
+ var scoringRulesSchema = external_exports.array(scoringRuleSchema).min(1).refine((rules) => new Set(rules.map((rule) => rule.responseIdentifier)).size === rules.length);
21696
+ var scoringItemSchema = external_exports.discriminatedUnion("strategy", [
21697
+ external_exports.object({
21698
+ strategy: external_exports.literal("qti"),
21699
+ itemIdentifier: trimmedNonEmptyString,
21700
+ maxScore: positiveFiniteNumber,
21701
+ reason: external_exports.enum([
21702
+ "response-mapping",
21703
+ "area-mapping",
21704
+ "unsupported-base-type",
21705
+ "unsupported-cardinality",
21706
+ "invalid-correct-response",
21707
+ "no-scorable-response",
21708
+ "unsupported-processing-template",
21709
+ "unsupported-response-processing",
21710
+ "cross-response-processing",
21711
+ "inconsistent-max-score"
21712
+ ])
21713
+ }).strict(),
21714
+ external_exports.object({
21715
+ strategy: external_exports.literal("platform"),
21716
+ itemIdentifier: trimmedNonEmptyString,
21717
+ maxScore: positiveFiniteNumber,
21718
+ rules: scoringRulesSchema
21719
+ }).strict()
21720
+ ]).refine((item) => item.strategy === "qti" || sameScore(item.rules.reduce((total, rule) => total + rule.points, 0), item.maxScore));
21721
+ var assessmentScoringArtifactItemsSchema = external_exports.array(scoringItemSchema).refine((items) => new Set(items.map((item) => item.itemIdentifier)).size === items.length);
21722
+ var assessmentScoringArtifactSchema = external_exports.object({ items: assessmentScoringArtifactItemsSchema }).strict();
21723
+ function isAssessmentScoringArtifact(value) {
21724
+ return assessmentScoringArtifactSchema.safeParse(value).success;
21725
+ }
21726
+ function scoringItemMatchesPlayableItem(scoringItem, item) {
21727
+ if (!sameScore(scoringItem.maxScore, item.maxScore)) {
21728
+ return false;
21729
+ }
21730
+ if (scoringItem.strategy === "qti") {
21731
+ return true;
21732
+ }
21733
+ const playableResponses = new Set(item.interactions.map((interaction) => interaction.responseIdentifier));
21734
+ const scoringResponses = new Set(scoringItem.rules.map((rule) => rule.responseIdentifier));
21735
+ return playableResponses.size === item.interactions.length && scoringResponses.size === scoringItem.rules.length && playableResponses.size === scoringResponses.size && [...playableResponses].every((identifier) => scoringResponses.has(identifier));
21736
+ }
21737
+ function normalizedKey(key) {
21738
+ return key.replaceAll(/[^a-z0-9]/gi, "").toLowerCase();
21739
+ }
21740
+ function containsPrivatePlayableAssessmentData(value) {
21741
+ if (Array.isArray(value)) {
21742
+ return value.some(containsPrivatePlayableAssessmentData);
21743
+ }
21744
+ if (!isRecord2(value)) {
21745
+ return false;
21746
+ }
21747
+ return Object.entries(value).some(([key, entry]) => PRIVATE_PLAYABLE_KEYS.has(normalizedKey(key)) || containsPrivatePlayableAssessmentData(entry));
21748
+ }
21749
+ var MATCH_CORRECT_TEMPLATES = new Set([
21750
+ "http://www.imsglobal.org/question/qti_v3p0/rptemplates/match_correct",
21751
+ "https://www.imsglobal.org/question/qti_v3p0/rptemplates/match_correct",
21752
+ "https://purl.imsglobal.org/spec/qti/v3p0/rptemplates/match_correct"
21753
+ ].flatMap((template) => [template, `${template}.xml`]));
21625
21754
  var COMMON_CORE_MATH_FRAMEWORK_ALIASES = /* @__PURE__ */ new Set([
21626
21755
  "ccssm",
21627
21756
  "ccssmath",
@@ -22557,12 +22686,30 @@ function isFixtureReviewBank(value, assessment) {
22557
22686
  }
22558
22687
  return indexedItems.size === expectedItems.size;
22559
22688
  }
22560
- function fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas) {
22689
+ function isFixturePlayableItem(value) {
22690
+ return isRecord2(value) && typeof value.identifier === "string" && typeof value.maxScore === "number" && Array.isArray(value.interactions) && value.interactions.every((interaction) => isRecord2(interaction) && typeof interaction.responseIdentifier === "string");
22691
+ }
22692
+ function isFixtureScoringArtifact(value, assessment) {
22693
+ if (!isAssessmentScoringArtifact(value) || !Array.isArray(assessment.items)) {
22694
+ return false;
22695
+ }
22696
+ const assessmentItems = assessment.items.filter(isFixturePlayableItem);
22697
+ const assessmentItemsByIdentifier = new Map(assessmentItems.map((item) => [item.identifier, item]));
22698
+ return assessmentItems.length === assessment.items.length && assessmentItemsByIdentifier.size === assessmentItems.length && value.items.length === assessmentItems.length && value.items.every((scoringItem) => {
22699
+ const assessmentItem = assessmentItemsByIdentifier.get(scoringItem.itemIdentifier);
22700
+ return scoringItem.strategy === "platform" && assessmentItem !== void 0 && scoringItemMatchesPlayableItem(scoringItem, assessmentItem);
22701
+ });
22702
+ }
22703
+ function fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas, scoring) {
22561
22704
  if (!isRecord2(item) || typeof item.identifier !== "string" || !Array.isArray(item.interactions)) {
22562
22705
  return false;
22563
22706
  }
22564
22707
  const itemCorrectResponses = correctResponses[item.identifier];
22565
22708
  const itemResponseAreas = responseAreas?.[item.identifier];
22709
+ const scoringItem = scoring?.items.find((candidate) => candidate.itemIdentifier === item.identifier);
22710
+ if (scoringItem) {
22711
+ return scoringItem.strategy === "platform";
22712
+ }
22566
22713
  return item.interactions.length > 0 && item.interactions.every((interaction) => {
22567
22714
  if (!isRecord2(interaction) || typeof interaction.responseIdentifier !== "string") {
22568
22715
  return false;
@@ -22571,13 +22718,13 @@ function fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, res
22571
22718
  return isRecord2(itemCorrectResponses) && isAssessmentResponseValue(itemCorrectResponses[identifier]) || isRecord2(itemResponseAreas) && Array.isArray(itemResponseAreas[identifier]) && itemResponseAreas[identifier].length > 0;
22572
22719
  });
22573
22720
  }
22574
- function isFixtureDiagnosticRouting(value, assessment, correctResponses, responseAreas) {
22721
+ function isFixtureDiagnosticRouting(value, assessment, correctResponses, responseAreas, scoring) {
22575
22722
  if (!isRecord2(value) || typeof value.diagnosticKey !== "string" || value.diagnosticKey.trim().length === 0 || value.diagnosticKey !== value.diagnosticKey.trim() || typeof value.routingRevision !== "string" || value.routingRevision.trim().length === 0 || value.routingRevision !== value.routingRevision.trim() || !Array.isArray(assessment.items)) {
22576
22723
  return false;
22577
22724
  }
22578
22725
  const capabilities = assessment.items.map((item) => ({
22579
22726
  itemIdentifier: isRecord2(item) && typeof item.identifier === "string" ? item.identifier : "",
22580
- supportsDeterminateBinaryGrading: fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas)
22727
+ supportsDeterminateBinaryGrading: fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas, scoring)
22581
22728
  }));
22582
22729
  const validation = validateDiagnosticRoutingManifest(value.routingManifest, capabilities, {
22583
22730
  analyzeBounds: false
@@ -22597,7 +22744,7 @@ function isAssessmentRuntimeFixtureBundle(value) {
22597
22744
  return false;
22598
22745
  }
22599
22746
  const validTests = catalog.tests.every((test) => {
22600
- if (!isRecord2(test) || typeof test.id !== "string" || typeof test.assessmentKey !== "string" || typeof test.qtiTestIdentifier !== "string" || typeof test.live !== "boolean" || !isRecord2(test.assessment) || typeof test.assessment.identifier !== "string" || !Number.isInteger(test.assessment.contractVersion) || typeof test.assessment.contentRevision !== "string" || !Array.isArray(test.assessment.items) || !isRecord2(test.correctResponses)) {
22747
+ if (!isRecord2(test) || typeof test.id !== "string" || typeof test.assessmentKey !== "string" || typeof test.qtiTestIdentifier !== "string" || typeof test.live !== "boolean" || !isRecord2(test.assessment) || typeof test.assessment.identifier !== "string" || !Number.isInteger(test.assessment.contractVersion) || typeof test.assessment.contentRevision !== "string" || !Array.isArray(test.assessment.items) || !test.assessment.items.every((item) => isRecord2(item) && typeof item.maxScore === "number" && Number.isFinite(item.maxScore) && item.maxScore > 0) || containsPrivatePlayableAssessmentData(test.assessment) || !isRecord2(test.correctResponses)) {
22601
22748
  return false;
22602
22749
  }
22603
22750
  const standard = isRecord2(test.standard) && typeof test.standard.framework === "string" && typeof test.standard.identifier === "string" ? canonicalReviewStandardRef({
@@ -22611,10 +22758,17 @@ function isAssessmentRuntimeFixtureBundle(value) {
22611
22758
  if (!validReviewBank) {
22612
22759
  return false;
22613
22760
  }
22761
+ let scoring;
22762
+ if (test.scoring !== void 0) {
22763
+ if (!isFixtureScoringArtifact(test.scoring, test.assessment)) {
22764
+ return false;
22765
+ }
22766
+ scoring = test.scoring;
22767
+ }
22614
22768
  if (test.diagnostic === void 0) {
22615
22769
  return true;
22616
22770
  }
22617
- return catalog.purpose === "diagnostic" && isFixtureDiagnosticRouting(test.diagnostic, test.assessment, test.correctResponses, isRecord2(test.responseAreas) ? test.responseAreas : void 0);
22771
+ return catalog.purpose === "diagnostic" && isFixtureDiagnosticRouting(test.diagnostic, test.assessment, test.correctResponses, isRecord2(test.responseAreas) ? test.responseAreas : void 0, scoring);
22618
22772
  });
22619
22773
  if (!validTests || catalog.purpose !== "diagnostic") {
22620
22774
  return validTests;
@@ -22632,6 +22786,133 @@ function isAssessmentRuntimeFixtureBundle(value) {
22632
22786
  return true;
22633
22787
  });
22634
22788
  }
22789
+ var ASSESSMENT_CHILD_RESULT_KIND = "assessment-child-result";
22790
+ var ASSESSMENT_CHILD_RESULT_VERSION = 1;
22791
+ var IdentitySchema = external_exports.string().min(1).refine((value) => value.trim() === value, {
22792
+ message: "Identifiers must not contain surrounding whitespace"
22793
+ });
22794
+ var RecordedAtSchema = external_exports.string().datetime().refine((value) => new Date(value).toISOString() === value, {
22795
+ message: "recordedAt must be a canonical UTC timestamp"
22796
+ });
22797
+ var ResponseKeySchema = IdentitySchema;
22798
+ var AssessmentResponseValueSchema = external_exports.custom(isAssessmentResponseValue, {
22799
+ message: `Response values are non-empty text, at most ${TIMEBACK_ASSESSMENT_RESPONSE_VALUE_MAX_LENGTH} characters each`
22800
+ });
22801
+ var AssessmentScoreSchema = external_exports.object({
22802
+ earned: external_exports.number().finite().nonnegative(),
22803
+ possible: external_exports.number().finite().nonnegative(),
22804
+ normalized: external_exports.number().finite().min(0).max(1)
22805
+ }).strict().superRefine((score, context2) => {
22806
+ const expectedNormalized = score.possible === 0 ? 0 : score.earned / score.possible;
22807
+ if (score.earned > score.possible) {
22808
+ context2.addIssue({
22809
+ code: external_exports.ZodIssueCode.custom,
22810
+ message: "Earned score must not exceed possible score",
22811
+ path: ["earned"]
22812
+ });
22813
+ }
22814
+ if (score.normalized !== expectedNormalized) {
22815
+ context2.addIssue({
22816
+ code: external_exports.ZodIssueCode.custom,
22817
+ message: "Normalized score must equal earned divided by possible",
22818
+ path: ["normalized"]
22819
+ });
22820
+ }
22821
+ });
22822
+ var AssessmentStandardRefSchema = external_exports.object({
22823
+ framework: IdentitySchema,
22824
+ identifier: IdentitySchema
22825
+ }).strict();
22826
+ var DiagnosticRoutingLedgerEntryV1Schema = external_exports.object({
22827
+ stageKey: IdentitySchema,
22828
+ trackKey: IdentitySchema,
22829
+ routingNodeKey: IdentitySchema,
22830
+ itemIdentifier: IdentitySchema,
22831
+ isCorrect: external_exports.boolean()
22832
+ }).strict();
22833
+ var AssessmentChildResultAttemptV1Schema = external_exports.object({
22834
+ attemptId: IdentitySchema,
22835
+ gameId: IdentitySchema,
22836
+ studentId: IdentitySchema,
22837
+ activityId: IdentitySchema,
22838
+ courseId: IdentitySchema,
22839
+ integrationId: IdentitySchema,
22840
+ enrollmentId: IdentitySchema,
22841
+ selectedTest: external_exports.object({
22842
+ assessmentKey: IdentitySchema,
22843
+ identifier: IdentitySchema,
22844
+ contentRevision: IdentitySchema
22845
+ }).strict()
22846
+ }).strict();
22847
+ var AssessmentChildResultAdministrationV1Schema = external_exports.object({
22848
+ submissionId: IdentitySchema,
22849
+ responseVersion: external_exports.number().int().positive(),
22850
+ itemIdentifier: IdentitySchema
22851
+ }).strict();
22852
+ var AssessmentChildResultGradingV1Schema = external_exports.discriminatedUnion("source", [
22853
+ external_exports.object({
22854
+ source: external_exports.literal("timeback-qti"),
22855
+ graderVersion: IdentitySchema
22856
+ }).strict(),
22857
+ external_exports.object({
22858
+ source: external_exports.literal("platform-qti-adapter"),
22859
+ graderVersion: IdentitySchema,
22860
+ qtiGraderVersion: IdentitySchema
22861
+ }).strict(),
22862
+ external_exports.object({
22863
+ source: external_exports.literal("platform-artifact"),
22864
+ artifactVersion: IdentitySchema,
22865
+ graderVersion: IdentitySchema
22866
+ }).strict()
22867
+ ]);
22868
+ var ReviewChildResultContextV1Schema = external_exports.object({
22869
+ kind: external_exports.literal("review"),
22870
+ bankRevision: IdentitySchema,
22871
+ standard: AssessmentStandardRefSchema
22872
+ }).strict();
22873
+ var DiagnosticChildResultContextV1Schema = external_exports.object({
22874
+ kind: external_exports.literal("platform-routed-diagnostic"),
22875
+ definitionId: IdentitySchema,
22876
+ diagnosticKey: IdentitySchema,
22877
+ routingRevision: IdentitySchema,
22878
+ transition: DiagnosticRoutingLedgerEntryV1Schema
22879
+ }).strict();
22880
+ var CommonPayloadShape = {
22881
+ attempt: AssessmentChildResultAttemptV1Schema,
22882
+ administration: AssessmentChildResultAdministrationV1Schema,
22883
+ responses: external_exports.record(ResponseKeySchema, AssessmentResponseValueSchema),
22884
+ score: AssessmentScoreSchema,
22885
+ grading: AssessmentChildResultGradingV1Schema
22886
+ };
22887
+ var ReviewChildResultPayloadV1Schema = external_exports.object({
22888
+ ...CommonPayloadShape,
22889
+ isCorrect: external_exports.boolean().optional(),
22890
+ context: ReviewChildResultContextV1Schema
22891
+ }).strict();
22892
+ var DiagnosticChildResultPayloadV1Schema = external_exports.object({
22893
+ ...CommonPayloadShape,
22894
+ isCorrect: external_exports.boolean(),
22895
+ context: DiagnosticChildResultContextV1Schema
22896
+ }).strict().superRefine((payload, context2) => {
22897
+ if (payload.context.transition.itemIdentifier !== payload.administration.itemIdentifier || payload.context.transition.isCorrect !== payload.isCorrect) {
22898
+ context2.addIssue({
22899
+ code: external_exports.ZodIssueCode.custom,
22900
+ message: "Diagnostic transition must match the administered item and correctness",
22901
+ path: ["context", "transition"]
22902
+ });
22903
+ }
22904
+ });
22905
+ var AssessmentChildResultPayloadV1Schema = external_exports.union([
22906
+ ReviewChildResultPayloadV1Schema,
22907
+ DiagnosticChildResultPayloadV1Schema
22908
+ ]);
22909
+ var AssessmentChildResultCommandV1Schema = external_exports.object({
22910
+ kind: external_exports.literal(ASSESSMENT_CHILD_RESULT_KIND),
22911
+ version: external_exports.literal(ASSESSMENT_CHILD_RESULT_VERSION),
22912
+ recordedAt: RecordedAtSchema,
22913
+ payloadHash: external_exports.string().regex(/^[a-f0-9]{64}$/),
22914
+ payload: AssessmentChildResultPayloadV1Schema
22915
+ }).strict();
22635
22916
  var RuntimeSubjectSchema = external_exports.enum(TIMEBACK_SUBJECTS);
22636
22917
  var RuntimeGradeSchema = external_exports.number().refine(isTimebackGrade, {
22637
22918
  message: `Grade must be one of: ${TIMEBACK_GRADES.join(", ")}`
@@ -22642,14 +22923,14 @@ var OptionalQueryGradeSchema = external_exports.preprocess((value) => {
22642
22923
  }
22643
22924
  return typeof value === "string" && value.trim() !== "" ? Number(value) : Number.NaN;
22644
22925
  }, RuntimeGradeSchema.optional());
22645
- var AssessmentResponseValueSchema = external_exports.custom(isAssessmentResponseValue, {
22926
+ var AssessmentResponseValueSchema2 = external_exports.custom(isAssessmentResponseValue, {
22646
22927
  message: `Response values are non-empty text, at most ${TIMEBACK_ASSESSMENT_RESPONSE_VALUE_MAX_LENGTH} characters each`
22647
22928
  });
22648
22929
  var AssessmentRuntimeIdentitySchema = external_exports.object({
22649
22930
  gameId: external_exports.string().uuid(),
22650
22931
  studentId: external_exports.string().trim().min(1)
22651
22932
  });
22652
- var ResponseKeySchema = external_exports.string().refine((key) => key.length > 0 && key.trim() === key, {
22933
+ var ResponseKeySchema2 = external_exports.string().refine((key) => key.length > 0 && key.trim() === key, {
22653
22934
  message: "Response keys must be non-empty without surrounding whitespace"
22654
22935
  });
22655
22936
  var StartAssessmentBaseSchema = external_exports.object({
@@ -22657,7 +22938,7 @@ var StartAssessmentBaseSchema = external_exports.object({
22657
22938
  subject: RuntimeSubjectSchema.optional(),
22658
22939
  grade: RuntimeGradeSchema.optional()
22659
22940
  });
22660
- var AssessmentStandardRefSchema = external_exports.object({
22941
+ var AssessmentStandardRefSchema2 = external_exports.object({
22661
22942
  framework: external_exports.string().trim().min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength),
22662
22943
  identifier: external_exports.string().trim().min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength)
22663
22944
  }).refine((standard) => {
@@ -22674,7 +22955,7 @@ var LatestAssessmentFiltersSchema = external_exports.discriminatedUnion("purpose
22674
22955
  }),
22675
22956
  LatestAssessmentFilterBaseSchema.extend({
22676
22957
  purpose: external_exports.literal("mastery"),
22677
- standard: AssessmentStandardRefSchema
22958
+ standard: AssessmentStandardRefSchema2
22678
22959
  })
22679
22960
  ]);
22680
22961
  var LatestRuntimeAssessmentQuerySchema = external_exports.intersection(AssessmentRuntimeIdentitySchema, LatestAssessmentFiltersSchema);
@@ -22688,24 +22969,26 @@ var StartAssessmentBodySchema = external_exports.discriminatedUnion("purpose", [
22688
22969
  }),
22689
22970
  StartAssessmentBaseSchema.extend({
22690
22971
  purpose: external_exports.literal("review"),
22691
- standards: external_exports.array(AssessmentStandardRefSchema).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
22972
+ standards: external_exports.array(AssessmentStandardRefSchema2).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
22692
22973
  candidateItemsPerStandard: external_exports.number().int().positive().max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard).optional()
22693
22974
  }),
22694
22975
  StartAssessmentBaseSchema.extend({
22695
22976
  purpose: external_exports.literal("mastery"),
22696
- standard: AssessmentStandardRefSchema
22977
+ standard: AssessmentStandardRefSchema2
22697
22978
  })
22698
22979
  ]);
22980
+ var AssessmentPreparationReceiptSchema = external_exports.string().max(32e3);
22981
+ var StartAssessmentRequestBodySchema = external_exports.intersection(StartAssessmentBodySchema, external_exports.object({ preparationReceipt: AssessmentPreparationReceiptSchema.optional() }));
22699
22982
  var SaveAssessmentBodySchema = external_exports.object({
22700
22983
  expectedResponseVersion: external_exports.number().int().nonnegative(),
22701
- responses: external_exports.record(ResponseKeySchema, external_exports.record(ResponseKeySchema, AssessmentResponseValueSchema.nullable()))
22984
+ responses: external_exports.record(ResponseKeySchema2, external_exports.record(ResponseKeySchema2, AssessmentResponseValueSchema2.nullable()))
22702
22985
  });
22703
22986
  var SubmitAssessmentItemBodySchema = external_exports.object({
22704
22987
  expectedResponseVersion: external_exports.number().int().nonnegative(),
22705
22988
  submissionId: external_exports.string().trim().min(1),
22706
- itemIdentifier: ResponseKeySchema,
22707
- routingNodeKey: ResponseKeySchema.optional(),
22708
- responses: external_exports.record(ResponseKeySchema, AssessmentResponseValueSchema.nullable())
22989
+ itemIdentifier: ResponseKeySchema2,
22990
+ routingNodeKey: ResponseKeySchema2.optional(),
22991
+ responses: external_exports.record(ResponseKeySchema2, AssessmentResponseValueSchema2.nullable())
22709
22992
  });
22710
22993
  var SubmitAssessmentBodySchema = external_exports.object({
22711
22994
  expectedResponseVersion: external_exports.number().int().nonnegative(),
@@ -22723,7 +23006,8 @@ var FinalizeAssessmentBodySchema = external_exports.object({
22723
23006
  message: "Provide either masteredUnits or masteredUnitsAbsolute, not both",
22724
23007
  path: ["masteredUnits"]
22725
23008
  });
22726
- var StartRuntimeAssessmentRequestSchema = AssessmentRuntimeIdentitySchema.and(StartAssessmentBodySchema);
23009
+ var PrepareRuntimeAssessmentRequestSchema = AssessmentRuntimeIdentitySchema.and(StartAssessmentBodySchema);
23010
+ var StartRuntimeAssessmentRequestSchema = AssessmentRuntimeIdentitySchema.and(StartAssessmentRequestBodySchema);
22727
23011
  var SaveRuntimeAssessmentRequestSchema = AssessmentRuntimeIdentitySchema.extend(SaveAssessmentBodySchema.shape);
22728
23012
  var SubmitAssessmentItemRuntimeRequestSchema = AssessmentRuntimeIdentitySchema.extend(SubmitAssessmentItemBodySchema.shape);
22729
23013
  var SubmitRuntimeAssessmentRequestSchema = AssessmentRuntimeIdentitySchema.extend(SubmitAssessmentBodySchema.shape).extend({
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.30.0",
3
- "sdkVersion": "0.18.0",
4
- "runtimeBuildId": "486fecc8fa56",
5
- "inputFingerprint": "486fecc8fa56dbf77094b6cc8fd4305f7e57d613b0ed34733f2b6db12e9d225a",
2
+ "cliVersion": "0.30.1-beta.2",
3
+ "sdkVersion": "0.18.1-beta.2",
4
+ "runtimeBuildId": "8b1482f218dd",
5
+ "inputFingerprint": "8b1482f218dd002569f3f20a70065dfe243d473fcee598817a8085a3b72f64aa",
6
6
  "entry": "index.js"
7
7
  }