playcademy 0.19.3-beta.2 → 0.19.3-beta.4

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.8-beta.2",
1068
+ version: "0.0.8-beta.4",
1069
1069
  type: "module",
1070
1070
  exports: {
1071
1071
  "./server": {
@@ -3016,7 +3016,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
3016
3016
  import { join as join13 } from "node:path";
3017
3017
 
3018
3018
  // src/version.ts
3019
- var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.2";
3019
+ var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.4";
3020
3020
 
3021
3021
  // src/lib/init/database.ts
3022
3022
  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.8-beta.2",
23
+ version: "0.0.8-beta.4",
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.8-beta.2",
39
+ version: "0.0.8-beta.4",
40
40
  type: "module",
41
41
  exports: {
42
42
  "./server": {
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.8-beta.2",
329
+ version: "0.0.8-beta.4",
330
330
  type: "module",
331
331
  exports: {
332
332
  "./server": {
@@ -673,7 +673,8 @@ var BADGES = {
673
673
  var TIMEBACK_ROUTES = {
674
674
  END_ACTIVITY: "/integrations/timeback/end-activity",
675
675
  GET_XP: "/integrations/timeback/xp",
676
- HEARTBEAT: "/integrations/timeback/heartbeat"
676
+ HEARTBEAT: "/integrations/timeback/heartbeat",
677
+ ADVANCE_COURSE: "/integrations/timeback/advance-course"
677
678
  };
678
679
  var TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
679
680
  var TIMEBACK_ORG_NAME = "Playcademy Studios";
@@ -4018,7 +4019,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, readFileSync as rea
4018
4019
  import { join as join13 } from "node:path";
4019
4020
 
4020
4021
  // src/version.ts
4021
- var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.2";
4022
+ var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.4";
4022
4023
 
4023
4024
  // src/lib/init/database.ts
4024
4025
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -6403,7 +6404,8 @@ var ROUTES = {
6403
6404
  TIMEBACK: {
6404
6405
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
6405
6406
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
6406
- HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`
6407
+ HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
6408
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
6407
6409
  }
6408
6410
  };
6409
6411
 
@@ -214,7 +214,8 @@ var init_timeback = __esm({
214
214
  TIMEBACK_ROUTES = {
215
215
  END_ACTIVITY: "/integrations/timeback/end-activity",
216
216
  GET_XP: "/integrations/timeback/xp",
217
- HEARTBEAT: "/integrations/timeback/heartbeat"
217
+ HEARTBEAT: "/integrations/timeback/heartbeat",
218
+ ADVANCE_COURSE: "/integrations/timeback/advance-course"
218
219
  };
219
220
  }
220
221
  });
@@ -259,7 +260,8 @@ var init_constants = __esm({
259
260
  TIMEBACK: {
260
261
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
261
262
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
262
- HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`
263
+ HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
264
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
263
265
  }
264
266
  };
265
267
  }
@@ -350,9 +352,9 @@ var init_routes = __esm({
350
352
  // ../edge-play/src/entry/metadata.ts
351
353
  function getRuntimeMetadata() {
352
354
  return {
353
- cliVersion: true ? "0.19.3-beta.2" : "0.0.0-dev",
354
- sdkVersion: true ? "0.6.1-beta.2" : "0.0.0-dev",
355
- buildId: true ? "53dfeb55fa70" : "dev-source"
355
+ cliVersion: true ? "0.19.3-beta.4" : "0.0.0-dev",
356
+ sdkVersion: true ? "0.6.1-beta.4" : "0.0.0-dev",
357
+ buildId: true ? "90bd871d0c0c" : "dev-source"
356
358
  };
357
359
  }
358
360
  var init_metadata = __esm({
@@ -554,12 +556,15 @@ var init_lib = __esm({
554
556
 
555
557
  // ../edge-play/src/routes/integrations/timeback/shared.ts
556
558
  function getConfig(c) {
557
- const config = c.get("config");
558
- const timebackConfig = config?.integrations?.timeback;
559
- if (!timebackConfig) {
559
+ return c.get("config");
560
+ }
561
+ function isTimebackIntegrated(c) {
562
+ return Boolean(getConfig(c)?.integrations?.timeback);
563
+ }
564
+ function assertTimebackIntegrated(c) {
565
+ if (!isTimebackIntegrated(c)) {
560
566
  throw new Error("TimeBack integration not found");
561
567
  }
562
- return config;
563
568
  }
564
569
  function enrichActivityData(params) {
565
570
  const { activityData, config, c } = params;
@@ -609,6 +614,7 @@ async function POST(c) {
609
614
  masteredUnits,
610
615
  extensions
611
616
  } = await c.req.json();
617
+ assertTimebackIntegrated(c);
612
618
  const config = getConfig(c);
613
619
  const structuredActivityData = isActivityDataInput(activityData) ? activityData : void 0;
614
620
  if (structuredActivityData && isValidGrade2(structuredActivityData.grade) && isValidSubject2(structuredActivityData.subject)) {
@@ -665,14 +671,6 @@ var get_xp_exports = {};
665
671
  __export(get_xp_exports, {
666
672
  GET: () => GET3
667
673
  });
668
- function getConfig2(c) {
669
- const config = c.get("config");
670
- const timebackConfig = config?.integrations?.timeback;
671
- if (!timebackConfig) {
672
- throw new Error("TimeBack integration not found");
673
- }
674
- return config;
675
- }
676
674
  async function GET3(c) {
677
675
  try {
678
676
  const user = c.get("playcademyUser");
@@ -684,7 +682,8 @@ async function GET3(c) {
684
682
  console.error("[TimeBack Get XP] Error:", message);
685
683
  return c.json(buildErrorResponse(c, message, message), 400);
686
684
  }
687
- const config = getConfig2(c);
685
+ assertTimebackIntegrated(c);
686
+ const config = getConfig(c);
688
687
  const url = new URL(c.req.url);
689
688
  const gradeParam = url.searchParams.get("grade");
690
689
  const subjectParam = url.searchParams.get("subject");
@@ -731,6 +730,7 @@ var init_get_xp = __esm({
731
730
  "../edge-play/src/routes/integrations/timeback/get-xp.ts"() {
732
731
  "use strict";
733
732
  init_lib();
733
+ init_shared();
734
734
  }
735
735
  });
736
736
 
@@ -766,6 +766,7 @@ async function POST2(c) {
766
766
  console.error("[TimeBack Heartbeat] Error:", message);
767
767
  return c.json(buildErrorResponse(c, message, message), 400);
768
768
  }
769
+ assertTimebackIntegrated(c);
769
770
  const config = getConfig(c);
770
771
  const structuredActivityData = isActivityDataInput(activityData) ? activityData : void 0;
771
772
  if (structuredActivityData && isValidGrade2(structuredActivityData.grade) && isValidSubject2(structuredActivityData.subject)) {
@@ -814,6 +815,57 @@ var init_heartbeat = __esm({
814
815
  }
815
816
  });
816
817
 
818
+ // ../edge-play/src/routes/integrations/timeback/advance-course.ts
819
+ var advance_course_exports = {};
820
+ __export(advance_course_exports, {
821
+ POST: () => POST3
822
+ });
823
+ async function POST3(c) {
824
+ try {
825
+ const user = c.get("playcademyUser");
826
+ if (!user) {
827
+ return c.json(buildErrorResponse(c, "Unauthorized", "Unauthorized"), 401);
828
+ }
829
+ if (!user.timeback_id) {
830
+ const message = "User does not have TimeBack integration";
831
+ console.error("[TimeBack Advance] Error:", message);
832
+ return c.json(buildErrorResponse(c, message, message), 400);
833
+ }
834
+ const body = await c.req.json().catch(() => ({}));
835
+ const subject = body.subject;
836
+ if (subject !== void 0 && !isValidSubject2(subject)) {
837
+ const message = "Invalid subject: must be one of the supported TimeBack subjects";
838
+ console.error("[TimeBack Advance] Error:", message);
839
+ return c.json(buildErrorResponse(c, message, message), 400);
840
+ }
841
+ assertTimebackIntegrated(c);
842
+ const sdk = c.get("sdk");
843
+ const result = await sdk.request(
844
+ "/api/timeback/advance-course",
845
+ "POST",
846
+ {
847
+ gameId: sdk.gameId,
848
+ studentId: user.timeback_id,
849
+ ...subject !== void 0 ? { subject } : {}
850
+ }
851
+ );
852
+ return c.json(result);
853
+ } catch (error) {
854
+ logError("TimeBack Advance", error);
855
+ return c.json(
856
+ buildErrorResponse(c, error, "Failed to advance student"),
857
+ getErrorStatus(error)
858
+ );
859
+ }
860
+ }
861
+ var init_advance_course = __esm({
862
+ "../edge-play/src/routes/integrations/timeback/advance-course.ts"() {
863
+ "use strict";
864
+ init_lib();
865
+ init_shared();
866
+ }
867
+ });
868
+
817
869
  // ../../node_modules/.bun/hono@4.10.7/node_modules/hono/dist/compose.js
818
870
  var compose = (middleware, onError, onNotFound) => {
819
871
  return (context, next) => {
@@ -3143,14 +3195,16 @@ async function registerBuiltinRoutes(app, integrations) {
3143
3195
  const health = await Promise.resolve().then(() => (init_health(), health_exports));
3144
3196
  app.get(ROUTES.HEALTH, health.GET);
3145
3197
  if (integrations?.timeback) {
3146
- const [endActivity, getXp, heartbeat] = await Promise.all([
3198
+ const [endActivity, getXp, heartbeat, advanceCourse] = await Promise.all([
3147
3199
  Promise.resolve().then(() => (init_end_activity(), end_activity_exports)),
3148
3200
  Promise.resolve().then(() => (init_get_xp(), get_xp_exports)),
3149
- Promise.resolve().then(() => (init_heartbeat(), heartbeat_exports))
3201
+ Promise.resolve().then(() => (init_heartbeat(), heartbeat_exports)),
3202
+ Promise.resolve().then(() => (init_advance_course(), advance_course_exports))
3150
3203
  ]);
3151
3204
  app.post(ROUTES.TIMEBACK.END_ACTIVITY, endActivity.POST);
3152
3205
  app.get(ROUTES.TIMEBACK.GET_XP, getXp.GET);
3153
3206
  app.post(ROUTES.TIMEBACK.HEARTBEAT, heartbeat.POST);
3207
+ app.post(ROUTES.TIMEBACK.ADVANCE_COURSE, advanceCourse.POST);
3154
3208
  } else if (integrations?.timeback === null) {
3155
3209
  app.post(
3156
3210
  "/api/integrations/timeback/end-activity",
@@ -3174,6 +3228,17 @@ async function registerBuiltinRoutes(app, integrations) {
3174
3228
  __playcademyDevWarning: "timeback-not-configured"
3175
3229
  })
3176
3230
  );
3231
+ app.post(
3232
+ "/api/integrations/timeback/advance-course",
3233
+ async (c) => c.json({
3234
+ status: "ok",
3235
+ promotion: {
3236
+ status: "no-next-course",
3237
+ currentCourseId: "dev-stub"
3238
+ },
3239
+ __playcademyDevWarning: "timeback-not-configured"
3240
+ })
3241
+ );
3177
3242
  }
3178
3243
  }
3179
3244
 
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.19.3-beta.2",
3
- "sdkVersion": "0.6.1-beta.2",
4
- "runtimeBuildId": "53dfeb55fa70",
5
- "inputFingerprint": "53dfeb55fa70e0208c85090203a053769118327872aa72b373ea10a30a93d0f8",
2
+ "cliVersion": "0.19.3-beta.4",
3
+ "sdkVersion": "0.6.1-beta.4",
4
+ "runtimeBuildId": "90bd871d0c0c",
5
+ "inputFingerprint": "90bd871d0c0cdddfc0f96c9b845f26ffa2000f54db3556473b6cdb4a52218818",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -441,7 +441,8 @@ var BADGES = {
441
441
  var TIMEBACK_ROUTES = {
442
442
  END_ACTIVITY: "/integrations/timeback/end-activity",
443
443
  GET_XP: "/integrations/timeback/xp",
444
- HEARTBEAT: "/integrations/timeback/heartbeat"
444
+ HEARTBEAT: "/integrations/timeback/heartbeat",
445
+ ADVANCE_COURSE: "/integrations/timeback/advance-course"
445
446
  };
446
447
 
447
448
  // ../constants/src/workers.ts
@@ -478,7 +479,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
478
479
  // ../better-auth/package.json
479
480
  var package_default = {
480
481
  name: "@playcademy/better-auth",
481
- version: "0.0.8-beta.2",
482
+ version: "0.0.8-beta.4",
482
483
  type: "module",
483
484
  exports: {
484
485
  "./server": {
@@ -1963,7 +1964,8 @@ var ROUTES = {
1963
1964
  TIMEBACK: {
1964
1965
  END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`,
1965
1966
  GET_XP: `/api${TIMEBACK_ROUTES.GET_XP}`,
1966
- HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`
1967
+ HEARTBEAT: `/api${TIMEBACK_ROUTES.HEARTBEAT}`,
1968
+ ADVANCE_COURSE: `/api${TIMEBACK_ROUTES.ADVANCE_COURSE}`
1967
1969
  }
1968
1970
  };
1969
1971
 
@@ -2531,7 +2533,7 @@ import { existsSync as existsSync8, mkdirSync as mkdirSync2, writeFileSync as wr
2531
2533
  import { dirname as dirname4, join as join13 } from "node:path";
2532
2534
 
2533
2535
  // src/version.ts
2534
- var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.2";
2536
+ var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.4";
2535
2537
 
2536
2538
  // src/lib/build/binary-resource.ts
2537
2539
  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.19.3-beta.2";
2
+ var cliVersion = false ? "0.0.0-dev" : "0.19.3-beta.4";
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.19.3-beta.2",
3
+ "version": "0.19.3-beta.4",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {