playcademy 0.28.0 → 0.28.1-beta.10

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/README.md CHANGED
@@ -264,6 +264,19 @@ Remove TimeBack integration (keeps game metadata).
264
264
  playcademy timeback cleanup
265
265
  ```
266
266
 
267
+ #### `timeback assessments import`
268
+
269
+ Import the ordered live assessment catalog and host-only QTI fixture data from the platform for
270
+ local game testing.
271
+
272
+ ```bash
273
+ playcademy timeback assessments import
274
+ playcademy timeback assessments import --env production
275
+ ```
276
+
277
+ Fixtures are written to `.playcademy/timeback/assessment-fixtures.json`. The local dev host serves
278
+ them through the normal game SDK assessment methods and resets local attempts when it restarts.
279
+
267
280
  ## Environment Variables
268
281
 
269
282
  - `CI` - Set to `1` or `true` to disable interactive prompts
package/dist/bin.js CHANGED
@@ -15,7 +15,8 @@ var CLI_DIRECTORIES = {
15
15
  WORKSPACE: WORKSPACE_NAME,
16
16
  DATABASE: join(WORKSPACE_NAME, "db"),
17
17
  KV: join(WORKSPACE_NAME, "kv"),
18
- BUCKET: join(WORKSPACE_NAME, "bucket")
18
+ BUCKET: join(WORKSPACE_NAME, "bucket"),
19
+ TIMEBACK: join(WORKSPACE_NAME, "timeback")
19
20
  };
20
21
  var PLAYCADEMY_HOME = join(homedir(), ".playcademy");
21
22
  var CLI_USER_DIRECTORIES = {
package/dist/bucket.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { GamePermission } from '@playcademy/constants';
1
2
  import { TimebackCourseConfig, CourseConfig, OrganizationConfig, ComponentConfig, ResourceConfig, ComponentResourceConfig } from '@playcademy/types/timeback';
2
3
  import { Miniflare } from 'miniflare';
3
4
 
@@ -148,6 +149,13 @@ interface PlaycademyConfig {
148
149
  description?: string;
149
150
  /** Game emoji icon */
150
151
  emoji?: string;
152
+ /**
153
+ * Browser permissions to request for the game's iframe (e.g.
154
+ * `['microphone']`). Opt-in per game; only `microphone` and `camera` are
155
+ * delegated this way. Fullscreen, autoplay, and gamepad are granted to
156
+ * every game automatically.
157
+ */
158
+ permissions?: GamePermission[];
151
159
  /** Build command to run before deployment */
152
160
  buildCommand?: string[];
153
161
  /** Path to build output */
package/dist/bucket.js CHANGED
@@ -44,7 +44,7 @@ var GAME_API_ROUTES_DIRECTORY = join2(GAME_SERVER_ROOT_DIRECTORY, "api");
44
44
  // ../better-auth/package.json
45
45
  var package_default = {
46
46
  name: "@playcademy/better-auth",
47
- version: "0.0.20",
47
+ version: "0.0.21-beta.10",
48
48
  type: "module",
49
49
  exports: {
50
50
  "./server": {
@@ -87,18 +87,7 @@ var package_default = {
87
87
  // src/constants/auth.ts
88
88
  var BETTER_AUTH_VERSION = package_default.dependencies["better-auth"];
89
89
 
90
- // src/constants/config.ts
91
- var ENV_FILES = [
92
- ".env",
93
- // Loaded first
94
- ".env.development",
95
- // Overrides .env
96
- ".env.local"
97
- // Overrides all (highest priority)
98
- ];
99
-
100
90
  // src/constants/bucket.ts
101
- var BUCKET_ALWAYS_SKIP = [".git", ".DS_Store", ".gitignore", ...ENV_FILES];
102
91
  var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
103
92
 
104
93
  // src/constants/cloudflare.ts
@@ -138,7 +127,8 @@ var CLI_DIRECTORIES = {
138
127
  WORKSPACE: WORKSPACE_NAME,
139
128
  DATABASE: join5(WORKSPACE_NAME, "db"),
140
129
  KV: join5(WORKSPACE_NAME, "kv"),
141
- BUCKET: join5(WORKSPACE_NAME, "bucket")
130
+ BUCKET: join5(WORKSPACE_NAME, "bucket"),
131
+ TIMEBACK: join5(WORKSPACE_NAME, "timeback")
142
132
  };
143
133
  var PLAYCADEMY_HOME = join5(homedir(), ".playcademy");
144
134
  var CLI_USER_DIRECTORIES = {
@@ -281,11 +271,44 @@ var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES = [
281
271
  "text-entry",
282
272
  "order",
283
273
  "match",
284
- "hottext"
274
+ "hottext",
275
+ "hotspot",
276
+ "gap-match",
277
+ "graphic-gap-match",
278
+ "select-point",
279
+ "graphic-associate",
280
+ "position-object"
285
281
  ];
286
282
  var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPE_SET = new Set(
287
283
  PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES
288
284
  );
285
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES = [
286
+ "choice",
287
+ "inline-choice",
288
+ "text-entry",
289
+ "order",
290
+ "match",
291
+ "hottext",
292
+ "gap-match",
293
+ "hotspot",
294
+ "graphic-associate",
295
+ "graphic-gap-match"
296
+ ];
297
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPE_SET = new Set(
298
+ PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES
299
+ );
300
+ var QTI_RASTER_IMAGE_MIME_TYPES = [
301
+ "image/png",
302
+ "image/jpeg",
303
+ // Some browsers and operating systems still report the legacy jpg spelling.
304
+ "image/jpg",
305
+ "image/gif",
306
+ "image/webp",
307
+ "image/bmp"
308
+ ];
309
+ var QTI_RASTER_IMAGE_SUBTYPE_PATTERN = QTI_RASTER_IMAGE_MIME_TYPES.map(
310
+ (type) => type.slice("image/".length)
311
+ ).join("|");
289
312
  var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
290
313
  var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
291
314
 
package/dist/cli.js CHANGED
@@ -1207,7 +1207,7 @@ var SAMPLE_BUCKET_FILENAME = "bucket.ts";
1207
1207
  // ../better-auth/package.json
1208
1208
  var package_default = {
1209
1209
  name: "@playcademy/better-auth",
1210
- version: "0.0.20",
1210
+ version: "0.0.21-beta.10",
1211
1211
  type: "module",
1212
1212
  exports: {
1213
1213
  "./server": {
@@ -1252,6 +1252,12 @@ var BETTER_AUTH_VERSION = package_default.dependencies["better-auth"];
1252
1252
  var PLAYCADEMY_AUTH_VERSION = "latest";
1253
1253
  var AUTH_CONFIG_FILE = "auth.ts";
1254
1254
 
1255
+ // src/constants/bucket.ts
1256
+ var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
1257
+
1258
+ // src/constants/cloudflare.ts
1259
+ var QUEUE_NAME_PREFIX = "playcademy";
1260
+
1255
1261
  // src/constants/config.ts
1256
1262
  var ENV_FILES = [
1257
1263
  ".env",
@@ -1277,13 +1283,6 @@ var TSCONFIG_REQUIRED_INCLUDES = [
1277
1283
  // Server-side code
1278
1284
  ];
1279
1285
 
1280
- // src/constants/bucket.ts
1281
- var BUCKET_ALWAYS_SKIP = [".git", ".DS_Store", ".gitignore", ...ENV_FILES];
1282
- var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
1283
-
1284
- // src/constants/cloudflare.ts
1285
- var QUEUE_NAME_PREFIX = "playcademy";
1286
-
1287
1286
  // src/constants/database.ts
1288
1287
  import { join as join4 } from "path";
1289
1288
  var DEFAULT_DATABASE_DIRECTORY = join4("server", "db");
@@ -1339,7 +1338,8 @@ var CLI_DIRECTORIES = {
1339
1338
  WORKSPACE: WORKSPACE_NAME,
1340
1339
  DATABASE: join6(WORKSPACE_NAME, "db"),
1341
1340
  KV: join6(WORKSPACE_NAME, "kv"),
1342
- BUCKET: join6(WORKSPACE_NAME, "bucket")
1341
+ BUCKET: join6(WORKSPACE_NAME, "bucket"),
1342
+ TIMEBACK: join6(WORKSPACE_NAME, "timeback")
1343
1343
  };
1344
1344
  var PLAYCADEMY_HOME = join6(homedir(), ".playcademy");
1345
1345
  var CLI_USER_DIRECTORIES = {
@@ -1372,6 +1372,18 @@ var CONFIG_FILE_NAMES = [
1372
1372
  ];
1373
1373
 
1374
1374
  // ../constants/src/timeback.ts
1375
+ var TIMEBACK_GRADES = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
1376
+ var TIMEBACK_SUBJECTS = [
1377
+ "Reading",
1378
+ "Language",
1379
+ "Vocabulary",
1380
+ "Social Studies",
1381
+ "Writing",
1382
+ "Science",
1383
+ "FastMath",
1384
+ "Math",
1385
+ "None"
1386
+ ];
1375
1387
  var TIMEBACK_ORG_NAME = "Playcademy Studios";
1376
1388
  var TIMEBACK_ORG_TYPE = "department";
1377
1389
  var TIMEBACK_COURSE_DEFAULTS = {
@@ -2048,17 +2060,6 @@ function processConfigVariables(config) {
2048
2060
  }
2049
2061
 
2050
2062
  // ../timeback/dist/constants.js
2051
- var TIMEBACK_SUBJECTS = [
2052
- "Math",
2053
- "FastMath",
2054
- "Science",
2055
- "Social Studies",
2056
- "Language",
2057
- "Reading",
2058
- "Vocabulary",
2059
- "Writing"
2060
- ];
2061
- var TIMEBACK_GRADE_LEVELS = [-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13];
2062
2063
  var TIMEBACK_GRADE_LEVEL_LABELS = {
2063
2064
  "-1": "pre-k",
2064
2065
  "0": "kindergarten",
@@ -2121,11 +2122,44 @@ var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES = [
2121
2122
  "text-entry",
2122
2123
  "order",
2123
2124
  "match",
2124
- "hottext"
2125
+ "hottext",
2126
+ "hotspot",
2127
+ "gap-match",
2128
+ "graphic-gap-match",
2129
+ "select-point",
2130
+ "graphic-associate",
2131
+ "position-object"
2125
2132
  ];
2126
2133
  var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPE_SET = new Set(
2127
2134
  PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES
2128
2135
  );
2136
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES = [
2137
+ "choice",
2138
+ "inline-choice",
2139
+ "text-entry",
2140
+ "order",
2141
+ "match",
2142
+ "hottext",
2143
+ "gap-match",
2144
+ "hotspot",
2145
+ "graphic-associate",
2146
+ "graphic-gap-match"
2147
+ ];
2148
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPE_SET = new Set(
2149
+ PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES
2150
+ );
2151
+ var QTI_RASTER_IMAGE_MIME_TYPES = [
2152
+ "image/png",
2153
+ "image/jpeg",
2154
+ // Some browsers and operating systems still report the legacy jpg spelling.
2155
+ "image/jpg",
2156
+ "image/gif",
2157
+ "image/webp",
2158
+ "image/bmp"
2159
+ ];
2160
+ var QTI_RASTER_IMAGE_SUBTYPE_PATTERN = QTI_RASTER_IMAGE_MIME_TYPES.map(
2161
+ (type) => type.slice("image/".length)
2162
+ ).join("|");
2129
2163
  var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
2130
2164
  var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
2131
2165
 
@@ -3007,7 +3041,7 @@ import { existsSync as existsSync11, mkdirSync as mkdirSync5, readFileSync as re
3007
3041
  import { join as join13 } from "node:path";
3008
3042
 
3009
3043
  // src/version.ts
3010
- var cliVersion = false ? "0.0.0-dev" : "0.28.0";
3044
+ var cliVersion = false ? "0.0.0-dev" : "0.28.1-beta.10";
3011
3045
 
3012
3046
  // src/lib/init/database.ts
3013
3047
  var drizzleConfigTemplate = loadTemplateString("database/drizzle-config.ts");
@@ -3252,7 +3286,7 @@ async function promptForTimeBackIntegration(options) {
3252
3286
  }
3253
3287
  const grades = await checkbox({
3254
3288
  message: "Select grade levels:",
3255
- choices: TIMEBACK_GRADE_LEVELS.map((grade) => ({
3289
+ choices: TIMEBACK_GRADES.map((grade) => ({
3256
3290
  value: grade,
3257
3291
  name: TIMEBACK_GRADE_LEVEL_LABELS[grade.toString()]
3258
3292
  })),
@@ -59,15 +59,18 @@ declare const AUTH_CONFIG_FILE = "auth.ts";
59
59
  * Bucket-related constants
60
60
  */
61
61
  /**
62
- * Files and directories that are always excluded from bucket sync uploads
62
+ * Files and directories that are always excluded from bucket uploads
63
63
  *
64
- * These are automatically skipped regardless of .gitignore patterns:
64
+ * These exact names are skipped regardless of .gitignore patterns:
65
65
  * - .git - Git repository data
66
66
  * - .DS_Store - macOS filesystem metadata
67
67
  * - .gitignore - Git ignore configuration (shouldn't be uploaded to storage)
68
- * - .env* - Environment files (should never be uploaded to storage)
68
+ *
69
+ * Environment files are excluded separately by the `.env*` name pattern in
70
+ * the collector, so every variant (`.env.production`, `.envrc`, ...) is
71
+ * covered, not just the ones the CLI loads.
69
72
  */
70
- declare const BUCKET_ALWAYS_SKIP: readonly [".git", ".DS_Store", ".gitignore", ".env", ".env.development", ".env.local"];
73
+ declare const BUCKET_ALWAYS_SKIP: readonly ['.git', '.DS_Store', '.gitignore'];
71
74
  declare const PRESIGNED_UPLOAD_THRESHOLD: number;
72
75
  /**
73
76
  * Default directory synced to the bucket by `playcademy bucket sync`.
@@ -277,8 +280,8 @@ declare const GODOT_EXECUTABLE_PATTERNS: {
277
280
  declare const CALLBACK_PORT = 6175;
278
281
  /** Path for the OAuth callback endpoint */
279
282
  declare const CALLBACK_PATH = "/callback";
280
- /** Timeout for SSO authentication in milliseconds (30 seconds) */
281
- declare const SSO_AUTH_TIMEOUT_MS = 30000;
283
+ /** Timeout for the whole browser SSO flow (login page + provider auth + MFA) */
284
+ declare const SSO_AUTH_TIMEOUT_MS = 90000;
282
285
 
283
286
  /**
284
287
  * Path constants for CLI directories and files
@@ -289,6 +292,7 @@ declare const CLI_DIRECTORIES: {
289
292
  readonly DATABASE: string;
290
293
  readonly KV: string;
291
294
  readonly BUCKET: string;
295
+ readonly TIMEBACK: string;
292
296
  };
293
297
  declare const CLI_USER_DIRECTORIES: {
294
298
  readonly CONFIG: string;
@@ -310,6 +314,7 @@ declare const CLI_FILES: {
310
314
  readonly AUTH_STORE: 'auth.json';
311
315
  readonly GAMES_STORE: 'games.json';
312
316
  readonly INITIAL_DATABASE: 'initial.sqlite';
317
+ readonly ASSESSMENT_FIXTURES: 'assessment-fixtures.json';
313
318
  };
314
319
 
315
320
  /**
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.20",
24
+ version: "0.0.21-beta.10",
25
25
  type: "module",
26
26
  exports: {
27
27
  "./server": {
@@ -73,6 +73,24 @@ var OAUTH_CALLBACK_URL_PATTERN = "{appUrl}/api/auth/callback/{provider}";
73
73
  var PLACEHOLDER_APP_URL = "https://your-app.playcademy.gg";
74
74
  var AUTH_CONFIG_FILE = "auth.ts";
75
75
 
76
+ // src/constants/bucket.ts
77
+ var BUCKET_ALWAYS_SKIP = [".git", ".DS_Store", ".gitignore"];
78
+ var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
79
+ var DEFAULT_BUCKET_DIRECTORY = "bucket";
80
+
81
+ // src/constants/cloudflare.ts
82
+ var CLOUDFLARE_BINDINGS = {
83
+ /** R2 bucket binding name */
84
+ BUCKET: "BUCKET",
85
+ /** KV namespace binding name */
86
+ KV: "KV",
87
+ /** D1 database binding name */
88
+ DB: "DB"
89
+ };
90
+ var MINIFLARE_D1_DIRECTORY = "miniflare-D1DatabaseObject";
91
+ var QUEUE_NAME_PREFIX = "playcademy";
92
+ var SELF_WORKER_NAME_BINDING = "__PLAYCADEMY_WORKER_NAME";
93
+
76
94
  // src/constants/config.ts
77
95
  var ENV_FILES = [
78
96
  ".env",
@@ -98,24 +116,6 @@ var TSCONFIG_REQUIRED_INCLUDES = [
98
116
  // Server-side code
99
117
  ];
100
118
 
101
- // src/constants/bucket.ts
102
- var BUCKET_ALWAYS_SKIP = [".git", ".DS_Store", ".gitignore", ...ENV_FILES];
103
- var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
104
- var DEFAULT_BUCKET_DIRECTORY = "bucket";
105
-
106
- // src/constants/cloudflare.ts
107
- var CLOUDFLARE_BINDINGS = {
108
- /** R2 bucket binding name */
109
- BUCKET: "BUCKET",
110
- /** KV namespace binding name */
111
- KV: "KV",
112
- /** D1 database binding name */
113
- DB: "DB"
114
- };
115
- var MINIFLARE_D1_DIRECTORY = "miniflare-D1DatabaseObject";
116
- var QUEUE_NAME_PREFIX = "playcademy";
117
- var SELF_WORKER_NAME_BINDING = "__PLAYCADEMY_WORKER_NAME";
118
-
119
119
  // src/constants/database.ts
120
120
  import { join as join3 } from "path";
121
121
  var DEFAULT_DATABASE_DIRECTORY = join3("server", "db");
@@ -182,7 +182,7 @@ var GODOT_EXECUTABLE_PATTERNS = {
182
182
  // src/constants/http-server.ts
183
183
  var CALLBACK_PORT = 6175;
184
184
  var CALLBACK_PATH = "/callback";
185
- var SSO_AUTH_TIMEOUT_MS = 3e4;
185
+ var SSO_AUTH_TIMEOUT_MS = 9e4;
186
186
 
187
187
  // src/constants/paths.ts
188
188
  import { homedir } from "node:os";
@@ -192,7 +192,8 @@ var CLI_DIRECTORIES = {
192
192
  WORKSPACE: WORKSPACE_NAME,
193
193
  DATABASE: join5(WORKSPACE_NAME, "db"),
194
194
  KV: join5(WORKSPACE_NAME, "kv"),
195
- BUCKET: join5(WORKSPACE_NAME, "bucket")
195
+ BUCKET: join5(WORKSPACE_NAME, "bucket"),
196
+ TIMEBACK: join5(WORKSPACE_NAME, "timeback")
196
197
  };
197
198
  var PLAYCADEMY_HOME = join5(homedir(), ".playcademy");
198
199
  var CLI_USER_DIRECTORIES = {
@@ -216,7 +217,8 @@ var CLI_DEFAULT_OUTPUTS = {
216
217
  var CLI_FILES = {
217
218
  AUTH_STORE: "auth.json",
218
219
  GAMES_STORE: "games.json",
219
- INITIAL_DATABASE: "initial.sqlite"
220
+ INITIAL_DATABASE: "initial.sqlite",
221
+ ASSESSMENT_FIXTURES: "assessment-fixtures.json"
220
222
  };
221
223
 
222
224
  // src/constants/ports.ts
package/dist/db.js CHANGED
@@ -2335,7 +2335,7 @@ var GAME_API_ROUTES_DIRECTORY = join2(GAME_SERVER_ROOT_DIRECTORY, "api");
2335
2335
  // ../better-auth/package.json
2336
2336
  var package_default = {
2337
2337
  name: "@playcademy/better-auth",
2338
- version: "0.0.20",
2338
+ version: "0.0.21-beta.10",
2339
2339
  type: "module",
2340
2340
  exports: {
2341
2341
  "./server": {
@@ -2378,18 +2378,7 @@ var package_default = {
2378
2378
  // src/constants/auth.ts
2379
2379
  var BETTER_AUTH_VERSION = package_default.dependencies["better-auth"];
2380
2380
 
2381
- // src/constants/config.ts
2382
- var ENV_FILES = [
2383
- ".env",
2384
- // Loaded first
2385
- ".env.development",
2386
- // Overrides .env
2387
- ".env.local"
2388
- // Overrides all (highest priority)
2389
- ];
2390
-
2391
2381
  // src/constants/bucket.ts
2392
- var BUCKET_ALWAYS_SKIP = [".git", ".DS_Store", ".gitignore", ...ENV_FILES];
2393
2382
  var PRESIGNED_UPLOAD_THRESHOLD = 4 * 1024 * 1024;
2394
2383
 
2395
2384
  // src/constants/cloudflare.ts
@@ -2451,7 +2440,8 @@ var CLI_DIRECTORIES = {
2451
2440
  WORKSPACE: WORKSPACE_NAME,
2452
2441
  DATABASE: join5(WORKSPACE_NAME, "db"),
2453
2442
  KV: join5(WORKSPACE_NAME, "kv"),
2454
- BUCKET: join5(WORKSPACE_NAME, "bucket")
2443
+ BUCKET: join5(WORKSPACE_NAME, "bucket"),
2444
+ TIMEBACK: join5(WORKSPACE_NAME, "timeback")
2455
2445
  };
2456
2446
  var PLAYCADEMY_HOME = join5(homedir(), ".playcademy");
2457
2447
  var CLI_USER_DIRECTORIES = {
@@ -2468,7 +2458,8 @@ var CLI_DEFAULT_OUTPUTS = {
2468
2458
  var CLI_FILES = {
2469
2459
  AUTH_STORE: "auth.json",
2470
2460
  GAMES_STORE: "games.json",
2471
- INITIAL_DATABASE: "initial.sqlite"
2461
+ INITIAL_DATABASE: "initial.sqlite",
2462
+ ASSESSMENT_FIXTURES: "assessment-fixtures.json"
2472
2463
  };
2473
2464
 
2474
2465
  // src/constants/timeback.ts
@@ -3394,6 +3385,17 @@ async function requireAuthenticatedClient() {
3394
3385
 
3395
3386
  // src/lib/core/errors.ts
3396
3387
  import { ApiError as ApiError2 } from "@playcademy/sdk/internal";
3388
+
3389
+ // src/lib/core/exit.ts
3390
+ function exitAfterStdoutDrain(code) {
3391
+ return new Promise(() => {
3392
+ process.stdout.write("", () => {
3393
+ process.exit(code);
3394
+ });
3395
+ });
3396
+ }
3397
+
3398
+ // src/lib/core/errors.ts
3397
3399
  function getErrorMessage(error) {
3398
3400
  if (error instanceof ApiError2) {
3399
3401
  if (error.message) {
@@ -3418,15 +3420,6 @@ function getErrorMessage(error) {
3418
3420
  return "Unknown error";
3419
3421
  }
3420
3422
 
3421
- // src/lib/core/exit.ts
3422
- function exitAfterStdoutDrain(code) {
3423
- return new Promise(() => {
3424
- process.stdout.write("", () => {
3425
- process.exit(code);
3426
- });
3427
- });
3428
- }
3429
-
3430
3423
  // ../utils/src/uuid.ts
3431
3424
  var UUID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
3432
3425
  function isValidUUID(value) {
@@ -4207,11 +4200,44 @@ var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES = [
4207
4200
  "text-entry",
4208
4201
  "order",
4209
4202
  "match",
4210
- "hottext"
4203
+ "hottext",
4204
+ "hotspot",
4205
+ "gap-match",
4206
+ "graphic-gap-match",
4207
+ "select-point",
4208
+ "graphic-associate",
4209
+ "position-object"
4211
4210
  ];
4212
4211
  var PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPE_SET = new Set(
4213
4212
  PLAYCADEMY_SUPPORTED_QTI_INTERACTION_TYPES
4214
4213
  );
4214
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES = [
4215
+ "choice",
4216
+ "inline-choice",
4217
+ "text-entry",
4218
+ "order",
4219
+ "match",
4220
+ "hottext",
4221
+ "gap-match",
4222
+ "hotspot",
4223
+ "graphic-associate",
4224
+ "graphic-gap-match"
4225
+ ];
4226
+ var PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPE_SET = new Set(
4227
+ PLAYCADEMY_AUTHORABLE_QTI_INTERACTION_TYPES
4228
+ );
4229
+ var QTI_RASTER_IMAGE_MIME_TYPES = [
4230
+ "image/png",
4231
+ "image/jpeg",
4232
+ // Some browsers and operating systems still report the legacy jpg spelling.
4233
+ "image/jpg",
4234
+ "image/gif",
4235
+ "image/webp",
4236
+ "image/bmp"
4237
+ ];
4238
+ var QTI_RASTER_IMAGE_SUBTYPE_PATTERN = QTI_RASTER_IMAGE_MIME_TYPES.map(
4239
+ (type) => type.slice("image/".length)
4240
+ ).join("|");
4215
4241
  var TIMEBACK_DISCREPANCY_QUEUE_WINDOW_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_WINDOWS);
4216
4242
  var TIMEBACK_DISCREPANCY_QUEUE_METRIC_VALUES = new Set(TIMEBACK_DISCREPANCY_QUEUE_METRICS);
4217
4243