playcademy 0.23.0 → 0.23.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/cli.js CHANGED
@@ -1065,7 +1065,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1065
1065
  // ../better-auth/package.json
1066
1066
  var package_default = {
1067
1067
  name: "@playcademy/better-auth",
1068
- version: "0.0.15",
1068
+ version: "0.0.16-beta.3",
1069
1069
  type: "module",
1070
1070
  exports: {
1071
1071
  "./server": {
@@ -2038,6 +2038,19 @@ var init_constants = __esm2(() => {
2038
2038
  });
2039
2039
  init_constants();
2040
2040
 
2041
+ // ../utils/src/timeback.ts
2042
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOWS = [
2043
+ "today",
2044
+ "yesterday",
2045
+ "this-week",
2046
+ "last-week",
2047
+ "all",
2048
+ "custom"
2049
+ ];
2050
+ var TIMEBACK_DISCREPANCY_QUEUE_METRICS = ["xp", "mastery", "time", "score"];
2051
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
2052
+ var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
2053
+
2041
2054
  // src/lib/templates/loader.ts
2042
2055
  import { existsSync as existsSync5, readFileSync } from "node:fs";
2043
2056
  import { dirname as dirname3, resolve as resolve4 } from "node:path";
@@ -2920,7 +2933,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
2920
2933
  import { join as join13 } from "node:path";
2921
2934
 
2922
2935
  // src/version.ts
2923
- var cliVersion = false ? "0.0.0-dev" : "0.23.0";
2936
+ var cliVersion = false ? "0.0.0-dev" : "0.23.1-beta.2";
2924
2937
 
2925
2938
  // src/lib/init/database.ts
2926
2939
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
package/dist/constants.js CHANGED
@@ -20,7 +20,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
20
20
  // ../better-auth/package.json
21
21
  var package_default = {
22
22
  name: "@playcademy/better-auth",
23
- version: "0.0.15",
23
+ version: "0.0.16-beta.3",
24
24
  type: "module",
25
25
  exports: {
26
26
  "./server": {
package/dist/db.js CHANGED
@@ -36,7 +36,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
36
36
  // ../better-auth/package.json
37
37
  var package_default = {
38
38
  name: "@playcademy/better-auth",
39
- version: "0.0.15",
39
+ version: "0.0.16-beta.3",
40
40
  type: "module",
41
41
  exports: {
42
42
  "./server": {
@@ -1039,6 +1039,19 @@ init_file_loader();
1039
1039
  // src/lib/config/loader.ts
1040
1040
  init_file_loader();
1041
1041
 
1042
+ // ../utils/src/timeback.ts
1043
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOWS = [
1044
+ "today",
1045
+ "yesterday",
1046
+ "this-week",
1047
+ "last-week",
1048
+ "all",
1049
+ "custom"
1050
+ ];
1051
+ var TIMEBACK_DISCREPANCY_QUEUE_METRICS = ["xp", "mastery", "time", "score"];
1052
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
1053
+ var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
1054
+
1042
1055
  // src/lib/core/import.ts
1043
1056
  import { mkdtempSync, rmSync } from "fs";
1044
1057
  import { tmpdir } from "os";
package/dist/index.js CHANGED
@@ -326,7 +326,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
326
326
  // ../better-auth/package.json
327
327
  var package_default = {
328
328
  name: "@playcademy/better-auth",
329
- version: "0.0.15",
329
+ version: "0.0.16-beta.3",
330
330
  type: "module",
331
331
  exports: {
332
332
  "./server": {
@@ -535,8 +535,10 @@ var TIMEBACK_ROUTES = {
535
535
  END_ACTIVITY: "/integrations/timeback/end-activity",
536
536
  GET_XP: "/integrations/timeback/xp",
537
537
  GET_MASTERY: "/integrations/timeback/mastery",
538
+ GET_HIGHEST_GRADE_MASTERED: "/integrations/timeback/highest-grade-mastered",
538
539
  HEARTBEAT: "/integrations/timeback/heartbeat",
539
- ADVANCE_COURSE: "/integrations/timeback/advance-course"
540
+ ADVANCE_COURSE: "/integrations/timeback/advance-course",
541
+ UNENROLL_COURSE: "/integrations/timeback/unenroll-course"
540
542
  };
541
543
  var TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
542
544
  var TIMEBACK_ORG_NAME = "Playcademy Studios";
@@ -2930,6 +2932,17 @@ function isPlaycademyResourceMetadata(value) {
2930
2932
  }
2931
2933
 
2932
2934
  // ../utils/src/timeback.ts
2935
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOWS = [
2936
+ "today",
2937
+ "yesterday",
2938
+ "this-week",
2939
+ "last-week",
2940
+ "all",
2941
+ "custom"
2942
+ ];
2943
+ var TIMEBACK_DISCREPANCY_QUEUE_METRICS = ["xp", "mastery", "time", "score"];
2944
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
2945
+ var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
2933
2946
  function formatGradeLabel(grade) {
2934
2947
  switch (grade) {
2935
2948
  case -1: {
@@ -4183,7 +4196,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, readFileSync as rea
4183
4196
  import { join as join13 } from "node:path";
4184
4197
 
4185
4198
  // src/version.ts
4186
- var cliVersion = false ? "0.0.0-dev" : "0.23.0";
4199
+ var cliVersion = false ? "0.0.0-dev" : "0.23.1-beta.2";
4187
4200
 
4188
4201
  // src/lib/init/database.ts
4189
4202
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -6625,8 +6638,10 @@ var ROUTES = {
6625
6638
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
6626
6639
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
6627
6640
  GET_MASTERY: `/api${TIMEBACK_ROUTES.GET_MASTERY}`,
6641
+ GET_HIGHEST_GRADE_MASTERED: `/api${TIMEBACK_ROUTES.GET_HIGHEST_GRADE_MASTERED}`,
6628
6642
  HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
6629
- ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
6643
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`,
6644
+ UNENROLL_COURSE: `/api${TIMEBACK_ROUTES.UNENROLL_COURSE}`
6630
6645
  }
6631
6646
  };
6632
6647
 
@@ -25,8 +25,20 @@ function formatGradeLabel(grade) {
25
25
  }
26
26
  }
27
27
  }
28
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOWS, TIMEBACK_DISCREPANCY_QUEUE_METRICS, TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES, TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES;
28
29
  var init_timeback = __esm({
29
30
  "../utils/src/timeback.ts"() {
31
+ TIMEBACK_DISCREPANCY_QUEUE_WINDOWS = [
32
+ "today",
33
+ "yesterday",
34
+ "this-week",
35
+ "last-week",
36
+ "all",
37
+ "custom"
38
+ ];
39
+ TIMEBACK_DISCREPANCY_QUEUE_METRICS = ["xp", "mastery", "time", "score"];
40
+ TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
41
+ TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
30
42
  }
31
43
  });
32
44
 
@@ -57,6 +69,19 @@ function validateCourseConfig(params) {
57
69
  }
58
70
  return null;
59
71
  }
72
+ function validateSubjectConfig(params) {
73
+ const { subject, config } = params;
74
+ const timebackConfig = config.integrations?.timeback;
75
+ const configuredSubject = timebackConfig?.courses?.some((course) => course.subject === subject);
76
+ if (!configuredSubject) {
77
+ const subjects = timebackConfig?.courses?.map((course) => course.subject);
78
+ const configured = subjects ? [...new Set(subjects)].join(", ") || "none" : "none";
79
+ return {
80
+ error: `Invalid subject: ${subject}. Configured subjects: ${configured}`
81
+ };
82
+ }
83
+ return null;
84
+ }
60
85
  var VALID_GRADES, VALID_SUBJECTS;
61
86
  var init_validation = __esm({
62
87
  "../edge-play/src/lib/validation.ts"() {
@@ -144,8 +169,10 @@ var init_timeback2 = __esm({
144
169
  END_ACTIVITY: "/integrations/timeback/end-activity",
145
170
  GET_XP: "/integrations/timeback/xp",
146
171
  GET_MASTERY: "/integrations/timeback/mastery",
172
+ GET_HIGHEST_GRADE_MASTERED: "/integrations/timeback/highest-grade-mastered",
147
173
  HEARTBEAT: "/integrations/timeback/heartbeat",
148
- ADVANCE_COURSE: "/integrations/timeback/advance-course"
174
+ ADVANCE_COURSE: "/integrations/timeback/advance-course",
175
+ UNENROLL_COURSE: "/integrations/timeback/unenroll-course"
149
176
  };
150
177
  TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
151
178
  xp: 1,
@@ -202,8 +229,10 @@ var init_constants = __esm({
202
229
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
203
230
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
204
231
  GET_MASTERY: `/api${TIMEBACK_ROUTES.GET_MASTERY}`,
232
+ GET_HIGHEST_GRADE_MASTERED: `/api${TIMEBACK_ROUTES.GET_HIGHEST_GRADE_MASTERED}`,
205
233
  HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
206
- ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
234
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`,
235
+ UNENROLL_COURSE: `/api${TIMEBACK_ROUTES.UNENROLL_COURSE}`
207
236
  }
208
237
  };
209
238
  }
@@ -260,7 +289,11 @@ function getTimebackRoutes(config) {
260
289
  return [
261
290
  { path: ROUTES.TIMEBACK.END_ACTIVITY, methods: ["POST"] },
262
291
  { path: ROUTES.TIMEBACK.GET_XP, methods: ["GET"] },
263
- { path: ROUTES.TIMEBACK.HEARTBEAT, methods: ["POST"] }
292
+ { path: ROUTES.TIMEBACK.GET_MASTERY, methods: ["GET"] },
293
+ { path: ROUTES.TIMEBACK.GET_HIGHEST_GRADE_MASTERED, methods: ["GET"] },
294
+ { path: ROUTES.TIMEBACK.HEARTBEAT, methods: ["POST"] },
295
+ { path: ROUTES.TIMEBACK.ADVANCE_COURSE, methods: ["POST"] },
296
+ { path: ROUTES.TIMEBACK.UNENROLL_COURSE, methods: ["POST"] }
264
297
  ];
265
298
  }
266
299
  return [];
@@ -294,9 +327,9 @@ var init_routes = __esm({
294
327
  // ../edge-play/src/entry/metadata.ts
295
328
  function getRuntimeMetadata() {
296
329
  return {
297
- cliVersion: true ? "0.23.0" : "0.0.0-dev",
298
- sdkVersion: true ? "0.11.0" : "0.0.0-dev",
299
- buildId: true ? "4e6199553f2f" : "dev-source"
330
+ cliVersion: true ? "0.23.1-beta.2" : "0.0.0-dev",
331
+ sdkVersion: true ? "0.11.1-beta.3" : "0.0.0-dev",
332
+ buildId: true ? "ad39a961b54a" : "dev-source"
300
333
  };
301
334
  }
302
335
  var init_metadata = __esm({
@@ -706,6 +739,62 @@ var init_get_mastery = __esm({
706
739
  }
707
740
  });
708
741
 
742
+ // ../edge-play/src/routes/integrations/timeback/get-highest-grade-mastered.ts
743
+ var get_highest_grade_mastered_exports = {};
744
+ __export(get_highest_grade_mastered_exports, {
745
+ GET: () => GET5
746
+ });
747
+ async function GET5(c) {
748
+ try {
749
+ const user = c.get("playcademyUser");
750
+ if (!user) {
751
+ return c.json(buildErrorResponse(c, "Unauthorized", "Unauthorized"), 401);
752
+ }
753
+ if (!user.timeback_id) {
754
+ const message2 = "User does not have TimeBack integration";
755
+ console.error("[TimeBack Highest Grade Mastered] Error:", message2);
756
+ return c.json(buildErrorResponse(c, message2, message2), 400);
757
+ }
758
+ assertTimebackIntegrated(c);
759
+ const config = getConfig(c);
760
+ const url = new URL(c.req.url);
761
+ const subject = url.searchParams.get("subject");
762
+ if (!subject) {
763
+ const message2 = "subject is required";
764
+ return c.json(buildErrorResponse(c, message2, message2), 400);
765
+ }
766
+ if (!isValidSubject(subject)) {
767
+ const message2 = `subject must be a valid subject (${VALID_SUBJECTS.join(", ")})`;
768
+ return c.json(buildErrorResponse(c, message2, message2), 400);
769
+ }
770
+ const subjectValidationError = validateSubjectConfig({ subject, config });
771
+ if (subjectValidationError) {
772
+ return c.json(
773
+ buildErrorResponse(c, subjectValidationError.error, subjectValidationError.error),
774
+ 400
775
+ );
776
+ }
777
+ const sdk = c.get("sdk");
778
+ const result = await sdk.timeback.getStudentHighestGradeMastered(user.timeback_id, {
779
+ subject
780
+ });
781
+ return c.json(result);
782
+ } catch (error) {
783
+ logError("TimeBack Highest Grade Mastered", error);
784
+ return c.json(
785
+ buildErrorResponse(c, error, "Failed to get highest grade mastered"),
786
+ getErrorStatus(error)
787
+ );
788
+ }
789
+ }
790
+ var init_get_highest_grade_mastered = __esm({
791
+ "../edge-play/src/routes/integrations/timeback/get-highest-grade-mastered.ts"() {
792
+ "use strict";
793
+ init_lib();
794
+ init_shared();
795
+ }
796
+ });
797
+
709
798
  // ../edge-play/src/routes/integrations/timeback/heartbeat.ts
710
799
  var heartbeat_exports = {};
711
800
  __export(heartbeat_exports, {
@@ -838,6 +927,64 @@ var init_advance_course = __esm({
838
927
  }
839
928
  });
840
929
 
930
+ // ../edge-play/src/routes/integrations/timeback/unenroll-course.ts
931
+ var unenroll_course_exports = {};
932
+ __export(unenroll_course_exports, {
933
+ POST: () => POST4
934
+ });
935
+ async function POST4(c) {
936
+ try {
937
+ const user = c.get("playcademyUser");
938
+ if (!user) {
939
+ return c.json(buildErrorResponse(c, "Unauthorized", "Unauthorized"), 401);
940
+ }
941
+ if (!user.timeback_id) {
942
+ const message2 = "User does not have TimeBack integration";
943
+ console.error("[TimeBack Unenroll Course] Error:", message2);
944
+ return c.json(buildErrorResponse(c, message2, message2), 400);
945
+ }
946
+ const body = await c.req.json().catch(() => ({}));
947
+ const subject = body.subject;
948
+ const force = body.force;
949
+ if (subject !== void 0 && !isValidSubject(subject)) {
950
+ const message2 = "Invalid subject: must be one of the supported TimeBack subjects";
951
+ console.error("[TimeBack Unenroll Course] Error:", message2);
952
+ return c.json(buildErrorResponse(c, message2, message2), 400);
953
+ }
954
+ if (force !== void 0 && typeof force !== "boolean") {
955
+ const message2 = "Invalid force: must be a boolean";
956
+ console.error("[TimeBack Unenroll Course] Error:", message2);
957
+ return c.json(buildErrorResponse(c, message2, message2), 400);
958
+ }
959
+ assertTimebackIntegrated(c);
960
+ const sdk = c.get("sdk");
961
+ const result = await sdk.request(
962
+ "/api/timeback/unenroll-course",
963
+ "POST",
964
+ {
965
+ gameId: sdk.gameId,
966
+ studentId: user.timeback_id,
967
+ ...subject !== void 0 ? { subject } : {},
968
+ ...force !== void 0 ? { force } : {}
969
+ }
970
+ );
971
+ return c.json(result);
972
+ } catch (error) {
973
+ logError("TimeBack Unenroll Course", error);
974
+ return c.json(
975
+ buildErrorResponse(c, error, "Failed to unenroll student"),
976
+ getErrorStatus(error)
977
+ );
978
+ }
979
+ }
980
+ var init_unenroll_course = __esm({
981
+ "../edge-play/src/routes/integrations/timeback/unenroll-course.ts"() {
982
+ "use strict";
983
+ init_lib();
984
+ init_shared();
985
+ }
986
+ });
987
+
841
988
  // ../../node_modules/.bun/hono@4.10.7/node_modules/hono/dist/compose.js
842
989
  var compose = (middleware, onError, onNotFound) => {
843
990
  return (context, next) => {
@@ -4020,6 +4167,18 @@ function createTimebackNamespace(client) {
4020
4167
  const queryString = params.toString();
4021
4168
  const endpoint = `/api/timeback/student-mastery/${studentId}?${queryString}`;
4022
4169
  return client["request"](endpoint, "GET");
4170
+ },
4171
+ getStudentHighestGradeMastered: async (studentId, options) => {
4172
+ if (!isValidSubject2(options.subject)) {
4173
+ throw new Error(
4174
+ `Invalid subject: ${options.subject}. Valid subjects: ${VALID_SUBJECTS2.join(", ")}`
4175
+ );
4176
+ }
4177
+ const params = new URLSearchParams();
4178
+ params.set("gameId", client.gameId);
4179
+ params.set("subject", options.subject);
4180
+ const endpoint = `/api/timeback/student-highest-grade-mastered/${encodeURIComponent(studentId)}?${params.toString()}`;
4181
+ return client["request"](endpoint, "GET");
4023
4182
  }
4024
4183
  };
4025
4184
  }
@@ -4616,18 +4775,30 @@ async function registerBuiltinRoutes(app, integrations) {
4616
4775
  const health = await Promise.resolve().then(() => (init_health(), health_exports));
4617
4776
  app.get(ROUTES.HEALTH, health.GET);
4618
4777
  if (integrations?.timeback) {
4619
- const [endActivity, getXp, getMastery, heartbeat, advanceCourse] = await Promise.all([
4778
+ const [
4779
+ endActivity,
4780
+ getXp,
4781
+ getMastery,
4782
+ getHighestGradeMastered,
4783
+ heartbeat,
4784
+ advanceCourse,
4785
+ unenrollCourse
4786
+ ] = await Promise.all([
4620
4787
  Promise.resolve().then(() => (init_end_activity(), end_activity_exports)),
4621
4788
  Promise.resolve().then(() => (init_get_xp(), get_xp_exports)),
4622
4789
  Promise.resolve().then(() => (init_get_mastery(), get_mastery_exports)),
4790
+ Promise.resolve().then(() => (init_get_highest_grade_mastered(), get_highest_grade_mastered_exports)),
4623
4791
  Promise.resolve().then(() => (init_heartbeat(), heartbeat_exports)),
4624
- Promise.resolve().then(() => (init_advance_course(), advance_course_exports))
4792
+ Promise.resolve().then(() => (init_advance_course(), advance_course_exports)),
4793
+ Promise.resolve().then(() => (init_unenroll_course(), unenroll_course_exports))
4625
4794
  ]);
4626
4795
  app.post(ROUTES.TIMEBACK.END_ACTIVITY, endActivity.POST);
4627
4796
  app.get(ROUTES.TIMEBACK.GET_XP, getXp.GET);
4628
4797
  app.get(ROUTES.TIMEBACK.GET_MASTERY, getMastery.GET);
4798
+ app.get(ROUTES.TIMEBACK.GET_HIGHEST_GRADE_MASTERED, getHighestGradeMastered.GET);
4629
4799
  app.post(ROUTES.TIMEBACK.HEARTBEAT, heartbeat.POST);
4630
4800
  app.post(ROUTES.TIMEBACK.ADVANCE_COURSE, advanceCourse.POST);
4801
+ app.post(ROUTES.TIMEBACK.UNENROLL_COURSE, unenrollCourse.POST);
4631
4802
  } else if (integrations?.timeback === null) {
4632
4803
  app.post(
4633
4804
  "/api/integrations/timeback/end-activity",
@@ -4652,6 +4823,14 @@ async function registerBuiltinRoutes(app, integrations) {
4652
4823
  __playcademyDevWarning: "timeback-not-configured"
4653
4824
  })
4654
4825
  );
4826
+ app.get(
4827
+ "/api/integrations/timeback/highest-grade-mastered",
4828
+ async (c) => c.json({
4829
+ subject: new URL(c.req.url).searchParams.get("subject") ?? "None",
4830
+ highestGradeMastered: null,
4831
+ __playcademyDevWarning: "timeback-not-configured"
4832
+ })
4833
+ );
4655
4834
  app.post(
4656
4835
  "/api/integrations/timeback/heartbeat",
4657
4836
  async (c) => c.json({
@@ -4670,6 +4849,17 @@ async function registerBuiltinRoutes(app, integrations) {
4670
4849
  __playcademyDevWarning: "timeback-not-configured"
4671
4850
  })
4672
4851
  );
4852
+ app.post(
4853
+ "/api/integrations/timeback/unenroll-course",
4854
+ async (c) => c.json({
4855
+ status: "ok",
4856
+ unenrollment: {
4857
+ status: "not-mastered",
4858
+ currentCourseId: "dev-stub"
4859
+ },
4860
+ __playcademyDevWarning: "timeback-not-configured"
4861
+ })
4862
+ );
4673
4863
  }
4674
4864
  }
4675
4865
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.23.0",
3
- "sdkVersion": "0.11.0",
4
- "runtimeBuildId": "4e6199553f2f",
5
- "inputFingerprint": "4e6199553f2f033f3642c605e19fd300516bfdce6b9217ddd97aedfde1ca0151",
2
+ "cliVersion": "0.23.1-beta.2",
3
+ "sdkVersion": "0.11.1-beta.3",
4
+ "runtimeBuildId": "ad39a961b54a",
5
+ "inputFingerprint": "ad39a961b54af09a7c01b917e105d2e0957f1491f282d39be4153f7ebf0ee9da",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -306,8 +306,10 @@ var TIMEBACK_ROUTES = {
306
306
  END_ACTIVITY: "/integrations/timeback/end-activity",
307
307
  GET_XP: "/integrations/timeback/xp",
308
308
  GET_MASTERY: "/integrations/timeback/mastery",
309
+ GET_HIGHEST_GRADE_MASTERED: "/integrations/timeback/highest-grade-mastered",
309
310
  HEARTBEAT: "/integrations/timeback/heartbeat",
310
- ADVANCE_COURSE: "/integrations/timeback/advance-course"
311
+ ADVANCE_COURSE: "/integrations/timeback/advance-course",
312
+ UNENROLL_COURSE: "/integrations/timeback/unenroll-course"
311
313
  };
312
314
  var TIMEBACK_GAME_METRIC_DECIMAL_PLACES = {
313
315
  xp: 1,
@@ -357,7 +359,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
357
359
  // ../better-auth/package.json
358
360
  var package_default = {
359
361
  name: "@playcademy/better-auth",
360
- version: "0.0.15",
362
+ version: "0.0.16-beta.3",
361
363
  type: "module",
362
364
  exports: {
363
365
  "./server": {
@@ -1277,6 +1279,19 @@ function hasEnvFile(workspace) {
1277
1279
  return ENV_FILES.some((filename) => existsSync3(join7(workspace, filename)));
1278
1280
  }
1279
1281
 
1282
+ // ../utils/src/timeback.ts
1283
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOWS = [
1284
+ "today",
1285
+ "yesterday",
1286
+ "this-week",
1287
+ "last-week",
1288
+ "all",
1289
+ "custom"
1290
+ ];
1291
+ var TIMEBACK_DISCREPANCY_QUEUE_METRICS = ["xp", "mastery", "time", "score"];
1292
+ var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
1293
+ var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
1294
+
1280
1295
  // src/lib/templates/loader.ts
1281
1296
  import { existsSync as existsSync4, readFileSync } from "node:fs";
1282
1297
  import { dirname as dirname2, resolve as resolve2 } from "node:path";
@@ -1843,8 +1858,10 @@ var ROUTES = {
1843
1858
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
1844
1859
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
1845
1860
  GET_MASTERY: `/api${TIMEBACK_ROUTES.GET_MASTERY}`,
1861
+ GET_HIGHEST_GRADE_MASTERED: `/api${TIMEBACK_ROUTES.GET_HIGHEST_GRADE_MASTERED}`,
1846
1862
  HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
1847
- ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
1863
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`,
1864
+ UNENROLL_COURSE: `/api${TIMEBACK_ROUTES.UNENROLL_COURSE}`
1848
1865
  }
1849
1866
  };
1850
1867
 
@@ -2468,7 +2485,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, writeFileSync as wr
2468
2485
  import { dirname as dirname4, join as join14 } from "node:path";
2469
2486
 
2470
2487
  // src/version.ts
2471
- var cliVersion = false ? "0.0.0-dev" : "0.23.0";
2488
+ var cliVersion = false ? "0.0.0-dev" : "0.23.1-beta.2";
2472
2489
 
2473
2490
  // src/lib/build/binary-resource.ts
2474
2491
  function writeFileTree(baseDir, files) {
package/dist/version.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var cliVersion = false ? "0.0.0-dev" : "0.23.0";
2
+ var cliVersion = false ? "0.0.0-dev" : "0.23.1-beta.2";
3
3
  export {
4
4
  cliVersion
5
5
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playcademy",
3
- "version": "0.23.0",
3
+ "version": "0.23.1-beta.2",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {