@playdrop/playdrop-cli 0.3.4-build.1 → 0.3.5-build.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 (141) hide show
  1. package/README.md +60 -23
  2. package/config/client-meta.json +5 -5
  3. package/dist/apps/upload.js +5 -3
  4. package/dist/assets/model-artifacts.js +1 -1
  5. package/dist/catalogue.d.ts +6 -0
  6. package/dist/catalogue.js +38 -1
  7. package/dist/commandContext.d.ts +1 -0
  8. package/dist/commandContext.js +45 -15
  9. package/dist/commands/browse.d.ts +16 -0
  10. package/dist/commands/browse.js +370 -0
  11. package/dist/commands/build.js +4 -9
  12. package/dist/commands/capture.js +24 -24
  13. package/dist/commands/captureRemote.d.ts +11 -0
  14. package/dist/commands/captureRemote.js +90 -0
  15. package/dist/commands/comments.d.ts +14 -0
  16. package/dist/commands/comments.js +189 -0
  17. package/dist/commands/create.js +112 -72
  18. package/dist/commands/creations.d.ts +49 -0
  19. package/dist/commands/creations.js +657 -0
  20. package/dist/commands/credits.d.ts +10 -0
  21. package/dist/commands/credits.js +91 -0
  22. package/dist/commands/detail.d.ts +2 -2
  23. package/dist/commands/detail.js +148 -290
  24. package/dist/commands/dev.js +24 -24
  25. package/dist/commands/devShared.js +2 -2
  26. package/dist/commands/documentation.d.ts +4 -1
  27. package/dist/commands/documentation.js +79 -104
  28. package/dist/commands/feedback.d.ts +12 -9
  29. package/dist/commands/feedback.js +125 -257
  30. package/dist/commands/format.js +6 -13
  31. package/dist/commands/generation.d.ts +11 -0
  32. package/dist/commands/generation.js +204 -42
  33. package/dist/commands/gettingStarted.d.ts +1 -0
  34. package/dist/commands/gettingStarted.js +26 -0
  35. package/dist/commands/init.js +26 -24
  36. package/dist/commands/login.js +9 -8
  37. package/dist/commands/logout.js +2 -1
  38. package/dist/commands/notifications.d.ts +14 -0
  39. package/dist/commands/notifications.js +179 -0
  40. package/dist/commands/search.d.ts +13 -0
  41. package/dist/commands/search.js +198 -0
  42. package/dist/commands/upload.js +20 -17
  43. package/dist/commands/validate.js +15 -1
  44. package/dist/commands/versionsBrowse.d.ts +7 -0
  45. package/dist/commands/versionsBrowse.js +209 -0
  46. package/dist/commands/whoami.js +9 -8
  47. package/dist/errors.d.ts +9 -0
  48. package/dist/errors.js +52 -0
  49. package/dist/externalAssetPackValidation.d.ts +2 -0
  50. package/dist/externalAssetPackValidation.js +115 -0
  51. package/dist/http.js +1 -1
  52. package/dist/index.js +570 -630
  53. package/dist/messages.js +11 -11
  54. package/dist/output.d.ts +5 -0
  55. package/dist/output.js +45 -0
  56. package/dist/playwright.js +1 -1
  57. package/dist/refs.d.ts +18 -0
  58. package/dist/refs.js +105 -0
  59. package/node_modules/@playdrop/ai-client/dist/index.d.ts +42 -15
  60. package/node_modules/@playdrop/ai-client/dist/index.d.ts.map +1 -1
  61. package/node_modules/@playdrop/ai-client/package.json +1 -0
  62. package/node_modules/@playdrop/api-client/dist/client.d.ts +39 -27
  63. package/node_modules/@playdrop/api-client/dist/client.d.ts.map +1 -1
  64. package/node_modules/@playdrop/api-client/dist/client.js +280 -1669
  65. package/node_modules/@playdrop/api-client/dist/core/errors.d.ts +9 -0
  66. package/node_modules/@playdrop/api-client/dist/core/errors.d.ts.map +1 -0
  67. package/node_modules/@playdrop/api-client/dist/core/errors.js +46 -0
  68. package/node_modules/@playdrop/api-client/dist/core/request.d.ts +27 -0
  69. package/node_modules/@playdrop/api-client/dist/core/request.d.ts.map +1 -0
  70. package/node_modules/@playdrop/api-client/dist/core/request.js +122 -0
  71. package/node_modules/@playdrop/api-client/dist/domains/admin.d.ts +75 -0
  72. package/node_modules/@playdrop/api-client/dist/domains/admin.d.ts.map +1 -0
  73. package/node_modules/@playdrop/api-client/dist/domains/admin.js +282 -0
  74. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts +22 -0
  75. package/node_modules/@playdrop/api-client/dist/domains/ai.d.ts.map +1 -0
  76. package/node_modules/@playdrop/api-client/dist/domains/ai.js +15 -0
  77. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts +60 -0
  78. package/node_modules/@playdrop/api-client/dist/domains/apps.d.ts.map +1 -0
  79. package/node_modules/@playdrop/api-client/dist/domains/apps.js +301 -0
  80. package/node_modules/@playdrop/api-client/dist/domains/asset-packs.d.ts +59 -0
  81. package/node_modules/@playdrop/api-client/dist/domains/asset-packs.d.ts.map +1 -0
  82. package/node_modules/@playdrop/api-client/dist/domains/asset-packs.js +297 -0
  83. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts +62 -0
  84. package/node_modules/@playdrop/api-client/dist/domains/assets.d.ts.map +1 -0
  85. package/node_modules/@playdrop/api-client/dist/domains/assets.js +297 -0
  86. package/node_modules/@playdrop/api-client/dist/domains/auth.d.ts +28 -0
  87. package/node_modules/@playdrop/api-client/dist/domains/auth.d.ts.map +1 -0
  88. package/node_modules/@playdrop/api-client/dist/domains/auth.js +78 -0
  89. package/node_modules/@playdrop/api-client/dist/domains/comments.d.ts +29 -0
  90. package/node_modules/@playdrop/api-client/dist/domains/comments.d.ts.map +1 -0
  91. package/node_modules/@playdrop/api-client/dist/domains/comments.js +65 -0
  92. package/node_modules/@playdrop/api-client/dist/domains/me.d.ts +24 -0
  93. package/node_modules/@playdrop/api-client/dist/domains/me.d.ts.map +1 -0
  94. package/node_modules/@playdrop/api-client/dist/domains/me.js +35 -0
  95. package/node_modules/@playdrop/api-client/dist/domains/payments.d.ts +37 -0
  96. package/node_modules/@playdrop/api-client/dist/domains/payments.d.ts.map +1 -0
  97. package/node_modules/@playdrop/api-client/dist/domains/payments.js +148 -0
  98. package/node_modules/@playdrop/api-client/dist/domains/search.d.ts +27 -0
  99. package/node_modules/@playdrop/api-client/dist/domains/search.d.ts.map +1 -0
  100. package/node_modules/@playdrop/api-client/dist/domains/search.js +65 -0
  101. package/node_modules/@playdrop/api-client/dist/index.d.ts +33 -56
  102. package/node_modules/@playdrop/api-client/dist/index.d.ts.map +1 -1
  103. package/node_modules/@playdrop/api-client/dist/index.js +103 -44
  104. package/node_modules/@playdrop/api-client/package.json +3 -2
  105. package/node_modules/@playdrop/boxel-core/package.json +1 -1
  106. package/node_modules/@playdrop/boxel-three/dist/test/glb-skinned.test.js +1 -1
  107. package/node_modules/@playdrop/boxel-three/dist/test/instantiate.test.js +1 -1
  108. package/node_modules/@playdrop/boxel-three/dist/test/skinned-mesh.test.js +1 -1
  109. package/node_modules/@playdrop/boxel-three/package.json +2 -1
  110. package/node_modules/@playdrop/config/client-meta.json +5 -5
  111. package/node_modules/@playdrop/config/dist/src/constants.d.ts +5 -0
  112. package/node_modules/@playdrop/config/dist/src/constants.d.ts.map +1 -1
  113. package/node_modules/@playdrop/config/dist/src/constants.js +5 -1
  114. package/node_modules/@playdrop/config/dist/tsconfig.tsbuildinfo +1 -1
  115. package/node_modules/@playdrop/config/package.json +1 -1
  116. package/node_modules/@playdrop/types/dist/api.d.ts +178 -17
  117. package/node_modules/@playdrop/types/dist/api.d.ts.map +1 -1
  118. package/node_modules/@playdrop/types/dist/api.js +30 -1
  119. package/node_modules/@playdrop/types/dist/app.d.ts +0 -14
  120. package/node_modules/@playdrop/types/dist/app.d.ts.map +1 -1
  121. package/node_modules/@playdrop/types/dist/app.js +0 -10
  122. package/node_modules/@playdrop/types/dist/asset-pack.d.ts +11 -1
  123. package/node_modules/@playdrop/types/dist/asset-pack.d.ts.map +1 -1
  124. package/node_modules/@playdrop/types/dist/asset.d.ts +65 -0
  125. package/node_modules/@playdrop/types/dist/asset.d.ts.map +1 -1
  126. package/node_modules/@playdrop/types/dist/realtime.d.ts +26 -26
  127. package/node_modules/@playdrop/types/dist/realtime.d.ts.map +1 -1
  128. package/node_modules/@playdrop/types/dist/version.d.ts +5 -0
  129. package/node_modules/@playdrop/types/dist/version.d.ts.map +1 -1
  130. package/package.json +2 -3
  131. package/bin/playdrop-cli +0 -2
  132. package/dist/commands/asset-packs.d.ts +0 -27
  133. package/dist/commands/asset-packs.js +0 -508
  134. package/dist/commands/assets.d.ts +0 -35
  135. package/dist/commands/assets.js +0 -668
  136. package/dist/commands/list.d.ts +0 -7
  137. package/dist/commands/list.js +0 -347
  138. package/dist/commands/migrateCatalogueV2.d.ts +0 -1
  139. package/dist/commands/migrateCatalogueV2.js +0 -142
  140. package/dist/commands/versions.d.ts +0 -17
  141. package/dist/commands/versions.js +0 -384
