playcademy 0.30.1-beta.1 → 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.23-beta.1",
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.23-beta.1",
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.1-beta.1";
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.23-beta.1",
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.23-beta.1",
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.23-beta.1",
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.1-beta.1";
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,130 @@ 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
+ }
21625
21749
  var MATCH_CORRECT_TEMPLATES = new Set([
21626
21750
  "http://www.imsglobal.org/question/qti_v3p0/rptemplates/match_correct",
21627
21751
  "https://www.imsglobal.org/question/qti_v3p0/rptemplates/match_correct",
@@ -22562,12 +22686,30 @@ function isFixtureReviewBank(value, assessment) {
22562
22686
  }
22563
22687
  return indexedItems.size === expectedItems.size;
22564
22688
  }
22565
- 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) {
22566
22704
  if (!isRecord2(item) || typeof item.identifier !== "string" || !Array.isArray(item.interactions)) {
22567
22705
  return false;
22568
22706
  }
22569
22707
  const itemCorrectResponses = correctResponses[item.identifier];
22570
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
+ }
22571
22713
  return item.interactions.length > 0 && item.interactions.every((interaction) => {
22572
22714
  if (!isRecord2(interaction) || typeof interaction.responseIdentifier !== "string") {
22573
22715
  return false;
@@ -22576,13 +22718,13 @@ function fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, res
22576
22718
  return isRecord2(itemCorrectResponses) && isAssessmentResponseValue(itemCorrectResponses[identifier]) || isRecord2(itemResponseAreas) && Array.isArray(itemResponseAreas[identifier]) && itemResponseAreas[identifier].length > 0;
22577
22719
  });
22578
22720
  }
22579
- function isFixtureDiagnosticRouting(value, assessment, correctResponses, responseAreas) {
22721
+ function isFixtureDiagnosticRouting(value, assessment, correctResponses, responseAreas, scoring) {
22580
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)) {
22581
22723
  return false;
22582
22724
  }
22583
22725
  const capabilities = assessment.items.map((item) => ({
22584
22726
  itemIdentifier: isRecord2(item) && typeof item.identifier === "string" ? item.identifier : "",
22585
- supportsDeterminateBinaryGrading: fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas)
22727
+ supportsDeterminateBinaryGrading: fixtureItemSupportsDeterminateBinaryGrading(item, correctResponses, responseAreas, scoring)
22586
22728
  }));
