@playdrop/playdrop-cli 0.16.16 → 0.17.1

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 (369) 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 +782 -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/node_modules/@playwright/mcp/node_modules/fsevents/LICENSE +22 -0
  202. package/node_modules/@playwright/mcp/node_modules/fsevents/README.md +83 -0
  203. package/node_modules/@playwright/mcp/node_modules/fsevents/fsevents.d.ts +46 -0
  204. package/node_modules/@playwright/mcp/node_modules/fsevents/fsevents.js +82 -0
  205. package/node_modules/@playwright/mcp/node_modules/fsevents/fsevents.node +0 -0
  206. package/node_modules/@playwright/mcp/node_modules/fsevents/package.json +62 -0
  207. package/package.json +9 -11
  208. package/dist/assets/model-artifacts.d.ts +0 -8
  209. package/dist/assets/model-artifacts.js +0 -382
  210. package/dist/assets/model-worker.d.ts +0 -22
  211. package/dist/assets/model-worker.js +0 -123
  212. package/node_modules/@playdrop/ai-client/dist/index.d.ts +0 -441
  213. package/node_modules/@playdrop/ai-client/dist/index.d.ts.map +0 -1
  214. package/node_modules/@playdrop/ai-client/dist/index.js +0 -499
  215. package/node_modules/@playdrop/ai-client/package.json +0 -22
  216. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.d.ts +0 -13
  217. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js +0 -141
  218. package/node_modules/@playdrop/boxel-core/dist/src/entity-cleaner.js.map +0 -1
  219. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.d.ts +0 -47
  220. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js +0 -313
  221. package/node_modules/@playdrop/boxel-core/dist/src/entity-utils.js.map +0 -1
  222. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.d.ts +0 -3
  223. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js +0 -36
  224. package/node_modules/@playdrop/boxel-core/dist/src/format-utils.js.map +0 -1
  225. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.d.ts +0 -23
  226. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js +0 -11
  227. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/geometry.js.map +0 -1
  228. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.d.ts +0 -4
  229. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js +0 -21
  230. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/index.js.map +0 -1
  231. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.d.ts +0 -4
  232. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js +0 -24
  233. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/common.js.map +0 -1
  234. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.d.ts +0 -3
  235. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/index.js.map +0 -1
  236. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.d.ts +0 -3
  237. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js +0 -387
  238. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/textured-builder.js.map +0 -1
  239. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.d.ts +0 -6
  240. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js +0 -3
  241. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/types.js.map +0 -1
  242. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.d.ts +0 -3
  243. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js +0 -373
  244. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r15/voxel-builder.js.map +0 -1
  245. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.d.ts +0 -12
  246. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js +0 -215
  247. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/builder.js.map +0 -1
  248. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.d.ts +0 -4
  249. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js +0 -18
  250. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/index.js.map +0 -1
  251. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.d.ts +0 -42
  252. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js +0 -145
  253. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/scanner.js.map +0 -1
  254. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.d.ts +0 -26
  255. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js +0 -65
  256. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/artifacts.js.map +0 -1
  257. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.d.ts +0 -33
  258. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js +0 -175
  259. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/r6/textures/face-map.js.map +0 -1
  260. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r15.json +0 -1517
  261. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/humanoid_r6.json +0 -61
  262. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.d.ts +0 -10
  263. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js +0 -23
  264. package/node_modules/@playdrop/boxel-core/dist/src/humanoid/templates/index.js.map +0 -1
  265. package/node_modules/@playdrop/boxel-core/dist/src/index.d.ts +0 -19
  266. package/node_modules/@playdrop/boxel-core/dist/src/index.js +0 -36
  267. package/node_modules/@playdrop/boxel-core/dist/src/index.js.map +0 -1
  268. package/node_modules/@playdrop/boxel-core/dist/src/materials.d.ts +0 -26
  269. package/node_modules/@playdrop/boxel-core/dist/src/materials.js +0 -184
  270. package/node_modules/@playdrop/boxel-core/dist/src/materials.js.map +0 -1
  271. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.d.ts +0 -68
  272. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js +0 -488
  273. package/node_modules/@playdrop/boxel-core/dist/src/palette_tools.js.map +0 -1
  274. package/node_modules/@playdrop/boxel-core/dist/src/serialization.d.ts +0 -4
  275. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js +0 -380
  276. package/node_modules/@playdrop/boxel-core/dist/src/serialization.js.map +0 -1
  277. package/node_modules/@playdrop/boxel-core/dist/src/textures.d.ts +0 -29
  278. package/node_modules/@playdrop/boxel-core/dist/src/textures.js +0 -208
  279. package/node_modules/@playdrop/boxel-core/dist/src/textures.js.map +0 -1
  280. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.d.ts +0 -9
  281. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js +0 -312
  282. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/infer-face.js.map +0 -1
  283. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.d.ts +0 -9
  284. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js +0 -154
  285. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/layer-mode.js.map +0 -1
  286. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.d.ts +0 -2
  287. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js +0 -121
  288. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/merge-overlay.js.map +0 -1
  289. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.d.ts +0 -20
  290. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js +0 -389
  291. package/node_modules/@playdrop/boxel-core/dist/src/transforms/textured-boxes/slice.js.map +0 -1
  292. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.d.ts +0 -3
  293. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js +0 -206
  294. package/node_modules/@playdrop/boxel-core/dist/src/transforms/upscale.js.map +0 -1
  295. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.d.ts +0 -12
  296. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js +0 -81
  297. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/slice.js.map +0 -1
  298. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.d.ts +0 -12
  299. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js +0 -318
  300. package/node_modules/@playdrop/boxel-core/dist/src/transforms/voxels/textured-to-voxel.js.map +0 -1
  301. package/node_modules/@playdrop/boxel-core/dist/src/types.d.ts +0 -168
  302. package/node_modules/@playdrop/boxel-core/dist/src/types.js +0 -3
  303. package/node_modules/@playdrop/boxel-core/dist/src/types.js.map +0 -1
  304. package/node_modules/@playdrop/boxel-core/dist/src/validation.d.ts +0 -24
  305. package/node_modules/@playdrop/boxel-core/dist/src/validation.js +0 -620
  306. package/node_modules/@playdrop/boxel-core/dist/src/validation.js.map +0 -1
  307. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.d.ts +0 -11
  308. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js +0 -135
  309. package/node_modules/@playdrop/boxel-core/dist/src/voxels/greedy-mesher.js.map +0 -1
  310. package/node_modules/@playdrop/boxel-core/dist/src/voxels.d.ts +0 -23
  311. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js +0 -52
  312. package/node_modules/@playdrop/boxel-core/dist/src/voxels.js.map +0 -1
  313. package/node_modules/@playdrop/boxel-core/package.json +0 -19
  314. package/node_modules/@playdrop/boxel-three/dist/src/animations.d.ts +0 -4
  315. package/node_modules/@playdrop/boxel-three/dist/src/animations.js +0 -92
  316. package/node_modules/@playdrop/boxel-three/dist/src/builders.d.ts +0 -8
  317. package/node_modules/@playdrop/boxel-three/dist/src/builders.js +0 -363
  318. package/node_modules/@playdrop/boxel-three/dist/src/context.d.ts +0 -24
  319. package/node_modules/@playdrop/boxel-three/dist/src/context.js +0 -58
  320. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.d.ts +0 -100
  321. package/node_modules/@playdrop/boxel-three/dist/src/exporters/glb.js +0 -927
  322. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.d.ts +0 -18
  323. package/node_modules/@playdrop/boxel-three/dist/src/exporters/image.js +0 -294
  324. package/node_modules/@playdrop/boxel-three/dist/src/index.d.ts +0 -17
  325. package/node_modules/@playdrop/boxel-three/dist/src/index.js +0 -64
  326. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.d.ts +0 -40
  327. package/node_modules/@playdrop/boxel-three/dist/src/instantiate.js +0 -96
  328. package/node_modules/@playdrop/boxel-three/dist/src/nodes.d.ts +0 -8
  329. package/node_modules/@playdrop/boxel-three/dist/src/nodes.js +0 -88
  330. package/node_modules/@playdrop/boxel-three/dist/src/overlays.d.ts +0 -7
  331. package/node_modules/@playdrop/boxel-three/dist/src/overlays.js +0 -123
  332. package/node_modules/@playdrop/boxel-three/dist/src/primitives.d.ts +0 -4
  333. package/node_modules/@playdrop/boxel-three/dist/src/primitives.js +0 -48
  334. package/node_modules/@playdrop/boxel-three/dist/src/scene.d.ts +0 -3
  335. package/node_modules/@playdrop/boxel-three/dist/src/scene.js +0 -168
  336. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.d.ts +0 -29
  337. package/node_modules/@playdrop/boxel-three/dist/src/skinned-mesh.js +0 -623
  338. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.d.ts +0 -13
  339. package/node_modules/@playdrop/boxel-three/dist/src/texture-atlas.js +0 -133
  340. package/node_modules/@playdrop/boxel-three/dist/src/textures.d.ts +0 -17
  341. package/node_modules/@playdrop/boxel-three/dist/src/textures.js +0 -216
  342. package/node_modules/@playdrop/boxel-three/dist/src/types.d.ts +0 -112
  343. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.d.ts +0 -28
  344. package/node_modules/@playdrop/boxel-three/dist/src/voxels/faces.js +0 -344
  345. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.d.ts +0 -24
  346. package/node_modules/@playdrop/boxel-three/dist/src/voxels/mesher.js +0 -113
  347. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.d.ts +0 -1
  348. package/node_modules/@playdrop/boxel-three/dist/test/export-image.playwright.test.js +0 -137
  349. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.d.ts +0 -20
  350. package/node_modules/@playdrop/boxel-three/dist/test/fixtures/render-worker.js +0 -85
  351. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.d.ts +0 -1
  352. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +0 -104
  353. package/node_modules/@playdrop/boxel-three/dist/test/index.test.d.ts +0 -1
  354. package/node_modules/@playdrop/boxel-three/dist/test/index.test.js +0 -30
  355. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.d.ts +0 -1
  356. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +0 -88
  357. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.d.ts +0 -1
  358. package/node_modules/@playdrop/boxel-three/dist/test/overlays.test.js +0 -42
  359. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.d.ts +0 -1
  360. package/node_modules/@playdrop/boxel-three/dist/test/scene-filter.test.js +0 -73
  361. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.d.ts +0 -1
  362. package/node_modules/@playdrop/boxel-three/dist/test/scene-smoke.test.js +0 -85
  363. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.d.ts +0 -1
  364. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +0 -73
  365. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.d.ts +0 -1
  366. package/node_modules/@playdrop/boxel-three/dist/test/textured-overlay.test.js +0 -136
  367. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.d.ts +0 -1
  368. package/node_modules/@playdrop/boxel-three/dist/test/voxels.test.js +0 -42
  369. package/node_modules/@playdrop/boxel-three/package.json +0 -28