@@ -0,0 +1,657 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browseCreations = browseCreations;
4
+ exports.updateCreationApp = updateCreationApp;
5
+ exports.deleteCreationApp = deleteCreationApp;
6
+ exports.setCurrentCreationAppVersion = setCurrentCreationAppVersion;
7
+ exports.publishCreationAppVersion = publishCreationAppVersion;
8
+ exports.unpublishCreationAppVersion = unpublishCreationAppVersion;
9
+ exports.deleteCreationAppVersion = deleteCreationAppVersion;
10
+ exports.updateCreationAsset = updateCreationAsset;
11
+ exports.deleteCreationAsset = deleteCreationAsset;
12
+ exports.setCurrentCreationAssetVersion = setCurrentCreationAssetVersion;
13
+ exports.publishCreationAssetVersion = publishCreationAssetVersion;
14
+ exports.unpublishCreationAssetVersion = unpublishCreationAssetVersion;
15
+ exports.deleteCreationAssetVersion = deleteCreationAssetVersion;
16
+ exports.updateCreationAssetPack = updateCreationAssetPack;
17
+ exports.deleteCreationAssetPack = deleteCreationAssetPack;
18
+ exports.setCurrentCreationAssetPackVersion = setCurrentCreationAssetPackVersion;
19
+ exports.publishCreationAssetPackVersion = publishCreationAssetPackVersion;
20
+ exports.unpublishCreationAssetPackVersion = unpublishCreationAssetPackVersion;
21
+ exports.deleteCreationAssetPackVersion = deleteCreationAssetPackVersion;
22
+ const types_1 = require("@playdrop/types");
23
+ const commandContext_1 = require("../commandContext");
24
+ const errors_1 = require("../errors");
25
+ const messages_1 = require("../messages");
26
+ const output_1 = require("../output");
27
+ const refs_1 = require("../refs");
28
+ const MERGED_PAGE_SIZE = 100;
29
+ function parseBrowseKind(raw) {
30
+ if (!raw || raw.trim().length === 0) {
31
+ return 'all';
32
+ }
33
+ const normalized = raw.trim().toLowerCase();
34
+ if (normalized === 'app' || normalized === 'asset' || normalized === 'asset-pack' || normalized === 'all') {
35
+ return normalized;
36
+ }
37
+ return null;
38
+ }
39
+ function parsePositiveInteger(raw, label, fallback) {
40
+ if (raw === undefined) {
41
+ return fallback;
42
+ }
43
+ const parsed = typeof raw === 'number' ? raw : Number.parseInt(String(raw), 10);
44
+ if (!Number.isInteger(parsed) || parsed < 0) {
45
+ return null;
46
+ }
47
+ if (label === 'limit' && parsed <= 0) {
48
+ return null;
49
+ }
50
+ return parsed;
51
+ }
52
+ async function resolveCreator(client, rawCreator, command) {
53
+ let creator;
54
+ try {
55
+ creator = (0, refs_1.parseCreatorOption)(rawCreator);
56
+ }
57
+ catch {
58
+ (0, messages_1.printErrorWithHelp)('The --creator value is invalid.', ['Use me or a creator slug without path separators.'], { command });
59
+ process.exitCode = 1;
60
+ return null;
61
+ }
62
+ if (creator !== 'me') {
63
+ return creator;
64
+ }
65
+ const response = await client.me();
66
+ const username = response.user?.username?.trim();
67
+ if (!username) {
68
+ (0, messages_1.printErrorWithHelp)('Could not resolve your current creator account.', ['Run "playdrop auth whoami" to confirm your session, then retry.'], { command });
69
+ process.exitCode = 1;
70
+ return null;
71
+ }
72
+ return username;
73
+ }
74
+ function parseRevision(raw, command) {
75
+ const normalized = raw.trim().toLowerCase();
76
+ const numeric = normalized.startsWith('r') ? normalized.slice(1) : normalized;
77
+ const parsed = Number.parseInt(numeric, 10);
78
+ if (!Number.isInteger(parsed) || parsed <= 0) {
79
+ (0, messages_1.printErrorWithHelp)('Revision must be a positive integer or r-prefixed revision label.', ['Example: r2'], { command });
80
+ process.exitCode = 1;
81
+ return null;
82
+ }
83
+ return parsed;
84
+ }
85
+ function parseVersion(raw, command) {
86
+ const normalized = raw.trim();
87
+ if (!/^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/.test(normalized)) {
88
+ (0, messages_1.printErrorWithHelp)('Version must use semantic version format x.y.z.', ['Example: 1.2.0'], { command });
89
+ process.exitCode = 1;
90
+ return null;
91
+ }
92
+ return normalized;
93
+ }
94
+ function kindLabel(kind) {
95
+ return kind === 'all' ? 'content' : kind === 'asset-pack' ? 'asset packs' : `${kind}s`;
96
+ }
97
+ async function collectPaginatedItems(fetchPage) {
98
+ const items = [];
99
+ let offset = 0;
100
+ let lastPagination = null;
101
+ while (true) {
102
+ const page = await fetchPage(MERGED_PAGE_SIZE, offset);
103
+ items.push(...page.items);
104
+ lastPagination = page.pagination;
105
+ if (!page.pagination.hasMore) {
106
+ break;
107
+ }
108
+ if (page.pagination.limit <= 0) {
109
+ throw new Error('invalid_pagination_limit');
110
+ }
111
+ offset += page.pagination.limit;
112
+ }
113
+ return {
114
+ items,
115
+ pagination: lastPagination ?? { limit: MERGED_PAGE_SIZE, offset: 0, count: 0, hasMore: false },
116
+ };
117
+ }
118
+ function sliceMergedItems(items, limit, offset) {
119
+ const count = items.length;
120
+ return {
121
+ items: items.slice(offset, offset + limit),
122
+ pagination: {
123
+ limit,
124
+ offset,
125
+ count,
126
+ hasMore: offset + limit < count,
127
+ },
128
+ };
129
+ }
130
+ function parseManagedName(raw, command) {
131
+ try {
132
+ return (0, refs_1.parseScopedName)(raw ?? '', 'name');
133
+ }
134
+ catch {
135
+ (0, messages_1.printErrorWithHelp)('A valid name is required.', ['Names cannot be empty and cannot contain path separators.'], { command });
136
+ process.exitCode = 1;
137
+ return null;
138
+ }
139
+ }
140
+ function parseOptionalManagedName(raw, command) {
141
+ if (raw === undefined) {
142
+ return undefined;
143
+ }
144
+ try {
145
+ return (0, refs_1.parseScopedName)(raw, 'name');
146
+ }
147
+ catch {
148
+ (0, messages_1.printErrorWithHelp)('The provided name is invalid.', ['Names cannot be empty and cannot contain path separators.'], { command });
149
+ process.exitCode = 1;
150
+ return null;
151
+ }
152
+ }
153
+ async function browseCreations(options = {}) {
154
+ const kind = parseBrowseKind(options.kind);
155
+ if (!kind) {
156
+ (0, messages_1.printErrorWithHelp)('The --kind value is invalid.', ['Use one of: app, asset, asset-pack, all.'], { command: 'creations browse' });
157
+ process.exitCode = 1;
158
+ return;
159
+ }
160
+ const limit = parsePositiveInteger(options.limit, 'limit', 20);
161
+ if (limit === null) {
162
+ (0, messages_1.printErrorWithHelp)('The --limit value must be a positive integer.', ['Example: --limit 20'], { command: 'creations browse' });
163
+ process.exitCode = 1;
164
+ return;
165
+ }
166
+ const offset = parsePositiveInteger(options.offset, 'offset', 0);
167
+ if (offset === null) {
168
+ (0, messages_1.printErrorWithHelp)('The --offset value must be zero or a positive integer.', ['Example: --offset 20'], { command: 'creations browse' });
169
+ process.exitCode = 1;
170
+ return;
171
+ }
172
+ await (0, commandContext_1.withEnvironment)('creations browse', 'Browsing your creations', async ({ client }) => {
173
+ try {
174
+ const creator = await resolveCreator(client, options.creator, 'creations browse');
175
+ if (!creator) {
176
+ return;
177
+ }
178
+ const usingCurrentCreator = !options.creator || options.creator.trim().toLowerCase() === 'me';
179
+ const items = [];
180
+ let pagination;
181
+ if (kind === 'app') {
182
+ const apps = !usingCurrentCreator
183
+ ? (await client.fetchAppsByCreator(creator)).apps ?? []
184
+ : (await client.fetchMyApps()).apps ?? [];
185
+ const sliced = sliceMergedItems(apps, limit, offset);
186
+ items.push(...sliced.items.map((item) => ({ kind: 'app', ref: `${item.creatorUsername}/app/${item.name}`, item })));
187
+ pagination = sliced.pagination;
188
+ }
189
+ else if (kind === 'asset') {
190
+ const response = await client.listAssetsForCreator(creator, { limit, offset });
191
+ items.push(...(response.assets ?? []).map((item) => ({ kind: 'asset', ref: `${item.creatorUsername}/asset/${item.name}`, item })));
192
+ pagination = response.pagination;
193
+ }
194
+ else if (kind === 'asset-pack') {
195
+ const response = await client.listAssetPacksForCreator(creator, { limit, offset });
196
+ items.push(...(response.packs ?? []).map((item) => ({ kind: 'asset-pack', ref: `${item.creatorUsername}/asset-pack/${item.name}`, item })));
197
+ pagination = response.pagination;
198
+ }
199
+ else {
200
+ const [appsResponse, assetsResponse, packsResponse] = await Promise.all([
201
+ !usingCurrentCreator
202
+ ? client.fetchAppsByCreator(creator)
203
+ : client.fetchMyApps(),
204
+ collectPaginatedItems((pageLimit, pageOffset) => client.listAssetsForCreator(creator, { limit: pageLimit, offset: pageOffset }).then((response) => ({
205
+ items: response.assets ?? [],
206
+ pagination: response.pagination,
207
+ }))),
208
+ collectPaginatedItems((pageLimit, pageOffset) => client.listAssetPacksForCreator(creator, { limit: pageLimit, offset: pageOffset }).then((response) => ({
209
+ items: response.packs ?? [],
210
+ pagination: response.pagination,
211
+ }))),
212
+ ]);
213
+ const combined = [
214
+ ...((appsResponse.apps ?? []).map((item) => ({ kind: 'app', ref: `${item.creatorUsername}/app/${item.name}`, item }))),
215
+ ...(assetsResponse.items.map((item) => ({ kind: 'asset', ref: `${item.creatorUsername}/asset/${item.name}`, item }))),
216
+ ...(packsResponse.items.map((item) => ({ kind: 'asset-pack', ref: `${item.creatorUsername}/asset-pack/${item.name}`, item }))),
217
+ ];
218
+ const sliced = sliceMergedItems(combined, limit, offset);
219
+ items.push(...sliced.items);
220
+ pagination = sliced.pagination;
221
+ }
222
+ if (options.json) {
223
+ (0, output_1.printJson)({
224
+ items,
225
+ ...(pagination ? { pagination } : {}),
226
+ });
227
+ return;
228
+ }
229
+ if (items.length === 0) {
230
+ console.log(`No ${kindLabel(kind)} found for @${creator}.`);
231
+ console.log('Next: run "playdrop project create app <name>" or "playdrop ai create <type> <prompt>" to create something new.');
232
+ return;
233
+ }
234
+ if (kind === 'all') {
235
+ console.log(`Creations for @${creator} (apps, then assets, then asset packs):\n`);
236
+ }
237
+ else {
238
+ console.log(`Creations for @${creator}:\n`);
239
+ }
240
+ for (const [index, item] of items.entries()) {
241
+ console.log(`${index + 1}. [${item.kind}] ${item.ref} | ${item.item.displayName || item.item.name}`);
242
+ }
243
+ console.log('\nNext: run "playdrop detail <creator>/<kind>/<name>" or a "playdrop creations ..." command to manage one item.');
244
+ }
245
+ catch (error) {
246
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations browse', 'Creation lookup', {
247
+ apiMessage: (apiError) => ({
248
+ problem: `Creation lookup failed with status ${apiError.status}.`,
249
+ suggestions: ['Run "playdrop auth login" and retry.'],
250
+ }),
251
+ });
252
+ if (!handled) {
253
+ throw error;
254
+ }
255
+ }
256
+ });
257
+ }
258
+ async function updateCreationApp(nameArg, options = {}) {
259
+ const name = parseManagedName(nameArg, 'creations apps update');
260
+ if (!name) {
261
+ return;
262
+ }
263
+ const appType = options.type ? (0, types_1.parseAppType)(options.type.trim().toUpperCase()) : undefined;
264
+ if (options.type !== undefined && !appType) {
265
+ (0, messages_1.printErrorWithHelp)('The --type value is invalid.', ['Use one of: game, demo, tool, template.'], { command: 'creations apps update' });
266
+ process.exitCode = 1;
267
+ return;
268
+ }
269
+ if (!options.displayName && !appType) {
270
+ (0, messages_1.printErrorWithHelp)('At least one update field is required.', ['Use --display-name and/or --type.'], { command: 'creations apps update' });
271
+ process.exitCode = 1;
272
+ return;
273
+ }
274
+ await (0, commandContext_1.withEnvironment)('creations apps update', 'Updating an app', async ({ client }) => {
275
+ try {
276
+ const creator = await resolveCreator(client, options.creator, 'creations apps update');
277
+ if (!creator) {
278
+ return;
279
+ }
280
+ const ref = (0, refs_1.buildScopedRef)(creator, 'app', name);
281
+ const response = await client.updateApp(creator, name, {
282
+ displayName: options.displayName?.trim() || undefined,
283
+ type: appType,
284
+ });
285
+ if (options.json) {
286
+ (0, output_1.printJson)({ ref: ref.ref, item: response.app });
287
+ return;
288
+ }
289
+ (0, output_1.printSuccess)(`Updated ${ref.ref}.`, ['Next: run "playdrop detail ' + ref.ref + '" to review the latest metadata.']);
290
+ }
291
+ catch (error) {
292
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations apps update', 'App update', {
293
+ apiMessage: (apiError) => ({
294
+ problem: `App update failed with status ${apiError.status}.`,
295
+ suggestions: ['Check the app name and your permissions, then retry.'],
296
+ }),
297
+ });
298
+ if (!handled) {
299
+ throw error;
300
+ }
301
+ }
302
+ });
303
+ }
304
+ async function deleteCreationApp(nameArg, options = {}) {
305
+ const name = parseManagedName(nameArg, 'creations apps delete');
306
+ if (!name) {
307
+ return;
308
+ }
309
+ await (0, commandContext_1.withEnvironment)('creations apps delete', 'Deleting an app', async ({ client }) => {
310
+ try {
311
+ const creator = await resolveCreator(client, options.creator, 'creations apps delete');
312
+ if (!creator) {
313
+ return;
314
+ }
315
+ const ref = (0, refs_1.buildScopedRef)(creator, 'app', name);
316
+ const response = await client.deleteApp(creator, name);
317
+ if (options.json) {
318
+ (0, output_1.printJson)({ success: Boolean(response.success), ref: ref.ref });
319
+ return;
320
+ }
321
+ (0, output_1.printSuccess)(`Deleted ${ref.ref}.`, ['Next: run "playdrop creations browse --kind app" to review your remaining apps.']);
322
+ }
323
+ catch (error) {
324
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations apps delete', 'App delete', {
325
+ apiMessage: (apiError) => ({
326
+ problem: `App delete failed with status ${apiError.status}.`,
327
+ suggestions: ['Check the app name and your permissions, then retry.'],
328
+ }),
329
+ });
330
+ if (!handled) {
331
+ throw error;
332
+ }
333
+ }
334
+ });
335
+ }
336
+ async function mutateAppVersion(nameArg, versionArg, command, options, mutation, successMessage, next) {
337
+ const name = parseManagedName(nameArg, command);
338
+ if (!name) {
339
+ return;
340
+ }
341
+ const version = parseVersion(versionArg ?? '', command);
342
+ if (!version) {
343
+ return;
344
+ }
345
+ await (0, commandContext_1.withEnvironment)(command, 'Updating an app version', async ({ client }) => {
346
+ try {
347
+ const creator = await resolveCreator(client, options.creator, command);
348
+ if (!creator) {
349
+ return;
350
+ }
351
+ const ref = (0, refs_1.buildScopedRef)(creator, 'app', name);
352
+ const response = await mutation(client, creator, name, version);
353
+ if (options.json) {
354
+ (0, output_1.printJson)({ ref: ref.ref, version, result: response });
355
+ return;
356
+ }
357
+ (0, output_1.printSuccess)(successMessage(ref.ref, version), [next.replace('{ref}', ref.ref)]);
358
+ }
359
+ catch (error) {
360
+ const handled = (0, errors_1.handleCommandFailure)(error, command, 'App version update', {
361
+ apiMessage: (apiError) => ({
362
+ problem: `App version update failed with status ${apiError.status}.`,
363
+ suggestions: ['Check the version string and your permissions, then retry.'],
364
+ }),
365
+ });
366
+ if (!handled) {
367
+ throw error;
368
+ }
369
+ }
370
+ });
371
+ }
372
+ async function setCurrentCreationAppVersion(nameArg, versionArg, options = {}) {
373
+ return mutateAppVersion(nameArg, versionArg, 'creations apps versions set-current', options, (client, creator, name, version) => client.updateAppVersion(creator, name, version, { setAsCurrent: true }), (ref, version) => `${ref} now points to version ${version}.`, 'Next: run "playdrop versions browse {ref}" to inspect version history.');
374
+ }
375
+ async function publishCreationAppVersion(nameArg, versionArg, options = {}) {
376
+ return mutateAppVersion(nameArg, versionArg, 'creations apps versions publish', options, (client, creator, name, version) => client.updateAppVersion(creator, name, version, { visibility: 'PUBLIC' }), (ref, version) => `Published version ${version} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
377
+ }
378
+ async function unpublishCreationAppVersion(nameArg, versionArg, options = {}) {
379
+ return mutateAppVersion(nameArg, versionArg, 'creations apps versions unpublish', options, (client, creator, name, version) => client.updateAppVersion(creator, name, version, { visibility: 'PRIVATE' }), (ref, version) => `Unpublished version ${version} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
380
+ }
381
+ async function deleteCreationAppVersion(nameArg, versionArg, options = {}) {
382
+ return mutateAppVersion(nameArg, versionArg, 'creations apps versions delete', options, (client, creator, name, version) => client.deleteAppVersion(creator, name, version), (ref, version) => `Deleted version ${version} from ${ref}.`, 'Next: run "playdrop versions browse {ref}" to review the remaining versions.');
383
+ }
384
+ async function updateCreationAsset(nameArg, options = {}) {
385
+ const name = parseManagedName(nameArg, 'creations assets update');
386
+ if (!name) {
387
+ return;
388
+ }
389
+ const nextName = parseOptionalManagedName(options.name, 'creations assets update');
390
+ if (nextName === null) {
391
+ return;
392
+ }
393
+ if (options.description !== undefined && options.clearDescription) {
394
+ (0, messages_1.printErrorWithHelp)('Use either --description or --clear-description, not both.', [], { command: 'creations assets update' });
395
+ process.exitCode = 1;
396
+ return;
397
+ }
398
+ if (!nextName && !options.displayName && options.description === undefined && !options.clearDescription) {
399
+ (0, messages_1.printErrorWithHelp)('At least one update field is required.', ['Use --name, --display-name, --description, or --clear-description.'], { command: 'creations assets update' });
400
+ process.exitCode = 1;
401
+ return;
402
+ }
403
+ await (0, commandContext_1.withEnvironment)('creations assets update', 'Updating an asset', async ({ client }) => {
404
+ try {
405
+ const creator = await resolveCreator(client, options.creator, 'creations assets update');
406
+ if (!creator) {
407
+ return;
408
+ }
409
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset', name);
410
+ const response = await client.updateAsset(creator, name, {
411
+ name: nextName,
412
+ displayName: options.displayName?.trim() || undefined,
413
+ description: options.clearDescription ? null : options.description,
414
+ });
415
+ if (options.json) {
416
+ (0, output_1.printJson)({ ref: ref.ref, item: response.asset });
417
+ return;
418
+ }
419
+ (0, output_1.printSuccess)(`Updated ${ref.ref}.`, ['Next: run "playdrop detail ' + `${response.asset.creatorUsername}/asset/${response.asset.name}` + '" to review the latest metadata.']);
420
+ }
421
+ catch (error) {
422
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations assets update', 'Asset update', {
423
+ apiMessage: (apiError) => ({
424
+ problem: `Asset update failed with status ${apiError.status}.`,
425
+ suggestions: ['Check the asset name and your permissions, then retry.'],
426
+ }),
427
+ });
428
+ if (!handled) {
429
+ throw error;
430
+ }
431
+ }
432
+ });
433
+ }
434
+ async function deleteCreationAsset(nameArg, options = {}) {
435
+ const name = parseManagedName(nameArg, 'creations assets delete');
436
+ if (!name) {
437
+ return;
438
+ }
439
+ await (0, commandContext_1.withEnvironment)('creations assets delete', 'Deleting an asset', async ({ client }) => {
440
+ try {
441
+ const creator = await resolveCreator(client, options.creator, 'creations assets delete');
442
+ if (!creator) {
443
+ return;
444
+ }
445
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset', name);
446
+ const response = await client.deleteAsset(creator, name);
447
+ if (options.json) {
448
+ (0, output_1.printJson)({ success: Boolean(response.success), ref: ref.ref });
449
+ return;
450
+ }
451
+ (0, output_1.printSuccess)(`Deleted ${ref.ref}.`, ['Next: run "playdrop creations browse --kind asset" to review your remaining assets.']);
452
+ }
453
+ catch (error) {
454
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations assets delete', 'Asset delete', {
455
+ apiMessage: (apiError) => ({
456
+ problem: `Asset delete failed with status ${apiError.status}.`,
457
+ suggestions: ['Check the asset name and your permissions, then retry.'],
458
+ }),
459
+ });
460
+ if (!handled) {
461
+ throw error;
462
+ }
463
+ }
464
+ });
465
+ }
466
+ async function mutateAssetVersion(nameArg, revisionArg, command, options, mutation, successMessage, next) {
467
+ const name = parseManagedName(nameArg, command);
468
+ if (!name) {
469
+ return;
470
+ }
471
+ const revision = parseRevision(revisionArg ?? '', command);
472
+ if (revision === null) {
473
+ return;
474
+ }
475
+ await (0, commandContext_1.withEnvironment)(command, 'Updating an asset revision', async ({ client }) => {
476
+ try {
477
+ const creator = await resolveCreator(client, options.creator, command);
478
+ if (!creator) {
479
+ return;
480
+ }
481
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset', name);
482
+ const response = await mutation(client, creator, name, revision);
483
+ if (options.json) {
484
+ (0, output_1.printJson)({ ref: ref.ref, revision, result: response });
485
+ return;
486
+ }
487
+ (0, output_1.printSuccess)(successMessage(ref.ref, revision), [next.replace('{ref}', ref.ref)]);
488
+ }
489
+ catch (error) {
490
+ const handled = (0, errors_1.handleCommandFailure)(error, command, 'Asset revision update', {
491
+ apiMessage: (apiError) => ({
492
+ problem: `Asset revision update failed with status ${apiError.status}.`,
493
+ suggestions: ['Check the revision and your permissions, then retry.'],
494
+ }),
495
+ });
496
+ if (!handled) {
497
+ throw error;
498
+ }
499
+ }
500
+ });
501
+ }
502
+ async function setCurrentCreationAssetVersion(nameArg, revisionArg, options = {}) {
503
+ return mutateAssetVersion(nameArg, revisionArg, 'creations assets versions set-current', options, (client, creator, name, revision) => client.updateAssetVersion(creator, name, revision, { setAsCurrent: true }), (ref, revision) => `${ref} now points to revision r${revision}.`, 'Next: run "playdrop versions browse {ref}" to inspect revision history.');
504
+ }
505
+ async function publishCreationAssetVersion(nameArg, revisionArg, options = {}) {
506
+ return mutateAssetVersion(nameArg, revisionArg, 'creations assets versions publish', options, (client, creator, name, revision) => client.updateAssetVersion(creator, name, revision, { visibility: 'PUBLIC' }), (ref, revision) => `Published revision r${revision} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
507
+ }
508
+ async function unpublishCreationAssetVersion(nameArg, revisionArg, options = {}) {
509
+ return mutateAssetVersion(nameArg, revisionArg, 'creations assets versions unpublish', options, (client, creator, name, revision) => client.updateAssetVersion(creator, name, revision, { visibility: 'PRIVATE' }), (ref, revision) => `Unpublished revision r${revision} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
510
+ }
511
+ async function deleteCreationAssetVersion(nameArg, revisionArg, options = {}) {
512
+ return mutateAssetVersion(nameArg, revisionArg, 'creations assets versions delete', options, (client, creator, name, revision) => client.deleteAssetVersion(creator, name, revision), (ref, revision) => `Deleted revision r${revision} from ${ref}.`, 'Next: run "playdrop versions browse {ref}" to review the remaining revisions.');
513
+ }
514
+ async function updateCreationAssetPack(nameArg, options = {}) {
515
+ const name = parseManagedName(nameArg, 'creations asset-packs update');
516
+ if (!name) {
517
+ return;
518
+ }
519
+ const nextName = parseOptionalManagedName(options.name, 'creations asset-packs update');
520
+ if (nextName === null) {
521
+ return;
522
+ }
523
+ if (options.description !== undefined && options.clearDescription) {
524
+ (0, messages_1.printErrorWithHelp)('Use either --description or --clear-description, not both.', [], { command: 'creations asset-packs update' });
525
+ process.exitCode = 1;
526
+ return;
527
+ }
528
+ if (options.previewAppVersionId !== undefined && options.clearPreviewAppVersionId) {
529
+ (0, messages_1.printErrorWithHelp)('Use either --preview-app-version-id or --clear-preview-app-version-id, not both.', [], { command: 'creations asset-packs update' });
530
+ process.exitCode = 1;
531
+ return;
532
+ }
533
+ const previewAppVersionId = options.previewAppVersionId !== undefined
534
+ ? parsePositiveInteger(options.previewAppVersionId, 'preview app version id', 0)
535
+ : null;
536
+ if (options.previewAppVersionId !== undefined && (previewAppVersionId === null || previewAppVersionId <= 0)) {
537
+ (0, messages_1.printErrorWithHelp)('Preview app version id must be a positive integer.', [], { command: 'creations asset-packs update' });
538
+ process.exitCode = 1;
539
+ return;
540
+ }
541
+ if (!nextName && !options.displayName && options.description === undefined && !options.clearDescription && previewAppVersionId === null && !options.clearPreviewAppVersionId) {
542
+ (0, messages_1.printErrorWithHelp)('At least one update field is required.', ['Use --name, --display-name, --description, --preview-app-version-id, or a clear flag.'], { command: 'creations asset-packs update' });
543
+ process.exitCode = 1;
544
+ return;
545
+ }
546
+ await (0, commandContext_1.withEnvironment)('creations asset-packs update', 'Updating an asset pack', async ({ client }) => {
547
+ try {
548
+ const creator = await resolveCreator(client, options.creator, 'creations asset-packs update');
549
+ if (!creator) {
550
+ return;
551
+ }
552
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset-pack', name);
553
+ const response = await client.updateAssetPack(creator, name, {
554
+ name: nextName,
555
+ displayName: options.displayName?.trim() || undefined,
556
+ description: options.clearDescription ? null : options.description,
557
+ previewAppVersionId: options.clearPreviewAppVersionId ? null : previewAppVersionId ?? undefined,
558
+ });
559
+ if (options.json) {
560
+ (0, output_1.printJson)({ ref: ref.ref, item: response.pack });
561
+ return;
562
+ }
563
+ (0, output_1.printSuccess)(`Updated ${ref.ref}.`, ['Next: run "playdrop detail ' + `${response.pack.creatorUsername}/asset-pack/${response.pack.name}` + '" to review the latest metadata.']);
564
+ }
565
+ catch (error) {
566
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations asset-packs update', 'Asset pack update', {
567
+ apiMessage: (apiError) => ({
568
+ problem: `Asset pack update failed with status ${apiError.status}.`,
569
+ suggestions: ['Check the asset pack name and your permissions, then retry.'],
570
+ }),
571
+ });
572
+ if (!handled) {
573
+ throw error;
574
+ }
575
+ }
576
+ });
577
+ }
578
+ async function deleteCreationAssetPack(nameArg, options = {}) {
579
+ const name = parseManagedName(nameArg, 'creations asset-packs delete');
580
+ if (!name) {
581
+ return;
582
+ }
583
+ await (0, commandContext_1.withEnvironment)('creations asset-packs delete', 'Deleting an asset pack', async ({ client }) => {
584
+ try {
585
+ const creator = await resolveCreator(client, options.creator, 'creations asset-packs delete');
586
+ if (!creator) {
587
+ return;
588
+ }
589
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset-pack', name);
590
+ const response = await client.deleteAssetPack(creator, name);
591
+ if (options.json) {
592
+ (0, output_1.printJson)({ success: Boolean(response.success), ref: ref.ref });
593
+ return;
594
+ }
595
+ (0, output_1.printSuccess)(`Deleted ${ref.ref}.`, ['Next: run "playdrop creations browse --kind asset-pack" to review your remaining asset packs.']);
596
+ }
597
+ catch (error) {
598
+ const handled = (0, errors_1.handleCommandFailure)(error, 'creations asset-packs delete', 'Asset pack delete', {
599
+ apiMessage: (apiError) => ({
600
+ problem: `Asset pack delete failed with status ${apiError.status}.`,
601
+ suggestions: ['Check the asset pack name and your permissions, then retry.'],
602
+ }),
603
+ });
604
+ if (!handled) {
605
+ throw error;
606
+ }
607
+ }
608
+ });
609
+ }
610
+ async function mutateAssetPackVersion(nameArg, versionArg, command, options, mutation, successMessage, next) {
611
+ const name = parseManagedName(nameArg, command);
612
+ if (!name) {
613
+ return;
614
+ }
615
+ const version = parseVersion(versionArg ?? '', command);
616
+ if (!version) {
617
+ return;
618
+ }
619
+ await (0, commandContext_1.withEnvironment)(command, 'Updating an asset pack version', async ({ client }) => {
620
+ try {
621
+ const creator = await resolveCreator(client, options.creator, command);
622
+ if (!creator) {
623
+ return;
624
+ }
625
+ const ref = (0, refs_1.buildScopedRef)(creator, 'asset-pack', name);
626
+ const response = await mutation(client, creator, name, version);
627
+ if (options.json) {
628
+ (0, output_1.printJson)({ ref: ref.ref, version, result: response });
629
+ return;
630
+ }
631
+ (0, output_1.printSuccess)(successMessage(ref.ref, version), [next.replace('{ref}', ref.ref)]);
632
+ }
633
+ catch (error) {
634
+ const handled = (0, errors_1.handleCommandFailure)(error, command, 'Asset pack version update', {
635
+ apiMessage: (apiError) => ({
636
+ problem: `Asset pack version update failed with status ${apiError.status}.`,
637
+ suggestions: ['Check the version string and your permissions, then retry.'],
638
+ }),
639
+ });
640
+ if (!handled) {
641
+ throw error;
642
+ }
643
+ }
644
+ });
645
+ }
646
+ async function setCurrentCreationAssetPackVersion(nameArg, versionArg, options = {}) {
647
+ return mutateAssetPackVersion(nameArg, versionArg, 'creations asset-packs versions set-current', options, (client, creator, name, version) => client.updateAssetPackVersion(creator, name, version, { setAsCurrent: true }), (ref, version) => `${ref} now points to version ${version}.`, 'Next: run "playdrop versions browse {ref}" to inspect version history.');
648
+ }
649
+ async function publishCreationAssetPackVersion(nameArg, versionArg, options = {}) {
650
+ return mutateAssetPackVersion(nameArg, versionArg, 'creations asset-packs versions publish', options, (client, creator, name, version) => client.updateAssetPackVersion(creator, name, version, { visibility: 'PUBLIC' }), (ref, version) => `Published version ${version} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
651
+ }
652
+ async function unpublishCreationAssetPackVersion(nameArg, versionArg, options = {}) {
653
+ return mutateAssetPackVersion(nameArg, versionArg, 'creations asset-packs versions unpublish', options, (client, creator, name, version) => client.updateAssetPackVersion(creator, name, version, { visibility: 'PRIVATE' }), (ref, version) => `Unpublished version ${version} for ${ref}.`, 'Next: run "playdrop versions browse {ref}" to confirm visibility.');
654
+ }
655
+ async function deleteCreationAssetPackVersion(nameArg, versionArg, options = {}) {
656
+ return mutateAssetPackVersion(nameArg, versionArg, 'creations asset-packs versions delete', options, (client, creator, name, version) => client.deleteAssetPackVersion(creator, name, version), (ref, version) => `Deleted version ${version} from ${ref}.`, 'Next: run "playdrop versions browse {ref}" to review the remaining versions.');
657
+ }
@@ -0,0 +1,10 @@
1
+ type TransactionsOptions = {
2
+ limit?: string | number;
3
+ offset?: string | number;
4
+ json?: boolean;
5
+ };
6
+ export declare function showCreditBalance(options?: {
7
+ json?: boolean;
8
+ }): Promise<void>;
9
+ export declare function browseCreditTransactions(options?: TransactionsOptions): Promise<void>;
10
+ export {};