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 +15 -2
- package/dist/constants.js +1 -1
- package/dist/db.js +14 -1
- package/dist/index.js +19 -4
- package/dist/runtime/backend-runtime/index.js +198 -8
- package/dist/runtime/backend-runtime/manifest.json +4 -4
- package/dist/utils.js +21 -4
- package/dist/version.js +1 -1
- package/package.json +1 -1
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.
|
|
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.
|
|
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
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
298
|
-
sdkVersion: true ? "0.11.
|
|
299
|
-
buildId: true ? "
|
|
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 [
|
|
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.
|
|
3
|
-
"sdkVersion": "0.11.
|
|
4
|
-
"runtimeBuildId": "
|
|
5
|
-
"inputFingerprint": "
|
|
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.
|
|
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.
|
|
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