package/dist/catalogue.js CHANGED
@@ -23,13 +23,9 @@ const LISTING_VIDEO_EXTENSIONS = new Set([".mp4"]);
23
23
  exports.APP_DESCRIPTION_RECOMMENDED_MIN_CHARACTERS = 120;
24
24
  exports.APP_DESCRIPTION_RECOMMENDED_MIN_WORDS = 20;
25
25
  exports.APP_RELEASE_NOTES_MAX_CHARACTERS = 240;
26
- const BOXEL_GENERATED_FILE_ROLES = new Set(["mesh", "preview"]);
27
- const BOXEL_REQUIRED_FILE_ROLES = ["primary", "mesh", "preview"];
28
- const VOX_GENERATED_FILE_ROLES = new Set(["boxel", "mesh", "preview"]);
29
- const VOX_REQUIRED_FILE_ROLES = ["primary", "boxel", "mesh", "preview"];
30
26
  const MAX_CONTENT_TAGS_PER_ITEM = 20;
31
27
  const APP_ALLOWED_LICENSES = new Set(["CLOSED", "PLAYDROP", "MIT"]);
32
- const ASSET_ALLOWED_LICENSES = new Set(["CLOSED", "PLAYDROP", "CC0"]);
28
+ const ASSET_ALLOWED_LICENSES = new Set(["CLOSED", "PLAYDROP", "MIT", "CC0"]);
33
29
  const ASSET_SUBCATEGORY_SET_BY_CATEGORY = types_1.ASSET_SUBCATEGORY_DEFINITIONS.reduce((acc, definition) => {
34
30
  if (!acc[definition.category]) {
35
31
  acc[definition.category] = new Set();
@@ -56,38 +52,6 @@ function normalizeAppReleaseNotes(value, options = {}) {
56
52
  }
57
53
  return releaseNotes;
58
54
  }
59
- function normalizeFileRole(role) {
60
- return role.trim().toLowerCase();
61
- }
62
- function inferGeneratedModel3DFormat(category, subcategory, format, files) {
63
- if (category !== "MODEL_3D" || !(0, types_1.isModel3DAssetSubcategory)("MODEL_3D", subcategory)) {
64
- return null;
65
- }
66
- const normalizedFormat = typeof format === "string" ? format.trim().toUpperCase() : "";
67
- if (normalizedFormat === "PLAYDROP_BOXEL_JSON" || normalizedFormat === "VOX") {
68
- return normalizedFormat;
69
- }
70
- const primary = typeof files?.primary === "string" ? files.primary.trim().toLowerCase() : "";
71
- if (primary.endsWith(".boxel.json")) {
72
- return "PLAYDROP_BOXEL_JSON";
73
- }
74
- if (primary.endsWith(".vox")) {
75
- return "VOX";
76
- }
77
- return null;
78
- }
79
- function getGeneratedModel3DFileRoles(format) {
80
- if (format === "VOX") {
81
- return {
82
- generated: VOX_GENERATED_FILE_ROLES,
83
- required: VOX_REQUIRED_FILE_ROLES,
84
- };
85
- }
86
- return {
87
- generated: BOXEL_GENERATED_FILE_ROLES,
88
- required: BOXEL_REQUIRED_FILE_ROLES,
89
- };
90
- }
91
55
  function extractGlbJsonChunk(buffer) {
92
56
  if (buffer.length < 20) {
93
57
  throw new Error("invalid_glb_payload");
@@ -1228,6 +1192,56 @@ function buildAppTasks(rootDir, catalogues, options) {
1228
1192
  }
1229
1193
  authMode = rawAuthMode;
1230
1194
  }
1195
+ let server = null;
1196
+ if (Object.prototype.hasOwnProperty.call(entry, "server")) {
1197
+ const rawServer = entry.server;
1198
+ if (!rawServer || typeof rawServer !== "object" || Array.isArray(rawServer)) {
1199
+ errors.push(`[${label}] Skipping ${rawName}: server must be an object with entry and rooms.`);
1200
+ continue;
1201
+ }
1202
+ const unknownServerKeys = Object.keys(rawServer).filter((key) => key !== "entry" && key !== "rooms");
1203
+ if (unknownServerKeys.length > 0) {
1204
+ errors.push(`[${label}] Skipping ${rawName}: server contains unsupported key "${unknownServerKeys[0]}".`);
1205
+ continue;
1206
+ }
1207
+ const serverEntry = typeof rawServer.entry === "string" ? rawServer.entry.trim().replace(/\\/g, "/") : "";
1208
+ if (!serverEntry || (!serverEntry.endsWith(".ts") && !serverEntry.endsWith(".mts"))) {
1209
+ errors.push(`[${label}] Skipping ${rawName}: server.entry must be a project-local TypeScript file.`);
1210
+ continue;
1211
+ }
1212
+ const serverEntryPath = (0, node_path_1.resolve)(file.directory, serverEntry);
1213
+ const relativeServerEntry = (0, node_path_1.relative)(file.directory, serverEntryPath);
1214
+ if (relativeServerEntry.startsWith("..") || relativeServerEntry === "") {
1215
+ errors.push(`[${label}] Skipping ${rawName}: server.entry must stay inside the project directory.`);
1216
+ continue;
1217
+ }
1218
+ if (!(0, node_fs_1.existsSync)(serverEntryPath) || !(0, node_fs_1.statSync)(serverEntryPath).isFile()) {
1219
+ errors.push(`[${label}] Skipping ${rawName}: server.entry was not found at ${serverEntryPath}.`);
1220
+ continue;
1221
+ }
1222
+ if (!Array.isArray(rawServer.rooms) || rawServer.rooms.length < 1 || rawServer.rooms.length > 2) {
1223
+ errors.push(`[${label}] Skipping ${rawName}: server.rooms must contain one or two room names.`);
1224
+ continue;
1225
+ }
1226
+ const roomNames = rawServer.rooms.map((value) => (typeof value === "string" ? value.trim() : ""));
1227
+ if (roomNames.some((room) => !/^[a-z][a-z0-9_-]{0,63}$/.test(room))) {
1228
+ errors.push(`[${label}] Skipping ${rawName}: server room names must start with a lowercase letter and use only lowercase letters, digits, _ or - (max 64 characters).`);
1229
+ continue;
1230
+ }
1231
+ if (new Set(roomNames).size !== roomNames.length) {
1232
+ errors.push(`[${label}] Skipping ${rawName}: server.rooms must not contain duplicates.`);
1233
+ continue;
1234
+ }
1235
+ if (isExternalMode) {
1236
+ errors.push(`[${label}] Skipping ${rawName}: server is supported only for HOSTED apps.`);
1237
+ continue;
1238
+ }
1239
+ if (!packageJsonPath) {
1240
+ errors.push(`[${label}] Skipping ${rawName}: server apps require a package.json in the project.`);
1241
+ continue;
1242
+ }
1243
+ server = { entry: serverEntry, entryPath: serverEntryPath, rooms: roomNames };
1244
+ }
1231
1245
  let controllerMode;
1232
1246
  const rawControllerMode = typeof entry.controllerMode === "string" ? entry.controllerMode.trim().toUpperCase() : "";
1233
1247
  if (rawControllerMode) {
@@ -1454,6 +1468,60 @@ function buildAppTasks(rootDir, catalogues, options) {
1454
1468
  }
1455
1469
  design = parsedDesign.value;
1456
1470
  }
1471
+ let players;
1472
+ if (Object.prototype.hasOwnProperty.call(entry, "players")) {
1473
+ const parsedPlayers = (0, types_1.normalizeAppPlayers)(entry.players);
1474
+ if (!parsedPlayers.ok) {
1475
+ errors.push(`[${label}] App "${rawName}" ${parsedPlayers.error}`);
1476
+ continue;
1477
+ }
1478
+ players = parsedPlayers.value;
1479
+ }
1480
+ const normalizeLongFormText = (field) => {
1481
+ if (!Object.prototype.hasOwnProperty.call(entry, field)) {
1482
+ return undefined;
1483
+ }
1484
+ const raw = entry[field];
1485
+ if (typeof raw !== "string" || raw.trim().length === 0) {
1486
+ errors.push(`[${label}] App "${rawName}" ${field} must be a non-empty Markdown string.`);
1487
+ return undefined;
1488
+ }
1489
+ return raw.trim();
1490
+ };
1491
+ const makingOf = normalizeLongFormText("makingOf");
1492
+ const controls = normalizeLongFormText("controls");
1493
+ if ((Object.prototype.hasOwnProperty.call(entry, "makingOf") && !makingOf) ||
1494
+ (Object.prototype.hasOwnProperty.call(entry, "controls") && !controls)) {
1495
+ continue;
1496
+ }
1497
+ let creation;
1498
+ if (Object.prototype.hasOwnProperty.call(entry, "creation")) {
1499
+ const parsedCreation = (0, types_1.normalizeAppCreationMetadata)(entry.creation);
1500
+ if (!parsedCreation.ok) {
1501
+ errors.push(`[${label}] App "${rawName}" ${parsedCreation.error}`);
1502
+ continue;
1503
+ }
1504
+ creation = parsedCreation.value;
1505
+ }
1506
+ let sourceRepository;
1507
+ if (Object.prototype.hasOwnProperty.call(entry, "sourceRepository")) {
1508
+ const rawSourceRepository = entry.sourceRepository;
1509
+ if (typeof rawSourceRepository !== "string" || rawSourceRepository.trim().length === 0) {
1510
+ errors.push(`[${label}] App "${rawName}" sourceRepository must be a non-empty HTTPS URL.`);
1511
+ continue;
1512
+ }
1513
+ try {
1514
+ const parsedSourceRepository = new URL(rawSourceRepository.trim());
1515
+ if (parsedSourceRepository.protocol !== "https:") {
1516
+ throw new Error("invalid_source_repository");
1517
+ }
1518
+ sourceRepository = parsedSourceRepository.toString();
1519
+ }
1520
+ catch {
1521
+ errors.push(`[${label}] App "${rawName}" sourceRepository must be a non-empty HTTPS URL.`);
1522
+ continue;
1523
+ }
1524
+ }
1457
1525
  let tweaks;
1458
1526
  if (Object.prototype.hasOwnProperty.call(entry, "tweaks")) {
1459
1527
  const parsedTweaks = (0, types_1.normalizeAppTweaks)(entry.tweaks);
@@ -1503,12 +1571,6 @@ function buildAppTasks(rootDir, catalogues, options) {
1503
1571
  const ownedFormat = typeof owned?.format === "string" && owned.format.trim().length > 0
1504
1572
  ? owned.format.trim().toUpperCase()
1505
1573
  : undefined;
1506
- const generatedModel3DFormat = subcategory
1507
- ? inferGeneratedModel3DFormat(category, subcategory, ownedFormat, fileEntries)
1508
- : null;
1509
- const generatedModel3DRoles = generatedModel3DFormat
1510
- ? getGeneratedModel3DFileRoles(generatedModel3DFormat)
1511
- : null;
1512
1574
  if (!fileEntries || Object.keys(fileEntries).length === 0) {
1513
1575
  errors.push(`[${label}] Skipping ${rawName}: owned asset "${ownedName}" must define files.`);
1514
1576
  continue;
@@ -1524,14 +1586,7 @@ function buildAppTasks(rootDir, catalogues, options) {
1524
1586
  }
1525
1587
  const relativeEmbeddedPath = fileValue.trim();
1526
1588
  const absoluteEmbeddedPath = (0, node_path_1.resolve)(file.directory, relativeEmbeddedPath);
1527
- const normalizedRole = normalizeFileRole(role);
1528
- const allowMissingGenerated = Boolean(generatedModel3DRoles?.generated.has(normalizedRole));
1529
1589
  if (!(0, node_fs_1.existsSync)(absoluteEmbeddedPath) || !(0, node_fs_1.statSync)(absoluteEmbeddedPath).isFile()) {
1530
- if (allowMissingGenerated) {
1531
- files[role] = relativeEmbeddedPath.replace(/\\/g, "/");
1532
- filePaths[role] = absoluteEmbeddedPath;
1533
- continue;
1534
- }
1535
1590
  errors.push(`[${label}] Skipping ${rawName}: owned asset "${ownedName}" file not found at ${absoluteEmbeddedPath}.`);
1536
1591
  ownedAssetHasError = true;
1537
1592
  continue;
@@ -1542,14 +1597,6 @@ function buildAppTasks(rootDir, catalogues, options) {
1542
1597
  if (ownedAssetHasError) {
1543
1598
  continue;
1544
1599
  }
1545
- if (generatedModel3DRoles) {
1546
- const normalizedRoles = new Set(Object.keys(files).map((role) => normalizeFileRole(role)));
1547
- const missingRoles = generatedModel3DRoles.required.filter((role) => !normalizedRoles.has(role));
1548
- if (missingRoles.length > 0) {
1549
- errors.push(`[${label}] Skipping ${rawName}: owned asset "${ownedName}" with subcategory=${subcategory} must define files.${missingRoles.join(" and files.")}.`);
1550
- continue;
1551
- }
1552
- }
1553
1600
  if (category === "SPRITESHEET") {
1554
1601
  const hasAtlas = Object.prototype.hasOwnProperty.call(files, "atlas");
1555
1602
  const hasManifest = Object.prototype.hasOwnProperty.call(files, "manifest");
@@ -1671,6 +1718,11 @@ function buildAppTasks(rootDir, catalogues, options) {
1671
1718
  primarySurface: metadata.primarySurface,
1672
1719
  playtestTapes: metadata.playtestTapes,
1673
1720
  design,
1721
+ players,
1722
+ makingOf,
1723
+ controls,
1724
+ creation,
1725
+ sourceRepository,
1674
1726
  tweaks,
1675
1727
  missingMetadata: metadata.missingFields,
1676
1728
  // Versioning fields
@@ -1684,6 +1736,7 @@ function buildAppTasks(rootDir, catalogues, options) {
1684
1736
  controllerMode,
1685
1737
  previewable,
1686
1738
  editorSupported,
1739
+ server,
1687
1740
  externalUrl,
1688
1741
  listing,
1689
1742
  // Admin-only field
@@ -1900,12 +1953,6 @@ function buildAssetTasks(catalogues, assetSpecTasks) {
1900
1953
  const fileEntries = entry.files && typeof entry.files === "object" && !Array.isArray(entry.files)
1901
1954
  ? entry.files
1902
1955
  : null;
1903
- const generatedModel3DFormat = !isCustomAsset && category && subcategory
1904
- ? inferGeneratedModel3DFormat(category, subcategory, format, fileEntries)
1905
- : null;
1906
- const generatedModel3DRoles = generatedModel3DFormat
1907
- ? getGeneratedModel3DFileRoles(generatedModel3DFormat)
1908
- : null;
1909
1956
  if (!fileEntries || Object.keys(fileEntries).length === 0) {
1910
1957
  errors.push(`[${label}] Asset "${name}" must define files.`);
1911
1958
  continue;
@@ -1921,14 +1968,7 @@ function buildAssetTasks(catalogues, assetSpecTasks) {
1921
1968
  }
1922
1969
  const relativePath = value.trim();
1923
1970
  const absolutePath = (0, node_path_1.resolve)(file.directory, relativePath);
1924
- const normalizedRole = normalizeFileRole(role);
1925
- const allowMissingGenerated = Boolean(generatedModel3DRoles?.generated.has(normalizedRole));
1926
1971
  if (!(0, node_fs_1.existsSync)(absolutePath) || !(0, node_fs_1.statSync)(absolutePath).isFile()) {
1927
- if (allowMissingGenerated) {
1928
- files[role] = relativePath.replace(/\\/g, "/");
1929
- filePaths[role] = absolutePath;
1930
- continue;
1931
- }
1932
1972
  errors.push(`[${label}] Asset "${name}" file not found at ${absolutePath}.`);
1933
1973
  hasError = true;
1934
1974
  continue;
@@ -1939,14 +1979,6 @@ function buildAssetTasks(catalogues, assetSpecTasks) {
1939
1979
  if (hasError) {
1940
1980
  continue;
1941
1981
  }
1942
- if (!isCustomAsset && generatedModel3DRoles) {
1943
- const normalizedRoles = new Set(Object.keys(files).map((role) => normalizeFileRole(role)));
1944
- const missingRoles = generatedModel3DRoles.required.filter((role) => !normalizedRoles.has(role));
1945
- if (missingRoles.length > 0) {
1946
- errors.push(`[${label}] Asset "${name}" with subcategory=${subcategory} must define files.${missingRoles.join(" and files.")}.`);
1947
- continue;
1948
- }
1949
- }
1950
1982
  if (!isCustomAsset && category === "SPRITESHEET") {
1951
1983
  const hasAtlas = Object.prototype.hasOwnProperty.call(files, "atlas");
1952
1984
  const hasManifest = Object.prototype.hasOwnProperty.call(files, "manifest");
@@ -2090,12 +2122,6 @@ function buildAssetPackTasks(catalogues) {
2090
2122
  const ownedFormat = typeof owned?.format === "string" && owned.format.trim().length > 0
2091
2123
  ? owned.format.trim().toUpperCase()
2092
2124
  : undefined;
2093
- const generatedModel3DFormat = subcategory
2094
- ? inferGeneratedModel3DFormat(category, subcategory, ownedFormat, fileEntries)
2095
- : null;
2096
- const generatedModel3DRoles = generatedModel3DFormat
2097
- ? getGeneratedModel3DFileRoles(generatedModel3DFormat)
2098
- : null;
2099
2125
  if (!fileEntries || Object.keys(fileEntries).length === 0) {
2100
2126
  errors.push(`[${label}] Skipping asset pack "${name}": owned asset "${ownedName}" must define files.`);
2101
2127
  continue;
@@ -2111,14 +2137,7 @@ function buildAssetPackTasks(catalogues) {
2111
2137
  }
2112
2138
  const relativeOwnedPath = fileValue.trim();
2113
2139
  const absoluteOwnedPath = (0, node_path_1.resolve)(file.directory, relativeOwnedPath);
2114
- const normalizedRole = normalizeFileRole(role);
2115
- const allowMissingGenerated = Boolean(generatedModel3DRoles?.generated.has(normalizedRole));
2116
2140
  if (!(0, node_fs_1.existsSync)(absoluteOwnedPath) || !(0, node_fs_1.statSync)(absoluteOwnedPath).isFile()) {
2117
- if (allowMissingGenerated) {
2118
- files[role] = relativeOwnedPath.replace(/\\/g, "/");
2119
- filePaths[role] = absoluteOwnedPath;
2120
- continue;
2121
- }
2122
2141
  errors.push(`[${label}] Skipping asset pack "${name}": owned asset "${ownedName}" file not found at ${absoluteOwnedPath}.`);
2123
2142
  ownedAssetHasError = true;
2124
2143
  continue;
@@ -2129,14 +2148,6 @@ function buildAssetPackTasks(catalogues) {
2129
2148
  if (ownedAssetHasError) {
2130
2149
  continue;
2131
2150
  }
2132
- if (generatedModel3DRoles) {
2133
- const normalizedRoles = new Set(Object.keys(files).map((role) => normalizeFileRole(role)));
2134
- const missingRoles = generatedModel3DRoles.required.filter((role) => !normalizedRoles.has(role));
2135
- if (missingRoles.length > 0) {
2136
- errors.push(`[${label}] Skipping asset pack "${name}": owned asset "${ownedName}" with subcategory=${subcategory} must define files.${missingRoles.join(" and files.")}.`);
2137
- continue;
2138
- }
2139
- }
2140
2151
  if (category === "SPRITESHEET") {
2141
2152
  const hasAtlas = Object.prototype.hasOwnProperty.call(files, "atlas");
2142
2153
  const hasManifest = Object.prototype.hasOwnProperty.call(files, "manifest");
@@ -2233,6 +2244,20 @@ function buildAssetPackTasks(catalogues) {
2233
2244
  errors.push(`[${label}] Asset pack "${name}" visibility must be PUBLIC or PRIVATE.`);
2234
2245
  continue;
2235
2246
  }
2247
+ let sourcePath;
2248
+ if (typeof entry.source === "string" && entry.source.trim()) {
2249
+ const relativeSourcePath = entry.source.trim();
2250
+ const absoluteSourcePath = (0, node_path_1.resolve)(file.directory, relativeSourcePath);
2251
+ if (!relativeSourcePath.toLowerCase().endsWith(".zip")) {
2252
+ errors.push(`[${label}] Asset pack "${name}" source must be a ZIP archive.`);
2253
+ continue;
2254
+ }
2255
+ if (!(0, node_fs_1.existsSync)(absoluteSourcePath) || !(0, node_fs_1.statSync)(absoluteSourcePath).isFile()) {
2256
+ errors.push(`[${label}] Asset pack "${name}" source not found at ${absoluteSourcePath}.`);
2257
+ continue;
2258
+ }
2259
+ sourcePath = absoluteSourcePath;
2260
+ }
2236
2261
  let listing;
2237
2262
  const rawListing = entry.listing;
2238
2263
  let listingValidationFailed = false;
@@ -2375,6 +2400,7 @@ function buildAssetPackTasks(catalogues) {
2375
2400
  visibility,
2376
2401
  license,
2377
2402
  releaseNotes: typeof entry.releaseNotes === "string" ? entry.releaseNotes : undefined,
2403
+ sourcePath,
2378
2404
  tags,
2379
2405
  listing,
2380
2406
  relations,
@@ -1,25 +1,28 @@
1
1
  import type { ApiClient } from "@playdrop/api-client";
2
- import type { AiClient } from "@playdrop/ai-client";
3
2
  import { type CliAccountSession, type CliConfig } from "./config";
4
3
  import { type EnvironmentConfig } from "./environment";
5
4
  import { type ResolvedWorkspaceAuthConfig } from "./workspaceAuth";
6
5
  export type EnvironmentContext = {
7
6
  client: ApiClient;
8
- aiClient: AiClient;
9
7
  env: string;
10
8
  envConfig: EnvironmentConfig;
11
9
  token: string;
12
10
  config: CliConfig;
13
11
  account: CliAccountSession | null;
14
12
  workspaceAuth: ResolvedWorkspaceAuthConfig | null;
13
+ getToken: () => string;
14
+ refreshToken: (force?: boolean) => Promise<string>;
15
15
  };
16
16
  type EnvironmentCallback = (ctx: EnvironmentContext) => Promise<void> | void;
17
17
  export type ResolveAuthenticatedEnvironmentOptions = {
18
18
  env?: string;
19
19
  workspacePath?: string;
20
+ forceRefresh?: boolean;
20
21
  };
21
22
  export declare function resolveAuthenticatedEnvironmentContext(command: string, actionLabel: string, options?: ResolveAuthenticatedEnvironmentOptions): Promise<EnvironmentContext | null>;
22
23
  export declare function resolveOptionalEnvironmentContext(command: string, options?: ResolveAuthenticatedEnvironmentOptions): Promise<EnvironmentContext | null>;
23
24
  export declare function withEnvironment(command: string, actionLabel: string, callback: EnvironmentCallback, options?: ResolveAuthenticatedEnvironmentOptions): Promise<void>;
24
- export declare function withPublicEnvironment(command: string, callback: EnvironmentCallback): Promise<void>;
25
+ export declare function withPublicEnvironment(command: string, callback: EnvironmentCallback, options?: {
26
+ env?: string;
27
+ }): Promise<void>;
25
28
  export {};
@@ -4,12 +4,82 @@ exports.resolveAuthenticatedEnvironmentContext = resolveAuthenticatedEnvironment
4
4
  exports.resolveOptionalEnvironmentContext = resolveOptionalEnvironmentContext;
5
5
  exports.withEnvironment = withEnvironment;
6
6
  exports.withPublicEnvironment = withPublicEnvironment;
7
+ const types_1 = require("@playdrop/types");
7
8
  const config_1 = require("./config");
8
9
  const apiClient_1 = require("./apiClient");
9
10
  const environment_1 = require("./environment");
10
11
  const messages_1 = require("./messages");
11
12
  const workspaceAuth_1 = require("./workspaceAuth");
12
13
  const DEFAULT_PUBLIC_ENV = "prod";
14
+ const ACCESS_TOKEN_REFRESH_WINDOW_MS = 5 * 60 * 1000;
15
+ function readAccessTokenExpiryMs(token) {
16
+ try {
17
+ const payloadSegment = token.split(".")[1];
18
+ if (!payloadSegment)
19
+ return null;
20
+ const payload = JSON.parse(Buffer.from(payloadSegment, "base64url").toString("utf8"));
21
+ return typeof payload.exp === "number" && Number.isFinite(payload.exp) ? payload.exp * 1000 : null;
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ function accessTokenIsValid(token, nowMs = Date.now()) {
28
+ const expiresAtMs = readAccessTokenExpiryMs(token);
29
+ return expiresAtMs !== null && expiresAtMs > nowMs;
30
+ }
31
+ function accessTokenNeedsRefresh(token, nowMs = Date.now()) {
32
+ const expiresAtMs = readAccessTokenExpiryMs(token);
33
+ return expiresAtMs === null || expiresAtMs - nowMs <= ACCESS_TOKEN_REFRESH_WINDOW_MS;
34
+ }
35
+ function extractLoginAccessToken(data) {
36
+ const token = data.accessToken ?? (typeof data === "object" && data !== null && "token" in data ? String(data.token) : "");
37
+ if (!token.trim())
38
+ throw new Error("cli_session_refresh_token_missing");
39
+ return token.trim();
40
+ }
41
+ async function refreshStoredAccountSession(input) {
42
+ if (!input.force && !accessTokenNeedsRefresh(input.account.token)) {
43
+ return input.account;
44
+ }
45
+ if (!input.account.deviceApiKey) {
46
+ const expiryMs = readAccessTokenExpiryMs(input.account.token);
47
+ const storedConfigVersion = (0, config_1.loadConfig)().version ?? 0;
48
+ if (!input.force && storedConfigVersion < 3 && expiryMs === null) {
49
+ return input.account;
50
+ }
51
+ throw new Error('cli_session_refresh_requires_login: this session predates durable CLI auth. Run "playdrop auth login" once to upgrade it.');
52
+ }
53
+ try {
54
+ const login = await (0, apiClient_1.createCliApiClient)({ baseUrl: input.envConfig.apiBase }).loginWithApiKey({
55
+ apiKey: input.account.deviceApiKey,
56
+ });
57
+ const username = login.user?.username?.trim() ?? "";
58
+ if (username !== input.account.username) {
59
+ throw new Error("cli_session_refresh_account_mismatch");
60
+ }
61
+ const token = extractLoginAccessToken(login);
62
+ (0, config_1.saveAccountSession)({
63
+ username,
64
+ env: input.account.env,
65
+ token,
66
+ deviceApiKey: input.account.deviceApiKey,
67
+ });
68
+ return (0, config_1.findAccountSession)(username, input.account.env) ?? { ...input.account, token };
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error && error.message === "cli_session_refresh_account_mismatch") {
72
+ throw new Error('cli_device_credentials_invalid: this computer token belongs to another account. Run "playdrop auth login" again.');
73
+ }
74
+ if (error instanceof types_1.ApiError && (error.status === 401 || error.status === 403)) {
75
+ throw new Error('cli_device_credentials_invalid: this computer token was revoked or is no longer authorized. Run "playdrop auth login" again.');
76
+ }
77
+ if (accessTokenIsValid(input.account.token)) {
78
+ return input.account;
79
+ }
80
+ throw new Error(`cli_session_refresh_failed: no valid access token remains (${error instanceof Error ? error.message : String(error)}).`);
81
+ }
82
+ }
13
83
  function normalizeRequestedEnv(value) {
14
84
  if (typeof value !== "string") {
15
85
  return undefined;
@@ -37,37 +107,43 @@ function resolveConfiguredEnvironment(envName, command, options) {
37
107
  return envConfig;
38
108
  }
39
109
  function buildContext(cfg, envConfig, account, workspaceAuth = null) {
40
- const token = account?.token ?? cfg.token ?? "";
110
+ let activeAccount = account;
111
+ let token = activeAccount?.token ?? cfg.token ?? "";
41
112
  const onBehalfCreatorUsername = workspaceAuth?.config.ownerUsername ?? null;
42
113
  const agentTaskToken = workspaceAuth?.config.taskToken ?? null;
43
114
  const agentTaskId = workspaceAuth?.config.taskId ?? null;
44
115
  const agentTaskAttempt = workspaceAuth?.config.taskAttempt ?? null;
45
116
  const client = (0, apiClient_1.createCliApiClient)({
46
117
  baseUrl: envConfig.apiBase,
47
- token,
48
- onBehalfCreatorUsername,
49
- agentTaskToken,
50
- agentTaskId,
51
- agentTaskAttempt,
52
- });
53
- const aiClient = (0, apiClient_1.createCliAiClient)({
54
- baseUrl: envConfig.aiBase,
55
- token,
118
+ tokenProvider: () => token,
56
119
  onBehalfCreatorUsername,
57
120
  agentTaskToken,
58
121
  agentTaskId,
59
122
  agentTaskAttempt,
60
123
  });
61
- return {
124
+ const context = {
62
125
  client,
63
- aiClient,
64
126
  env: envConfig.name,
65
127
  envConfig,
66
- token,
128
+ get token() {
129
+ return token;
130
+ },
67
131
  config: cfg,
68
132
  account,
69
133
  workspaceAuth,
134
+ getToken: () => token,
135
+ refreshToken: async (force = true) => {
136
+ if (!activeAccount) {
137
+ throw new Error("cli_session_refresh_requires_login");
138
+ }
139
+ activeAccount = await refreshStoredAccountSession({ account: activeAccount, envConfig, force });
140
+ token = activeAccount.token;
141
+ context.account = activeAccount;
142
+ context.config = (0, config_1.loadConfig)();
143
+ return token;
144
+ },
70
145
  };
146
+ return context;
71
147
  }
72
148
  function buildLegacyAccountSession(cfg) {
73
149
  if (!cfg.token || !cfg.env) {
@@ -274,7 +350,12 @@ async function resolveAuthenticatedEnvironmentContext(command, actionLabel, opti
274
350
  if (!resolved) {
275
351
  return null;
276
352
  }
277
- return buildContext(resolved.cfg, resolved.envConfig, resolved.account, resolved.workspaceAuth);
353
+ const account = await refreshStoredAccountSession({
354
+ account: resolved.account,
355
+ envConfig: resolved.envConfig,
356
+ force: options.forceRefresh,
357
+ });
358
+ return buildContext((0, config_1.loadConfig)(), resolved.envConfig, account, resolved.workspaceAuth);
278
359
  }
279
360
  async function resolveOptionalEnvironmentContext(command, options = {}) {
280
361
  const loaded = await loadWorkspaceAwareConfig(command, options);
@@ -325,7 +406,12 @@ async function resolveOptionalEnvironmentContext(command, options = {}) {
325
406
  if (!envConfig) {
326
407
  return null;
327
408
  }
328
- return buildContext((0, config_1.loadConfig)(), envConfig, selectedAccount, workspaceAuth);
409
+ const account = await refreshStoredAccountSession({
410
+ account: selectedAccount,
411
+ envConfig,
412
+ force: options.forceRefresh,
413
+ });
414
+ return buildContext((0, config_1.loadConfig)(), envConfig, account, workspaceAuth);
329
415
  }
330
416
  async function withEnvironment(command, actionLabel, callback, options = {}) {
331
417
  const ctx = await resolveAuthenticatedEnvironmentContext(command, actionLabel, options);
@@ -334,10 +420,14 @@ async function withEnvironment(command, actionLabel, callback, options = {}) {
334
420
  }
335
421
  await callback(ctx);
336
422
  }
337
- async function withPublicEnvironment(command, callback) {
423
+ async function withPublicEnvironment(command, callback, options = {}) {
338
424
  const cfg = (0, config_1.loadConfig)();
339
- const account = (0, config_1.getCurrentAccountSession)(cfg);
340
- const envConfig = resolveConfiguredEnvironment(account?.env ?? cfg.env, command, {
425
+ const currentAccount = (0, config_1.getCurrentAccountSession)(cfg);
426
+ const requestedEnv = options.env?.trim();
427
+ const account = requestedEnv && currentAccount
428
+ ? (0, config_1.findAccountSession)(currentAccount.username, requestedEnv, cfg)
429
+ : currentAccount;
430
+ const envConfig = resolveConfiguredEnvironment(requestedEnv ?? account?.env ?? cfg.env, command, {
341
431
  requireAuth: false,
342
432
  allowDefaultPublicEnv: true,
343
433
  });
@@ -5,7 +5,6 @@ const taskSelection_1 = require("../taskSelection");
5
5
  const taskUtils_1 = require("../taskUtils");
6
6
  const uploadLog_1 = require("../uploadLog");
7
7
  const apps_1 = require("../apps");
8
- const model_artifacts_1 = require("../assets/model-artifacts");
9
8
  async function build(pathOrName) {
10
9
  const selection = (0, taskSelection_1.selectTasks)(pathOrName);
11
10
  if (selection.errors.length > 0) {
@@ -29,12 +28,6 @@ async function build(pathOrName) {
29
28
  const artifacts = await (0, apps_1.buildApp)(task);
30
29
  detail = `bundleHash=${artifacts.bundleHash}`;
31
30
  }
32
- else if (task.kind === "asset" || task.kind === "owned-asset") {
33
- const generated = await (0, model_artifacts_1.prepareModel3DAssetArtifacts)(task);
34
- if (!generated) {
35
- throw new Error(`project build does not support ${task.kind} "${entityId}" because it has no local build step.`);
36
- }
37
- }
38
31
  else {
39
32
  throw new Error(`project build does not support ${task.kind} "${entityId}".`);
40
33
  }
@@ -3,6 +3,7 @@ import type { BrowserContextOptions } from "playwright-core";
3
3
  import { type TaskCaptureSession } from "../appUrls";
4
4
  type CaptureListingOptions = {
5
5
  app?: string;
6
+ surface?: string;
6
7
  duration?: string | number;
7
8
  width?: string | number;
8
9
  height?: string | number;
@@ -15,6 +16,7 @@ type CaptureListingOptions = {
15
16
  type ParsedCaptureListingOptions = {
16
17
  targetArg?: string;
17
18
  appName?: string;
19
+ surface: AppSurface | null;
18
20
  durationSeconds: number;
19
21
  width: number;
20
22
  height: number;
@@ -124,6 +126,7 @@ export type ExportedListingAudio = {
124
126
  mimeType: string;
125
127
  base64: string;
126
128
  };
129
+ export declare function resolveCaptureSurfaces(declared: AppSurface[], selected: AppSurface | null): AppSurface[];
127
130
  export declare function resolveListingCaptureRouteSegment(previewable: boolean): "dev-preview";
128
131
  export declare function resolveCaptureListingDevRouterPort(env?: NodeJS.ProcessEnv): number;
129
132
  export declare function resolveListingCaptureLocalDevPort(devRouterPort: number): number | null;