@playcademy/sdk 0.16.1-beta.7 → 0.16.1-beta.8

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/README.md CHANGED
@@ -139,9 +139,10 @@ const completed = await client.timeback.assessments.submit(attempt.attemptId, {
139
139
  })
140
140
  ```
141
141
 
142
- `start()` resumes an unfinished attempt or selects the next live test. Save payloads are
143
- question deltas, but each included question replaces its complete response state; use `null` to
144
- clear an answer. Keep the returned `responseVersion` and send it with the next mutation.
142
+ `start()` resumes a compatible unfinished attempt or selects content for a fixed test or standards
143
+ review. Save payloads merge at both the item and response levels; omitted values remain unchanged,
144
+ and `null` clears one response. Keep the returned `responseVersion` and send it with the next
145
+ mutation.
145
146
 
146
147
  For local development, import the current ordered catalog before starting the dev host:
147
148
 
package/dist/index.js CHANGED
@@ -823,7 +823,12 @@ var TIMEBACK_SUBJECTS = [
823
823
  "Math",
824
824
  "None"
825
825
  ];
826
- var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic"];
826
+ var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic", "review"];
827
+ var TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS = {
828
+ standards: 20,
829
+ itemsPerStandard: 5,
830
+ standardFieldLength: 128
831
+ };
827
832
  var VALID_E_LEVELS = ["E1", "E2", "E3", "E4"];
828
833
  var TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
829
834
  xp: 1,
@@ -2952,7 +2957,7 @@ var VALID_MASTERY_INCLUDE_OPTIONS = ["perCourse"];
2952
2957
  var ASSESSMENTS_ROUTE = TIMEBACK_ROUTES.ASSESSMENTS;
2953
2958
  function validateAssessmentFilters(options) {
2954
2959
  if (!isAssessmentPurpose(options?.purpose)) {
2955
- throw new Error("purpose must be end_of_course or diagnostic");
2960
+ throw new Error("purpose must be end_of_course, diagnostic, or review");
2956
2961
  }
2957
2962
  if (options.grade !== undefined && !isValidGrade(options.grade)) {
2958
2963
  throw new Error(`Invalid grade: ${options.grade}. Valid grades: ${VALID_GRADES.join(", ")}`);
@@ -2972,6 +2977,25 @@ function createTimebackNamespace(client) {
2972
2977
  throw new Error("activityId is required");
2973
2978
  }
2974
2979
  validateAssessmentFilters(input);
2980
+ if (input.purpose === "review") {
2981
+ if (!Array.isArray(input.standards) || input.standards.length === 0) {
2982
+ throw new Error("standards must contain at least one standard for review");
2983
+ }
2984
+ if (input.standards.length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards) {
2985
+ throw new Error(`standards must contain at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards} standards`);
2986
+ }
2987
+ for (const standard of input.standards) {
2988
+ if (!standard || typeof standard !== "object" || !standard.framework?.trim() || !standard.identifier?.trim()) {
2989
+ throw new Error("review standards require a framework and identifier");
2990
+ }
2991
+ if (standard.framework.trim().length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength || standard.identifier.trim().length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength) {
2992
+ throw new Error(`review standard fields must be at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength} characters`);
2993
+ }
2994
+ }
2995
+ if (input.itemsPerStandard !== undefined && (!Number.isInteger(input.itemsPerStandard) || input.itemsPerStandard <= 0 || input.itemsPerStandard > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.itemsPerStandard)) {
2996
+ throw new Error(`itemsPerStandard must be a positive integer at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.itemsPerStandard}`);
2997
+ }
2998
+ }
2975
2999
  return client["requestGameBackend"](`${ASSESSMENTS_ROUTE}/start`, "POST", input);
2976
3000
  },
2977
3001
  latest: async (options) => {
@@ -3421,7 +3445,7 @@ async function request({
3421
3445
  return rawText && rawText.length > 0 ? rawText : undefined;
3422
3446
  }
3423
3447
  // src/version.ts
3424
- var SDK_VERSION = "0.16.1-beta.7";
3448
+ var SDK_VERSION = "0.16.1-beta.8";
3425
3449
 
3426
3450
  // src/clients/base.ts
3427
3451
  class PlaycademyBaseClient {
package/dist/internal.js CHANGED
@@ -823,7 +823,12 @@ var TIMEBACK_SUBJECTS = [
823
823
  "Math",
824
824
  "None"
825
825
  ];
826
- var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic"];
826
+ var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic", "review"];
827
+ var TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS = {
828
+ standards: 20,
829
+ itemsPerStandard: 5,
830
+ standardFieldLength: 128
831
+ };
827
832
  var VALID_E_LEVELS = ["E1", "E2", "E3", "E4"];
828
833
  var TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
829
834
  xp: 1,
@@ -2952,7 +2957,7 @@ var VALID_MASTERY_INCLUDE_OPTIONS = ["perCourse"];
2952
2957
  var ASSESSMENTS_ROUTE = TIMEBACK_ROUTES.ASSESSMENTS;
2953
2958
  function validateAssessmentFilters(options) {
2954
2959
  if (!isAssessmentPurpose(options?.purpose)) {
2955
- throw new Error("purpose must be end_of_course or diagnostic");
2960
+ throw new Error("purpose must be end_of_course, diagnostic, or review");
2956
2961
  }
2957
2962
  if (options.grade !== undefined && !isValidGrade(options.grade)) {
2958
2963
  throw new Error(`Invalid grade: ${options.grade}. Valid grades: ${VALID_GRADES.join(", ")}`);
@@ -2972,6 +2977,25 @@ function createTimebackNamespace(client) {
2972
2977
  throw new Error("activityId is required");
2973
2978
  }
2974
2979
  validateAssessmentFilters(input);
2980
+ if (input.purpose === "review") {
2981
+ if (!Array.isArray(input.standards) || input.standards.length === 0) {
2982
+ throw new Error("standards must contain at least one standard for review");
2983
+ }
2984
+ if (input.standards.length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards) {
2985
+ throw new Error(`standards must contain at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards} standards`);
2986
+ }
2987
+ for (const standard of input.standards) {
2988
+ if (!standard || typeof standard !== "object" || !standard.framework?.trim() || !standard.identifier?.trim()) {
2989
+ throw new Error("review standards require a framework and identifier");
2990
+ }
2991
+ if (standard.framework.trim().length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength || standard.identifier.trim().length > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength) {
2992
+ throw new Error(`review standard fields must be at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength} characters`);
2993
+ }
2994
+ }
2995
+ if (input.itemsPerStandard !== undefined && (!Number.isInteger(input.itemsPerStandard) || input.itemsPerStandard <= 0 || input.itemsPerStandard > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.itemsPerStandard)) {
2996
+ throw new Error(`itemsPerStandard must be a positive integer at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.itemsPerStandard}`);
2997
+ }
2998
+ }
2975
2999
  return client["requestGameBackend"](`${ASSESSMENTS_ROUTE}/start`, "POST", input);
2976
3000
  },
2977
3001
  latest: async (options) => {
@@ -4296,7 +4320,7 @@ async function request({
4296
4320
  return rawText && rawText.length > 0 ? rawText : undefined;
4297
4321
  }
4298
4322
  // src/version.ts
4299
- var SDK_VERSION = "0.16.1-beta.7";
4323
+ var SDK_VERSION = "0.16.1-beta.8";
4300
4324
 
4301
4325
  // src/clients/base.ts
4302
4326
  class PlaycademyBaseClient {
@@ -41,7 +41,12 @@ var TIMEBACK_SUBJECTS = [
41
41
  "Math",
42
42
  "None"
43
43
  ];
44
- var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic"];
44
+ var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic", "review"];
45
+ var TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS = {
46
+ standards: 20,
47
+ itemsPerStandard: 5,
48
+ standardFieldLength: 128
49
+ };
45
50
  var VALID_E_LEVELS = ["E1", "E2", "E3", "E4"];
46
51
  var TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
47
52
  xp: 1,
@@ -303,7 +308,7 @@ function extractApiErrorInfo(error) {
303
308
  }
304
309
 
305
310
  // src/version.ts
306
- var SDK_VERSION = "0.16.1-beta.7";
311
+ var SDK_VERSION = "0.16.1-beta.8";
307
312
 
308
313
  // src/server/request.ts
309
314
  async function makeApiRequest(opts) {
package/dist/server.js CHANGED
@@ -230,7 +230,12 @@ var TIMEBACK_SUBJECTS = [
230
230
  "Math",
231
231
  "None"
232
232
  ];
233
- var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic"];
233
+ var ASSESSMENT_PURPOSES = ["end_of_course", "diagnostic", "review"];
234
+ var TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS = {
235
+ standards: 20,
236
+ itemsPerStandard: 5,
237
+ standardFieldLength: 128
238
+ };
234
239
  var VALID_E_LEVELS = ["E1", "E2", "E3", "E4"];
235
240
  var TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
236
241
  xp: 1,
@@ -492,7 +497,7 @@ function extractApiErrorInfo(error) {
492
497
  }
493
498
 
494
499
  // src/version.ts
495
- var SDK_VERSION = "0.16.1-beta.7";
500
+ var SDK_VERSION = "0.16.1-beta.8";
496
501
 
497
502
  // src/server/request.ts
498
503
  async function makeApiRequest(opts) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/sdk",
3
- "version": "0.16.1-beta.7",
3
+ "version": "0.16.1-beta.8",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {