playcademy 0.31.1-beta.2 → 0.31.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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.24-beta.2",
45
+ version: "0.0.24-beta.3",
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.24-beta.2",
1211
+ version: "0.0.24-beta.3",
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.31.1-beta.2";
3048
+ var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.3";
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.24-beta.2",
24
+ version: "0.0.24-beta.3",
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.24-beta.2",
2336
+ version: "0.0.24-beta.3",
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.24-beta.2",
2348
+ version: "0.0.24-beta.3",
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.31.1-beta.2";
6489
+ var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.3";
6490
6490
 
6491
6491
  // src/lib/init/database.ts
6492
6492
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -22993,8 +22993,8 @@ var StartAssessmentBodySchema = external_exports.discriminatedUnion("purpose", [
22993
22993
  }),
22994
22994
  StartAssessmentBaseSchema.extend({
22995
22995
  purpose: external_exports.literal("review"),
22996
- requireBothQuestions: external_exports.boolean().optional(),
22997
- standards: external_exports.array(AssessmentStandardRefSchema2).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
22996
+ requireBothQuestions: external_exports.never().optional(),
22997
+ standards: external_exports.array(AssessmentStandardRefSchema2.and(external_exports.object({ requireBothQuestions: external_exports.boolean().optional() }))).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
22998
22998
  candidateItemsPerStandard: external_exports.number().int().positive().max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard).optional()
22999
22999
  }),
23000
23000
  StartAssessmentBaseSchema.extend({
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.31.1-beta.2",
3
- "sdkVersion": "0.19.1-beta.3",
4
- "runtimeBuildId": "4673549da4d8",
5
- "inputFingerprint": "4673549da4d81b760c8c8270835a45d570cb44eef97ca9052ba75da4876260e5",
2
+ "cliVersion": "0.31.1-beta.3",
3
+ "sdkVersion": "0.19.1-beta.4",
4
+ "runtimeBuildId": "691d5310a7ed",
5
+ "inputFingerprint": "691d5310a7ed13e93287da0159f9e9d932ae881add0e32c66efea273866b92a1",
6
6
  "entry": "index.js"
7
7
  }
@@ -11634,19 +11634,22 @@ function scorePlatformAssessmentItem(item, responses) {
11634
11634
  isCorrect: verdicts.length > 0 && verdicts.every(Boolean)
11635
11635
  };
11636
11636
  }
11637
+ function reviewStandardRef({
11638
+ framework,
11639
+ identifier
11640
+ }) {
11641
+ return { framework, identifier };
11642
+ }
11637
11643
  function reportReviewRequiredPairUnavailable(review, administeredItemIdentifiers2, report) {
11638
- if (!review.requireBothQuestions) {
11639
- return;
11640
- }
11641
11644
  const administered = new Set(administeredItemIdentifiers2);
11642
11645
  const failures = [];
11643
- for (const standard of review.standards) {
11646
+ for (const standard of review.standards.filter((entry) => entry.requireBothQuestions)) {
11644
11647
  const key = assessmentStandardRefKey(standard);
11645
11648
  const selected = new Set(review.selections.filter((selection) => assessmentStandardRefKey(selection.standard) === key).map((selection) => selection.itemIdentifier));
11646
11649
  const administeredCount = [...selected].filter((identifier) => administered.has(identifier)).length;
11647
11650
  if (selected.size < 2 || administeredCount === 1) {
11648
11651
  failures.push({
11649
- standard,
11652
+ standard: reviewStandardRef(standard),
11650
11653
  reason: selected.size < 2 ? "selection_shortage" : "not_administered",
11651
11654
  requiredCount: 2,
11652
11655
  selectedCount: selected.size,
@@ -11677,6 +11680,9 @@ function canonicalRequestStandards(standards) {
11677
11680
  }
11678
11681
  const canonical = /* @__PURE__ */ new Map();
11679
11682
  for (const input of standards) {
11683
+ if (input.requireBothQuestions !== void 0 && typeof input.requireBothQuestions !== "boolean") {
11684
+ throw new Error("review standard requireBothQuestions must be a boolean");
11685
+ }
11680
11686
  const standard = canonicalAssessmentStandardRef(input);
11681
11687
  if (!reviewStandardFieldsWithinLimits(standard)) {
11682
11688
  throw new RangeError(`Review standard fields may contain at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standardFieldLength} characters`);
@@ -11685,13 +11691,19 @@ function canonicalRequestStandards(standards) {
11685
11691
  throw new Error("Review standards require a framework and identifier");
11686
11692
  }
11687
11693
  const key = assessmentStandardRefKey(standard);
11688
- if (!canonical.has(key)) {
11689
- canonical.set(key, standard);
11694
+ if (!canonical.has(key) || input.requireBothQuestions) {
11695
+ canonical.set(key, {
11696
+ ...standard,
11697
+ ...input.requireBothQuestions ? { requireBothQuestions: true } : {}
11698
+ });
11690
11699
  }
11691
11700
  }
11692
- return [...canonical.values()].toSorted((left, right) => compareCodeUnits(assessmentStandardRefKey(left), assessmentStandardRefKey(right)));
11701
+ return [...canonical.values()];
11693
11702
  }
11694
11703
  function normalizeReviewRequest(request2) {
11704
+ if ("requireBothQuestions" in request2 && request2.requireBothQuestions !== void 0) {
11705
+ throw new Error("Set requireBothQuestions on individual review standards, not the review request");
11706
+ }
11695
11707
  const candidateItemsPerStandard = request2.candidateItemsPerStandard ?? 1;
11696
11708
  if (!Number.isInteger(candidateItemsPerStandard) || candidateItemsPerStandard <= 0 || candidateItemsPerStandard > TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard) {
11697
11709
  throw new RangeError(`candidateItemsPerStandard must be a positive integer at most ${TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard}`);
@@ -11702,20 +11714,20 @@ function normalizeReviewRequest(request2) {
11702
11714
  }
11703
11715
  return {
11704
11716
  standards,
11705
- candidateItemsPerStandard,
11706
- ...request2.requireBothQuestions ? { requireBothQuestions: true } : {}
11717
+ candidateItemsPerStandard
11707
11718
  };
11708
11719
  }
11709
11720
  function reviewRequestFingerprint(request2, policy) {
11710
11721
  const normalized = normalizeReviewRequest(request2);
11722
+ const requiredStandardKeys = normalized.standards.filter((standard) => standard.requireBothQuestions).map(assessmentStandardRefKey);
11711
11723
  return JSON.stringify({
11712
11724
  kind: "standards-review",
11713
11725
  policy: {
11714
11726
  version: policy.version
11715
11727
  },
11716
11728
  candidateItemsPerStandard: normalized.candidateItemsPerStandard,
11717
- ...normalized.requireBothQuestions ? { requireBothQuestions: true } : {},
11718
- standardKeys: normalized.standards.map(assessmentStandardRefKey)
11729
+ standardKeys: normalized.standards.map(assessmentStandardRefKey),
11730
+ ...requiredStandardKeys.length > 0 ? { requiredStandardKeys } : {}
11719
11731
  });
11720
11732
  }
11721
11733
  function exposureTimestamp(value) {
@@ -11765,9 +11777,10 @@ function rankedCandidatesByStandard(bank, exposures) {
11765
11777
  return byStandard;
11766
11778
  }
11767
11779
  function reviewSlots(request2) {
11768
- return request2.standards.flatMap((standard) => Array.from({ length: request2.candidateItemsPerStandard }, () => ({
11769
- standard,
11770
- standardKey: assessmentStandardRefKey(standard)
11780
+ return request2.standards.flatMap((standard, servingIndex) => Array.from({ length: request2.candidateItemsPerStandard }, () => ({
11781
+ standard: reviewStandardRef(standard),
11782
+ standardKey: assessmentStandardRefKey(standard),
11783
+ servingIndex
11771
11784
  })));
11772
11785
  }
11773
11786
  function matchingCandidates(candidatesByStandard, slotCount) {
@@ -11880,7 +11893,7 @@ function fulfillment(request2, candidatesByStandard, selections) {
11880
11893
  const selected = selectedByStandard.get(key) ?? 0;
11881
11894
  return selected < request2.candidateItemsPerStandard ? [
11882
11895
  {
11883
- standard,
11896
+ standard: reviewStandardRef(standard),
11884
11897
  requested: request2.candidateItemsPerStandard,
11885
11898
  selected,
11886
11899
  eligible: candidatesByStandard.get(key)?.length ?? 0
@@ -11905,10 +11918,10 @@ function fulfillment(request2, candidatesByStandard, selections) {
11905
11918
  function selectReviewItems(input) {
11906
11919
  const request2 = normalizeReviewRequest(input.request);
11907
11920
  const candidatesByStandard = rankedCandidatesByStandard(input.bank, input.exposures);
11908
- const slots = reviewSlots(request2);
11921
+ const slots = reviewSlots(request2).toSorted((left, right) => compareCodeUnits(left.standardKey, right.standardKey));
11909
11922
  const boundedCandidates = matchingCandidates(candidatesByStandard, slots.length);
11910
11923
  const selected = preferredDistinctMatching(slots, boundedCandidates);
11911
- const selections = [...selected.entries()].toSorted(([left], [right]) => left - right).map(([index, itemIdentifier]) => ({
11924
+ const selections = [...selected.entries()].toSorted(([left], [right]) => slots[left].servingIndex - slots[right].servingIndex || left - right).map(([index, itemIdentifier]) => ({
11912
11925
  standard: slots[index].standard,
11913
11926
  itemIdentifier
11914
11927
  }));
@@ -12703,8 +12716,8 @@ var init_assessment_runtime2 = __esm({
12703
12716
  }),
12704
12717
  StartAssessmentBaseSchema.extend({
12705
12718
  purpose: external_exports.literal("review"),
12706
- requireBothQuestions: external_exports.boolean().optional(),
12707
- standards: external_exports.array(AssessmentStandardRefSchema2).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
12719
+ requireBothQuestions: external_exports.never().optional(),
12720
+ standards: external_exports.array(AssessmentStandardRefSchema2.and(external_exports.object({ requireBothQuestions: external_exports.boolean().optional() }))).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
12708
12721
  candidateItemsPerStandard: external_exports.number().int().positive().max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard).optional()
12709
12722
  }),
12710
12723
  StartAssessmentBaseSchema.extend({
@@ -13005,7 +13018,6 @@ var init_local_assessment_runtime = __esm({
13005
13018
  purpose: "review",
13006
13019
  standards: [...request2.standards],
13007
13020
  candidateItemsPerStandard: request2.candidateItemsPerStandard,
13008
- ...request2.requireBothQuestions ? { requireBothQuestions: true } : {},
13009
13021
  selections: [...selected.selections],
13010
13022
  fulfillment: selected.fulfillment
13011
13023
  },
@@ -14253,9 +14265,9 @@ var init_list = __esm({
14253
14265
  // ../edge-play/src/game/lib/metadata.ts
14254
14266
  function getRuntimeMetadata() {
14255
14267
  return {
14256
- cliVersion: true ? "0.31.1-beta.2" : "0.0.0-dev",
14257
- sdkVersion: true ? "0.19.1-beta.3" : "0.0.0-dev",
14258
- buildId: true ? "4673549da4d8" : "dev-source"
14268
+ cliVersion: true ? "0.31.1-beta.3" : "0.0.0-dev",
14269
+ sdkVersion: true ? "0.19.1-beta.4" : "0.0.0-dev",
14270
+ buildId: true ? "691d5310a7ed" : "dev-source"
14259
14271
  };
14260
14272
  }
14261
14273
  var init_metadata = __esm({
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.31.1-beta.2",
3
- "sdkVersion": "0.19.1-beta.3",
4
- "runtimeBuildId": "4673549da4d8",
5
- "inputFingerprint": "4673549da4d81b760c8c8270835a45d570cb44eef97ca9052ba75da4876260e5",
2
+ "cliVersion": "0.31.1-beta.3",
3
+ "sdkVersion": "0.19.1-beta.4",
4
+ "runtimeBuildId": "691d5310a7ed",
5
+ "inputFingerprint": "691d5310a7ed13e93287da0159f9e9d932ae881add0e32c66efea273866b92a1",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -396,7 +396,7 @@ var DASHBOARD_API_ROUTES_DIRECTORY = "api";
396
396
  // ../better-auth/package.json
397
397
  var package_default = {
398
398
  name: "@playcademy/better-auth",
399
- version: "0.0.24-beta.2",
399
+ version: "0.0.24-beta.3",
400
400
  type: "module",
401
401
  exports: {
402
402
  "./server": {
@@ -2849,7 +2849,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, writeFileSync as wr
2849
2849
  import { dirname as dirname4, join as join13 } from "node:path";
2850
2850
 
2851
2851
  // src/version.ts
2852
- var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.2";
2852
+ var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.3";
2853
2853
 
2854
2854
  // src/lib/build/binary-resource.ts
2855
2855
  function writeFileTree(baseDir, files) {
@@ -15761,8 +15761,8 @@ var StartAssessmentBodySchema = external_exports.discriminatedUnion("purpose", [
15761
15761
  }),
15762
15762
  StartAssessmentBaseSchema.extend({
15763
15763
  purpose: external_exports.literal("review"),
15764
- requireBothQuestions: external_exports.boolean().optional(),
15765
- standards: external_exports.array(AssessmentStandardRefSchema2).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
15764
+ requireBothQuestions: external_exports.never().optional(),
15765
+ standards: external_exports.array(AssessmentStandardRefSchema2.and(external_exports.object({ requireBothQuestions: external_exports.boolean().optional() }))).min(1).max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.standards),
15766
15766
  candidateItemsPerStandard: external_exports.number().int().positive().max(TIMEBACK_ASSESSMENT_REVIEW_REQUEST_LIMITS.candidateItemsPerStandard).optional()
15767
15767
  }),
15768
15768
  StartAssessmentBaseSchema.extend({
package/dist/version.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { createRequire as __pcCreateRequire } from 'node:module'; const require = __pcCreateRequire(import.meta.url);
2
2
 
3
3
  // src/version.ts
4
- var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.2";
4
+ var cliVersion = false ? "0.0.0-dev" : "0.31.1-beta.3";
5
5
  export {
6
6
  cliVersion
7
7
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playcademy",
3
- "version": "0.31.1-beta.2",
3
+ "version": "0.31.1-beta.3",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
@@ -55,7 +55,7 @@
55
55
  },
56
56
  "dependencies": {
57
57
  "@inquirer/prompts": "^7.8.6",
58
- "@playcademy/sdk": "0.19.1-beta.3",
58
+ "@playcademy/sdk": "0.19.1-beta.4",
59
59
  "chokidar": "^4.0.3",
60
60
  "colorette": "^2.0.20",
61
61
  "commander": "^14.0.1",