@playcademy/sandbox 0.5.1-beta.3 → 0.5.1-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 +13 -56
- package/dist/server.js +13 -56
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1078,7 +1078,7 @@ var package_default;
|
|
|
1078
1078
|
var init_package = __esm(() => {
|
|
1079
1079
|
package_default = {
|
|
1080
1080
|
name: "@playcademy/sandbox",
|
|
1081
|
-
version: "0.5.1-beta.
|
|
1081
|
+
version: "0.5.1-beta.4",
|
|
1082
1082
|
description: "Local development server for Playcademy game development",
|
|
1083
1083
|
type: "module",
|
|
1084
1084
|
exports: {
|
|
@@ -32125,44 +32125,6 @@ function validateSessionData(sessionData) {
|
|
|
32125
32125
|
throw new ConfigurationError("sensorUrl", 'Sensor URL is required for Caliper events. Provide it in sessionData.sensorUrl (e.g., "https://hub.playcademy.net/p/your-game")');
|
|
32126
32126
|
}
|
|
32127
32127
|
}
|
|
32128
|
-
function getAttemptMultiplier(attemptNumber) {
|
|
32129
|
-
switch (attemptNumber) {
|
|
32130
|
-
case 1: {
|
|
32131
|
-
return 1;
|
|
32132
|
-
}
|
|
32133
|
-
case 2: {
|
|
32134
|
-
return 0.5;
|
|
32135
|
-
}
|
|
32136
|
-
case 3: {
|
|
32137
|
-
return 0.25;
|
|
32138
|
-
}
|
|
32139
|
-
default: {
|
|
32140
|
-
return 0;
|
|
32141
|
-
}
|
|
32142
|
-
}
|
|
32143
|
-
}
|
|
32144
|
-
function getAccuracyMultiplier(accuracy) {
|
|
32145
|
-
if (!Number.isFinite(accuracy) || accuracy < 0) {
|
|
32146
|
-
return 0;
|
|
32147
|
-
}
|
|
32148
|
-
if (accuracy >= PERFECT_ACCURACY_THRESHOLD) {
|
|
32149
|
-
return 1.25;
|
|
32150
|
-
} else if (accuracy >= 0.8) {
|
|
32151
|
-
return 1;
|
|
32152
|
-
} else {
|
|
32153
|
-
return 0;
|
|
32154
|
-
}
|
|
32155
|
-
}
|
|
32156
|
-
function calculateXp(durationSeconds, accuracy, attemptNumber) {
|
|
32157
|
-
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0) {
|
|
32158
|
-
return 0;
|
|
32159
|
-
}
|
|
32160
|
-
const durationMinutes = durationSeconds / 60;
|
|
32161
|
-
const baseXp = Number(durationMinutes);
|
|
32162
|
-
const accuracyMultiplier = getAccuracyMultiplier(accuracy);
|
|
32163
|
-
const attemptMultiplier = getAttemptMultiplier(attemptNumber);
|
|
32164
|
-
return Math.round(baseXp * accuracyMultiplier * attemptMultiplier * 10) / 10;
|
|
32165
|
-
}
|
|
32166
32128
|
|
|
32167
32129
|
class ProgressRecorder {
|
|
32168
32130
|
studentResolver;
|
|
@@ -32181,10 +32143,15 @@ class ProgressRecorder {
|
|
|
32181
32143
|
validateProgressData(progressData);
|
|
32182
32144
|
const { ids, activityId, activityName, courseName, student } = await this.resolveContext(courseId, studentIdentifier, progressData);
|
|
32183
32145
|
const { id: studentId, email: studentEmail } = student;
|
|
32184
|
-
const {
|
|
32146
|
+
const {
|
|
32147
|
+
score,
|
|
32148
|
+
totalQuestions,
|
|
32149
|
+
correctQuestions,
|
|
32150
|
+
xpEarned = 0,
|
|
32151
|
+
attemptNumber
|
|
32152
|
+
} = progressData;
|
|
32185
32153
|
const actualLineItemId = await this.resolveAssessmentLineItem(activityId, activityName, progressData.classId, ids);
|
|
32186
32154
|
const currentAttemptNumber = await this.resolveAttemptNumber(attemptNumber, score, studentId, actualLineItemId);
|
|
32187
|
-
const calculatedXp = this.calculateXpForProgress(progressData, totalQuestions, correctQuestions, xpEarned, currentAttemptNumber);
|
|
32188
32155
|
let extensions = progressData.extensions;
|
|
32189
32156
|
const masteryProgress = await this.masteryTracker.checkProgress({
|
|
32190
32157
|
studentId,
|
|
@@ -32215,7 +32182,7 @@ class ProgressRecorder {
|
|
|
32215
32182
|
studentId,
|
|
32216
32183
|
attemptNumber: currentAttemptNumber,
|
|
32217
32184
|
score,
|
|
32218
|
-
xp:
|
|
32185
|
+
xp: xpEarned,
|
|
32219
32186
|
scoreStatus,
|
|
32220
32187
|
inProgress,
|
|
32221
32188
|
appName: progressData.appName,
|
|
@@ -32254,7 +32221,7 @@ class ProgressRecorder {
|
|
|
32254
32221
|
courseName,
|
|
32255
32222
|
totalQuestions,
|
|
32256
32223
|
correctQuestions,
|
|
32257
|
-
xpEarned
|
|
32224
|
+
xpEarned,
|
|
32258
32225
|
masteredUnits: effectiveMasteredUnits || undefined,
|
|
32259
32226
|
attemptNumber: currentAttemptNumber,
|
|
32260
32227
|
progressData,
|
|
@@ -32262,7 +32229,7 @@ class ProgressRecorder {
|
|
|
32262
32229
|
runId: progressData.runId
|
|
32263
32230
|
});
|
|
32264
32231
|
return {
|
|
32265
|
-
xpAwarded:
|
|
32232
|
+
xpAwarded: xpEarned,
|
|
32266
32233
|
attemptNumber: currentAttemptNumber,
|
|
32267
32234
|
masteredUnitsApplied: effectiveMasteredUnits,
|
|
32268
32235
|
pctCompleteApp,
|
|
@@ -32296,16 +32263,6 @@ class ProgressRecorder {
|
|
|
32296
32263
|
}
|
|
32297
32264
|
return 1;
|
|
32298
32265
|
}
|
|
32299
|
-
calculateXpForProgress(progressData, totalQuestions, correctQuestions, xpEarned, attemptNumber) {
|
|
32300
|
-
if (xpEarned !== undefined) {
|
|
32301
|
-
return xpEarned;
|
|
32302
|
-
}
|
|
32303
|
-
if (progressData.durationSeconds && totalQuestions && correctQuestions) {
|
|
32304
|
-
const accuracy = correctQuestions / totalQuestions;
|
|
32305
|
-
return calculateXp(progressData.durationSeconds, accuracy, attemptNumber);
|
|
32306
|
-
}
|
|
32307
|
-
return 0;
|
|
32308
|
-
}
|
|
32309
32266
|
async getOrCreateLineItem(lineItemId, activityName, classId, ids) {
|
|
32310
32267
|
try {
|
|
32311
32268
|
const lineItem = await this.onerosterNamespace.assessmentLineItems.findOrCreate(lineItemId, {
|
|
@@ -32963,7 +32920,7 @@ var __defProp2, __export2 = (target, all) => {
|
|
|
32963
32920
|
configurable: true,
|
|
32964
32921
|
set: (newValue) => all[name3] = () => newValue
|
|
32965
32922
|
});
|
|
32966
|
-
}, __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), TIMEBACK_API_URLS, QTI_API_URL = "https://qti.alpha-1edtech.ai/api", TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_ENDPOINTS, QTI_ENDPOINTS, CALIPER_ENDPOINTS, CALIPER_CONSTANTS, TIMEBACK_EVENT_TYPES, TIMEBACK_ACTIONS, TIMEBACK_TYPES, ACTIVITY_METRIC_TYPES, TIME_METRIC_TYPES, TIMEBACK_SUBJECTS, TIMEBACK_GRADE_LEVELS, TIMEBACK_GRADE_LEVEL_LABELS, CALIPER_SUBJECTS, ONEROSTER_STATUS, SCORE_STATUS, ENV_VARS, HTTP_DEFAULTS, AUTH_DEFAULTS, CACHE_DEFAULTS, CONFIG_DEFAULTS, PLAYCADEMY_DEFAULTS, RESOURCE_DEFAULTS, HTTP_STATUS, ERROR_NAMES, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, SUBJECT_VALUES, GRADE_VALUES, TimebackAuthError, UUID_PATTERN, storage,
|
|
32923
|
+
}, __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), TIMEBACK_API_URLS, QTI_API_URL = "https://qti.alpha-1edtech.ai/api", TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_ENDPOINTS, QTI_ENDPOINTS, CALIPER_ENDPOINTS, CALIPER_CONSTANTS, TIMEBACK_EVENT_TYPES, TIMEBACK_ACTIONS, TIMEBACK_TYPES, ACTIVITY_METRIC_TYPES, TIME_METRIC_TYPES, TIMEBACK_SUBJECTS, TIMEBACK_GRADE_LEVELS, TIMEBACK_GRADE_LEVEL_LABELS, CALIPER_SUBJECTS, ONEROSTER_STATUS, SCORE_STATUS, ENV_VARS, HTTP_DEFAULTS, AUTH_DEFAULTS, CACHE_DEFAULTS, CONFIG_DEFAULTS, PLAYCADEMY_DEFAULTS, RESOURCE_DEFAULTS, HTTP_STATUS, ERROR_NAMES, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, SUBJECT_VALUES, GRADE_VALUES, TimebackAuthError, UUID_PATTERN, storage, EmailSchema, StudentSourcedIdSchema, StudentIdentifierSchema;
|
|
32967
32924
|
var init_dist2 = __esm(() => {
|
|
32968
32925
|
init_src();
|
|
32969
32926
|
init_src();
|
|
@@ -34494,7 +34451,7 @@ var init_schemas4 = __esm(() => {
|
|
|
34494
34451
|
activeSeconds: exports_external.number().nonnegative(),
|
|
34495
34452
|
inactiveSeconds: exports_external.number().nonnegative().optional()
|
|
34496
34453
|
}).optional(),
|
|
34497
|
-
xpEarned: exports_external.number()
|
|
34454
|
+
xpEarned: exports_external.number(),
|
|
34498
34455
|
masteredUnits: exports_external.number().optional(),
|
|
34499
34456
|
masteredUnitsAbsolute: exports_external.number().int().nonnegative().optional(),
|
|
34500
34457
|
extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|
package/dist/server.js
CHANGED
|
@@ -1077,7 +1077,7 @@ var package_default;
|
|
|
1077
1077
|
var init_package = __esm(() => {
|
|
1078
1078
|
package_default = {
|
|
1079
1079
|
name: "@playcademy/sandbox",
|
|
1080
|
-
version: "0.5.1-beta.
|
|
1080
|
+
version: "0.5.1-beta.4",
|
|
1081
1081
|
description: "Local development server for Playcademy game development",
|
|
1082
1082
|
type: "module",
|
|
1083
1083
|
exports: {
|
|
@@ -32124,44 +32124,6 @@ function validateSessionData(sessionData) {
|
|
|
32124
32124
|
throw new ConfigurationError("sensorUrl", 'Sensor URL is required for Caliper events. Provide it in sessionData.sensorUrl (e.g., "https://hub.playcademy.net/p/your-game")');
|
|
32125
32125
|
}
|
|
32126
32126
|
}
|
|
32127
|
-
function getAttemptMultiplier(attemptNumber) {
|
|
32128
|
-
switch (attemptNumber) {
|
|
32129
|
-
case 1: {
|
|
32130
|
-
return 1;
|
|
32131
|
-
}
|
|
32132
|
-
case 2: {
|
|
32133
|
-
return 0.5;
|
|
32134
|
-
}
|
|
32135
|
-
case 3: {
|
|
32136
|
-
return 0.25;
|
|
32137
|
-
}
|
|
32138
|
-
default: {
|
|
32139
|
-
return 0;
|
|
32140
|
-
}
|
|
32141
|
-
}
|
|
32142
|
-
}
|
|
32143
|
-
function getAccuracyMultiplier(accuracy) {
|
|
32144
|
-
if (!Number.isFinite(accuracy) || accuracy < 0) {
|
|
32145
|
-
return 0;
|
|
32146
|
-
}
|
|
32147
|
-
if (accuracy >= PERFECT_ACCURACY_THRESHOLD) {
|
|
32148
|
-
return 1.25;
|
|
32149
|
-
} else if (accuracy >= 0.8) {
|
|
32150
|
-
return 1;
|
|
32151
|
-
} else {
|
|
32152
|
-
return 0;
|
|
32153
|
-
}
|
|
32154
|
-
}
|
|
32155
|
-
function calculateXp(durationSeconds, accuracy, attemptNumber) {
|
|
32156
|
-
if (!Number.isFinite(durationSeconds) || durationSeconds <= 0) {
|
|
32157
|
-
return 0;
|
|
32158
|
-
}
|
|
32159
|
-
const durationMinutes = durationSeconds / 60;
|
|
32160
|
-
const baseXp = Number(durationMinutes);
|
|
32161
|
-
const accuracyMultiplier = getAccuracyMultiplier(accuracy);
|
|
32162
|
-
const attemptMultiplier = getAttemptMultiplier(attemptNumber);
|
|
32163
|
-
return Math.round(baseXp * accuracyMultiplier * attemptMultiplier * 10) / 10;
|
|
32164
|
-
}
|
|
32165
32127
|
|
|
32166
32128
|
class ProgressRecorder {
|
|
32167
32129
|
studentResolver;
|
|
@@ -32180,10 +32142,15 @@ class ProgressRecorder {
|
|
|
32180
32142
|
validateProgressData(progressData);
|
|
32181
32143
|
const { ids, activityId, activityName, courseName, student } = await this.resolveContext(courseId, studentIdentifier, progressData);
|
|
32182
32144
|
const { id: studentId, email: studentEmail } = student;
|
|
32183
|
-
const {
|
|
32145
|
+
const {
|
|
32146
|
+
score,
|
|
32147
|
+
totalQuestions,
|
|
32148
|
+
correctQuestions,
|
|
32149
|
+
xpEarned = 0,
|
|
32150
|
+
attemptNumber
|
|
32151
|
+
} = progressData;
|
|
32184
32152
|
const actualLineItemId = await this.resolveAssessmentLineItem(activityId, activityName, progressData.classId, ids);
|
|
32185
32153
|
const currentAttemptNumber = await this.resolveAttemptNumber(attemptNumber, score, studentId, actualLineItemId);
|
|
32186
|
-
const calculatedXp = this.calculateXpForProgress(progressData, totalQuestions, correctQuestions, xpEarned, currentAttemptNumber);
|
|
32187
32154
|
let extensions = progressData.extensions;
|
|
32188
32155
|
const masteryProgress = await this.masteryTracker.checkProgress({
|
|
32189
32156
|
studentId,
|
|
@@ -32214,7 +32181,7 @@ class ProgressRecorder {
|
|
|
32214
32181
|
studentId,
|
|
32215
32182
|
attemptNumber: currentAttemptNumber,
|
|
32216
32183
|
score,
|
|
32217
|
-
xp:
|
|
32184
|
+
xp: xpEarned,
|
|
32218
32185
|
scoreStatus,
|
|
32219
32186
|
inProgress,
|
|
32220
32187
|
appName: progressData.appName,
|
|
@@ -32253,7 +32220,7 @@ class ProgressRecorder {
|
|
|
32253
32220
|
courseName,
|
|
32254
32221
|
totalQuestions,
|
|
32255
32222
|
correctQuestions,
|
|
32256
|
-
xpEarned
|
|
32223
|
+
xpEarned,
|
|
32257
32224
|
masteredUnits: effectiveMasteredUnits || undefined,
|
|
32258
32225
|
attemptNumber: currentAttemptNumber,
|
|
32259
32226
|
progressData,
|
|
@@ -32261,7 +32228,7 @@ class ProgressRecorder {
|
|
|
32261
32228
|
runId: progressData.runId
|
|
32262
32229
|
});
|
|
32263
32230
|
return {
|
|
32264
|
-
xpAwarded:
|
|
32231
|
+
xpAwarded: xpEarned,
|
|
32265
32232
|
attemptNumber: currentAttemptNumber,
|
|
32266
32233
|
masteredUnitsApplied: effectiveMasteredUnits,
|
|
32267
32234
|
pctCompleteApp,
|
|
@@ -32295,16 +32262,6 @@ class ProgressRecorder {
|
|
|
32295
32262
|
}
|
|
32296
32263
|
return 1;
|
|
32297
32264
|
}
|
|
32298
|
-
calculateXpForProgress(progressData, totalQuestions, correctQuestions, xpEarned, attemptNumber) {
|
|
32299
|
-
if (xpEarned !== undefined) {
|
|
32300
|
-
return xpEarned;
|
|
32301
|
-
}
|
|
32302
|
-
if (progressData.durationSeconds && totalQuestions && correctQuestions) {
|
|
32303
|
-
const accuracy = correctQuestions / totalQuestions;
|
|
32304
|
-
return calculateXp(progressData.durationSeconds, accuracy, attemptNumber);
|
|
32305
|
-
}
|
|
32306
|
-
return 0;
|
|
32307
|
-
}
|
|
32308
32265
|
async getOrCreateLineItem(lineItemId, activityName, classId, ids) {
|
|
32309
32266
|
try {
|
|
32310
32267
|
const lineItem = await this.onerosterNamespace.assessmentLineItems.findOrCreate(lineItemId, {
|
|
@@ -32962,7 +32919,7 @@ var __defProp2, __export2 = (target, all) => {
|
|
|
32962
32919
|
configurable: true,
|
|
32963
32920
|
set: (newValue) => all[name3] = () => newValue
|
|
32964
32921
|
});
|
|
32965
|
-
}, __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), TIMEBACK_API_URLS, QTI_API_URL = "https://qti.alpha-1edtech.ai/api", TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_ENDPOINTS, QTI_ENDPOINTS, CALIPER_ENDPOINTS, CALIPER_CONSTANTS, TIMEBACK_EVENT_TYPES, TIMEBACK_ACTIONS, TIMEBACK_TYPES, ACTIVITY_METRIC_TYPES, TIME_METRIC_TYPES, TIMEBACK_SUBJECTS, TIMEBACK_GRADE_LEVELS, TIMEBACK_GRADE_LEVEL_LABELS, CALIPER_SUBJECTS, ONEROSTER_STATUS, SCORE_STATUS, ENV_VARS, HTTP_DEFAULTS, AUTH_DEFAULTS, CACHE_DEFAULTS, CONFIG_DEFAULTS, PLAYCADEMY_DEFAULTS, RESOURCE_DEFAULTS, HTTP_STATUS, ERROR_NAMES, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, SUBJECT_VALUES, GRADE_VALUES, TimebackAuthError, UUID_PATTERN, storage,
|
|
32922
|
+
}, __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), TIMEBACK_API_URLS, QTI_API_URL = "https://qti.alpha-1edtech.ai/api", TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_ENDPOINTS, QTI_ENDPOINTS, CALIPER_ENDPOINTS, CALIPER_CONSTANTS, TIMEBACK_EVENT_TYPES, TIMEBACK_ACTIONS, TIMEBACK_TYPES, ACTIVITY_METRIC_TYPES, TIME_METRIC_TYPES, TIMEBACK_SUBJECTS, TIMEBACK_GRADE_LEVELS, TIMEBACK_GRADE_LEVEL_LABELS, CALIPER_SUBJECTS, ONEROSTER_STATUS, SCORE_STATUS, ENV_VARS, HTTP_DEFAULTS, AUTH_DEFAULTS, CACHE_DEFAULTS, CONFIG_DEFAULTS, PLAYCADEMY_DEFAULTS, RESOURCE_DEFAULTS, HTTP_STATUS, ERROR_NAMES, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, SUBJECT_VALUES, GRADE_VALUES, TimebackAuthError, UUID_PATTERN, storage, EmailSchema, StudentSourcedIdSchema, StudentIdentifierSchema;
|
|
32966
32923
|
var init_dist2 = __esm(() => {
|
|
32967
32924
|
init_src();
|
|
32968
32925
|
init_src();
|
|
@@ -34493,7 +34450,7 @@ var init_schemas4 = __esm(() => {
|
|
|
34493
34450
|
activeSeconds: exports_external.number().nonnegative(),
|
|
34494
34451
|
inactiveSeconds: exports_external.number().nonnegative().optional()
|
|
34495
34452
|
}).optional(),
|
|
34496
|
-
xpEarned: exports_external.number()
|
|
34453
|
+
xpEarned: exports_external.number(),
|
|
34497
34454
|
masteredUnits: exports_external.number().optional(),
|
|
34498
34455
|
masteredUnitsAbsolute: exports_external.number().int().nonnegative().optional(),
|
|
34499
34456
|
extensions: exports_external.record(exports_external.string(), exports_external.unknown()).optional()
|