playcademy 0.27.1-beta.1 → 0.27.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/bucket.js CHANGED
@@ -94,7 +94,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
94
94
  // ../better-auth/package.json
95
95
  var package_default = {
96
96
  name: "@playcademy/better-auth",
97
- version: "0.0.19",
97
+ version: "0.0.20-beta.1",
98
98
  type: "module",
99
99
  exports: {
100
100
  "./server": {
package/dist/cli.js CHANGED
@@ -1196,7 +1196,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1196
1196
  // ../better-auth/package.json
1197
1197
  var package_default = {
1198
1198
  name: "@playcademy/better-auth",
1199
- version: "0.0.19",
1199
+ version: "0.0.20-beta.1",
1200
1200
  type: "module",
1201
1201
  exports: {
1202
1202
  "./server": {
@@ -2951,7 +2951,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
2951
2951
  import { join as join13 } from "node:path";
2952
2952
 
2953
2953
  // src/version.ts
2954
- var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.1";
2954
+ var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.2";
2955
2955
 
2956
2956
  // src/lib/init/database.ts
2957
2957
  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.19",
23
+ version: "0.0.20-beta.1",
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.19",
39
+ version: "0.0.20-beta.1",
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.19",
329
+ version: "0.0.20-beta.1",
330
330
  type: "module",
331
331
  exports: {
332
332
  "./server": {
@@ -4140,7 +4140,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, readFileSync as rea
4140
4140
  import { join as join13 } from "node:path";
4141
4141
 
4142
4142
  // src/version.ts
4143
- var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.1";
4143
+ var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.2";
4144
4144
 
4145
4145
  // src/lib/init/database.ts
4146
4146
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -13074,6 +13074,7 @@ import { sql as sql2 } from "drizzle-orm";
13074
13074
  import { sql } from "drizzle-orm";
13075
13075
  import {
13076
13076
  boolean as boolean3,
13077
+ doublePrecision,
13077
13078
  index,
13078
13079
  integer as integer2,
13079
13080
  pgEnum as pgEnum3,
@@ -13397,6 +13398,32 @@ var gameTimebackMetricDiscrepancyVerifications = pgTable3(
13397
13398
  )
13398
13399
  ]
13399
13400
  );
13401
+ var gameTimebackActivityCompletions = pgTable3(
13402
+ "game_timeback_activity_completions",
13403
+ {
13404
+ id: uuid2("id").primaryKey().defaultRandom(),
13405
+ gameId: uuid2("game_id").notNull().references(() => games.id, { onDelete: "cascade" }),
13406
+ courseId: text3("course_id").notNull(),
13407
+ studentId: text3("student_id").notNull(),
13408
+ runId: uuid2("run_id").notNull(),
13409
+ activityId: text3("activity_id").notNull(),
13410
+ completedAt: timestamp3("completed_at", { withTimezone: true }),
13411
+ reservedAt: timestamp3("reserved_at", { withTimezone: true, mode: "string" }).notNull().defaultNow(),
13412
+ xpAwarded: doublePrecision("xp_awarded"),
13413
+ masteredUnitsApplied: integer2("mastered_units_applied"),
13414
+ pctCompleteApp: doublePrecision("pct_complete_app"),
13415
+ createdAt: timestamp3("created_at", { withTimezone: true }).notNull().defaultNow()
13416
+ },
13417
+ (table) => [
13418
+ uniqueIndex3("game_timeback_activity_completions_run_idx").on(
13419
+ table.gameId,
13420
+ table.courseId,
13421
+ table.studentId,
13422
+ table.runId,
13423
+ table.activityId
13424
+ )
13425
+ ]
13426
+ );
13400
13427
 
13401
13428
  // src/lib/deploy/preparation.ts
13402
13429
  async function updateBuildMetadata(context2) {
@@ -414,9 +414,9 @@ var init_routes = __esm({
414
414
  // ../edge-play/src/entry/metadata.ts
415
415
  function getRuntimeMetadata() {
416
416
  return {
417
- cliVersion: true ? "0.27.1-beta.1" : "0.0.0-dev",
418
- sdkVersion: true ? "0.15.0" : "0.0.0-dev",
419
- buildId: true ? "c3d4ce6ef48d" : "dev-source"
417
+ cliVersion: true ? "0.27.1-beta.2" : "0.0.0-dev",
418
+ sdkVersion: true ? "0.15.1-beta.1" : "0.0.0-dev",
419
+ buildId: true ? "d545e8dcb239" : "dev-source"
420
420
  };
421
421
  }
422
422
  var init_metadata = __esm({
@@ -4118,6 +4118,12 @@ function createTimebackNamespace(client) {
4118
4118
  * @param payload.xpEarned - XP earned for this activity (required)
4119
4119
  * @param payload.masteredUnits - Optional mastery units completed this session
4120
4120
  * @param payload.extensions - Optional arbitrary extensions for the Caliper event
4121
+ * @param payload.runId - Optional stable run identifier (UUID) enabling the
4122
+ * platform's duplicate-completion guard: at most one completion is recorded
4123
+ * per activity per run. A resubmission (e.g. a retry after a timeout) returns
4124
+ * `blockedByDedupeGuard: true` echoing the originally recorded award instead
4125
+ * of double-counting XP. Strongly recommended for any caller with retry
4126
+ * logic; use a fresh UUID per logical run.
4121
4127
  * @returns Promise resolving to the API response with status, courseId, and xpAwarded
4122
4128
  * @throws {Error} If grade or subject are missing
4123
4129
  * @throws {Error} If the API request fails
@@ -4125,6 +4131,7 @@ function createTimebackNamespace(client) {
4125
4131
  * @example
4126
4132
  * ```typescript
4127
4133
  * await client.timeback.endActivity('student-tb-id-123', {
4134
+ * runId: crypto.randomUUID(), // mint once per run; reuse on retries
4128
4135
  * activityData: {
4129
4136
  * activityId: 'math-quiz-1',
4130
4137
  * activityName: 'Basic Arithmetic Quiz',
@@ -4153,6 +4160,7 @@ function createTimebackNamespace(client) {
4153
4160
  return client["request"]("/api/timeback/end-activity", "POST", {
4154
4161
  gameId: client.gameId,
4155
4162
  studentId,
4163
+ ...payload.runId ? { runId: payload.runId } : {},
4156
4164
  activityData: enrichedActivityData,
4157
4165
  scoreData: payload.scoreData,
4158
4166
  timingData: payload.timingData,
@@ -1,7 +1,7 @@
1
1
  {
2
- "cliVersion": "0.27.1-beta.1",
3
- "sdkVersion": "0.15.0",
4
- "runtimeBuildId": "c3d4ce6ef48d",
5
- "inputFingerprint": "c3d4ce6ef48d4f0ebc1a21e153861593787bb0b1e99d8f3e7c3484f6ea9d1fd8",
2
+ "cliVersion": "0.27.1-beta.2",
3
+ "sdkVersion": "0.15.1-beta.1",
4
+ "runtimeBuildId": "d545e8dcb239",
5
+ "inputFingerprint": "d545e8dcb2397340ecb4aeaf21a6cfa083edd51f1fba4ad42b3b2fb6ef89ed97",
6
6
  "entry": "index.js"
7
7
  }
package/dist/utils.js CHANGED
@@ -359,7 +359,7 @@ var DEFAULT_API_ROUTES_DIRECTORY = join2(SERVER_ROOT_DIRECTORY, "api");
359
359
  // ../better-auth/package.json
360
360
  var package_default = {
361
361
  name: "@playcademy/better-auth",
362
- version: "0.0.19",
362
+ version: "0.0.20-beta.1",
363
363
  type: "module",
364
364
  exports: {
365
365
  "./server": {
@@ -2603,7 +2603,7 @@ import { existsSync as existsSync9, mkdirSync as mkdirSync2, writeFileSync as wr
2603
2603
  import { dirname as dirname4, join as join14 } from "node:path";
2604
2604
 
2605
2605
  // src/version.ts
2606
- var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.1";
2606
+ var cliVersion = false ? "0.0.0-dev" : "0.27.1-beta.2";
2607
2607
 
2608
2608
  // src/lib/build/binary-resource.ts
2609
2609
  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.27.1-beta.1";
2
+ var cliVersion = false ? "0.0.0-dev" : "0.27.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.27.1-beta.1",
3
+ "version": "0.27.1-beta.2",
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.15.0",
58
+ "@playcademy/sdk": "0.15.1-beta.1",
59
59
  "chokidar": "^4.0.3",
60
60
  "colorette": "^2.0.20",
61
61
  "commander": "^14.0.1",