@playdrop/playdrop-cli 0.16.16 → 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 (363) 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 -0
  25. package/dist/commands/chat.js +133 -8
  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/runtime.d.ts +8 -10
  59. package/dist/commands/worker/runtime.js +51 -45
  60. package/dist/commands/worker.d.ts +79 -19
  61. package/dist/commands/worker.js +1796 -419
  62. package/dist/config.d.ts +2 -0
  63. package/dist/config.js +16 -3
  64. package/dist/environment.d.ts +0 -1
  65. package/dist/environment.js +0 -8
  66. package/dist/index.js +92 -13
  67. package/dist/workerAppProject.d.ts +1 -1
  68. package/dist/workerAppProject.js +15 -2
  69. package/node_modules/@playdrop/api-client/dist/client.d.ts +72 -25
  70. package/node_modules/@playdrop/api-client/dist/client.d.ts.map +1 -1
  71. package/node_modules/@playdrop/api-client/dist/client.js +33 -0
  72. package/node_modules/@playdrop/api-client/dist/core/request.d.ts +1 -0
  73. package/node_modules/@playdrop/api-client/dist/core/request.d.ts.map +1 -1
  74. package/node_modules/@playdrop/api-client/dist/core/request.js +17 -11
  75. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts +51 -6
  76. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.d.ts.map +1 -1
  77. package/node_modules/@playdrop/api-client/dist/domains/agent-tasks.js +338 -41
  78. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts +24 -1
  79. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts.map +1 -1
  80. package/node_modules/@playdrop/api-client/dist/domains/ai.js +20 -0
  81. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts +13 -8
  82. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts.map +1 -1
  83. package/node_modules/@playdrop/api-client/dist/domains/apps.js +158 -90
  84. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts +4 -0
  85. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts.map +1 -1
  86. package/node_modules/@playdrop/api-client/dist/domains/assets.js +27 -0
  87. package/node_modules/@playdrop/api-client/dist/domains/chat.d.ts +35 -3
  88. package/node_modules/@playdrop/api-client/dist/domains/chat.d.ts.map +1 -1
  89. package/node_modules/@playdrop/api-client/dist/domains/chat.js +89 -7
  90. package/node_modules/@playdrop/api-client/dist/domains/player-meta.d.ts +2 -1
  91. package/node_modules/@playdrop/api-client/dist/domains/player-meta.d.ts.map +1 -1
  92. package/node_modules/@playdrop/api-client/dist/domains/player-meta.js +9 -0
  93. package/node_modules/@playdrop/api-client/dist/domains/playtrade.d.ts +1 -2
  94. package/node_modules/@playdrop/api-client/dist/domains/playtrade.d.ts.map +1 -1
  95. package/node_modules/@playdrop/api-client/dist/domains/playtrade.js +0 -11
  96. package/node_modules/@playdrop/api-client/dist/domains/social.d.ts +29 -0
  97. package/node_modules/@playdrop/api-client/dist/domains/social.d.ts.map +1 -0
  98. package/node_modules/@playdrop/api-client/dist/domains/social.js +79 -0
  99. package/node_modules/@playdrop/api-client/dist/index.d.ts +80 -29
  100. package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
  101. package/node_modules/@playdrop/api-client/dist/index.js +217 -56
  102. package/node_modules/@playdrop/api-client/dist/runtime.d.ts +18 -0
  103. package/node_modules/@playdrop/api-client/dist/runtime.d.ts.map +1 -0
  104. package/node_modules/@playdrop/api-client/dist/runtime.js +54 -0
  105. package/node_modules/@playdrop/api-client/package.json +7 -0
  106. package/node_modules/@playdrop/config/client-meta.json +4 -4
  107. package/node_modules/@playdrop/config/dist/src/creator-plans.d.ts +11 -0
  108. package/node_modules/@playdrop/config/dist/src/creator-plans.d.ts.map +1 -1
  109. package/node_modules/@playdrop/config/dist/src/creator-plans.js +13 -1
  110. package/node_modules/@playdrop/config/dist/src/deployment.d.ts +0 -1
  111. package/node_modules/@playdrop/config/dist/src/deployment.d.ts.map +1 -1
  112. package/node_modules/@playdrop/config/dist/src/deployment.js +0 -8
  113. package/node_modules/@playdrop/config/dist/src/public-deployment.d.ts +0 -1
  114. package/node_modules/@playdrop/config/dist/src/public-deployment.d.ts.map +1 -1
  115. package/node_modules/@playdrop/config/dist/src/public-deployment.js +0 -8
  116. package/node_modules/@playdrop/config/dist/src/runtime-service-origins.d.ts +1 -1
  117. package/node_modules/@playdrop/config/dist/src/runtime-service-origins.js +2 -2
  118. package/node_modules/@playdrop/config/dist/src/server/logging.d.ts.map +1 -1
  119. package/node_modules/@playdrop/config/dist/src/server/logging.js +31 -2
  120. package/node_modules/@playdrop/config/dist/test/creator-plans.test.js +10 -0
  121. package/node_modules/@playdrop/config/dist/test/deployment.test.js +0 -4
  122. package/node_modules/@playdrop/config/dist/test/runtime-service-origins.test.js +2 -0
  123. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  124. package/node_modules/@playdrop/config/package.json +6 -0
  125. package/node_modules/@playdrop/game-source-git/dist/src/archive.d.ts +9 -0
  126. package/node_modules/@playdrop/game-source-git/dist/src/archive.d.ts.map +1 -0
  127. package/node_modules/@playdrop/game-source-git/dist/src/archive.js +107 -0
  128. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.d.ts +29 -0
  129. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.d.ts.map +1 -0
  130. package/node_modules/@playdrop/game-source-git/dist/src/bundle-storage.js +64 -0
  131. package/node_modules/@playdrop/game-source-git/dist/src/export.d.ts +8 -0
  132. package/node_modules/@playdrop/game-source-git/dist/src/export.d.ts.map +1 -0
  133. package/node_modules/@playdrop/game-source-git/dist/src/export.js +25 -0
  134. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts +39 -0
  135. package/node_modules/@playdrop/game-source-git/dist/src/git.d.ts.map +1 -0
  136. package/node_modules/@playdrop/game-source-git/dist/src/git.js +195 -0
  137. package/node_modules/@playdrop/game-source-git/dist/src/ignore.d.ts +6 -0
  138. package/node_modules/@playdrop/game-source-git/dist/src/ignore.d.ts.map +1 -0
  139. package/node_modules/@playdrop/game-source-git/dist/src/ignore.js +51 -0
  140. package/node_modules/@playdrop/game-source-git/dist/src/index.d.ts +10 -0
  141. package/node_modules/@playdrop/game-source-git/dist/src/index.d.ts.map +1 -0
  142. package/node_modules/@playdrop/{boxel-core/dist/src/humanoid/r15 → game-source-git/dist/src}/index.js +9 -4
  143. package/node_modules/@playdrop/game-source-git/dist/src/lock.d.ts +17 -0
  144. package/node_modules/@playdrop/game-source-git/dist/src/lock.d.ts.map +1 -0
  145. package/node_modules/@playdrop/game-source-git/dist/src/lock.js +72 -0
  146. package/node_modules/@playdrop/game-source-git/dist/src/materialize.d.ts +10 -0
  147. package/node_modules/@playdrop/game-source-git/dist/src/materialize.d.ts.map +1 -0
  148. package/node_modules/@playdrop/game-source-git/dist/src/materialize.js +99 -0
  149. package/node_modules/@playdrop/game-source-git/dist/src/paths.d.ts +24 -0
  150. package/node_modules/@playdrop/game-source-git/dist/src/paths.d.ts.map +1 -0
  151. package/node_modules/@playdrop/game-source-git/dist/src/paths.js +207 -0
  152. package/node_modules/@playdrop/game-source-git/dist/src/repository.d.ts +66 -0
  153. package/node_modules/@playdrop/game-source-git/dist/src/repository.d.ts.map +1 -0
  154. package/node_modules/@playdrop/game-source-git/dist/src/repository.js +213 -0
  155. package/node_modules/@playdrop/game-source-git/dist/test/core.test.d.ts +2 -0
  156. package/node_modules/@playdrop/game-source-git/dist/test/core.test.d.ts.map +1 -0
  157. package/node_modules/@playdrop/game-source-git/dist/test/core.test.js +441 -0
  158. package/node_modules/@playdrop/game-source-git/dist/tsconfig.tsbuildinfo +1 -0
  159. package/node_modules/@playdrop/game-source-git/package.json +28 -0
  160. package/node_modules/@playdrop/types/dist/agent-task-terminal.d.ts +2 -2
  161. package/node_modules/@playdrop/types/dist/agent-task-terminal.d.ts.map +1 -1
  162. package/node_modules/@playdrop/types/dist/agent-task-terminal.js +15 -9
  163. package/node_modules/@playdrop/types/dist/api.d.ts +728 -164
  164. package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
  165. package/node_modules/@playdrop/types/dist/api.js +60 -11
  166. package/node_modules/@playdrop/types/dist/asset-pack.d.ts +2 -0
  167. package/node_modules/@playdrop/types/dist/asset-pack.d.ts.map +1 -1
  168. package/node_modules/@playdrop/types/dist/asset.d.ts +22 -8
  169. package/node_modules/@playdrop/types/dist/asset.d.ts.map +1 -1
  170. package/node_modules/@playdrop/types/dist/asset.js +26 -26
  171. package/node_modules/@playdrop/types/dist/chat.d.ts +107 -3
  172. package/node_modules/@playdrop/types/dist/chat.d.ts.map +1 -1
  173. package/node_modules/@playdrop/types/dist/chat.js +33 -4
  174. package/node_modules/@playdrop/types/dist/index.d.ts +3 -0
  175. package/node_modules/@playdrop/types/dist/index.d.ts.map +1 -1
  176. package/node_modules/@playdrop/types/dist/index.js +7 -1
  177. package/node_modules/@playdrop/types/dist/public-cache-tags.d.ts +11 -0
  178. package/node_modules/@playdrop/types/dist/public-cache-tags.d.ts.map +1 -0
  179. package/node_modules/@playdrop/types/dist/public-cache-tags.js +78 -0
  180. package/node_modules/@playdrop/types/dist/realtime.d.ts +3 -15
  181. package/node_modules/@playdrop/types/dist/realtime.d.ts.map +1 -1
  182. package/node_modules/@playdrop/types/dist/social.d.ts +64 -0
  183. package/node_modules/@playdrop/types/dist/social.d.ts.map +1 -0
  184. package/node_modules/@playdrop/{boxel-three/dist/src/types.js → types/dist/social.js} +14 -2
  185. package/node_modules/@playdrop/types/dist/spritesheet.d.ts +51 -0
  186. package/node_modules/@playdrop/types/dist/spritesheet.d.ts.map +1 -0
  187. package/node_modules/@playdrop/types/dist/spritesheet.js +73 -0
  188. package/node_modules/@playdrop/types/dist/version.d.ts +86 -58
  189. package/node_modules/@playdrop/types/dist/version.d.ts.map +1 -1
  190. package/node_modules/@playdrop/types/dist/version.js +111 -0
  191. package/node_modules/@playdrop/types/package.json +14 -0
  192. package/node_modules/@playdrop/vox-three/dist/src/index.d.ts +1 -1
  193. package/node_modules/@playdrop/vox-three/dist/src/index.js +1 -1
  194. package/node_modules/@playdrop/vox-three/dist/src/index.js.map +1 -1
  195. package/node_modules/@playdrop/vox-three/dist/src/vox.d.ts +0 -3
  196. package/node_modules/@playdrop/vox-three/dist/src/vox.js +0 -110
  197. package/node_modules/@playdrop/vox-three/dist/src/vox.js.map +1 -1
  198. package/node_modules/@playdrop/vox-three/dist/test/vox.test.js +0 -18
  199. package/node_modules/@playdrop/vox-three/dist/test/vox.test.js.map +1 -1
  200. package/node_modules/@playdrop/vox-three/package.json +8 -4
  201. package/package.json +9 -11
  202. package/dist/assets/model-artifacts.d.ts +0 -8
  203. package/dist/assets/model-artifacts.js +0 -382
  204. package/dist/assets/model-worker.d.ts +0 -22
  205. package/dist/assets/model-worker.js +0 -123
  206. package/node_modules/@playdrop/ai-client/dist/index.d.ts +0 -441
  207. package/node_modules/@playdrop/ai-client/dist/index.d.ts.map +0 -1
  208. package/node_modules/@playdrop/ai-client/dist/index.js +0 -499
  209. package/node_modules/@playdrop/ai-client/package.json +0 -22
  210. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.d.ts +0 -13
  211. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js +0 -141
  212. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js.map +0 -1
  213. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.d.ts +0 -47
  214. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js +0 -313
  215. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js.map +0 -1
  216. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.d.ts +0 -3
  217. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js +0 -36
  218. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js.map +0 -1
  219. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.d.ts +0 -23
  220. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js +0 -11
  221. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js.map +0 -1
  222. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.d.ts +0 -4
  223. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js +0 -21
  224. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js.map +0 -1
  225. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.d.ts +0 -4
  226. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js +0 -24
  227. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js.map +0 -1
  228. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.d.ts +0 -3
  229. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.js.map +0 -1
  230. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.d.ts +0 -3
  231. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js +0 -387
  232. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js.map +0 -1
  233. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.d.ts +0 -6
  234. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js +0 -3
  235. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js.map +0 -1
  236. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.d.ts +0 -3
  237. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js +0 -373
  238. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js.map +0 -1
  239. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.d.ts +0 -12
  240. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js +0 -215
  241. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js.map +0 -1
  242. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.d.ts +0 -4
  243. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js +0 -18
  244. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js.map +0 -1
  245. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.d.ts +0 -42
  246. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js +0 -145
  247. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js.map +0 -1
  248. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.d.ts +0 -26
  249. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js +0 -65
  250. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js.map +0 -1
  251. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.d.ts +0 -33
  252. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js +0 -175
  253. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js.map +0 -1
  254. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r15.json +0 -1517
  255. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r6.json +0 -61
  256. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.d.ts +0 -10
  257. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js +0 -23
  258. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js.map +0 -1
  259. package/node_modules/@playdrop/boxel-core/dist/src/index.d.ts +0 -19
  260. package/node_modules/@playdrop/boxel-core/dist/src/index.js +0 -36
  261. package/node_modules/@playdrop/boxel-core/dist/src/index.js.map +0 -1
  262. package/node_modules/@playdrop/boxel-core/dist/src/materials.d.ts +0 -26
  263. package/node_modules/@playdrop/boxel-core/dist/src/materials.js +0 -184
  264. package/node_modules/@playdrop/boxel-core/dist/src/materials.js.map +0 -1
  265. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.d.ts +0 -68
  266. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js +0 -488
  267. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js.map +0 -1
  268. package/node_modules/@playdrop/boxel-core/dist/src/serialization.d.ts +0 -4
  269. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js +0 -380
  270. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js.map +0 -1
  271. package/node_modules/@playdrop/boxel-core/dist/src/textures.d.ts +0 -29
  272. package/node_modules/@playdrop/boxel-core/dist/src/textures.js +0 -208
  273. package/node_modules/@playdrop/boxel-core/dist/src/textures.js.map +0 -1
  274. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.d.ts +0 -9
  275. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js +0 -312
  276. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js.map +0 -1
  277. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.d.ts +0 -9
  278. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js +0 -154
  279. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js.map +0 -1
  280. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.d.ts +0 -2
  281. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js +0 -121
  282. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js.map +0 -1
  283. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.d.ts +0 -20
  284. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js +0 -389
  285. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js.map +0 -1
  286. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.d.ts +0 -3
  287. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js +0 -206
  288. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js.map +0 -1
  289. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.d.ts +0 -12
  290. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js +0 -81
  291. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js.map +0 -1
  292. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.d.ts +0 -12
  293. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js +0 -318
  294. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js.map +0 -1
  295. package/node_modules/@playdrop/boxel-core/dist/src/types.d.ts +0 -168
  296. package/node_modules/@playdrop/boxel-core/dist/src/types.js +0 -3
  297. package/node_modules/@playdrop/boxel-core/dist/src/types.js.map +0 -1
  298. package/node_modules/@playdrop/boxel-core/dist/src/validation.d.ts +0 -24
  299. package/node_modules/@playdrop/boxel-core/dist/src/validation.js +0 -620
  300. package/node_modules/@playdrop/boxel-core/dist/src/validation.js.map +0 -1
  301. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.d.ts +0 -11
  302. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js +0 -135
  303. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js.map +0 -1
  304. package/node_modules/@playdrop/boxel-core/dist/src/voxels.d.ts +0 -23
  305. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js +0 -52
  306. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js.map +0 -1
  307. package/node_modules/@playdrop/boxel-core/package.json +0 -19
  308. package/node_modules/@playdrop/boxel-three/dist/src/animations.d.ts +0 -4
  309. package/node_modules/@playdrop/boxel-three/dist/src/animations.js +0 -92
  310. package/node_modules/@playdrop/boxel-three/dist/src/builders.d.ts +0 -8
  311. package/node_modules/@playdrop/boxel-three/dist/src/builders.js +0 -363
  312. package/node_modules/@playdrop/boxel-three/dist/src/context.d.ts +0 -24
  313. package/node_modules/@playdrop/boxel-three/dist/src/context.js +0 -58
  314. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.d.ts +0 -100
  315. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.js +0 -927
  316. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.d.ts +0 -18
  317. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.js +0 -294
  318. package/node_modules/@playdrop/boxel-three/dist/src/index.d.ts +0 -17
  319. package/node_modules/@playdrop/boxel-three/dist/src/index.js +0 -64
  320. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.d.ts +0 -40
  321. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.js +0 -96
  322. package/node_modules/@playdrop/boxel-three/dist/src/nodes.d.ts +0 -8
  323. package/node_modules/@playdrop/boxel-three/dist/src/nodes.js +0 -88
  324. package/node_modules/@playdrop/boxel-three/dist/src/overlays.d.ts +0 -7
  325. package/node_modules/@playdrop/boxel-three/dist/src/overlays.js +0 -123
  326. package/node_modules/@playdrop/boxel-three/dist/src/primitives.d.ts +0 -4
  327. package/node_modules/@playdrop/boxel-three/dist/src/primitives.js +0 -48
  328. package/node_modules/@playdrop/boxel-three/dist/src/scene.d.ts +0 -3
  329. package/node_modules/@playdrop/boxel-three/dist/src/scene.js +0 -168
  330. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.d.ts +0 -29
  331. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.js +0 -623
  332. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.d.ts +0 -13
  333. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.js +0 -133
  334. package/node_modules/@playdrop/boxel-three/dist/src/textures.d.ts +0 -17
  335. package/node_modules/@playdrop/boxel-three/dist/src/textures.js +0 -216
  336. package/node_modules/@playdrop/boxel-three/dist/src/types.d.ts +0 -112
  337. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.d.ts +0 -28
  338. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.js +0 -344
  339. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.d.ts +0 -24
  340. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.js +0 -113
  341. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.d.ts +0 -1
  342. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.js +0 -137
  343. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.d.ts +0 -20
  344. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.js +0 -85
  345. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.d.ts +0 -1
  346. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +0 -104
  347. package/node_modules/@playdrop/boxel-three/dist/test/index.test.d.ts +0 -1
  348. package/node_modules/@playdrop/boxel-three/dist/test/index.test.js +0 -30
  349. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.d.ts +0 -1
  350. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +0 -88
  351. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.d.ts +0 -1
  352. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.js +0 -42
  353. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.d.ts +0 -1
  354. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.js +0 -73
  355. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.d.ts +0 -1
  356. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.js +0 -85
  357. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.d.ts +0 -1
  358. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +0 -73
  359. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.d.ts +0 -1
  360. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.js +0 -136
  361. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.d.ts +0 -1
  362. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.js +0 -42
  363. 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;