@playdrop/playdrop-cli 0.16.12 → 0.17.0

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.
Files changed (364) hide show
  1. package/config/client-meta.json +4 -4
  2. package/dist/apiClient.d.ts +1 -2
  3. package/dist/apiClient.js +1 -16
  4. package/dist/appUrls.js +4 -0
  5. package/dist/apps/build.d.ts +12 -4
  6. package/dist/apps/build.js +55 -22
  7. package/dist/apps/index.d.ts +2 -1
  8. package/dist/apps/index.js +4 -1
  9. package/dist/apps/loadCheck.d.ts +5 -1
  10. package/dist/apps/loadCheck.js +52 -18
  11. package/dist/apps/serverBuild.d.ts +17 -0
  12. package/dist/apps/serverBuild.js +155 -0
  13. package/dist/apps/staticHtml.d.ts +1 -0
  14. package/dist/apps/staticHtml.js +19 -10
  15. package/dist/apps/upload.d.ts +12 -2
  16. package/dist/apps/upload.js +127 -46
  17. package/dist/catalogue.d.ts +23 -1
  18. package/dist/catalogue.js +126 -100
  19. package/dist/commandContext.d.ts +6 -3
  20. package/dist/commandContext.js +108 -18
  21. package/dist/commands/build.js +0 -7
  22. package/dist/commands/captureListing.d.ts +3 -0
  23. package/dist/commands/captureListing.js +48 -4
  24. package/dist/commands/chat.d.ts +4 -7
  25. package/dist/commands/chat.js +165 -77
  26. package/dist/commands/check.js +34 -1
  27. package/dist/commands/create.js +30 -263
  28. package/dist/commands/dev.js +37 -3
  29. package/dist/commands/devBrowser.js +2 -2
  30. package/dist/commands/devGameServer.d.ts +16 -0
  31. package/dist/commands/devGameServer.js +237 -0
  32. package/dist/commands/devRuntimeAssets.d.ts +1 -0
  33. package/dist/commands/devRuntimeAssets.js +2 -0
  34. package/dist/commands/devServer.d.ts +3 -0
  35. package/dist/commands/devServer.js +111 -5
  36. package/dist/commands/generation.d.ts +33 -4
  37. package/dist/commands/generation.js +304 -115
  38. package/dist/commands/login.js +23 -7
  39. package/dist/commands/review.d.ts +1 -1
  40. package/dist/commands/review.js +68 -95
  41. package/dist/commands/source.d.ts +19 -0
  42. package/dist/commands/source.js +142 -0
  43. package/dist/commands/tweaks.js +5 -11
  44. package/dist/commands/upload-content.d.ts +1 -1
  45. package/dist/commands/upload-content.js +16 -12
  46. package/dist/commands/upload.d.ts +17 -1
  47. package/dist/commands/upload.js +47 -10
  48. package/dist/commands/worker/archive-staging.d.ts +1 -0
  49. package/dist/commands/worker/archive-staging.js +13 -2
  50. package/dist/commands/worker/e2e-fixtures.d.ts +32 -0
  51. package/dist/commands/worker/e2e-fixtures.js +466 -0
  52. package/dist/commands/worker/game-server-infra.d.ts +80 -0
  53. package/dist/commands/worker/game-server-infra.js +595 -0
  54. package/dist/commands/worker/game-source-git.d.ts +126 -0
  55. package/dist/commands/worker/game-source-git.js +780 -0
  56. package/dist/commands/worker/generation.d.ts +94 -0
  57. package/dist/commands/worker/generation.js +1458 -0
  58. package/dist/commands/worker/provider-telemetry.js +1 -1
  59. package/dist/commands/worker/runtime.d.ts +8 -10
  60. package/dist/commands/worker/runtime.js +53 -48
  61. package/dist/commands/worker.d.ts +79 -19
  62. package/dist/commands/worker.js +1796 -419
  63. package/dist/config.d.ts +2 -0
  64. package/dist/config.js +16 -3
  65. package/dist/environment.d.ts +0 -1
  66. package/dist/environment.js +0 -8
  67. package/dist/index.js +92 -22
  68. package/dist/workerAppProject.d.ts +1 -1
  69. package/dist/workerAppProject.js +15 -2
  70. package/node_modules/@playdrop/api-client/dist/client.d.ts +143 -39
  71. package/node_modules/@playdrop/api-client/dist/client.d.ts.map +1 -1
  72. package/node_modules/@playdrop/api-client/dist/client.js +33 -0
  73. package/node_modules/@playdrop/api-client/dist/core/request.d.ts +1 -0
  74. package/node_modules/@playdrop/api-client/dist/core/request.d.ts.map +1 -1
  75. package/node_modules/@playdrop/api-client/dist/core/request.js +17 -11
  76. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts +51 -6
  77. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts.map +1 -1
  78. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.js +338 -41
  79. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts +24 -1
  80. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts.map +1 -1
  81. package/node_modules/@playdrop/api-client/dist/domains/ai.js +20 -0
  82. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts +13 -8
  83. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts.map +1 -1
  84. package/node_modules/@playdrop/api-client/dist/domains/apps.js +158 -90
  85. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts +4 -0
  86. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts.map +1 -1
  87. package/node_modules/@playdrop/api-client/dist/domains/assets.js +27 -0
  88. package/node_modules/@playdrop/api-client/dist/domains/chat.d.ts +152 -21
  89. package/node_modules/@playdrop/api-client/dist/domains/chat.d.ts.map +1 -1
  90. package/node_modules/@playdrop/api-client/dist/domains/chat.js +477 -100
  91. package/node_modules/@playdrop/api-client/dist/domains/player-meta.d.ts +2 -1
  92. package/node_modules/@playdrop/api-client/dist/domains/player-meta.d.ts.map +1 -1
  93. package/node_modules/@playdrop/api-client/dist/domains/player-meta.js +9 -0
  94. package/node_modules/@playdrop/api-client/dist/domains/playtrade.d.ts +1 -2
  95. package/node_modules/@playdrop/api-client/dist/domains/playtrade.d.ts.map +1 -1
  96. package/node_modules/@playdrop/api-client/dist/domains/playtrade.js +0 -11
  97. package/node_modules/@playdrop/api-client/dist/domains/social.d.ts +29 -0
  98. package/node_modules/@playdrop/api-client/dist/domains/social.d.ts.map +1 -0
  99. package/node_modules/@playdrop/api-client/dist/domains/social.js +79 -0
  100. package/node_modules/@playdrop/api-client/dist/index.d.ts +81 -30
  101. package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
  102. package/node_modules/@playdrop/api-client/dist/index.js +217 -56
  103. package/node_modules/@playdrop/api-client/dist/runtime.d.ts +18 -0
  104. package/node_modules/@playdrop/api-client/dist/runtime.d.ts.map +1 -0
  105. package/node_modules/@playdrop/api-client/dist/runtime.js +54 -0
  106. package/node_modules/@playdrop/api-client/package.json +7 -0
  107. package/node_modules/@playdrop/config/client-meta.json +4 -4
  108. package/node_modules/@playdrop/config/dist/src/creator-plans.d.ts +11 -0
  109. package/node_modules/@playdrop/config/dist/src/creator-plans.d.ts.map +1 -1
  110. package/node_modules/@playdrop/config/dist/src/creator-plans.js +13 -1
  111. package/node_modules/@playdrop/config/dist/src/deployment.d.ts +0 -1
  112. package/node_modules/@playdrop/config/dist/src/deployment.d.ts.map +1 -1
  113. package/node_modules/@playdrop/config/dist/src/deployment.js +0 -8
  114. package/node_modules/@playdrop/config/dist/src/public-deployment.d.ts +0 -1
  115. package/node_modules/@playdrop/config/dist/src/public-deployment.d.ts.map +1 -1
  116. package/node_modules/@playdrop/config/dist/src/public-deployment.js +0 -8
  117. package/node_modules/@playdrop/config/dist/src/runtime-service-origins.d.ts +1 -1
  118. package/node_modules/@playdrop/config/dist/src/runtime-service-origins.js +2 -2
  119. package/node_modules/@playdrop/config/dist/src/server/logging.d.ts.map +1 -1
  120. package/node_modules/@playdrop/config/dist/src/server/logging.js +31 -2
  121. package/node_modules/@playdrop/config/dist/test/creator-plans.test.js +10 -0
  122. package/node_modules/@playdrop/config/dist/test/deployment.test.js +0 -4
  123. package/node_modules/@playdrop/config/dist/test/runtime-service-origins.test.js +2 -0
  124. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  125. package/node_modules/@playdrop/config/package.json +6 -0
  126. package/node_modules/@playdrop/game-source-git/dist/src/archive.d.ts +9 -0
  127. package/node_modules/@playdrop/game-source-git/dist/src/archive.d.ts.map +1 -0
  128. package/node_modules/@playdrop/game-source-git/dist/src/archive.js +107 -0
  129. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.d.ts +29 -0
  130. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.d.ts.map +1 -0
  131. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.js +64 -0
  132. package/node_modules/@playdrop/game-source-git/dist/src/export.d.ts +8 -0
  133. package/node_modules/@playdrop/game-source-git/dist/src/export.d.ts.map +1 -0
  134. package/node_modules/@playdrop/game-source-git/dist/src/export.js +25 -0
  135. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts +39 -0
  136. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts.map +1 -0
  137. package/node_modules/@playdrop/game-source-git/dist/src/git.js +195 -0
  138. package/node_modules/@playdrop/game-source-git/dist/src/ignore.d.ts +6 -0
  139. package/node_modules/@playdrop/game-source-git/dist/src/ignore.d.ts.map +1 -0
  140. package/node_modules/@playdrop/game-source-git/dist/src/ignore.js +51 -0
  141. package/node_modules/@playdrop/game-source-git/dist/src/index.d.ts +10 -0
  142. package/node_modules/@playdrop/game-source-git/dist/src/index.d.ts.map +1 -0
  143. package/node_modules/@playdrop/{boxel-core/dist/src/humanoid/r15 → game-source-git/dist/src}/index.js +9 -4
  144. package/node_modules/@playdrop/game-source-git/dist/src/lock.d.ts +17 -0
  145. package/node_modules/@playdrop/game-source-git/dist/src/lock.d.ts.map +1 -0
  146. package/node_modules/@playdrop/game-source-git/dist/src/lock.js +72 -0
  147. package/node_modules/@playdrop/game-source-git/dist/src/materialize.d.ts +10 -0
  148. package/node_modules/@playdrop/game-source-git/dist/src/materialize.d.ts.map +1 -0
  149. package/node_modules/@playdrop/game-source-git/dist/src/materialize.js +99 -0
  150. package/node_modules/@playdrop/game-source-git/dist/src/paths.d.ts +24 -0
  151. package/node_modules/@playdrop/game-source-git/dist/src/paths.d.ts.map +1 -0
  152. package/node_modules/@playdrop/game-source-git/dist/src/paths.js +207 -0
  153. package/node_modules/@playdrop/game-source-git/dist/src/repository.d.ts +66 -0
  154. package/node_modules/@playdrop/game-source-git/dist/src/repository.d.ts.map +1 -0
  155. package/node_modules/@playdrop/game-source-git/dist/src/repository.js +213 -0
  156. package/node_modules/@playdrop/game-source-git/dist/test/core.test.d.ts +2 -0
  157. package/node_modules/@playdrop/game-source-git/dist/test/core.test.d.ts.map +1 -0
  158. package/node_modules/@playdrop/game-source-git/dist/test/core.test.js +441 -0
  159. package/node_modules/@playdrop/game-source-git/dist/tsconfig.tsbuildinfo +1 -0
  160. package/node_modules/@playdrop/game-source-git/package.json +28 -0
  161. package/node_modules/@playdrop/types/dist/agent-task-terminal.d.ts +2 -2
  162. package/node_modules/@playdrop/types/dist/agent-task-terminal.d.ts.map +1 -1
  163. package/node_modules/@playdrop/types/dist/agent-task-terminal.js +15 -9
  164. package/node_modules/@playdrop/types/dist/api.d.ts +730 -166
  165. package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
  166. package/node_modules/@playdrop/types/dist/api.js +65 -18
  167. package/node_modules/@playdrop/types/dist/asset-pack.d.ts +2 -0
  168. package/node_modules/@playdrop/types/dist/asset-pack.d.ts.map +1 -1
  169. package/node_modules/@playdrop/types/dist/asset.d.ts +22 -8
  170. package/node_modules/@playdrop/types/dist/asset.d.ts.map +1 -1
  171. package/node_modules/@playdrop/types/dist/asset.js +26 -26
  172. package/node_modules/@playdrop/types/dist/chat.d.ts +273 -31
  173. package/node_modules/@playdrop/types/dist/chat.d.ts.map +1 -1
  174. package/node_modules/@playdrop/types/dist/chat.js +38 -4
  175. package/node_modules/@playdrop/types/dist/index.d.ts +3 -0
  176. package/node_modules/@playdrop/types/dist/index.d.ts.map +1 -1
  177. package/node_modules/@playdrop/types/dist/index.js +7 -1
  178. package/node_modules/@playdrop/types/dist/public-cache-tags.d.ts +11 -0
  179. package/node_modules/@playdrop/types/dist/public-cache-tags.d.ts.map +1 -0
  180. package/node_modules/@playdrop/types/dist/public-cache-tags.js +78 -0
  181. package/node_modules/@playdrop/types/dist/realtime.d.ts +3 -15
  182. package/node_modules/@playdrop/types/dist/realtime.d.ts.map +1 -1
  183. package/node_modules/@playdrop/types/dist/social.d.ts +64 -0
  184. package/node_modules/@playdrop/types/dist/social.d.ts.map +1 -0
  185. package/node_modules/@playdrop/{boxel-three/dist/src/types.js → types/dist/social.js} +14 -2
  186. package/node_modules/@playdrop/types/dist/spritesheet.d.ts +51 -0
  187. package/node_modules/@playdrop/types/dist/spritesheet.d.ts.map +1 -0
  188. package/node_modules/@playdrop/types/dist/spritesheet.js +73 -0
  189. package/node_modules/@playdrop/types/dist/version.d.ts +86 -58
  190. package/node_modules/@playdrop/types/dist/version.d.ts.map +1 -1
  191. package/node_modules/@playdrop/types/dist/version.js +111 -0
  192. package/node_modules/@playdrop/types/package.json +14 -0
  193. package/node_modules/@playdrop/vox-three/dist/src/index.d.ts +1 -1
  194. package/node_modules/@playdrop/vox-three/dist/src/index.js +1 -1
  195. package/node_modules/@playdrop/vox-three/dist/src/index.js.map +1 -1
  196. package/node_modules/@playdrop/vox-three/dist/src/vox.d.ts +0 -3
  197. package/node_modules/@playdrop/vox-three/dist/src/vox.js +0 -110
  198. package/node_modules/@playdrop/vox-three/dist/src/vox.js.map +1 -1
  199. package/node_modules/@playdrop/vox-three/dist/test/vox.test.js +0 -18
  200. package/node_modules/@playdrop/vox-three/dist/test/vox.test.js.map +1 -1
  201. package/node_modules/@playdrop/vox-three/package.json +8 -4
  202. package/package.json +9 -11
  203. package/dist/assets/model-artifacts.d.ts +0 -8
  204. package/dist/assets/model-artifacts.js +0 -382
  205. package/dist/assets/model-worker.d.ts +0 -22
  206. package/dist/assets/model-worker.js +0 -123
  207. package/node_modules/@playdrop/ai-client/dist/index.d.ts +0 -441
  208. package/node_modules/@playdrop/ai-client/dist/index.d.ts.map +0 -1
  209. package/node_modules/@playdrop/ai-client/dist/index.js +0 -499
  210. package/node_modules/@playdrop/ai-client/package.json +0 -22
  211. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.d.ts +0 -13
  212. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js +0 -141
  213. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js.map +0 -1
  214. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.d.ts +0 -47
  215. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js +0 -313
  216. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js.map +0 -1
  217. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.d.ts +0 -3
  218. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js +0 -36
  219. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js.map +0 -1
  220. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.d.ts +0 -23
  221. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js +0 -11
  222. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js.map +0 -1
  223. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.d.ts +0 -4
  224. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js +0 -21
  225. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js.map +0 -1
  226. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.d.ts +0 -4
  227. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js +0 -24
  228. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js.map +0 -1
  229. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.d.ts +0 -3
  230. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.js.map +0 -1
  231. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.d.ts +0 -3
  232. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js +0 -387
  233. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js.map +0 -1
  234. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.d.ts +0 -6
  235. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js +0 -3
  236. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js.map +0 -1
  237. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.d.ts +0 -3
  238. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js +0 -373
  239. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js.map +0 -1
  240. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.d.ts +0 -12
  241. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js +0 -215
  242. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js.map +0 -1
  243. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.d.ts +0 -4
  244. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js +0 -18
  245. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js.map +0 -1
  246. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.d.ts +0 -42
  247. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js +0 -145
  248. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js.map +0 -1
  249. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.d.ts +0 -26
  250. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js +0 -65
  251. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js.map +0 -1
  252. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.d.ts +0 -33
  253. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js +0 -175
  254. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js.map +0 -1
  255. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r15.json +0 -1517
  256. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r6.json +0 -61
  257. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.d.ts +0 -10
  258. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js +0 -23
  259. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js.map +0 -1
  260. package/node_modules/@playdrop/boxel-core/dist/src/index.d.ts +0 -19
  261. package/node_modules/@playdrop/boxel-core/dist/src/index.js +0 -36
  262. package/node_modules/@playdrop/boxel-core/dist/src/index.js.map +0 -1
  263. package/node_modules/@playdrop/boxel-core/dist/src/materials.d.ts +0 -26
  264. package/node_modules/@playdrop/boxel-core/dist/src/materials.js +0 -184
  265. package/node_modules/@playdrop/boxel-core/dist/src/materials.js.map +0 -1
  266. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.d.ts +0 -68
  267. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js +0 -488
  268. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js.map +0 -1
  269. package/node_modules/@playdrop/boxel-core/dist/src/serialization.d.ts +0 -4
  270. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js +0 -380
  271. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js.map +0 -1
  272. package/node_modules/@playdrop/boxel-core/dist/src/textures.d.ts +0 -29
  273. package/node_modules/@playdrop/boxel-core/dist/src/textures.js +0 -208
  274. package/node_modules/@playdrop/boxel-core/dist/src/textures.js.map +0 -1
  275. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.d.ts +0 -9
  276. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js +0 -312
  277. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js.map +0 -1
  278. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.d.ts +0 -9
  279. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js +0 -154
  280. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js.map +0 -1
  281. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.d.ts +0 -2
  282. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js +0 -121
  283. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js.map +0 -1
  284. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.d.ts +0 -20
  285. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js +0 -389
  286. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js.map +0 -1
  287. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.d.ts +0 -3
  288. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js +0 -206
  289. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js.map +0 -1
  290. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.d.ts +0 -12
  291. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js +0 -81
  292. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js.map +0 -1
  293. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.d.ts +0 -12
  294. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js +0 -318
  295. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js.map +0 -1
  296. package/node_modules/@playdrop/boxel-core/dist/src/types.d.ts +0 -168
  297. package/node_modules/@playdrop/boxel-core/dist/src/types.js +0 -3
  298. package/node_modules/@playdrop/boxel-core/dist/src/types.js.map +0 -1
  299. package/node_modules/@playdrop/boxel-core/dist/src/validation.d.ts +0 -24
  300. package/node_modules/@playdrop/boxel-core/dist/src/validation.js +0 -620
  301. package/node_modules/@playdrop/boxel-core/dist/src/validation.js.map +0 -1
  302. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.d.ts +0 -11
  303. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js +0 -135
  304. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js.map +0 -1
  305. package/node_modules/@playdrop/boxel-core/dist/src/voxels.d.ts +0 -23
  306. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js +0 -52
  307. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js.map +0 -1
  308. package/node_modules/@playdrop/boxel-core/package.json +0 -19
  309. package/node_modules/@playdrop/boxel-three/dist/src/animations.d.ts +0 -4
  310. package/node_modules/@playdrop/boxel-three/dist/src/animations.js +0 -92
  311. package/node_modules/@playdrop/boxel-three/dist/src/builders.d.ts +0 -8
  312. package/node_modules/@playdrop/boxel-three/dist/src/builders.js +0 -363
  313. package/node_modules/@playdrop/boxel-three/dist/src/context.d.ts +0 -24
  314. package/node_modules/@playdrop/boxel-three/dist/src/context.js +0 -58
  315. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.d.ts +0 -100
  316. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.js +0 -927
  317. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.d.ts +0 -18
  318. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.js +0 -294
  319. package/node_modules/@playdrop/boxel-three/dist/src/index.d.ts +0 -17
  320. package/node_modules/@playdrop/boxel-three/dist/src/index.js +0 -64
  321. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.d.ts +0 -40
  322. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.js +0 -96
  323. package/node_modules/@playdrop/boxel-three/dist/src/nodes.d.ts +0 -8
  324. package/node_modules/@playdrop/boxel-three/dist/src/nodes.js +0 -88
  325. package/node_modules/@playdrop/boxel-three/dist/src/overlays.d.ts +0 -7
  326. package/node_modules/@playdrop/boxel-three/dist/src/overlays.js +0 -123
  327. package/node_modules/@playdrop/boxel-three/dist/src/primitives.d.ts +0 -4
  328. package/node_modules/@playdrop/boxel-three/dist/src/primitives.js +0 -48
  329. package/node_modules/@playdrop/boxel-three/dist/src/scene.d.ts +0 -3
  330. package/node_modules/@playdrop/boxel-three/dist/src/scene.js +0 -168
  331. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.d.ts +0 -29
  332. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.js +0 -623
  333. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.d.ts +0 -13
  334. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.js +0 -133
  335. package/node_modules/@playdrop/boxel-three/dist/src/textures.d.ts +0 -17
  336. package/node_modules/@playdrop/boxel-three/dist/src/textures.js +0 -216
  337. package/node_modules/@playdrop/boxel-three/dist/src/types.d.ts +0 -112
  338. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.d.ts +0 -28
  339. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.js +0 -344
  340. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.d.ts +0 -24
  341. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.js +0 -113
  342. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.d.ts +0 -1
  343. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.js +0 -137
  344. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.d.ts +0 -20
  345. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.js +0 -85
  346. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.d.ts +0 -1
  347. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +0 -104
  348. package/node_modules/@playdrop/boxel-three/dist/test/index.test.d.ts +0 -1
  349. package/node_modules/@playdrop/boxel-three/dist/test/index.test.js +0 -30
  350. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.d.ts +0 -1
  351. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +0 -88
  352. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.d.ts +0 -1
  353. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.js +0 -42
  354. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.d.ts +0 -1
  355. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.js +0 -73
  356. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.d.ts +0 -1
  357. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.js +0 -85
  358. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.d.ts +0 -1
  359. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +0 -73
  360. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.d.ts +0 -1
  361. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.js +0 -136
  362. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.d.ts +0 -1
  363. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.js +0 -42
  364. package/node_modules/@playdrop/boxel-three/package.json +0 -28
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GAME_SERVER_BUNDLE_MAX_BYTES = exports.GAME_SERVER_RUNTIME_VERSION = void 0;
4
+ exports.verifyGameServerDependencies = verifyGameServerDependencies;
5
+ exports.buildGameServer = buildGameServer;
6
+ exports.formatServerBuildPath = formatServerBuildPath;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_path_1 = require("node:path");
10
+ const node_url_1 = require("node:url");
11
+ const esbuild_1 = require("esbuild");
12
+ exports.GAME_SERVER_RUNTIME_VERSION = "colyseus-0.17-v1";
13
+ exports.GAME_SERVER_BUNDLE_MAX_BYTES = 2 * 1024 * 1024;
14
+ const REQUIRED_PACKAGE_VERSIONS = Object.freeze({
15
+ colyseus: "0.17.10",
16
+ "@colyseus/core": "0.17.50",
17
+ "@colyseus/schema": "4.0.30",
18
+ mongodb: "7.5.0",
19
+ "@playdrop/server": "0.1.0",
20
+ typescript: "5.9.3",
21
+ });
22
+ const CREATOR_IMPORTS = new Set([
23
+ "colyseus",
24
+ "@colyseus/core",
25
+ "@colyseus/schema",
26
+ "mongodb",
27
+ "@playdrop/server",
28
+ ]);
29
+ function resolveInstalledPackageVersion(projectPackageJsonPath, packageName) {
30
+ let current = (0, node_path_1.dirname)(projectPackageJsonPath);
31
+ while (true) {
32
+ const packageJsonPath = (0, node_path_1.join)(current, "node_modules", ...packageName.split("/"), "package.json");
33
+ if ((0, node_fs_1.existsSync)(packageJsonPath)) {
34
+ const manifest = JSON.parse((0, node_fs_1.readFileSync)(packageJsonPath, "utf8"));
35
+ if (manifest.name === packageName && typeof manifest.version === "string") {
36
+ return manifest.version;
37
+ }
38
+ }
39
+ const parent = (0, node_path_1.dirname)(current);
40
+ if (parent === current)
41
+ break;
42
+ current = parent;
43
+ }
44
+ throw new Error(`server_dependency_missing:${packageName}`);
45
+ }
46
+ function verifyGameServerDependencies(task) {
47
+ if (!task.server)
48
+ return;
49
+ if (!task.packageJsonPath)
50
+ throw new Error("server_package_json_required");
51
+ for (const [packageName, expected] of Object.entries(REQUIRED_PACKAGE_VERSIONS)) {
52
+ const actual = resolveInstalledPackageVersion(task.packageJsonPath, packageName);
53
+ if (actual !== expected) {
54
+ throw new Error(`server_dependency_version_mismatch:${packageName}:expected=${expected}:actual=${actual}`);
55
+ }
56
+ }
57
+ }
58
+ function allowedImportsPlugin(projectDir) {
59
+ const normalizedProjectDir = `${(0, node_fs_1.realpathSync)(projectDir)}${node_path_1.sep}`;
60
+ return {
61
+ name: "playdrop-server-import-policy",
62
+ setup(builder) {
63
+ builder.onResolve({ filter: /.*/ }, (args) => {
64
+ if (args.kind === "entry-point")
65
+ return null;
66
+ if (CREATOR_IMPORTS.has(args.path)) {
67
+ return { path: args.path, external: true };
68
+ }
69
+ if (args.path.startsWith(".") || args.path.startsWith("/")) {
70
+ const candidate = (0, node_path_1.resolve)(args.resolveDir, args.path);
71
+ let resolvedPath = candidate;
72
+ try {
73
+ resolvedPath = (0, node_fs_1.realpathSync)(candidate);
74
+ }
75
+ catch {
76
+ // esbuild reports the more precise missing-module error.
77
+ }
78
+ if (`${resolvedPath}${node_path_1.sep}`.startsWith(normalizedProjectDir) || resolvedPath.startsWith(normalizedProjectDir)) {
79
+ return null;
80
+ }
81
+ return { errors: [{ text: `server_import_outside_project:${args.path}` }] };
82
+ }
83
+ return { errors: [{ text: `server_import_not_allowed:${args.path}` }] };
84
+ });
85
+ },
86
+ };
87
+ }
88
+ async function validateRoomExports(task, bundlePath) {
89
+ if (!task.server)
90
+ return;
91
+ const moduleUrl = `${(0, node_url_1.pathToFileURL)(bundlePath).href}?validation=${Date.now()}`;
92
+ let imported;
93
+ try {
94
+ const importEsm = new Function("specifier", "return import(specifier)");
95
+ imported = await importEsm(moduleUrl);
96
+ }
97
+ catch (error) {
98
+ throw new Error(`server_bundle_load_failed:${error instanceof Error ? error.message : String(error)}`);
99
+ }
100
+ if (!imported.rooms || typeof imported.rooms !== "object" || Array.isArray(imported.rooms)) {
101
+ throw new Error("server_rooms_export_missing");
102
+ }
103
+ const exportedRoomNames = Object.keys(imported.rooms).sort();
104
+ const declaredRoomNames = [...task.server.rooms].sort();
105
+ if (JSON.stringify(exportedRoomNames) !== JSON.stringify(declaredRoomNames)) {
106
+ throw new Error(`server_rooms_mismatch:declared=${declaredRoomNames.join(",")}:exported=${exportedRoomNames.join(",")}`);
107
+ }
108
+ for (const roomName of exportedRoomNames) {
109
+ const handler = imported.rooms[roomName];
110
+ if (!handler || typeof handler.klass !== "function")
111
+ throw new Error(`server_room_invalid:${roomName}`);
112
+ }
113
+ }
114
+ async function buildGameServer(task) {
115
+ if (!task.server)
116
+ return null;
117
+ verifyGameServerDependencies(task);
118
+ const outputDir = (0, node_path_1.join)(task.projectDir, ".playdrop", "server");
119
+ const bundlePath = (0, node_path_1.join)(outputDir, "bundle.mjs");
120
+ const manifestPath = (0, node_path_1.join)(outputDir, "manifest.json");
121
+ (0, node_fs_1.mkdirSync)(outputDir, { recursive: true });
122
+ await (0, esbuild_1.build)({
123
+ entryPoints: [task.server.entryPath],
124
+ outfile: bundlePath,
125
+ absWorkingDir: task.projectDir,
126
+ bundle: true,
127
+ format: "esm",
128
+ platform: "node",
129
+ target: "node22",
130
+ packages: "bundle",
131
+ sourcemap: false,
132
+ legalComments: "none",
133
+ treeShaking: true,
134
+ metafile: true,
135
+ logLevel: "silent",
136
+ plugins: [allowedImportsPlugin(task.projectDir)],
137
+ });
138
+ const size = (0, node_fs_1.statSync)(bundlePath).size;
139
+ if (size > exports.GAME_SERVER_BUNDLE_MAX_BYTES) {
140
+ throw new Error(`server_bundle_too_large:max=${exports.GAME_SERVER_BUNDLE_MAX_BYTES}:actual=${size}`);
141
+ }
142
+ await validateRoomExports(task, bundlePath);
143
+ const sha256 = (0, node_crypto_1.createHash)("sha256").update((0, node_fs_1.readFileSync)(bundlePath)).digest("hex");
144
+ const manifest = {
145
+ runtimeVersion: exports.GAME_SERVER_RUNTIME_VERSION,
146
+ rooms: [...task.server.rooms],
147
+ size,
148
+ sha256,
149
+ };
150
+ (0, node_fs_1.writeFileSync)(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
151
+ return { bundlePath, manifestPath, manifest };
152
+ }
153
+ function formatServerBuildPath(task, absolutePath) {
154
+ return (0, node_path_1.relative)(task.projectDir, absolutePath).split(node_path_1.sep).join("/");
155
+ }
@@ -25,5 +25,6 @@ export declare function prepareStaticHtmlProject(input: {
25
25
  appName?: string;
26
26
  primarySurface: AppSurface;
27
27
  cdnBase: string;
28
+ gameSourceGit?: boolean;
28
29
  }): Promise<PreparedStaticHtmlProject>;
29
30
  export declare function sha256File(filePath: string): string;
@@ -12,7 +12,18 @@ const node_path_1 = require("node:path");
12
12
  const parse5_1 = require("parse5");
13
13
  const build_1 = require("./build");
14
14
  const STATIC_GAME_SURFACES = ["DESKTOP", "MOBILE_LANDSCAPE", "MOBILE_PORTRAIT"];
15
- const STATIC_SOURCE_EXCLUDES = ["AGENTS.md", "CLAUDE.md", ".playdrop/", "bin/playdrop"];
15
+ const STATIC_SOURCE_EXCLUDES = ["AGENTS.md", "CLAUDE.md", ".playdrop/", "bin/playdrop", "tasks/"];
16
+ const STATIC_GAME_SOURCE_GIT_EXCLUDES = [
17
+ "AGENTS.md",
18
+ "CLAUDE.md",
19
+ ".DS_Store",
20
+ ".playdrop.json",
21
+ "bin/playdrop",
22
+ "next-steps.json",
23
+ "player-feedback.md",
24
+ "platform-feedback.md",
25
+ "source.zip",
26
+ ];
16
27
  const STATIC_BUNDLE_EXCLUDES = [...STATIC_SOURCE_EXCLUDES];
17
28
  function attribute(node, name) {
18
29
  return node.attrs?.find((entry) => entry.name.toLowerCase() === name)?.value.trim() ?? null;
@@ -246,7 +257,8 @@ function buildStaticAppTask(input) {
246
257
  version: "1.0.0",
247
258
  releaseNotes: "Initial static game upload",
248
259
  versionVisibility: "PRIVATE",
249
- sourceArchiveExcludeRelativeFiles: STATIC_SOURCE_EXCLUDES,
260
+ sourceArchiveExcludeRelativeFiles: input.gameSourceGit ? STATIC_GAME_SOURCE_GIT_EXCLUDES : STATIC_SOURCE_EXCLUDES,
261
+ sourceArchiveGameSourceGit: input.gameSourceGit === true,
250
262
  bundleArchiveExcludeRelativeFiles: STATIC_BUNDLE_EXCLUDES,
251
263
  license: "CLOSED",
252
264
  tags: [],
@@ -302,8 +314,9 @@ async function prepareStaticHtmlProject(input) {
302
314
  name,
303
315
  metadata,
304
316
  primarySurface: input.primarySurface,
317
+ gameSourceGit: input.gameSourceGit,
305
318
  });
306
- const sourceArtifacts = await (0, build_1.buildApp)(sourceTask);
319
+ const sourceArtifacts = await (0, build_1.buildApp)(sourceTask, { includeSourceArchive: false });
307
320
  const runtimeDir = await (0, promises_1.mkdtemp)((0, node_path_1.join)((0, node_os_1.tmpdir)(), `playdrop-static-${name}-`));
308
321
  try {
309
322
  await (0, promises_1.cp)(sourceRoot, runtimeDir, {
@@ -328,17 +341,13 @@ async function prepareStaticHtmlProject(input) {
328
341
  },
329
342
  primarySurface: input.primarySurface,
330
343
  });
331
- const runtimeArtifacts = await (0, build_1.buildApp)(runtimeTask);
332
- const artifacts = {
333
- ...runtimeArtifacts,
334
- sourceFile: sourceArtifacts.sourceFile,
335
- sourceHash: sourceArtifacts.sourceHash,
336
- };
344
+ const runtimeArtifacts = await (0, build_1.buildApp)(runtimeTask, { includeSourceArchive: false });
345
+ const artifacts = runtimeArtifacts;
337
346
  return {
338
347
  sourceTask,
339
348
  runtimeTask,
340
349
  artifacts,
341
- sourceHash: sourceArtifacts.sourceHash,
350
+ sourceHash: sourceArtifacts.bundleHash,
342
351
  runtimeHash: runtimeArtifacts.bundleHash,
343
352
  metadata,
344
353
  runtimeDir,
@@ -1,5 +1,5 @@
1
1
  import type { ApiClient } from "@playdrop/api-client";
2
- import type { AgentTaskPlaytestProof, UserResponse } from "@playdrop/types";
2
+ import type { AgentTaskPlaytestProof, FinalizeAppUploadRequest, UserResponse } from "@playdrop/types";
3
3
  import type { AppTask } from "../catalogue";
4
4
  import type { TaskCaptureSession } from "../appUrls";
5
5
  import type { AppBuildArtifacts } from "./build";
@@ -24,14 +24,22 @@ export type AppUploadOptions = {
24
24
  playtestProof?: AgentTaskPlaytestProof;
25
25
  playtestSmokeCheckRequired?: boolean;
26
26
  captureSession?: TaskCaptureSession | null;
27
+ prepareGitTransition?: (input: {
28
+ appId: number;
29
+ sessionId: string;
30
+ version: string;
31
+ }) => Promise<NonNullable<FinalizeAppUploadRequest["gitTransition"]>>;
27
32
  };
28
33
  type PreparedSessionFile = {
29
- fileKey: string;
34
+ id: string;
35
+ role: "RUNTIME" | "LISTING" | "SERVER" | "SOURCE" | "OWNED_ASSET";
36
+ relativePath: string;
30
37
  file: File;
31
38
  filename: string;
32
39
  contentType: string;
33
40
  sizeBytes: number;
34
41
  sha256: string;
42
+ md5Base64: string;
35
43
  };
36
44
  type PreparedOwnedAssetUpload = {
37
45
  uploadKey: string;
@@ -49,12 +57,14 @@ type PreparedOwnedAssetUpload = {
49
57
  shopListed?: boolean;
50
58
  shopPriceCredits?: number;
51
59
  files: Array<{
60
+ objectId: string;
52
61
  role: string;
53
62
  file: File;
54
63
  filename: string;
55
64
  contentType: string;
56
65
  sizeBytes: number;
57
66
  sha256: string;
67
+ md5Base64: string;
58
68
  }>;
59
69
  };
60
70
  type PreparedAppUploadFiles = {
@@ -8,6 +8,7 @@ const node_crypto_1 = require("node:crypto");
8
8
  const node_fs_1 = require("node:fs");
9
9
  const node_path_1 = require("node:path");
10
10
  const http_1 = require("../http");
11
+ const serverBuild_1 = require("./serverBuild");
11
12
  const loadCheck_1 = require("./loadCheck");
12
13
  const EXTENSION_TO_MIME = {
13
14
  ".png": "image/png",
@@ -20,7 +21,18 @@ const EXTENSION_TO_MIME = {
20
21
  ".mp3": "audio/mpeg",
21
22
  ".wav": "audio/wav",
22
23
  ".ogg": "audio/ogg",
24
+ ".html": "text/html",
25
+ ".htm": "text/html",
26
+ ".js": "application/javascript",
27
+ ".mjs": "application/javascript",
28
+ ".css": "text/css",
29
+ ".txt": "text/plain",
30
+ ".svg": "image/svg+xml",
31
+ ".wasm": "application/wasm",
32
+ ".woff": "font/woff",
33
+ ".woff2": "font/woff2",
23
34
  ".json": "application/json",
35
+ ".zip": "application/zip",
24
36
  ".gltf": "model/gltf+json",
25
37
  ".glb": "model/gltf-binary",
26
38
  ".vox": "application/octet-stream",
@@ -75,19 +87,26 @@ async function bufferFromFile(file) {
75
87
  function computeSha256Hex(buffer) {
76
88
  return (0, node_crypto_1.createHash)("sha256").update(buffer).digest("hex");
77
89
  }
90
+ function computeMd5Base64(buffer) {
91
+ return (0, node_crypto_1.createHash)("md5").update(buffer).digest("base64");
92
+ }
78
93
  function resolveMimeType(filename, fallback = "application/octet-stream") {
79
94
  const type = EXTENSION_TO_MIME[(0, node_path_1.extname)(filename).toLowerCase()];
80
95
  return type ?? fallback;
81
96
  }
82
- async function buildPreparedSessionFile(fileKey, file) {
97
+ async function buildPreparedSessionFile(role, relativePath, file) {
83
98
  const buffer = await bufferFromFile(file);
99
+ const sha256 = computeSha256Hex(buffer);
84
100
  return {
85
- fileKey,
101
+ id: `o-${computeSha256Hex(Buffer.from(`${role}\0${relativePath}\0${sha256}`)).slice(0, 40)}`,
102
+ role,
103
+ relativePath,
86
104
  file,
87
105
  filename: file.name,
88
106
  contentType: file.type || resolveMimeType(file.name),
89
107
  sizeBytes: buffer.length,
90
- sha256: computeSha256Hex(buffer),
108
+ sha256,
109
+ md5Base64: computeMd5Base64(buffer),
91
110
  };
92
111
  }
93
112
  function createGenericFileFromPath(filePath) {
@@ -100,12 +119,14 @@ async function prepareOwnedAssetUpload(task) {
100
119
  const file = createGenericFileFromPath(filePath);
101
120
  const buffer = await bufferFromFile(file);
102
121
  return {
122
+ objectId: `o-${computeSha256Hex(Buffer.from(`OWNED_ASSET\0owned-assets/${task.name}/${role}/${file.name}\0${computeSha256Hex(buffer)}`)).slice(0, 40)}`,
103
123
  role,
104
124
  file,
105
125
  filename: file.name,
106
126
  contentType: file.type || resolveMimeType(file.name),
107
127
  sizeBytes: buffer.length,
108
128
  sha256: computeSha256Hex(buffer),
129
+ md5Base64: computeMd5Base64(buffer),
109
130
  };
110
131
  }));
111
132
  return {
@@ -153,6 +174,41 @@ function pushPreparedArtifact(task, currentTotal, file, maxBytes, code, label) {
153
174
  const bytes = ensurePreparedArtifactSize(file, maxBytes, code, label);
154
175
  return accumulateUploadBytes(task.name, currentTotal, bytes);
155
176
  }
177
+ async function uploadSignedObject(client, creatorUsername, appName, sessionId, file) {
178
+ for (let attempt = 0; attempt < 2; attempt += 1) {
179
+ const signed = await client.signAppUploadObjects(creatorUsername, appName, sessionId, {
180
+ objectIds: [file.id],
181
+ });
182
+ const descriptor = signed.uploads.find((entry) => entry.id === file.id);
183
+ if (!descriptor) {
184
+ throw new Error(`app_upload_signed_object_missing:${file.id}`);
185
+ }
186
+ const response = await fetch(descriptor.url, {
187
+ method: descriptor.method,
188
+ headers: descriptor.headers,
189
+ body: file.file,
190
+ });
191
+ if (response.ok) {
192
+ return;
193
+ }
194
+ if ((response.status === 401 || response.status === 403) && attempt === 0) {
195
+ continue;
196
+ }
197
+ const detail = (await response.text()).trim();
198
+ throw new Error(`direct_object_upload_failed:${file.id}:${response.status}${detail ? `:${detail.slice(0, 300)}` : ""}`);
199
+ }
200
+ }
201
+ async function uploadSignedObjects(client, creatorUsername, appName, sessionId, files) {
202
+ let cursor = 0;
203
+ const workers = Array.from({ length: Math.min(8, files.length) }, async () => {
204
+ while (cursor < files.length) {
205
+ const index = cursor;
206
+ cursor += 1;
207
+ await uploadSignedObject(client, creatorUsername, appName, sessionId, files[index]);
208
+ }
209
+ });
210
+ await Promise.all(workers);
211
+ }
156
212
  async function prepareAppUploadFiles(task, artifacts) {
157
213
  let totalUploadBytes = 0;
158
214
  const listing = task.listing;
@@ -166,55 +222,72 @@ async function prepareAppUploadFiles(task, artifacts) {
166
222
  for (const definition of task.achievements ?? []) {
167
223
  const prepared = createFileFromPath(definition.iconPath, "image/png", config_1.MAX_VERSION_ICON_BYTES, "achievement_icon_too_large", "invalid_achievement_icon_content_type", `Achievement icon "${definition.key}"`, isPngSignature);
168
224
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
169
- sessionFiles.push(await buildPreparedSessionFile(`achievementIcon:${definition.key}`, prepared.file));
225
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", `listing/achievements/${definition.key}.png`, prepared.file));
170
226
  }
171
227
  if (task.hostingMode === "EXTERNAL") {
172
228
  // no hosted files
173
229
  }
174
230
  else if (artifacts) {
175
- totalUploadBytes = pushPreparedArtifact(task, totalUploadBytes, artifacts.bundleFile, config_1.MAX_VERSION_BUNDLE_BYTES, "bundle_too_large", "Bundle");
176
- totalUploadBytes = pushPreparedArtifact(task, totalUploadBytes, artifacts.sourceFile, config_1.MAX_APP_SOURCE_BYTES, "source_too_large", "Source archive");
177
- sessionFiles.push(await buildPreparedSessionFile("bundle", artifacts.bundleFile));
178
- sessionFiles.push(await buildPreparedSessionFile("source", artifacts.sourceFile));
231
+ const runtimeBytes = artifacts.runtimeFiles.reduce((total, entry) => total + entry.sizeBytes, 0);
232
+ if (runtimeBytes > config_1.MAX_VERSION_BUNDLE_BYTES) {
233
+ throw createUploadValidationError("bundle_too_large", `Runtime files for "${task.name}" exceed ${formatLimitBytes(config_1.MAX_VERSION_BUNDLE_BYTES)}. Received ${runtimeBytes} bytes.`);
234
+ }
235
+ for (const runtime of artifacts.runtimeFiles) {
236
+ totalUploadBytes = accumulateUploadBytes(task.name, totalUploadBytes, runtime.sizeBytes);
237
+ sessionFiles.push(await buildPreparedSessionFile("RUNTIME", runtime.relativePath, createGenericFileFromPath(runtime.absolutePath)));
238
+ }
239
+ if (artifacts.sourceFile) {
240
+ totalUploadBytes = pushPreparedArtifact(task, totalUploadBytes, artifacts.sourceFile, config_1.MAX_APP_SOURCE_BYTES, "source_too_large", "Source archive");
241
+ sessionFiles.push(await buildPreparedSessionFile("SOURCE", "source.zip", artifacts.sourceFile));
242
+ }
243
+ }
244
+ const gameServer = await (0, serverBuild_1.buildGameServer)(task);
245
+ if (gameServer) {
246
+ const bundle = createFileFromPath(gameServer.bundlePath, "application/javascript", serverBuild_1.GAME_SERVER_BUNDLE_MAX_BYTES, "server_bundle_too_large", "invalid_server_bundle", "Game server bundle");
247
+ const manifest = createFileFromPath(gameServer.manifestPath, "application/json", 16 * 1024, "server_manifest_too_large", "invalid_server_manifest", "Game server manifest");
248
+ totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, bundle);
249
+ totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, manifest);
250
+ sessionFiles.push(await buildPreparedSessionFile("SERVER", "server/bundle.mjs", bundle.file));
251
+ sessionFiles.push(await buildPreparedSessionFile("SERVER", "server/manifest.json", manifest.file));
179
252
  }
180
253
  if (listing?.iconPath) {
181
254
  const prepared = createFileFromPath(listing.iconPath, "image/png", config_1.MAX_VERSION_ICON_BYTES, "icon_too_large", "invalid_icon_content_type", "Icon", isPngSignature);
182
255
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
183
- sessionFiles.push(await buildPreparedSessionFile("icon", prepared.file));
256
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", "listing/icon.png", prepared.file));
184
257
  }
185
258
  if (listing?.heroPortraitPath) {
186
259
  const prepared = createFileFromPath(listing.heroPortraitPath, "image/png", config_1.MAX_VERSION_HERO_BYTES, "hero_portrait_too_large", "invalid_hero_portrait_content_type", "Hero portrait", isPngSignature);
187
260
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
188
- sessionFiles.push(await buildPreparedSessionFile("heroPortrait", prepared.file));
261
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", "listing/hero-portrait.png", prepared.file));
189
262
  }
190
263
  if (listing?.heroLandscapePath) {
191
264
  const prepared = createFileFromPath(listing.heroLandscapePath, "image/png", config_1.MAX_VERSION_HERO_BYTES, "hero_landscape_too_large", "invalid_hero_landscape_content_type", "Hero landscape", isPngSignature);
192
265
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
193
- sessionFiles.push(await buildPreparedSessionFile("heroLandscape", prepared.file));
266
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", "listing/hero-landscape.png", prepared.file));
194
267
  }
195
268
  for (let index = 0; index < (listing?.screenshotPortraitPaths ?? []).length; index += 1) {
196
269
  const filePath = listing.screenshotPortraitPaths[index];
197
270
  const prepared = createFileFromPath(filePath, "image/png", config_1.MAX_VERSION_SCREENSHOT_BYTES, "screenshot_portrait_too_large", "invalid_screenshot_portrait_content_type", `Portrait screenshot ${index + 1}`, isPngSignature);
198
271
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
199
- sessionFiles.push(await buildPreparedSessionFile(`screenshotsPortrait:${index}`, prepared.file));
272
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", `listing/screenshots/portrait/${index}.png`, prepared.file));
200
273
  }
201
274
  for (let index = 0; index < (listing?.screenshotLandscapePaths ?? []).length; index += 1) {
202
275
  const filePath = listing.screenshotLandscapePaths[index];
203
276
  const prepared = createFileFromPath(filePath, "image/png", config_1.MAX_VERSION_SCREENSHOT_BYTES, "screenshot_landscape_too_large", "invalid_screenshot_landscape_content_type", `Landscape screenshot ${index + 1}`, isPngSignature);
204
277
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
205
- sessionFiles.push(await buildPreparedSessionFile(`screenshotsLandscape:${index}`, prepared.file));
278
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", `listing/screenshots/landscape/${index}.png`, prepared.file));
206
279
  }
207
280
  for (let index = 0; index < (listing?.videoPortraitPaths ?? []).length; index += 1) {
208
281
  const filePath = listing.videoPortraitPaths[index];
209
282
  const prepared = createFileFromPath(filePath, "video/mp4", config_1.MAX_VERSION_VIDEO_BYTES, "video_portrait_too_large", "invalid_video_portrait_content_type", `Portrait video ${index + 1}`, isMp4Signature);
210
283
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
211
- sessionFiles.push(await buildPreparedSessionFile(`videosPortrait:${index}`, prepared.file));
284
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", `listing/videos/portrait/${index}.mp4`, prepared.file));
212
285
  }
213
286
  for (let index = 0; index < (listing?.videoLandscapePaths ?? []).length; index += 1) {
214
287
  const filePath = listing.videoLandscapePaths[index];
215
288
  const prepared = createFileFromPath(filePath, "video/mp4", config_1.MAX_VERSION_VIDEO_BYTES, "video_landscape_too_large", "invalid_video_landscape_content_type", `Landscape video ${index + 1}`, isMp4Signature);
216
289
  totalUploadBytes = pushPreparedFile(task.name, totalUploadBytes, prepared);
217
- sessionFiles.push(await buildPreparedSessionFile(`videosLandscape:${index}`, prepared.file));
290
+ sessionFiles.push(await buildPreparedSessionFile("LISTING", `listing/videos/landscape/${index}.mp4`, prepared.file));
218
291
  }
219
292
  return { sessionFiles, ownedAssets };
220
293
  }
@@ -238,6 +311,18 @@ async function uploadAppVersion(client, task, artifacts, options) {
238
311
  const leaderboards = task.leaderboards ?? [];
239
312
  const listing = task.listing;
240
313
  const { sessionFiles: preparedSessionFiles, ownedAssets: preparedOwnedAssets } = await prepareAppUploadFiles(task, artifacts);
314
+ const preparedOwnedAssetFiles = preparedOwnedAssets.flatMap((ownedAsset) => ownedAsset.files.map((file) => ({
315
+ id: file.objectId,
316
+ role: "OWNED_ASSET",
317
+ relativePath: `owned-assets/${ownedAsset.uploadKey}/${file.role}/${file.filename}`,
318
+ file: file.file,
319
+ filename: file.filename,
320
+ contentType: file.contentType,
321
+ sizeBytes: file.sizeBytes,
322
+ sha256: file.sha256,
323
+ md5Base64: file.md5Base64,
324
+ })));
325
+ const preparedObjects = [...preparedSessionFiles, ...preparedOwnedAssetFiles];
241
326
  const initializeRequest = {
242
327
  version: task.version,
243
328
  agentTaskId: options?.agentTaskId,
@@ -254,6 +339,11 @@ async function uploadAppVersion(client, task, artifacts, options) {
254
339
  usesPacks: task.uses.packs,
255
340
  tags: task.tags,
256
341
  design: task.design,
342
+ players: task.players,
343
+ makingOf: task.makingOf,
344
+ controls: task.controls,
345
+ creation: task.creation,
346
+ sourceRepository: task.sourceRepository,
257
347
  tweaks: task.tweaks,
258
348
  clearTags: options?.clearTags,
259
349
  surfaceTargets: task.surfaceTargets,
@@ -297,12 +387,20 @@ async function uploadAppVersion(client, task, artifacts, options) {
297
387
  })),
298
388
  externalUrl: task.hostingMode === "EXTERNAL" ? task.externalUrl : undefined,
299
389
  listingMedia: listing?.mediaMetadata,
300
- files: preparedSessionFiles.map((file) => ({
301
- fileKey: file.fileKey,
302
- filename: file.filename,
390
+ server: task.server
391
+ ? {
392
+ entry: task.server.entry,
393
+ rooms: task.server.rooms,
394
+ }
395
+ : undefined,
396
+ objects: preparedObjects.map((file) => ({
397
+ id: file.id,
398
+ role: file.role,
399
+ relativePath: file.relativePath,
303
400
  contentType: file.contentType,
304
401
  sizeBytes: file.sizeBytes,
305
402
  sha256: file.sha256,
403
+ md5Base64: file.md5Base64,
306
404
  })),
307
405
  ownedAssets: preparedOwnedAssets.map((ownedAsset) => ({
308
406
  uploadKey: ownedAsset.uploadKey,
@@ -320,11 +418,8 @@ async function uploadAppVersion(client, task, artifacts, options) {
320
418
  shopListed: ownedAsset.shopListed,
321
419
  shopPriceCredits: ownedAsset.shopPriceCredits,
322
420
  files: ownedAsset.files.map((file) => ({
421
+ objectId: file.objectId,
323
422
  role: file.role,
324
- filename: file.filename,
325
- contentType: file.contentType,
326
- sizeBytes: file.sizeBytes,
327
- sha256: file.sha256,
328
423
  })),
329
424
  })),
330
425
  };
@@ -333,29 +428,8 @@ async function uploadAppVersion(client, task, artifacts, options) {
333
428
  const initialized = await client.initializeAppUpload(creatorUsername, task.name, initializeRequest);
334
429
  sessionId = initialized.session.id;
335
430
  if (initialized.status !== "finalized") {
336
- const uploadedFileKeys = new Set(initialized.session.uploadedFileKeys);
337
- const uploadedOwnedAssetKeys = new Set(initialized.session.uploadedOwnedAssetKeys);
338
- for (const file of preparedSessionFiles) {
339
- if (uploadedFileKeys.has(file.fileKey)) {
340
- continue;
341
- }
342
- await client.uploadAppSessionFile(creatorUsername, task.name, sessionId, file.fileKey, {
343
- file: file.file,
344
- filename: file.filename,
345
- });
346
- }
347
- for (const ownedAsset of preparedOwnedAssets) {
348
- if (uploadedOwnedAssetKeys.has(ownedAsset.uploadKey)) {
349
- continue;
350
- }
351
- await client.uploadAppSessionOwnedAsset(creatorUsername, task.name, sessionId, ownedAsset.uploadKey, {
352
- files: ownedAsset.files.map((file) => ({
353
- fieldName: file.role,
354
- file: file.file,
355
- filename: file.filename,
356
- })),
357
- });
358
- }
431
+ const missingIds = new Set(initialized.missingObjectIds);
432
+ await uploadSignedObjects(client, creatorUsername, task.name, sessionId, preparedObjects.filter((file) => missingIds.has(file.id)));
359
433
  if (task.hostingMode !== "EXTERNAL" && !task.externalUrl && options?.playtestSmokeCheckRequired) {
360
434
  await (0, loadCheck_1.runUploadedHostedPlaytestSmokeCheck)({
361
435
  client,
@@ -401,9 +475,16 @@ async function uploadAppVersion(client, task, artifacts, options) {
401
475
  }
402
476
  }
403
477
  }
478
+ const gitTransition = !options?.prepareGitTransition
479
+ ? undefined
480
+ : await options.prepareGitTransition({
481
+ appId: initialized.session.appId,
482
+ sessionId,
483
+ version: task.version,
484
+ });
404
485
  const finalized = initialized.status === "finalized"
405
486
  ? initialized.finalized
406
- : await client.finalizeAppUpload(creatorUsername, task.name, sessionId);
487
+ : await client.finalizeAppUpload(creatorUsername, task.name, sessionId, gitTransition ? { gitTransition } : undefined);
407
488
  if (!finalized) {
408
489
  throw new Error(`Upload failed for ${task.name}: missing finalized app upload payload`);
409
490
  }
@@ -1,4 +1,4 @@
1
- import { type AppAchievementCatalogueDefinition, type AppAuthMode, type AppControllerMode, type AppHostingMode, type AppLeaderboardCatalogueDefinition, type AppListingMediaMetadata, type AppMetadataAssetSpecSupport, type AppPlaytestTapes, type AppSurface, type AppType, type AppTweaksDeclaration, type AppVersionDesign, type AppVersionVisibility, type AssetSpecContract, type AssetSpecStatus, type AssetSpecValidationKind, type CatalogueTagGroupDefinition, type ContentLicense, type PlayerMetaDefinitionStatus } from "@playdrop/types";
1
+ import { type AppAchievementCatalogueDefinition, type AppAuthMode, type AppControllerMode, type AppCreationMetadata, type AppHostingMode, type AppLeaderboardCatalogueDefinition, type AppListingMediaMetadata, type AppMetadataAssetSpecSupport, type AppPlaytestTapes, type AppPlayersConfig, type AppSurface, type AppType, type AppTweaksDeclaration, type AppVersionDesign, type AppVersionVisibility, type AssetSpecContract, type AssetSpecStatus, type AssetSpecValidationKind, type CatalogueTagGroupDefinition, type ContentLicense, type PlayerMetaDefinitionStatus } from "@playdrop/types";
2
2
  import { type AssetSpecSupportDeclaration } from "./assetSpecs";
3
3
  export type CatalogueJson = {
4
4
  apps?: Array<Record<string, unknown>>;
@@ -58,6 +58,11 @@ export type AppCatalogueEntry = {
58
58
  primarySurface?: string | null;
59
59
  playtestTapes?: unknown;
60
60
  design?: unknown;
61
+ players?: unknown;
62
+ makingOf?: string;
63
+ controls?: string;
64
+ creation?: unknown;
65
+ sourceRepository?: string;
61
66
  tweaks?: unknown;
62
67
  version?: string;
63
68
  releaseNotes?: string;
@@ -68,6 +73,10 @@ export type AppCatalogueEntry = {
68
73
  controllerMode?: string;
69
74
  previewable?: boolean;
70
75
  editorSupported?: boolean;
76
+ server?: {
77
+ entry?: string;
78
+ rooms?: unknown;
79
+ };
71
80
  externalUrl?: string;
72
81
  listing?: AppListingConfig;
73
82
  username?: string;
@@ -179,6 +188,11 @@ export type AppDependencyAssetRef = {
179
188
  ref: string;
180
189
  runtimeKey?: string;
181
190
  };
191
+ export type AppServerTask = {
192
+ entry: string;
193
+ entryPath: string;
194
+ rooms: string[];
195
+ };
182
196
  export type AppTask = {
183
197
  kind: "app";
184
198
  name: string;
@@ -202,12 +216,18 @@ export type AppTask = {
202
216
  primarySurface?: AppSurface;
203
217
  playtestTapes?: AppPlaytestTapes;
204
218
  design?: AppVersionDesign;
219
+ players?: AppPlayersConfig;
220
+ makingOf?: string;
221
+ controls?: string;
222
+ creation?: AppCreationMetadata;
223
+ sourceRepository?: string;
205
224
  tweaks?: AppTweaksDeclaration;
206
225
  missingMetadata: string[];
207
226
  version?: string;
208
227
  releaseNotes?: string;
209
228
  versionVisibility?: AppVersionVisibility;
210
229
  sourceArchiveExcludeRelativeFiles?: string[];
230
+ sourceArchiveGameSourceGit?: boolean;
211
231
  bundleArchiveExcludeRelativeFiles?: string[];
212
232
  license: ContentLicense;
213
233
  tags: string[];
@@ -216,6 +236,7 @@ export type AppTask = {
216
236
  controllerMode?: AppControllerMode;
217
237
  previewable?: boolean;
218
238
  editorSupported?: boolean;
239
+ server?: AppServerTask | null;
219
240
  externalUrl?: string;
220
241
  listing?: ResolvedListingAssets;
221
242
  username?: string;
@@ -335,6 +356,7 @@ export type AssetPackTask = {
335
356
  visibility?: string;
336
357
  license: ContentLicense;
337
358
  releaseNotes?: string;
359
+ sourcePath?: string;
338
360
  listing?: ResolvedListingAssets;
339
361
  relations?: Array<{
340
362
  type: string;