22587
22729
  const validation = validateDiagnosticRoutingManifest(value.routingManifest, capabilities, {
22588
22730
  analyzeBounds: false
@@ -22602,7 +22744,7 @@ function isAssessmentRuntimeFixtureBundle(value) {
22602
22744
  return false;
22603
22745
  }
22604
22746
  const validTests = catalog.tests.every((test) => {
22605
- 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)) {
22606
22748
  return false;
22607
22749
  }
22608
22750
  const standard = isRecord2(test.standard) && typeof test.standard.framework === "string" && typeof test.standard.identifier === "string" ? canonicalReviewStandardRef({
@@ -22616,10 +22758,17 @@ function isAssessmentRuntimeFixtureBundle(value) {
22616
22758
  if (!validReviewBank) {
22617
22759
  return false;
22618
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
+ }
22619
22768
  if (test.diagnostic === void 0) {
22620
22769
  return true;
22621
22770
  }
22622
- 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);
22623
22772
  });
22624
22773
  if (!validTests || catalog.purpose !== "diagnostic") {
22625
22774
  return validTests;
@@ -22637,6 +22786,133 @@ function isAssessmentRuntimeFixtureBundle(value) {
22637
22786
  return true;
22638
22787
  });
22639
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();
22640
22916
  var RuntimeSubjectSchema = external_exports.enum(TIMEBACK_SUBJECTS);
22641
22917
  var RuntimeGradeSchema = external_exports.number().refine(isTimebackGrade, {
22642
22918
  message: `Grade must be one of: ${TIMEBACK_GRADES.join(", ")}`
@@ -22647,14 +22923,14 @@ var OptionalQueryGradeSchema = external_exports.preprocess((value) => {
22647
22923
  }
22648
22924
  return typeof value === "string" && value.trim() !== "" ? Number(value) : Number.NaN;
22649
22925
  }, RuntimeGradeSchema.optional());
22650
- var AssessmentResponseValueSchema = external_exports.custom(isAssessmentResponseValue, {
22926
+ var AssessmentResponseValueSchema2 = external_exports.custom(isAssessmentResponseValue, {
22651
22927
  message: `Response values are non-empty text, at most ${TIMEBACK_ASSESSMENT_RESPONSE_VALUE_MAX_LENGTH} characters each`
22652
22928
  });
22653
22929
  var AssessmentRuntimeIdentitySchema = external_exports.object({
22654
22930
  gameId: external_exports.string().uuid(),
22655
22931
  studentId: external_exports.string().trim().min(1)
22656
22932
  });
22657
- 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, {
22658
22934
  message: "Response keys must be non-empty without surrounding whitespace"
22659
22935
  });
22660
22936
  var StartAssessmentBaseSchema = external_exports.object({
@@ -22662,7 +22938,7 @@ var StartAssessmentBaseSchema = external_exports.object({
22662
22938
  subject: RuntimeSubjectSchema.optional(),
22663
22939
  grade: RuntimeGradeSchema.optional()
22664
22940
  });
22665
- var AssessmentStandardRefSchema = external_exports.object({
22941
+ var AssessmentStandardRefSchema2 = external_exports.object({
22666
22942
  framework: external_exports.string().trim().min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength),
22667
22943
  identifier: external_exports.string().trim().min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength)
22668
22944
  }).refine((standard) => {
@@ -22679,7 +22955,7 @@ var LatestAssessmentFiltersSchema = external_exports.discriminatedUnion("purpose
22679
22955
  }),
22680
22956
  LatestAssessmentFilterBaseSchema.extend({
22681
22957
  purpose: external_exports.literal("mastery"),
22682
- standard: AssessmentStandardRefSchema
22958
+ standard: AssessmentStandardRefSchema2
22683
22959
  })
22684
22960
  ]);
22685
22961
  var LatestRuntimeAssessmentQuerySchema = external_exports.intersection(AssessmentRuntimeIdentitySchema, LatestAssessmentFiltersSchema);
@@ -22693,26 +22969,26 @@ var StartAssessmentBodySchema = external_exports.discriminatedUnion("purpose", [
22693
22969
  }),
22694
22970
  StartAssessmentBaseSchema.extend({
22695
22971
  purpose: external_exports.literal("review"),
22696
- 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),
22697
22973
  candidateItemsPerStandard: external_exports.number().int().positive().max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard).optional()
22698
22974
  }),
22699
22975
  StartAssessmentBaseSchema.extend({
22700
22976
  purpose: external_exports.literal("mastery"),
22701
- standard: AssessmentStandardRefSchema
22977
+ standard: AssessmentStandardRefSchema2
22702
22978
  })
22703
22979
  ]);
22704
22980
  var AssessmentPreparationReceiptSchema = external_exports.string().max(32e3);
22705
22981
  var StartAssessmentRequestBodySchema = external_exports.intersection(StartAssessmentBodySchema, external_exports.object({ preparationReceipt: AssessmentPreparationReceiptSchema.optional() }));
22706
22982
  var SaveAssessmentBodySchema = external_exports.object({
22707
22983
  expectedResponseVersion: external_exports.number().int().nonnegative(),
22708
- responses: external_exports.record(ResponseKeySchema, external_exports.record(ResponseKeySchema, AssessmentResponseValueSchema.nullable()))
22984
+ responses: external_exports.record(ResponseKeySchema2, external_exports.record(ResponseKeySchema2, AssessmentResponseValueSchema2.nullable()))
22709
22985
  });
22710
22986
  var SubmitAssessmentItemBodySchema = external_exports.object({
22711
22987
  expectedResponseVersion: external_exports.number().int().nonnegative(),
22712
22988
  submissionId: external_exports.string().trim().min(1),
22713
- itemIdentifier: ResponseKeySchema,
22714
- routingNodeKey: ResponseKeySchema.optional(),
22715
- responses: external_exports.record(ResponseKeySchema, AssessmentResponseValueSchema.nullable())
22989
+ itemIdentifier: ResponseKeySchema2,
22990
+ routingNodeKey: ResponseKeySchema2.optional(),
22991
+ responses: external_exports.record(ResponseKeySchema2, AssessmentResponseValueSchema2.nullable())
22716
22992
  });
22717
22993
  var SubmitAssessmentBodySchema = external_exports.object({
22718
22994
  expectedResponseVersion: external_exports.number().int().nonnegative(),
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.30.1-beta.1",
3
- "sdkVersion": "0.18.1-beta.1",
4
- "runtimeBuildId": "ed530c9aeee4",
5
- "inputFingerprint": "ed530c9aeee40f0354eafbceba665ec77a21e74f7691c4b18bd94dbf44ffcfa8",
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
  }