@playcademy/sandbox 0.3.17-beta.19 → 0.3.17-beta.20

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
@@ -314,10 +314,10 @@ var init_typescript = __esm(() => {
314
314
  TypeScriptPackages = {
315
315
  tsc: "tsc",
316
316
  nativePreview: "@typescript/native-preview",
317
- nativePreviewPinned: "@typescript/native-preview@7.0.0-dev.20260221.1"
317
+ nativePreviewBeta: "@typescript/native-preview@beta"
318
318
  };
319
319
  TYPESCRIPT_RUNNER = {
320
- package: TypeScriptPackages.nativePreviewPinned,
320
+ package: TypeScriptPackages.nativePreviewBeta,
321
321
  bin: "tsgo"
322
322
  };
323
323
  });
@@ -1330,7 +1330,7 @@ var package_default;
1330
1330
  var init_package = __esm(() => {
1331
1331
  package_default = {
1332
1332
  name: "@playcademy/sandbox",
1333
- version: "0.3.17-beta.19",
1333
+ version: "0.3.17-beta.20",
1334
1334
  description: "Local development server for Playcademy game development",
1335
1335
  type: "module",
1336
1336
  exports: {
@@ -1665,7 +1665,7 @@ function formatJSONSingleLine(level, message, context, scope) {
1665
1665
  ...context && Object.keys(context).length > 0 && { context }
1666
1666
  };
1667
1667
  const consoleMethod = getConsoleMethod(level);
1668
- consoleMethod(JSON.stringify(logEntry));
1668
+ consoleMethod(safeJSONStringify(logEntry));
1669
1669
  }
1670
1670
  function formatJSONPretty(level, message, context, scope) {
1671
1671
  const timestamp = new Date().toISOString();
@@ -1677,7 +1677,30 @@ function formatJSONPretty(level, message, context, scope) {
1677
1677
  ...context && Object.keys(context).length > 0 && { context }
1678
1678
  };
1679
1679
  const consoleMethod = getConsoleMethod(level);
1680
- consoleMethod(JSON.stringify(logEntry, null, 2));
1680
+ consoleMethod(safeJSONStringify(logEntry, 2));
1681
+ }
1682
+ function safeJSONStringify(value, space) {
1683
+ const seen = new WeakSet;
1684
+ try {
1685
+ return JSON.stringify(value, (_key, currentValue) => {
1686
+ if (typeof currentValue === "bigint") {
1687
+ return currentValue.toString();
1688
+ }
1689
+ if (typeof currentValue === "object" && currentValue !== null) {
1690
+ if (seen.has(currentValue)) {
1691
+ return "[Circular]";
1692
+ }
1693
+ seen.add(currentValue);
1694
+ }
1695
+ return currentValue;
1696
+ }, space);
1697
+ } catch {
1698
+ return JSON.stringify({
1699
+ timestamp: new Date().toISOString(),
1700
+ level: "ERROR",
1701
+ message: "[Logger] Failed to serialize log entry"
1702
+ });
1703
+ }
1681
1704
  }
1682
1705
  function getConsoleMethod(level) {
1683
1706
  switch (level) {
@@ -35250,7 +35273,6 @@ async function request({
35250
35273
  method,
35251
35274
  headers,
35252
35275
  body: payload,
35253
- credentials: "omit",
35254
35276
  signal: controller.signal
35255
35277
  });
35256
35278
  clearTimeout(timeoutId);
@@ -35834,10 +35856,11 @@ function createOneRosterNamespace(client) {
35834
35856
  const url = `${ONEROSTER_ENDPOINTS4.assessmentResults}?filter=${encodeURIComponent(filter)}`;
35835
35857
  const response = await client["request"](url, "GET");
35836
35858
  const results = response.assessmentResults || [];
35837
- if (results.length === 0) {
35859
+ const firstResult = results[0];
35860
+ if (!firstResult) {
35838
35861
  return null;
35839
35862
  }
35840
- let maxAttemptResult = results[0];
35863
+ let maxAttemptResult = firstResult;
35841
35864
  let maxAttemptNumber = maxAttemptResult.metadata?.attemptNumber || 0;
35842
35865
  let activeAttemptCount = 0;
35843
35866
  for (const result of results) {
@@ -35871,10 +35894,11 @@ function createOneRosterNamespace(client) {
35871
35894
  if (!response || !response.users || !Array.isArray(response.users)) {
35872
35895
  throw new Error(`Invalid response format from OneRoster API when searching for user with email: ${email}. ` + `Expected { users: [...] } but received: ${JSON.stringify(response)}`);
35873
35896
  }
35874
- if (response.users.length === 0) {
35897
+ const user = response.users[0];
35898
+ if (!user) {
35875
35899
  throw new Error(`User not found with email: ${email}. ` + `Ensure the user exists in OneRoster and has a valid email address. ` + `If this is a new user, they must be created in OneRoster first.`);
35876
35900
  }
35877
- return response.users[0];
35901
+ return user;
35878
35902
  },
35879
35903
  listBySourcedIds: async (sourcedIds, batchSize = 50) => {
35880
35904
  if (sourcedIds.length === 0) {
@@ -36156,6 +36180,9 @@ class TimebackCache {
36156
36180
  return;
36157
36181
  }
36158
36182
  const oldestKey = this.accessOrder[0];
36183
+ if (!oldestKey) {
36184
+ return;
36185
+ }
36159
36186
  this.delete(oldestKey);
36160
36187
  log.debug(`[${this.name}] Evicted LRU entry`, { key: oldestKey });
36161
36188
  }
@@ -5,97 +5,97 @@ import { ItemRow } from '@playcademy/data/types';
5
5
  * Demo user data for sandbox testing
6
6
  */
7
7
  declare const DEMO_USER_IDS: {
8
- readonly player: "00000000-0000-0000-0000-000000000001";
9
- readonly developer: "00000000-0000-0000-0000-000000000002";
10
- readonly admin: "00000000-0000-0000-0000-000000000003";
11
- readonly pendingDeveloper: "00000000-0000-0000-0000-000000000004";
12
- readonly unverifiedPlayer: "00000000-0000-0000-0000-000000000005";
13
- readonly anonymousPlayer: "00000000-0000-0000-0000-000000000006";
8
+ readonly player: '00000000-0000-0000-0000-000000000001';
9
+ readonly developer: '00000000-0000-0000-0000-000000000002';
10
+ readonly admin: '00000000-0000-0000-0000-000000000003';
11
+ readonly pendingDeveloper: '00000000-0000-0000-0000-000000000004';
12
+ readonly unverifiedPlayer: '00000000-0000-0000-0000-000000000005';
13
+ readonly anonymousPlayer: '00000000-0000-0000-0000-000000000006';
14
14
  };
15
15
  declare const DEMO_USERS: {
16
16
  readonly admin: {
17
17
  readonly id: "00000000-0000-0000-0000-000000000003";
18
- readonly name: "Admin User";
19
- readonly username: "admin_user";
20
- readonly email: "admin@playcademy.com";
18
+ readonly name: 'Admin User';
19
+ readonly username: 'admin_user';
20
+ readonly email: 'admin@playcademy.com';
21
21
  readonly emailVerified: true;
22
22
  readonly image: null;
23
- readonly role: "admin";
24
- readonly developerStatus: "approved";
23
+ readonly role: 'admin';
24
+ readonly developerStatus: 'approved';
25
25
  readonly createdAt: Date;
26
26
  readonly updatedAt: Date;
27
27
  };
28
28
  readonly player: {
29
29
  readonly id: "00000000-0000-0000-0000-000000000001";
30
- readonly name: "Player User";
31
- readonly username: "player_user";
32
- readonly email: "player@playcademy.com";
30
+ readonly name: 'Player User';
31
+ readonly username: 'player_user';
32
+ readonly email: 'player@playcademy.com';
33
33
  readonly emailVerified: true;
34
34
  readonly image: null;
35
- readonly role: "player";
36
- readonly developerStatus: "none";
35
+ readonly role: 'player';
36
+ readonly developerStatus: 'none';
37
37
  readonly createdAt: Date;
38
38
  readonly updatedAt: Date;
39
39
  };
40
40
  readonly developer: {
41
41
  readonly id: "00000000-0000-0000-0000-000000000002";
42
- readonly name: "Developer User";
43
- readonly username: "developer_user";
44
- readonly email: "developer@playcademy.com";
42
+ readonly name: 'Developer User';
43
+ readonly username: 'developer_user';
44
+ readonly email: 'developer@playcademy.com';
45
45
  readonly emailVerified: true;
46
46
  readonly image: null;
47
- readonly role: "developer";
48
- readonly developerStatus: "approved";
47
+ readonly role: 'developer';
48
+ readonly developerStatus: 'approved';
49
49
  readonly createdAt: Date;
50
50
  readonly updatedAt: Date;
51
51
  };
52
52
  readonly pendingDeveloper: {
53
53
  readonly id: "00000000-0000-0000-0000-000000000004";
54
- readonly name: "Pending Developer";
55
- readonly username: "pending_dev";
56
- readonly email: "pending@playcademy.com";
54
+ readonly name: 'Pending Developer';
55
+ readonly username: 'pending_dev';
56
+ readonly email: 'pending@playcademy.com';
57
57
  readonly emailVerified: true;
58
58
  readonly image: null;
59
- readonly role: "developer";
60
- readonly developerStatus: "pending";
59
+ readonly role: 'developer';
60
+ readonly developerStatus: 'pending';
61
61
  readonly createdAt: Date;
62
62
  readonly updatedAt: Date;
63
63
  };
64
64
  readonly unverifiedPlayer: {
65
65
  readonly id: "00000000-0000-0000-0000-000000000005";
66
- readonly name: "Unverified Player";
67
- readonly username: "unverified_player";
68
- readonly email: "unverified@playcademy.com";
66
+ readonly name: 'Unverified Player';
67
+ readonly username: 'unverified_player';
68
+ readonly email: 'unverified@playcademy.com';
69
69
  readonly emailVerified: false;
70
70
  readonly image: null;
71
- readonly role: "player";
72
- readonly developerStatus: "none";
71
+ readonly role: 'player';
72
+ readonly developerStatus: 'none';
73
73
  readonly createdAt: Date;
74
74
  readonly updatedAt: Date;
75
75
  };
76
76
  readonly anonymousPlayer: {
77
77
  readonly id: "00000000-0000-0000-0000-000000000006";
78
78
  readonly name: "Demo Player";
79
- readonly username: "anonymous_demo_player";
80
- readonly email: "player@anon.demo.playcademy.gg";
79
+ readonly username: 'anonymous_demo_player';
80
+ readonly email: 'player@anon.demo.playcademy.gg';
81
81
  readonly emailVerified: false;
82
82
  readonly image: null;
83
83
  readonly isAnonymous: true;
84
- readonly role: "player";
85
- readonly developerStatus: "none";
84
+ readonly role: 'player';
85
+ readonly developerStatus: 'none';
86
86
  readonly createdAt: Date;
87
87
  readonly updatedAt: Date;
88
88
  };
89
89
  };
90
90
  declare const DEMO_USER: {
91
91
  readonly id: "00000000-0000-0000-0000-000000000001";
92
- readonly name: "Player User";
93
- readonly username: "player_user";
94
- readonly email: "player@playcademy.com";
92
+ readonly name: 'Player User';
93
+ readonly username: 'player_user';
94
+ readonly email: 'player@playcademy.com';
95
95
  readonly emailVerified: true;
96
96
  readonly image: null;
97
- readonly role: "player";
98
- readonly developerStatus: "none";
97
+ readonly role: 'player';
98
+ readonly developerStatus: 'none';
99
99
  readonly createdAt: Date;
100
100
  readonly updatedAt: Date;
101
101
  };
@@ -107,122 +107,122 @@ declare const DEMO_USER: {
107
107
  declare const DEMO_TOKENS: {
108
108
  readonly 'sandbox-demo-token': {
109
109
  readonly id: "00000000-0000-0000-0000-000000000001";
110
- readonly name: "Player User";
111
- readonly username: "player_user";
112
- readonly email: "player@playcademy.com";
110
+ readonly name: 'Player User';
111
+ readonly username: 'player_user';
112
+ readonly email: 'player@playcademy.com';
113
113
  readonly emailVerified: true;
114
114
  readonly image: null;
115
- readonly role: "player";
116
- readonly developerStatus: "none";
115
+ readonly role: 'player';
116
+ readonly developerStatus: 'none';
117
117
  readonly createdAt: Date;
118
118
  readonly updatedAt: Date;
119
119
  };
120
120
  readonly 'sandbox-admin-token': {
121
121
  readonly id: "00000000-0000-0000-0000-000000000003";
122
- readonly name: "Admin User";
123
- readonly username: "admin_user";
124
- readonly email: "admin@playcademy.com";
122
+ readonly name: 'Admin User';
123
+ readonly username: 'admin_user';
124
+ readonly email: 'admin@playcademy.com';
125
125
  readonly emailVerified: true;
126
126
  readonly image: null;
127
- readonly role: "admin";
128
- readonly developerStatus: "approved";
127
+ readonly role: 'admin';
128
+ readonly developerStatus: 'approved';
129
129
  readonly createdAt: Date;
130
130
  readonly updatedAt: Date;
131
131
  };
132
132
  readonly 'sandbox-player-token': {
133
133
  readonly id: "00000000-0000-0000-0000-000000000001";
134
- readonly name: "Player User";
135
- readonly username: "player_user";
136
- readonly email: "player@playcademy.com";
134
+ readonly name: 'Player User';
135
+ readonly username: 'player_user';
136
+ readonly email: 'player@playcademy.com';
137
137
  readonly emailVerified: true;
138
138
  readonly image: null;
139
- readonly role: "player";
140
- readonly developerStatus: "none";
139
+ readonly role: 'player';
140
+ readonly developerStatus: 'none';
141
141
  readonly createdAt: Date;
142
142
  readonly updatedAt: Date;
143
143
  };
144
144
  readonly 'sandbox-anonymous-token': {
145
145
  readonly id: "00000000-0000-0000-0000-000000000006";
146
146
  readonly name: "Demo Player";
147
- readonly username: "anonymous_demo_player";
148
- readonly email: "player@anon.demo.playcademy.gg";
147
+ readonly username: 'anonymous_demo_player';
148
+ readonly email: 'player@anon.demo.playcademy.gg';
149
149
  readonly emailVerified: false;
150
150
  readonly image: null;
151
151
  readonly isAnonymous: true;
152
- readonly role: "player";
153
- readonly developerStatus: "none";
152
+ readonly role: 'player';
153
+ readonly developerStatus: 'none';
154
154
  readonly createdAt: Date;
155
155
  readonly updatedAt: Date;
156
156
  };
157
157
  readonly 'sandbox-developer-token': {
158
158
  readonly id: "00000000-0000-0000-0000-000000000002";
159
- readonly name: "Developer User";
160
- readonly username: "developer_user";
161
- readonly email: "developer@playcademy.com";
159
+ readonly name: 'Developer User';
160
+ readonly username: 'developer_user';
161
+ readonly email: 'developer@playcademy.com';
162
162
  readonly emailVerified: true;
163
163
  readonly image: null;
164
- readonly role: "developer";
165
- readonly developerStatus: "approved";
164
+ readonly role: 'developer';
165
+ readonly developerStatus: 'approved';
166
166
  readonly createdAt: Date;
167
167
  readonly updatedAt: Date;
168
168
  };
169
169
  readonly 'sandbox-pending-dev-token': {
170
170
  readonly id: "00000000-0000-0000-0000-000000000004";
171
- readonly name: "Pending Developer";
172
- readonly username: "pending_dev";
173
- readonly email: "pending@playcademy.com";
171
+ readonly name: 'Pending Developer';
172
+ readonly username: 'pending_dev';
173
+ readonly email: 'pending@playcademy.com';
174
174
  readonly emailVerified: true;
175
175
  readonly image: null;
176
- readonly role: "developer";
177
- readonly developerStatus: "pending";
176
+ readonly role: 'developer';
177
+ readonly developerStatus: 'pending';
178
178
  readonly createdAt: Date;
179
179
  readonly updatedAt: Date;
180
180
  };
181
181
  readonly 'sandbox-unverified-token': {
182
182
  readonly id: "00000000-0000-0000-0000-000000000005";
183
- readonly name: "Unverified Player";
184
- readonly username: "unverified_player";
185
- readonly email: "unverified@playcademy.com";
183
+ readonly name: 'Unverified Player';
184
+ readonly username: 'unverified_player';
185
+ readonly email: 'unverified@playcademy.com';
186
186
  readonly emailVerified: false;
187
187
  readonly image: null;
188
- readonly role: "player";
189
- readonly developerStatus: "none";
188
+ readonly role: 'player';
189
+ readonly developerStatus: 'none';
190
190
  readonly createdAt: Date;
191
191
  readonly updatedAt: Date;
192
192
  };
193
193
  readonly 'mock-game-token-for-local-dev': {
194
194
  readonly id: "00000000-0000-0000-0000-000000000001";
195
- readonly name: "Player User";
196
- readonly username: "player_user";
197
- readonly email: "player@playcademy.com";
195
+ readonly name: 'Player User';
196
+ readonly username: 'player_user';
197
+ readonly email: 'player@playcademy.com';
198
198
  readonly emailVerified: true;
199
199
  readonly image: null;
200
- readonly role: "player";
201
- readonly developerStatus: "none";
200
+ readonly role: 'player';
201
+ readonly developerStatus: 'none';
202
202
  readonly createdAt: Date;
203
203
  readonly updatedAt: Date;
204
204
  };
205
205
  readonly 'sandbox-game-backend-token': {
206
206
  readonly id: "00000000-0000-0000-0000-000000000002";
207
- readonly name: "Developer User";
208
- readonly username: "developer_user";
209
- readonly email: "developer@playcademy.com";
207
+ readonly name: 'Developer User';
208
+ readonly username: 'developer_user';
209
+ readonly email: 'developer@playcademy.com';
210
210
  readonly emailVerified: true;
211
211
  readonly image: null;
212
- readonly role: "developer";
213
- readonly developerStatus: "approved";
212
+ readonly role: 'developer';
213
+ readonly developerStatus: 'approved';
214
214
  readonly createdAt: Date;
215
215
  readonly updatedAt: Date;
216
216
  };
217
217
  };
218
218
  /** Well-known token strings by role (for use in tests) */
219
219
  declare const SANDBOX_TOKENS: {
220
- readonly player: "sandbox-player-token";
221
- readonly anonymous: "sandbox-anonymous-token";
222
- readonly developer: "sandbox-developer-token";
223
- readonly admin: "sandbox-admin-token";
224
- readonly pendingDeveloper: "sandbox-pending-dev-token";
225
- readonly unverified: "sandbox-unverified-token";
220
+ readonly player: 'sandbox-player-token';
221
+ readonly anonymous: 'sandbox-anonymous-token';
222
+ readonly developer: 'sandbox-developer-token';
223
+ readonly admin: 'sandbox-admin-token';
224
+ readonly pendingDeveloper: 'sandbox-pending-dev-token';
225
+ readonly unverified: 'sandbox-unverified-token';
226
226
  };
227
227
  declare const DEMO_TOKEN = "sandbox-demo-token";
228
228
  declare const MOCK_GAME_ID = "mock-game-id-from-template";
package/dist/constants.js CHANGED
@@ -149,10 +149,10 @@ var init_typescript = __esm(() => {
149
149
  TypeScriptPackages = {
150
150
  tsc: "tsc",
151
151
  nativePreview: "@typescript/native-preview",
152
- nativePreviewPinned: "@typescript/native-preview@7.0.0-dev.20260221.1"
152
+ nativePreviewBeta: "@typescript/native-preview@beta"
153
153
  };
154
154
  TYPESCRIPT_RUNNER = {
155
- package: TypeScriptPackages.nativePreviewPinned,
155
+ package: TypeScriptPackages.nativePreviewBeta,
156
156
  bin: "tsgo"
157
157
  };
158
158
  });
@@ -18,35 +18,35 @@ export declare function createSandboxAuthProvider(): AuthProvider;
18
18
  */
19
19
  export declare function getDemoUser(role?: 'admin' | 'developer' | 'player'): {
20
20
  readonly id: "00000000-0000-0000-0000-000000000003";
21
- readonly name: "Admin User";
22
- readonly username: "admin_user";
23
- readonly email: "admin@playcademy.com";
21
+ readonly name: 'Admin User';
22
+ readonly username: 'admin_user';
23
+ readonly email: 'admin@playcademy.com';
24
24
  readonly emailVerified: true;
25
25
  readonly image: null;
26
- readonly role: "admin";
27
- readonly developerStatus: "approved";
26
+ readonly role: 'admin';
27
+ readonly developerStatus: 'approved';
28
28
  readonly createdAt: Date;
29
29
  readonly updatedAt: Date;
30
30
  } | {
31
31
  readonly id: "00000000-0000-0000-0000-000000000001";
32
- readonly name: "Player User";
33
- readonly username: "player_user";
34
- readonly email: "player@playcademy.com";
32
+ readonly name: 'Player User';
33
+ readonly username: 'player_user';
34
+ readonly email: 'player@playcademy.com';
35
35
  readonly emailVerified: true;
36
36
  readonly image: null;
37
- readonly role: "player";
38
- readonly developerStatus: "none";
37
+ readonly role: 'player';
38
+ readonly developerStatus: 'none';
39
39
  readonly createdAt: Date;
40
40
  readonly updatedAt: Date;
41
41
  } | {
42
42
  readonly id: "00000000-0000-0000-0000-000000000002";
43
- readonly name: "Developer User";
44
- readonly username: "developer_user";
45
- readonly email: "developer@playcademy.com";
43
+ readonly name: 'Developer User';
44
+ readonly username: 'developer_user';
45
+ readonly email: 'developer@playcademy.com';
46
46
  readonly emailVerified: true;
47
47
  readonly image: null;
48
- readonly role: "developer";
49
- readonly developerStatus: "approved";
48
+ readonly role: 'developer';
49
+ readonly developerStatus: 'approved';
50
50
  readonly createdAt: Date;
51
51
  readonly updatedAt: Date;
52
52
  };
package/dist/server.js CHANGED
@@ -313,10 +313,10 @@ var init_typescript = __esm(() => {
313
313
  TypeScriptPackages = {
314
314
  tsc: "tsc",
315
315
  nativePreview: "@typescript/native-preview",
316
- nativePreviewPinned: "@typescript/native-preview@7.0.0-dev.20260221.1"
316
+ nativePreviewBeta: "@typescript/native-preview@beta"
317
317
  };
318
318
  TYPESCRIPT_RUNNER = {
319
- package: TypeScriptPackages.nativePreviewPinned,
319
+ package: TypeScriptPackages.nativePreviewBeta,
320
320
  bin: "tsgo"
321
321
  };
322
322
  });
@@ -1329,7 +1329,7 @@ var package_default;
1329
1329
  var init_package = __esm(() => {
1330
1330
  package_default = {
1331
1331
  name: "@playcademy/sandbox",
1332
- version: "0.3.17-beta.19",
1332
+ version: "0.3.17-beta.20",
1333
1333
  description: "Local development server for Playcademy game development",
1334
1334
  type: "module",
1335
1335
  exports: {
@@ -1664,7 +1664,7 @@ function formatJSONSingleLine(level, message, context, scope) {
1664
1664
  ...context && Object.keys(context).length > 0 && { context }
1665
1665
  };
1666
1666
  const consoleMethod = getConsoleMethod(level);
1667
- consoleMethod(JSON.stringify(logEntry));
1667
+ consoleMethod(safeJSONStringify(logEntry));
1668
1668
  }
1669
1669
  function formatJSONPretty(level, message, context, scope) {
1670
1670
  const timestamp = new Date().toISOString();
@@ -1676,7 +1676,30 @@ function formatJSONPretty(level, message, context, scope) {
1676
1676
  ...context && Object.keys(context).length > 0 && { context }
1677
1677
  };
1678
1678
  const consoleMethod = getConsoleMethod(level);
1679
- consoleMethod(JSON.stringify(logEntry, null, 2));
1679
+ consoleMethod(safeJSONStringify(logEntry, 2));
1680
+ }
1681
+ function safeJSONStringify(value, space) {
1682
+ const seen = new WeakSet;
1683
+ try {
1684
+ return JSON.stringify(value, (_key, currentValue) => {
1685
+ if (typeof currentValue === "bigint") {
1686
+ return currentValue.toString();
1687
+ }
1688
+ if (typeof currentValue === "object" && currentValue !== null) {
1689
+ if (seen.has(currentValue)) {
1690
+ return "[Circular]";
1691
+ }
1692
+ seen.add(currentValue);
1693
+ }
1694
+ return currentValue;
1695
+ }, space);
1696
+ } catch {
1697
+ return JSON.stringify({
1698
+ timestamp: new Date().toISOString(),
1699
+ level: "ERROR",
1700
+ message: "[Logger] Failed to serialize log entry"
1701
+ });
1702
+ }
1680
1703
  }
1681
1704
  function getConsoleMethod(level) {
1682
1705
  switch (level) {
@@ -35249,7 +35272,6 @@ async function request({
35249
35272
  method,
35250
35273
  headers,
35251
35274
  body: payload,
35252
- credentials: "omit",
35253
35275
  signal: controller.signal
35254
35276
  });
35255
35277
  clearTimeout(timeoutId);
@@ -35833,10 +35855,11 @@ function createOneRosterNamespace(client) {
35833
35855
  const url = `${ONEROSTER_ENDPOINTS4.assessmentResults}?filter=${encodeURIComponent(filter)}`;
35834
35856
  const response = await client["request"](url, "GET");
35835
35857
  const results = response.assessmentResults || [];
35836
- if (results.length === 0) {
35858
+ const firstResult = results[0];
35859
+ if (!firstResult) {
35837
35860
  return null;
35838
35861
  }
35839
- let maxAttemptResult = results[0];
35862
+ let maxAttemptResult = firstResult;
35840
35863
  let maxAttemptNumber = maxAttemptResult.metadata?.attemptNumber || 0;
35841
35864
  let activeAttemptCount = 0;
35842
35865
  for (const result of results) {
@@ -35870,10 +35893,11 @@ function createOneRosterNamespace(client) {
35870
35893
  if (!response || !response.users || !Array.isArray(response.users)) {
35871
35894
  throw new Error(`Invalid response format from OneRoster API when searching for user with email: ${email}. ` + `Expected { users: [...] } but received: ${JSON.stringify(response)}`);
35872
35895
  }
35873
- if (response.users.length === 0) {
35896
+ const user = response.users[0];
35897
+ if (!user) {
35874
35898
  throw new Error(`User not found with email: ${email}. ` + `Ensure the user exists in OneRoster and has a valid email address. ` + `If this is a new user, they must be created in OneRoster first.`);
35875
35899
  }
35876
- return response.users[0];
35900
+ return user;
35877
35901
  },
35878
35902
  listBySourcedIds: async (sourcedIds, batchSize = 50) => {
35879
35903
  if (sourcedIds.length === 0) {
@@ -36155,6 +36179,9 @@ class TimebackCache {
36155
36179
  return;
36156
36180
  }
36157
36181
  const oldestKey = this.accessOrder[0];
36182
+ if (!oldestKey) {
36183
+ return;
36184
+ }
36158
36185
  this.delete(oldestKey);
36159
36186
  log.debug(`[${this.name}] Evicted LRU entry`, { key: oldestKey });
36160
36187
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/sandbox",
3
- "version": "0.3.17-beta.19",
3
+ "version": "0.3.17-beta.20",
4
4
  "description": "Local development server for Playcademy game development",
5
5
  "type": "module",
6
6
  "exports": {