@playcademy/sandbox 0.3.12 → 0.3.13

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
@@ -351,11 +351,15 @@ var init_overworld = __esm(() => {
351
351
  var PLATFORM_TIMEZONE = "America/New_York";
352
352
 
353
353
  // ../constants/src/timeback.ts
354
- var TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
355
- var init_timeback2 = () => {};
354
+ var TIMEBACK_ROUTES, TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
355
+ var init_timeback2 = __esm(() => {
356
+ TIMEBACK_ROUTES = {
357
+ END_ACTIVITY: "/integrations/timeback/end-activity"
358
+ };
359
+ });
356
360
 
357
361
  // ../constants/src/workers.ts
358
- var WORKER_NAMING;
362
+ var WORKER_NAMING, SECRETS_PREFIX = "secrets_";
359
363
  var init_workers = __esm(() => {
360
364
  WORKER_NAMING = {
361
365
  STAGING_PREFIX: "staging-",
@@ -1225,7 +1229,7 @@ var package_default;
1225
1229
  var init_package = __esm(() => {
1226
1230
  package_default = {
1227
1231
  name: "@playcademy/sandbox",
1228
- version: "0.3.12",
1232
+ version: "0.3.13",
1229
1233
  description: "Local development server for Playcademy game development",
1230
1234
  type: "module",
1231
1235
  exports: {
@@ -15816,8 +15820,9 @@ class SecretsService {
15816
15820
  }
15817
15821
  }
15818
15822
  }
15819
- var logger21, SECRETS_PREFIX = "secrets_", INTERNAL_SECRET_KEYS;
15823
+ var logger21, INTERNAL_SECRET_KEYS;
15820
15824
  var init_secrets_service = __esm(() => {
15825
+ init_src();
15821
15826
  init_src2();
15822
15827
  init_config2();
15823
15828
  init_errors();
@@ -15826,6 +15831,32 @@ var init_secrets_service = __esm(() => {
15826
15831
  INTERNAL_SECRET_KEYS = ["PLAYCADEMY_API_KEY", "GAME_ID", "PLAYCADEMY_BASE_URL"];
15827
15832
  });
15828
15833
 
15834
+ // ../edge-play/src/constants.ts
15835
+ var ROUTES;
15836
+ var init_constants2 = __esm(() => {
15837
+ init_src();
15838
+ ROUTES = {
15839
+ INDEX: "/api",
15840
+ HEALTH: "/api/health",
15841
+ TIMEBACK: {
15842
+ END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`
15843
+ }
15844
+ };
15845
+ });
15846
+
15847
+ // ../edge-play/src/entry/setup.ts
15848
+ function prefixSecrets(secrets) {
15849
+ const prefixed = {};
15850
+ for (const [key, value] of Object.entries(secrets)) {
15851
+ prefixed[SECRETS_PREFIX + key] = value;
15852
+ }
15853
+ return prefixed;
15854
+ }
15855
+ var init_setup = __esm(() => {
15856
+ init_src();
15857
+ init_constants2();
15858
+ });
15859
+
15829
15860
  // ../api-core/src/services/seed.service.ts
15830
15861
  class SeedService {
15831
15862
  ctx;
@@ -15840,7 +15871,7 @@ class SeedService {
15840
15871
  }
15841
15872
  return cf;
15842
15873
  }
15843
- async seed(slug2, code, user) {
15874
+ async seed(slug2, code, user, secrets) {
15844
15875
  const cf = this.getCloudflare();
15845
15876
  const game = await this.ctx.services.game.validateDeveloperAccessBySlug(user, slug2);
15846
15877
  const isProd = isProduction2(this.ctx.config);
@@ -15852,10 +15883,11 @@ class SeedService {
15852
15883
  gameId: game.id,
15853
15884
  slug: slug2,
15854
15885
  deploymentId,
15855
- codeLength: code.length
15886
+ codeLength: code.length,
15887
+ secretCount: secrets ? Object.keys(secrets).length : 0
15856
15888
  });
15857
15889
  try {
15858
- const workerResponse = await this.deployAndExecuteSeedWorker(cf, seedDeploymentId, game.id, deploymentId, code);
15890
+ const workerResponse = await this.deployAndExecuteSeedWorker(cf, seedDeploymentId, game.id, deploymentId, code, secrets);
15859
15891
  logger22.info("Seed completed", {
15860
15892
  gameId: game.id,
15861
15893
  slug: slug2,
@@ -15927,7 +15959,7 @@ class SeedService {
15927
15959
  });
15928
15960
  }
15929
15961
  }
15930
- async deployAndExecuteSeedWorker(cf, seedDeploymentId, gameId, deploymentId, workerCode) {
15962
+ async deployAndExecuteSeedWorker(cf, seedDeploymentId, gameId, deploymentId, workerCode, secrets) {
15931
15963
  try {
15932
15964
  const result = await cf.deploy(seedDeploymentId, workerCode, {
15933
15965
  GAME_ID: gameId,
@@ -15937,6 +15969,13 @@ class SeedService {
15937
15969
  keepAssets: false
15938
15970
  });
15939
15971
  logger22.info("Worker deployed", { seedDeploymentId, url: result.url });
15972
+ if (secrets && Object.keys(secrets).length > 0) {
15973
+ await cf.setSecrets(seedDeploymentId, prefixSecrets(secrets));
15974
+ logger22.info("Secrets bound to worker", {
15975
+ seedDeploymentId,
15976
+ count: Object.keys(secrets).length
15977
+ });
15978
+ }
15940
15979
  return await this.executeSeedWorker(result.url, seedDeploymentId);
15941
15980
  } finally {
15942
15981
  await this.cleanupSeedWorker(cf, seedDeploymentId);
@@ -16052,6 +16091,7 @@ class SeedService {
16052
16091
  }
16053
16092
  var logger22;
16054
16093
  var init_seed_service = __esm(() => {
16094
+ init_setup();
16055
16095
  init_src2();
16056
16096
  init_config2();
16057
16097
  init_errors();
@@ -16519,7 +16559,7 @@ function isTimebackSubject(value) {
16519
16559
  function isTimebackGrade(value) {
16520
16560
  return typeof value === "number" && Number.isInteger(value) && GRADE_VALUES.includes(value);
16521
16561
  }
16522
- var __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), ACHIEVEMENT_IDS2, ACHIEVEMENT_DEFINITIONS2, init_achievements2, init_auth2 = () => {}, TSC_PACKAGE2 = "@typescript/native-preview", USE_NATIVE_TSC2, init_typescript2, init_character2 = () => {}, PLAYCADEMY_BASE_URLS, init_domains2, init_env_vars2 = () => {}, ITEM_SLUGS2, CURRENCIES2, BADGES2, init_overworld2, TIMEBACK_CALIPER_SENSORS, TIMEBACK_ORG_SOURCED_ID2 = "PLAYCADEMY", TIMEBACK_ORG_NAME = "Playcademy Studios", TIMEBACK_ORG_TYPE = "department", TIMEBACK_COURSE_DEFAULTS, TIMEBACK_RESOURCE_DEFAULTS, TIMEBACK_COMPONENT_DEFAULTS, TIMEBACK_COMPONENT_RESOURCE_DEFAULTS, init_timeback3, init_workers2 = () => {}, init_src5, TIMEBACK_API_URLS, TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_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_constants2, isObject = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES, GRADE_VALUES;
16562
+ var __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), ACHIEVEMENT_IDS2, ACHIEVEMENT_DEFINITIONS2, init_achievements2, init_auth2 = () => {}, TSC_PACKAGE2 = "@typescript/native-preview", USE_NATIVE_TSC2, init_typescript2, init_character2 = () => {}, PLAYCADEMY_BASE_URLS, init_domains2, init_env_vars2 = () => {}, ITEM_SLUGS2, CURRENCIES2, BADGES2, init_overworld2, TIMEBACK_CALIPER_SENSORS, TIMEBACK_ORG_SOURCED_ID2 = "PLAYCADEMY", TIMEBACK_ORG_NAME = "Playcademy Studios", TIMEBACK_ORG_TYPE = "department", TIMEBACK_COURSE_DEFAULTS, TIMEBACK_RESOURCE_DEFAULTS, TIMEBACK_COMPONENT_DEFAULTS, TIMEBACK_COMPONENT_RESOURCE_DEFAULTS, init_timeback3, init_workers2 = () => {}, init_src5, TIMEBACK_API_URLS, TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_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_constants3, isObject = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES, GRADE_VALUES;
16523
16563
  var init_types7 = __esm(() => {
16524
16564
  init_achievements2 = __esm2(() => {
16525
16565
  ACHIEVEMENT_IDS2 = {
@@ -16696,7 +16736,7 @@ var init_types7 = __esm(() => {
16696
16736
  init_timeback3();
16697
16737
  init_workers2();
16698
16738
  });
16699
- init_constants2 = __esm2(() => {
16739
+ init_constants3 = __esm2(() => {
16700
16740
  init_src5();
16701
16741
  TIMEBACK_API_URLS = {
16702
16742
  production: "https://api.alpha-1edtech.ai",
@@ -16871,7 +16911,7 @@ var init_types7 = __esm(() => {
16871
16911
  timebackSdk: "TimebackSDKError"
16872
16912
  };
16873
16913
  });
16874
- init_constants2();
16914
+ init_constants3();
16875
16915
  SUBJECT_VALUES = TIMEBACK_SUBJECTS;
16876
16916
  GRADE_VALUES = TIMEBACK_GRADE_LEVELS;
16877
16917
  });
@@ -20169,7 +20209,7 @@ var __defProp2, __export2 = (target, all) => {
20169
20209
  course: (courseId) => `${base}${ONEROSTER_ENDPOINTS2.courses}/${courseId}`,
20170
20210
  componentResource: (resourceId) => `${base}${ONEROSTER_ENDPOINTS2.componentResources}/${resourceId}`
20171
20211
  };
20172
- }, CALIPER_CONSTANTS2, TIMEBACK_EVENT_TYPES2, TIMEBACK_ACTIONS2, TIMEBACK_TYPES2, ACTIVITY_METRIC_TYPES2, TIME_METRIC_TYPES2, TIMEBACK_SUBJECTS2, TIMEBACK_GRADE_LEVELS2, TIMEBACK_GRADE_LEVEL_LABELS2, CALIPER_SUBJECTS2, ONEROSTER_STATUS2, SCORE_STATUS2, ENV_VARS2, HTTP_DEFAULTS2, AUTH_DEFAULTS2, CACHE_DEFAULTS2, CONFIG_DEFAULTS2, PLAYCADEMY_DEFAULTS2, RESOURCE_DEFAULTS2, HTTP_STATUS2, ERROR_NAMES2, init_constants3, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, isObject2 = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES2, GRADE_VALUES2, isBrowser2 = () => {
20212
+ }, CALIPER_CONSTANTS2, TIMEBACK_EVENT_TYPES2, TIMEBACK_ACTIONS2, TIMEBACK_TYPES2, ACTIVITY_METRIC_TYPES2, TIME_METRIC_TYPES2, TIMEBACK_SUBJECTS2, TIMEBACK_GRADE_LEVELS2, TIMEBACK_GRADE_LEVEL_LABELS2, CALIPER_SUBJECTS2, ONEROSTER_STATUS2, SCORE_STATUS2, ENV_VARS2, HTTP_DEFAULTS2, AUTH_DEFAULTS2, CACHE_DEFAULTS2, CONFIG_DEFAULTS2, PLAYCADEMY_DEFAULTS2, RESOURCE_DEFAULTS2, HTTP_STATUS2, ERROR_NAMES2, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, isObject2 = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES2, GRADE_VALUES2, isBrowser2 = () => {
20173
20213
  const g = globalThis;
20174
20214
  return typeof g.window !== "undefined" && typeof g.document !== "undefined";
20175
20215
  }, isProduction3 = () => {
@@ -20708,7 +20748,7 @@ var init_dist3 = __esm(() => {
20708
20748
  init_timeback4();
20709
20749
  init_workers3();
20710
20750
  });
20711
- init_constants3 = __esm3(() => {
20751
+ init_constants4 = __esm3(() => {
20712
20752
  init_src6();
20713
20753
  TIMEBACK_API_URLS2 = {
20714
20754
  production: "https://api.alpha-1edtech.ai",
@@ -20889,9 +20929,9 @@ var init_dist3 = __esm(() => {
20889
20929
  fetchTimebackConfig: () => fetchTimebackConfig
20890
20930
  });
20891
20931
  init_verify = __esm3(() => {
20892
- init_constants3();
20932
+ init_constants4();
20893
20933
  });
20894
- init_constants3();
20934
+ init_constants4();
20895
20935
  TimebackError = class TimebackError extends Error {
20896
20936
  constructor(message) {
20897
20937
  super(message);
@@ -20948,7 +20988,7 @@ var init_dist3 = __esm(() => {
20948
20988
  Object.setPrototypeOf(this, ResourceNotFoundError.prototype);
20949
20989
  }
20950
20990
  };
20951
- init_constants3();
20991
+ init_constants4();
20952
20992
  SUBJECT_VALUES2 = TIMEBACK_SUBJECTS2;
20953
20993
  GRADE_VALUES2 = TIMEBACK_GRADE_LEVELS2;
20954
20994
  colors3 = {
@@ -20969,8 +21009,8 @@ var init_dist3 = __esm(() => {
20969
21009
  };
20970
21010
  log3 = createLogger2();
20971
21011
  init_verify();
20972
- init_constants3();
20973
- init_constants3();
21012
+ init_constants4();
21013
+ init_constants4();
20974
21014
  if (process.env.DEBUG === "true") {
20975
21015
  process.env.TERM = "dumb";
20976
21016
  }
@@ -20982,13 +21022,13 @@ var init_dist3 = __esm(() => {
20982
21022
  this.name = ERROR_NAMES2.timebackAuth;
20983
21023
  }
20984
21024
  };
20985
- init_constants3();
20986
- init_constants3();
20987
- init_constants3();
20988
- init_constants3();
20989
- init_constants3();
20990
- init_constants3();
20991
- init_constants3();
21025
+ init_constants4();
21026
+ init_constants4();
21027
+ init_constants4();
21028
+ init_constants4();
21029
+ init_constants4();
21030
+ init_constants4();
21031
+ init_constants4();
20992
21032
  exports_external2 = {};
20993
21033
  __export2(exports_external2, {
20994
21034
  void: () => voidType2,
@@ -24546,7 +24586,7 @@ var init_http_exception = () => {};
24546
24586
 
24547
24587
  // ../../node_modules/hono/dist/request/constants.js
24548
24588
  var GET_MATCH_RESULT;
24549
- var init_constants4 = __esm(() => {
24589
+ var init_constants5 = __esm(() => {
24550
24590
  GET_MATCH_RESULT = Symbol();
24551
24591
  });
24552
24592
 
@@ -24810,7 +24850,7 @@ var init_url = __esm(() => {
24810
24850
  var tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_), HonoRequest;
24811
24851
  var init_request = __esm(() => {
24812
24852
  init_http_exception();
24813
- init_constants4();
24853
+ init_constants5();
24814
24854
  init_body();
24815
24855
  init_url();
24816
24856
  HonoRequest = class {
@@ -25140,7 +25180,7 @@ var init_router = __esm(() => {
25140
25180
 
25141
25181
  // ../../node_modules/hono/dist/utils/constants.js
25142
25182
  var COMPOSED_HANDLER = "__COMPOSED_HANDLER";
25143
- var init_constants5 = () => {};
25183
+ var init_constants6 = () => {};
25144
25184
 
25145
25185
  // ../../node_modules/hono/dist/hono-base.js
25146
25186
  var notFoundHandler = (c) => {
@@ -25362,7 +25402,7 @@ var init_hono_base = __esm(() => {
25362
25402
  init_compose();
25363
25403
  init_context2();
25364
25404
  init_router();
25365
- init_constants5();
25405
+ init_constants6();
25366
25406
  init_url();
25367
25407
  });
25368
25408
 
@@ -82719,7 +82759,8 @@ var init_schemas3 = __esm(() => {
82719
82759
  });
82720
82760
  SetSecretsRequestSchema = exports_external.record(exports_external.string().min(1), exports_external.string());
82721
82761
  SeedRequestSchema = exports_external.object({
82722
- code: exports_external.string().min(1, "Seed code is required")
82762
+ code: exports_external.string().min(1, "Seed code is required"),
82763
+ secrets: exports_external.record(exports_external.string(), exports_external.string()).optional()
82723
82764
  });
82724
82765
  SchemaInfoSchema = exports_external.object({
82725
82766
  sql: exports_external.string(),
@@ -93884,8 +93925,13 @@ var init_seed_controller = __esm(() => {
93884
93925
  }
93885
93926
  throw ApiError.badRequest("Invalid JSON body");
93886
93927
  }
93887
- logger55.debug("Seeding database", { userId: ctx.user.id, slug: slug2, codeLength: body2.code.length });
93888
- return ctx.services.seed.seed(slug2, body2.code, ctx.user);
93928
+ logger55.debug("Seeding database", {
93929
+ userId: ctx.user.id,
93930
+ slug: slug2,
93931
+ codeLength: body2.code.length,
93932
+ secretCount: body2.secrets ? Object.keys(body2.secrets).length : 0
93933
+ });
93934
+ return ctx.services.seed.seed(slug2, body2.code, ctx.user, body2.secrets);
93889
93935
  });
93890
93936
  });
93891
93937
 
package/dist/constants.js CHANGED
@@ -197,11 +197,15 @@ var init_overworld = __esm(() => {
197
197
  var PLATFORM_TIMEZONE = "America/New_York";
198
198
 
199
199
  // ../constants/src/timeback.ts
200
- var TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
201
- var init_timeback = () => {};
200
+ var TIMEBACK_ROUTES, TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
201
+ var init_timeback = __esm(() => {
202
+ TIMEBACK_ROUTES = {
203
+ END_ACTIVITY: "/integrations/timeback/end-activity"
204
+ };
205
+ });
202
206
 
203
207
  // ../constants/src/workers.ts
204
- var WORKER_NAMING;
208
+ var WORKER_NAMING, SECRETS_PREFIX = "secrets_";
205
209
  var init_workers = __esm(() => {
206
210
  WORKER_NAMING = {
207
211
  STAGING_PREFIX: "staging-",
package/dist/server.js CHANGED
@@ -350,11 +350,15 @@ var init_overworld = __esm(() => {
350
350
  var PLATFORM_TIMEZONE = "America/New_York";
351
351
 
352
352
  // ../constants/src/timeback.ts
353
- var TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
354
- var init_timeback2 = () => {};
353
+ var TIMEBACK_ROUTES, TIMEBACK_ORG_SOURCED_ID = "PLAYCADEMY";
354
+ var init_timeback2 = __esm(() => {
355
+ TIMEBACK_ROUTES = {
356
+ END_ACTIVITY: "/integrations/timeback/end-activity"
357
+ };
358
+ });
355
359
 
356
360
  // ../constants/src/workers.ts
357
- var WORKER_NAMING;
361
+ var WORKER_NAMING, SECRETS_PREFIX = "secrets_";
358
362
  var init_workers = __esm(() => {
359
363
  WORKER_NAMING = {
360
364
  STAGING_PREFIX: "staging-",
@@ -1224,7 +1228,7 @@ var package_default;
1224
1228
  var init_package = __esm(() => {
1225
1229
  package_default = {
1226
1230
  name: "@playcademy/sandbox",
1227
- version: "0.3.12",
1231
+ version: "0.3.13",
1228
1232
  description: "Local development server for Playcademy game development",
1229
1233
  type: "module",
1230
1234
  exports: {
@@ -15815,8 +15819,9 @@ class SecretsService {
15815
15819
  }
15816
15820
  }
15817
15821
  }
15818
- var logger21, SECRETS_PREFIX = "secrets_", INTERNAL_SECRET_KEYS;
15822
+ var logger21, INTERNAL_SECRET_KEYS;
15819
15823
  var init_secrets_service = __esm(() => {
15824
+ init_src();
15820
15825
  init_src2();
15821
15826
  init_config2();
15822
15827
  init_errors();
@@ -15825,6 +15830,32 @@ var init_secrets_service = __esm(() => {
15825
15830
  INTERNAL_SECRET_KEYS = ["PLAYCADEMY_API_KEY", "GAME_ID", "PLAYCADEMY_BASE_URL"];
15826
15831
  });
15827
15832
 
15833
+ // ../edge-play/src/constants.ts
15834
+ var ROUTES;
15835
+ var init_constants2 = __esm(() => {
15836
+ init_src();
15837
+ ROUTES = {
15838
+ INDEX: "/api",
15839
+ HEALTH: "/api/health",
15840
+ TIMEBACK: {
15841
+ END_ACTIVITY: `/api${TIMEBACK_ROUTES.END_ACTIVITY}`
15842
+ }
15843
+ };
15844
+ });
15845
+
15846
+ // ../edge-play/src/entry/setup.ts
15847
+ function prefixSecrets(secrets) {
15848
+ const prefixed = {};
15849
+ for (const [key, value] of Object.entries(secrets)) {
15850
+ prefixed[SECRETS_PREFIX + key] = value;
15851
+ }
15852
+ return prefixed;
15853
+ }
15854
+ var init_setup = __esm(() => {
15855
+ init_src();
15856
+ init_constants2();
15857
+ });
15858
+
15828
15859
  // ../api-core/src/services/seed.service.ts
15829
15860
  class SeedService {
15830
15861
  ctx;
@@ -15839,7 +15870,7 @@ class SeedService {
15839
15870
  }
15840
15871
  return cf;
15841
15872
  }
15842
- async seed(slug2, code, user) {
15873
+ async seed(slug2, code, user, secrets) {
15843
15874
  const cf = this.getCloudflare();
15844
15875
  const game = await this.ctx.services.game.validateDeveloperAccessBySlug(user, slug2);
15845
15876
  const isProd = isProduction2(this.ctx.config);
@@ -15851,10 +15882,11 @@ class SeedService {
15851
15882
  gameId: game.id,
15852
15883
  slug: slug2,
15853
15884
  deploymentId,
15854
- codeLength: code.length
15885
+ codeLength: code.length,
15886
+ secretCount: secrets ? Object.keys(secrets).length : 0
15855
15887
  });
15856
15888
  try {
15857
- const workerResponse = await this.deployAndExecuteSeedWorker(cf, seedDeploymentId, game.id, deploymentId, code);
15889
+ const workerResponse = await this.deployAndExecuteSeedWorker(cf, seedDeploymentId, game.id, deploymentId, code, secrets);
15858
15890
  logger22.info("Seed completed", {
15859
15891
  gameId: game.id,
15860
15892
  slug: slug2,
@@ -15926,7 +15958,7 @@ class SeedService {
15926
15958
  });
15927
15959
  }
15928
15960
  }
15929
- async deployAndExecuteSeedWorker(cf, seedDeploymentId, gameId, deploymentId, workerCode) {
15961
+ async deployAndExecuteSeedWorker(cf, seedDeploymentId, gameId, deploymentId, workerCode, secrets) {
15930
15962
  try {
15931
15963
  const result = await cf.deploy(seedDeploymentId, workerCode, {
15932
15964
  GAME_ID: gameId,
@@ -15936,6 +15968,13 @@ class SeedService {
15936
15968
  keepAssets: false
15937
15969
  });
15938
15970
  logger22.info("Worker deployed", { seedDeploymentId, url: result.url });
15971
+ if (secrets && Object.keys(secrets).length > 0) {
15972
+ await cf.setSecrets(seedDeploymentId, prefixSecrets(secrets));
15973
+ logger22.info("Secrets bound to worker", {
15974
+ seedDeploymentId,
15975
+ count: Object.keys(secrets).length
15976
+ });
15977
+ }
15939
15978
  return await this.executeSeedWorker(result.url, seedDeploymentId);
15940
15979
  } finally {
15941
15980
  await this.cleanupSeedWorker(cf, seedDeploymentId);
@@ -16051,6 +16090,7 @@ class SeedService {
16051
16090
  }
16052
16091
  var logger22;
16053
16092
  var init_seed_service = __esm(() => {
16093
+ init_setup();
16054
16094
  init_src2();
16055
16095
  init_config2();
16056
16096
  init_errors();
@@ -16518,7 +16558,7 @@ function isTimebackSubject(value) {
16518
16558
  function isTimebackGrade(value) {
16519
16559
  return typeof value === "number" && Number.isInteger(value) && GRADE_VALUES.includes(value);
16520
16560
  }
16521
- var __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), ACHIEVEMENT_IDS2, ACHIEVEMENT_DEFINITIONS2, init_achievements2, init_auth2 = () => {}, TSC_PACKAGE2 = "@typescript/native-preview", USE_NATIVE_TSC2, init_typescript2, init_character2 = () => {}, PLAYCADEMY_BASE_URLS, init_domains2, init_env_vars2 = () => {}, ITEM_SLUGS2, CURRENCIES2, BADGES2, init_overworld2, TIMEBACK_CALIPER_SENSORS, TIMEBACK_ORG_SOURCED_ID2 = "PLAYCADEMY", TIMEBACK_ORG_NAME = "Playcademy Studios", TIMEBACK_ORG_TYPE = "department", TIMEBACK_COURSE_DEFAULTS, TIMEBACK_RESOURCE_DEFAULTS, TIMEBACK_COMPONENT_DEFAULTS, TIMEBACK_COMPONENT_RESOURCE_DEFAULTS, init_timeback3, init_workers2 = () => {}, init_src5, TIMEBACK_API_URLS, TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_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_constants2, isObject = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES, GRADE_VALUES;
16561
+ var __esm2 = (fn, res) => () => (fn && (res = fn(fn = 0)), res), ACHIEVEMENT_IDS2, ACHIEVEMENT_DEFINITIONS2, init_achievements2, init_auth2 = () => {}, TSC_PACKAGE2 = "@typescript/native-preview", USE_NATIVE_TSC2, init_typescript2, init_character2 = () => {}, PLAYCADEMY_BASE_URLS, init_domains2, init_env_vars2 = () => {}, ITEM_SLUGS2, CURRENCIES2, BADGES2, init_overworld2, TIMEBACK_CALIPER_SENSORS, TIMEBACK_ORG_SOURCED_ID2 = "PLAYCADEMY", TIMEBACK_ORG_NAME = "Playcademy Studios", TIMEBACK_ORG_TYPE = "department", TIMEBACK_COURSE_DEFAULTS, TIMEBACK_RESOURCE_DEFAULTS, TIMEBACK_COMPONENT_DEFAULTS, TIMEBACK_COMPONENT_RESOURCE_DEFAULTS, init_timeback3, init_workers2 = () => {}, init_src5, TIMEBACK_API_URLS, TIMEBACK_AUTH_URLS, CALIPER_API_URLS, ONEROSTER_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_constants3, isObject = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES, GRADE_VALUES;
16522
16562
  var init_types7 = __esm(() => {
16523
16563
  init_achievements2 = __esm2(() => {
16524
16564
  ACHIEVEMENT_IDS2 = {
@@ -16695,7 +16735,7 @@ var init_types7 = __esm(() => {
16695
16735
  init_timeback3();
16696
16736
  init_workers2();
16697
16737
  });
16698
- init_constants2 = __esm2(() => {
16738
+ init_constants3 = __esm2(() => {
16699
16739
  init_src5();
16700
16740
  TIMEBACK_API_URLS = {
16701
16741
  production: "https://api.alpha-1edtech.ai",
@@ -16870,7 +16910,7 @@ var init_types7 = __esm(() => {
16870
16910
  timebackSdk: "TimebackSDKError"
16871
16911
  };
16872
16912
  });
16873
- init_constants2();
16913
+ init_constants3();
16874
16914
  SUBJECT_VALUES = TIMEBACK_SUBJECTS;
16875
16915
  GRADE_VALUES = TIMEBACK_GRADE_LEVELS;
16876
16916
  });
@@ -20168,7 +20208,7 @@ var __defProp2, __export2 = (target, all) => {
20168
20208
  course: (courseId) => `${base}${ONEROSTER_ENDPOINTS2.courses}/${courseId}`,
20169
20209
  componentResource: (resourceId) => `${base}${ONEROSTER_ENDPOINTS2.componentResources}/${resourceId}`
20170
20210
  };
20171
- }, CALIPER_CONSTANTS2, TIMEBACK_EVENT_TYPES2, TIMEBACK_ACTIONS2, TIMEBACK_TYPES2, ACTIVITY_METRIC_TYPES2, TIME_METRIC_TYPES2, TIMEBACK_SUBJECTS2, TIMEBACK_GRADE_LEVELS2, TIMEBACK_GRADE_LEVEL_LABELS2, CALIPER_SUBJECTS2, ONEROSTER_STATUS2, SCORE_STATUS2, ENV_VARS2, HTTP_DEFAULTS2, AUTH_DEFAULTS2, CACHE_DEFAULTS2, CONFIG_DEFAULTS2, PLAYCADEMY_DEFAULTS2, RESOURCE_DEFAULTS2, HTTP_STATUS2, ERROR_NAMES2, init_constants3, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, isObject2 = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES2, GRADE_VALUES2, isBrowser2 = () => {
20211
+ }, CALIPER_CONSTANTS2, TIMEBACK_EVENT_TYPES2, TIMEBACK_ACTIONS2, TIMEBACK_TYPES2, ACTIVITY_METRIC_TYPES2, TIME_METRIC_TYPES2, TIMEBACK_SUBJECTS2, TIMEBACK_GRADE_LEVELS2, TIMEBACK_GRADE_LEVEL_LABELS2, CALIPER_SUBJECTS2, ONEROSTER_STATUS2, SCORE_STATUS2, ENV_VARS2, HTTP_DEFAULTS2, AUTH_DEFAULTS2, CACHE_DEFAULTS2, CONFIG_DEFAULTS2, PLAYCADEMY_DEFAULTS2, RESOURCE_DEFAULTS2, HTTP_STATUS2, ERROR_NAMES2, init_constants4, exports_verify, init_verify, TimebackError, TimebackApiError, TimebackAuthenticationError, StudentNotFoundError, ConfigurationError, ResourceNotFoundError, isObject2 = (value) => typeof value === "object" && value !== null, SUBJECT_VALUES2, GRADE_VALUES2, isBrowser2 = () => {
20172
20212
  const g = globalThis;
20173
20213
  return typeof g.window !== "undefined" && typeof g.document !== "undefined";
20174
20214
  }, isProduction3 = () => {
@@ -20707,7 +20747,7 @@ var init_dist3 = __esm(() => {
20707
20747
  init_timeback4();
20708
20748
  init_workers3();
20709
20749
  });
20710
- init_constants3 = __esm3(() => {
20750
+ init_constants4 = __esm3(() => {
20711
20751
  init_src6();
20712
20752
  TIMEBACK_API_URLS2 = {
20713
20753
  production: "https://api.alpha-1edtech.ai",
@@ -20888,9 +20928,9 @@ var init_dist3 = __esm(() => {
20888
20928
  fetchTimebackConfig: () => fetchTimebackConfig
20889
20929
  });
20890
20930
  init_verify = __esm3(() => {
20891
- init_constants3();
20931
+ init_constants4();
20892
20932
  });
20893
- init_constants3();
20933
+ init_constants4();
20894
20934
  TimebackError = class TimebackError extends Error {
20895
20935
  constructor(message) {
20896
20936
  super(message);
@@ -20947,7 +20987,7 @@ var init_dist3 = __esm(() => {
20947
20987
  Object.setPrototypeOf(this, ResourceNotFoundError.prototype);
20948
20988
  }
20949
20989
  };
20950
- init_constants3();
20990
+ init_constants4();
20951
20991
  SUBJECT_VALUES2 = TIMEBACK_SUBJECTS2;
20952
20992
  GRADE_VALUES2 = TIMEBACK_GRADE_LEVELS2;
20953
20993
  colors3 = {
@@ -20968,8 +21008,8 @@ var init_dist3 = __esm(() => {
20968
21008
  };
20969
21009
  log3 = createLogger2();
20970
21010
  init_verify();
20971
- init_constants3();
20972
- init_constants3();
21011
+ init_constants4();
21012
+ init_constants4();
20973
21013
  if (process.env.DEBUG === "true") {
20974
21014
  process.env.TERM = "dumb";
20975
21015
  }
@@ -20981,13 +21021,13 @@ var init_dist3 = __esm(() => {
20981
21021
  this.name = ERROR_NAMES2.timebackAuth;
20982
21022
  }
20983
21023
  };
20984
- init_constants3();
20985
- init_constants3();
20986
- init_constants3();
20987
- init_constants3();
20988
- init_constants3();
20989
- init_constants3();
20990
- init_constants3();
21024
+ init_constants4();
21025
+ init_constants4();
21026
+ init_constants4();
21027
+ init_constants4();
21028
+ init_constants4();
21029
+ init_constants4();
21030
+ init_constants4();
20991
21031
  exports_external2 = {};
20992
21032
  __export2(exports_external2, {
20993
21033
  void: () => voidType2,
@@ -24545,7 +24585,7 @@ var init_http_exception = () => {};
24545
24585
 
24546
24586
  // ../../node_modules/hono/dist/request/constants.js
24547
24587
  var GET_MATCH_RESULT;
24548
- var init_constants4 = __esm(() => {
24588
+ var init_constants5 = __esm(() => {
24549
24589
  GET_MATCH_RESULT = Symbol();
24550
24590
  });
24551
24591
 
@@ -24809,7 +24849,7 @@ var init_url = __esm(() => {
24809
24849
  var tryDecodeURIComponent = (str) => tryDecode(str, decodeURIComponent_), HonoRequest;
24810
24850
  var init_request = __esm(() => {
24811
24851
  init_http_exception();
24812
- init_constants4();
24852
+ init_constants5();
24813
24853
  init_body();
24814
24854
  init_url();
24815
24855
  HonoRequest = class {
@@ -25139,7 +25179,7 @@ var init_router = __esm(() => {
25139
25179
 
25140
25180
  // ../../node_modules/hono/dist/utils/constants.js
25141
25181
  var COMPOSED_HANDLER = "__COMPOSED_HANDLER";
25142
- var init_constants5 = () => {};
25182
+ var init_constants6 = () => {};
25143
25183
 
25144
25184
  // ../../node_modules/hono/dist/hono-base.js
25145
25185
  var notFoundHandler = (c) => {
@@ -25361,7 +25401,7 @@ var init_hono_base = __esm(() => {
25361
25401
  init_compose();
25362
25402
  init_context2();
25363
25403
  init_router();
25364
- init_constants5();
25404
+ init_constants6();
25365
25405
  init_url();
25366
25406
  });
25367
25407
 
@@ -82718,7 +82758,8 @@ var init_schemas3 = __esm(() => {
82718
82758
  });
82719
82759
  SetSecretsRequestSchema = exports_external.record(exports_external.string().min(1), exports_external.string());
82720
82760
  SeedRequestSchema = exports_external.object({
82721
- code: exports_external.string().min(1, "Seed code is required")
82761
+ code: exports_external.string().min(1, "Seed code is required"),
82762
+ secrets: exports_external.record(exports_external.string(), exports_external.string()).optional()
82722
82763
  });
82723
82764
  SchemaInfoSchema = exports_external.object({
82724
82765
  sql: exports_external.string(),
@@ -93883,8 +93924,13 @@ var init_seed_controller = __esm(() => {
93883
93924
  }
93884
93925
  throw ApiError.badRequest("Invalid JSON body");
93885
93926
  }
93886
- logger55.debug("Seeding database", { userId: ctx.user.id, slug: slug2, codeLength: body2.code.length });
93887
- return ctx.services.seed.seed(slug2, body2.code, ctx.user);
93927
+ logger55.debug("Seeding database", {
93928
+ userId: ctx.user.id,
93929
+ slug: slug2,
93930
+ codeLength: body2.code.length,
93931
+ secretCount: body2.secrets ? Object.keys(body2.secrets).length : 0
93932
+ });
93933
+ return ctx.services.seed.seed(slug2, body2.code, ctx.user, body2.secrets);
93888
93934
  });
93889
93935
  });
93890
93936
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcademy/sandbox",
3
- "version": "0.3.12",
3
+ "version": "0.3.13",
4
4
  "description": "Local development server for Playcademy game development",
5
5
  "type": "module",
6
6
  "exports": {