@dreamboard-games/cli 0.1.30-alpha.19 → 0.1.30-alpha.20

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 (97) hide show
  1. package/README.md +22 -102
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +1508 -55
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  4. package/dist/agent-verifier/{chunk-V7ABTZXW.mjs → chunk-4I2WWAPK.mjs} +26 -7
  5. package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
  6. package/dist/agent-verifier/{chunk-7LFDFXLS.mjs → chunk-BWBN2TDJ.mjs} +338 -133
  7. package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-AWZ4M4NS.mjs → chunk-DQUYBIGQ.mjs} +5 -6
  9. package/dist/agent-verifier/chunk-DQUYBIGQ.mjs.map +1 -0
  10. package/dist/agent-verifier/{chunk-H5L4KK4Y.mjs → chunk-GCFGAFYC.mjs} +7 -7
  11. package/dist/agent-verifier/chunk-GCFGAFYC.mjs.map +1 -0
  12. package/dist/agent-verifier/{chunk-TAEQKBJB.mjs → chunk-GWRZRWCF.mjs} +1 -1
  13. package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
  14. package/dist/agent-verifier/{chunk-6AKXIY37.mjs → chunk-IWB4L2HV.mjs} +3 -3
  15. package/dist/agent-verifier/chunk-IWB4L2HV.mjs.map +1 -0
  16. package/dist/agent-verifier/{chunk-334H4LE4.mjs → chunk-KDAQ4CZY.mjs} +3 -3
  17. package/dist/agent-verifier/{chunk-WSIYUUSD.mjs → chunk-TIDX3YLW.mjs} +2 -2
  18. package/dist/agent-verifier/{chunk-WSIYUUSD.mjs.map → chunk-TIDX3YLW.mjs.map} +1 -1
  19. package/dist/agent-verifier/{chunk-UMW24KZI.mjs → chunk-UXGTT25Q.mjs} +3 -3
  20. package/dist/agent-verifier/{global-config-SXR6X3OZ.mjs → global-config-IXZLY4BS.mjs} +4 -4
  21. package/dist/agent-verifier/{local-files-DAFIR7SN.mjs → local-files-OF4QFISU.mjs} +4 -4
  22. package/dist/agent-verifier/{chunk-POBFNXD4.mjs → local-typecheck-DHVLM37Z.mjs} +3 -3
  23. package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
  24. package/dist/agent-verifier/{materialize-workspace-PWNT6HQK.mjs → materialize-workspace-VS5RHSBO.mjs} +7 -7
  25. package/dist/agent-verifier/{chunk-HLHT57AW.mjs → reducer-bundle-preflight-GLUJKTWU.mjs} +13 -10
  26. package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
  27. package/dist/agent-verifier/{chunk-INIK6LHK.mjs → reducer-contract-preflight-WVQQPW5F.mjs} +6 -5
  28. package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
  29. package/dist/agent-verifier/{chunk-3Y4FRMTK.mjs → reducer-native-test-harness-H6G6RBRY.mjs} +150 -34
  30. package/dist/agent-verifier/reducer-native-test-harness-H6G6RBRY.mjs.map +1 -0
  31. package/dist/agent-verifier/{static-scaffold-HXUQLJVN.mjs → static-scaffold-C36KROJA.mjs} +3 -3
  32. package/dist/agent-verifier/{workspace-dependencies-ZMHPHVQV.mjs → workspace-dependencies-5HEEKZFP.mjs} +4 -2
  33. package/dist/authoring-compatibility-internal.js +2 -2
  34. package/dist/{chunk-R6RB4EKH.js → chunk-5PJWUB6W.js} +179 -210
  35. package/dist/chunk-5PJWUB6W.js.map +1 -0
  36. package/dist/{chunk-YRSE5DLH.js → chunk-EJGB3IR7.js} +422 -264
  37. package/dist/chunk-EJGB3IR7.js.map +1 -0
  38. package/dist/{chunk-FFO2IJL3.js → chunk-EQNBQVIW.js} +1 -1
  39. package/dist/chunk-EQNBQVIW.js.map +1 -0
  40. package/dist/{chunk-VWMKJL4A.js → chunk-UI7NWSYA.js} +3 -3
  41. package/dist/chunk-UI7NWSYA.js.map +1 -0
  42. package/dist/{global-config-UHGWFJIK.js → global-config-GK2UC2X6.js} +3 -3
  43. package/dist/index.js +2691 -3953
  44. package/dist/index.js.map +1 -1
  45. package/dist/internal.js +4 -4
  46. package/package.json +1 -1
  47. package/release/authoring-release-set.json +2 -2
  48. package/skills/dreamboard/SKILL.md +30 -28
  49. package/skills/dreamboard/references/building-your-first-game.md +15 -15
  50. package/skills/dreamboard/references/cli.md +48 -47
  51. package/skills/dreamboard/references/quickstart.md +16 -13
  52. package/skills/dreamboard/references/testing.md +10 -10
  53. package/dist/agent-verifier/chunk-3Y4FRMTK.mjs.map +0 -1
  54. package/dist/agent-verifier/chunk-5D3OJBDT.mjs +0 -1547
  55. package/dist/agent-verifier/chunk-5D3OJBDT.mjs.map +0 -1
  56. package/dist/agent-verifier/chunk-6AKXIY37.mjs.map +0 -1
  57. package/dist/agent-verifier/chunk-7LFDFXLS.mjs.map +0 -1
  58. package/dist/agent-verifier/chunk-AWZ4M4NS.mjs.map +0 -1
  59. package/dist/agent-verifier/chunk-H5L4KK4Y.mjs.map +0 -1
  60. package/dist/agent-verifier/chunk-HLHT57AW.mjs.map +0 -1
  61. package/dist/agent-verifier/chunk-INIK6LHK.mjs.map +0 -1
  62. package/dist/agent-verifier/chunk-LEWM26XR.mjs +0 -618
  63. package/dist/agent-verifier/chunk-LEWM26XR.mjs.map +0 -1
  64. package/dist/agent-verifier/chunk-PLXXH5LY.mjs +0 -222
  65. package/dist/agent-verifier/chunk-PLXXH5LY.mjs.map +0 -1
  66. package/dist/agent-verifier/chunk-POBFNXD4.mjs.map +0 -1
  67. package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +0 -1
  68. package/dist/agent-verifier/chunk-V7ABTZXW.mjs.map +0 -1
  69. package/dist/agent-verifier/chunk-ZOR5FTIG.mjs +0 -39
  70. package/dist/agent-verifier/chunk-ZOR5FTIG.mjs.map +0 -1
  71. package/dist/agent-verifier/compile-MO2URO5Z.mjs +0 -317
  72. package/dist/agent-verifier/compile-MO2URO5Z.mjs.map +0 -1
  73. package/dist/agent-verifier/local-typecheck-3JXL2NMG.mjs +0 -10
  74. package/dist/agent-verifier/reducer-bundle-preflight-3DSXIELT.mjs +0 -20
  75. package/dist/agent-verifier/reducer-contract-preflight-FQB7M4PU.mjs +0 -11
  76. package/dist/agent-verifier/reducer-native-test-harness-X2KQYSCD.mjs +0 -53
  77. package/dist/agent-verifier/reducer-native-test-harness-X2KQYSCD.mjs.map +0 -1
  78. package/dist/agent-verifier/static-scaffold-HXUQLJVN.mjs.map +0 -1
  79. package/dist/agent-verifier/sync-5YM4CSXL.mjs +0 -598
  80. package/dist/agent-verifier/sync-5YM4CSXL.mjs.map +0 -1
  81. package/dist/agent-verifier/test-CNNVTFIG.mjs +0 -356
  82. package/dist/agent-verifier/test-CNNVTFIG.mjs.map +0 -1
  83. package/dist/agent-verifier/workspace-dependencies-ZMHPHVQV.mjs.map +0 -1
  84. package/dist/chunk-FFO2IJL3.js.map +0 -1
  85. package/dist/chunk-R6RB4EKH.js.map +0 -1
  86. package/dist/chunk-VWMKJL4A.js.map +0 -1
  87. package/dist/chunk-YRSE5DLH.js.map +0 -1
  88. package/dist/global-config-UHGWFJIK.js.map +0 -1
  89. package/skills/dreamboard/scripts/events-extract.mjs +0 -218
  90. /package/dist/agent-verifier/{chunk-334H4LE4.mjs.map → chunk-KDAQ4CZY.mjs.map} +0 -0
  91. /package/dist/agent-verifier/{chunk-UMW24KZI.mjs.map → chunk-UXGTT25Q.mjs.map} +0 -0
  92. /package/dist/agent-verifier/{global-config-SXR6X3OZ.mjs.map → global-config-IXZLY4BS.mjs.map} +0 -0
  93. /package/dist/agent-verifier/{local-files-DAFIR7SN.mjs.map → local-files-OF4QFISU.mjs.map} +0 -0
  94. /package/dist/agent-verifier/{materialize-workspace-PWNT6HQK.mjs.map → materialize-workspace-VS5RHSBO.mjs.map} +0 -0
  95. /package/dist/agent-verifier/{local-typecheck-3JXL2NMG.mjs.map → static-scaffold-C36KROJA.mjs.map} +0 -0
  96. /package/dist/agent-verifier/{reducer-bundle-preflight-3DSXIELT.mjs.map → workspace-dependencies-5HEEKZFP.mjs.map} +0 -0
  97. /package/dist/{agent-verifier/reducer-contract-preflight-FQB7M4PU.mjs.map → global-config-GK2UC2X6.js.map} +0 -0
@@ -1,618 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- toDreamboardApiError
4
- } from "./chunk-PLXXH5LY.mjs";
5
- import {
6
- createGameRevision,
7
- createProjectSourceBlobUploadSession,
8
- ensureProject,
9
- getApiVersion,
10
- getCurrentAuthUser,
11
- getJob,
12
- getProjectCompiledResult,
13
- listProjectCompiledResults,
14
- queueProjectRevisionCompile,
15
- uploadProjectInitialProjection
16
- } from "./chunk-7LFDFXLS.mjs";
17
- import {
18
- external_exports
19
- } from "./chunk-JZTH3EMV.mjs";
20
-
21
- // ../../node_modules/.pnpm/citty@0.2.2/node_modules/citty/dist/index.mjs
22
- import { parseArgs as parseArgs$1 } from "util";
23
- function defineCommand(def) {
24
- return def;
25
- }
26
-
27
- // ../../packages/api-client/dist/source-revisions.js
28
- var textEncoder = new TextEncoder();
29
- function bytesToHex(bytes) {
30
- return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
31
- }
32
- async function sha256Hex(bytes) {
33
- const normalizedBytes = new Uint8Array(bytes.byteLength);
34
- normalizedBytes.set(bytes);
35
- const digest = await crypto.subtle.digest("SHA-256", normalizedBytes.buffer);
36
- return bytesToHex(new Uint8Array(digest));
37
- }
38
- function getUtf8ByteSize(content) {
39
- return textEncoder.encode(content).byteLength;
40
- }
41
- async function computeSourceContentHash(content) {
42
- return sha256Hex(textEncoder.encode(content));
43
- }
44
- async function describeSourceBlob(content) {
45
- return {
46
- contentHash: await computeSourceContentHash(content),
47
- byteSize: getUtf8ByteSize(content)
48
- };
49
- }
50
- async function materializeSourceChangeOperations(changes) {
51
- const blobsByHash = /* @__PURE__ */ new Map();
52
- const materialized = await Promise.all(Array.from(changes, async (change) => {
53
- if (change.kind === "delete") {
54
- return change;
55
- }
56
- const blob = await describeSourceBlob(change.content);
57
- const existing = blobsByHash.get(blob.contentHash);
58
- if (!existing) {
59
- blobsByHash.set(blob.contentHash, blob);
60
- }
61
- return {
62
- kind: "upsert",
63
- path: change.path,
64
- contentHash: blob.contentHash,
65
- byteSize: blob.byteSize
66
- };
67
- }));
68
- return {
69
- blobs: Array.from(blobsByHash.values()).sort((left, right) => left.contentHash.localeCompare(right.contentHash)),
70
- changes: materialized
71
- };
72
- }
73
- function mapUpsertBlobContentsByContentHash(localChanges, materializedChanges) {
74
- const uploadBlobs = /* @__PURE__ */ new Map();
75
- const length = Math.min(localChanges.length, materializedChanges.length);
76
- for (let index = 0; index < length; index += 1) {
77
- const localChange = localChanges[index];
78
- const materializedChange = materializedChanges[index];
79
- if (localChange?.kind !== "upsert" || materializedChange?.kind !== "upsert") {
80
- continue;
81
- }
82
- uploadBlobs.set(materializedChange.contentHash, {
83
- contentHash: materializedChange.contentHash,
84
- byteSize: materializedChange.byteSize,
85
- content: localChange.content
86
- });
87
- }
88
- return uploadBlobs;
89
- }
90
- var SourceBlobUploadError = class extends Error {
91
- constructor(status, details) {
92
- const suffix = details.trim().length > 0 ? `: ${details.trim()}` : "";
93
- super(`Failed to upload source blob (HTTP ${status}${suffix})`);
94
- this.name = "SourceBlobUploadError";
95
- this.status = status;
96
- this.details = details;
97
- }
98
- };
99
- function isDuplicateDirectUploadError(error) {
100
- if (!(error instanceof SourceBlobUploadError)) {
101
- return false;
102
- }
103
- if (error.status === 409) {
104
- return true;
105
- }
106
- const normalizedDetails = error.details.toLowerCase();
107
- return normalizedDetails.includes("duplicate") || normalizedDetails.includes("already exists") || normalizedDetails.includes("resource already exists");
108
- }
109
- async function uploadSourceBlob(uploadTarget, content) {
110
- const response = await fetch(uploadTarget.url, {
111
- method: uploadTarget.method,
112
- headers: uploadTarget.headers,
113
- body: textEncoder.encode(content)
114
- });
115
- if (response.ok) {
116
- return;
117
- }
118
- const details = await response.text().catch(() => "");
119
- throw new SourceBlobUploadError(response.status, details);
120
- }
121
- var SourceBlobSessionRequestError = class extends Error {
122
- constructor(message, apiError, response) {
123
- super(message);
124
- this.name = "SourceBlobSessionRequestError";
125
- this.apiError = apiError;
126
- this.response = response;
127
- }
128
- };
129
- function assertSourceBlobUploadSession(data, response) {
130
- if (!data || typeof data !== "object" || !Array.isArray(data.uploads)) {
131
- throw new SourceBlobSessionRequestError("Source blob upload session response did not include an uploads array", data, response);
132
- }
133
- }
134
- async function confirmSourceBlobAlreadyExists(options) {
135
- const { requestUploadSession, blob } = options;
136
- const { data, error, response } = await requestUploadSession([
137
- {
138
- contentHash: blob.contentHash,
139
- byteSize: blob.byteSize
140
- }
141
- ]);
142
- if (error || !data) {
143
- throw new SourceBlobSessionRequestError("Failed to create source blob upload session", error, response);
144
- }
145
- assertSourceBlobUploadSession(data, response);
146
- return data.uploads[0]?.status === "exists";
147
- }
148
- async function uploadSourceBlobs(options) {
149
- const { blobs, requestUploadSession } = options;
150
- const uniqueBlobs = /* @__PURE__ */ new Map();
151
- for (const blob of blobs) {
152
- const existing = uniqueBlobs.get(blob.contentHash);
153
- if (!existing) {
154
- uniqueBlobs.set(blob.contentHash, blob);
155
- continue;
156
- }
157
- if (existing.byteSize !== blob.byteSize) {
158
- throw new Error(`Source blob ${blob.contentHash} has conflicting byte sizes.`);
159
- }
160
- }
161
- if (uniqueBlobs.size === 0) {
162
- return;
163
- }
164
- const { data, error, response } = await requestUploadSession(Array.from(uniqueBlobs.values(), ({ contentHash, byteSize }) => ({
165
- contentHash,
166
- byteSize
167
- })));
168
- if (error || !data) {
169
- throw new SourceBlobSessionRequestError("Failed to create source blob upload session", error, response);
170
- }
171
- assertSourceBlobUploadSession(data, response);
172
- for (const upload of data.uploads) {
173
- if (upload.status !== "upload_required") {
174
- continue;
175
- }
176
- const blob = uniqueBlobs.get(upload.contentHash);
177
- if (!blob) {
178
- throw new Error(`Upload session referenced unknown source blob ${upload.contentHash}.`);
179
- }
180
- if (!upload.uploadTarget) {
181
- throw new Error(`Upload target missing for source blob ${upload.contentHash}.`);
182
- }
183
- try {
184
- await uploadSourceBlob(upload.uploadTarget, blob.content);
185
- if (!await confirmSourceBlobAlreadyExists({ requestUploadSession, blob })) {
186
- throw new Error(`Source blob ${blob.contentHash} was uploaded but not registered.`);
187
- }
188
- } catch (error2) {
189
- if (isDuplicateDirectUploadError(error2) && await confirmSourceBlobAlreadyExists({ requestUploadSession, blob })) {
190
- continue;
191
- }
192
- throw error2;
193
- }
194
- }
195
- }
196
- async function uploadProjectSourceBlobs(options) {
197
- const { projectId, blobs } = options;
198
- return uploadSourceBlobs({
199
- blobs,
200
- requestUploadSession: (uploadBlobs) => createProjectSourceBlobUploadSession({
201
- path: { projectId },
202
- body: { blobs: uploadBlobs }
203
- })
204
- });
205
- }
206
-
207
- // src/command-args.ts
208
- var CONFIG_FLAG_ARGS = {
209
- env: {
210
- type: "string",
211
- description: "Environment: local | staging | prod"
212
- },
213
- token: {
214
- type: "string",
215
- description: "Auth token (Dreamboard bearer JWT)"
216
- }
217
- };
218
-
219
- // src/flags.ts
220
- var configFlagsSchema = external_exports.object({
221
- env: external_exports.enum(["local", "staging", "prod"]).optional(),
222
- token: external_exports.string().optional()
223
- });
224
- var ruleInputFlagsSchema = external_exports.object({
225
- "rule-file": external_exports.string().optional(),
226
- rule: external_exports.string().optional()
227
- });
228
- var playerCountFlagsSchema = external_exports.object({
229
- players: external_exports.string().optional(),
230
- "player-count": external_exports.string().optional()
231
- });
232
- var newCommandArgsSchema = configFlagsSchema.extend({
233
- slug: external_exports.string().min(1),
234
- description: external_exports.string().min(1),
235
- force: external_exports.boolean().default(false)
236
- });
237
- var cloneCommandArgsSchema = configFlagsSchema.extend({
238
- slug: external_exports.string().min(1)
239
- });
240
- var queryCommandArgsSchema = configFlagsSchema.extend({
241
- title: external_exports.string().min(1)
242
- });
243
- var pullCommandArgsSchema = configFlagsSchema.extend({
244
- force: external_exports.boolean().default(false)
245
- });
246
- var syncCommandArgsSchema = configFlagsSchema.extend({
247
- force: external_exports.boolean().default(false),
248
- yes: external_exports.boolean().default(false)
249
- });
250
- var compileCommandArgsSchema = configFlagsSchema.extend({
251
- debug: external_exports.boolean().default(false),
252
- "skip-local-check": external_exports.boolean().default(false)
253
- });
254
- var statusCommandArgsSchema = configFlagsSchema.extend({
255
- json: external_exports.boolean().default(false)
256
- });
257
- var devCommandArgsSchema = configFlagsSchema.extend({
258
- seed: external_exports.string().optional(),
259
- "setup-profile": external_exports.string().optional(),
260
- players: external_exports.string().optional(),
261
- "player-count": external_exports.string().optional(),
262
- debug: external_exports.boolean().default(false),
263
- resume: external_exports.string().optional(),
264
- "from-scenario": external_exports.string().optional(),
265
- "new-session": external_exports.boolean().default(false),
266
- open: external_exports.boolean().default(false),
267
- port: external_exports.string().optional(),
268
- host: external_exports.union([external_exports.string(), external_exports.boolean()]).optional(),
269
- "allowed-host": external_exports.string().optional()
270
- });
271
- var joinCommandArgsSchema = configFlagsSchema.extend({
272
- session: external_exports.string().min(1).optional(),
273
- player: external_exports.string().min(1),
274
- "raw-events": external_exports.boolean().default(false)
275
- });
276
- var configCommandArgsSchema = configFlagsSchema.extend({
277
- action: external_exports.string().optional().default("show"),
278
- scope: external_exports.enum(["global", "workspace"]).optional().default("global")
279
- });
280
- var authCommandArgsSchema = external_exports.object({
281
- action: external_exports.enum(["set", "clear", "login", "env", "status", "git-credential"]),
282
- tokenValue: external_exports.string().optional(),
283
- token: external_exports.string().optional(),
284
- jwt: external_exports.boolean().optional(),
285
- env: external_exports.enum(["local", "staging", "prod"]).optional()
286
- });
287
- function parseArgs(commandName, schema, args) {
288
- const parsed = schema.safeParse(args);
289
- if (parsed.success) {
290
- return parsed.data;
291
- }
292
- const details = parsed.error.issues.map((issue) => {
293
- const field = issue.path.length > 0 ? issue.path.join(".") : "args";
294
- return `${field}: ${issue.message}`;
295
- }).join("; ");
296
- throw new Error(`Invalid arguments for '${commandName}': ${details}`);
297
- }
298
- function parseConfigFlags(args) {
299
- return parseArgs("config-flags", configFlagsSchema, args);
300
- }
301
- function parseSyncCommandArgs(args) {
302
- return parseArgs("sync", syncCommandArgsSchema, args);
303
- }
304
- function parseCompileCommandArgs(args) {
305
- return parseArgs("compile", compileCommandArgsSchema, args);
306
- }
307
-
308
- // src/utils/strings.ts
309
- import path from "path";
310
- function titleFromSlug(slug) {
311
- return slug.split("-").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
312
- }
313
- function sleep(ms) {
314
- return new Promise((resolve) => setTimeout(resolve, ms));
315
- }
316
-
317
- // src/services/api/compiled-results-api.ts
318
- var COMPILE_JOB_POLL_INTERVAL_MS = 1e3;
319
- var DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS = 10 * 60 * 1e3;
320
- function firstNonEmpty(...values) {
321
- for (const value of values) {
322
- if (typeof value === "string" && value.trim().length > 0) {
323
- return value.trim();
324
- }
325
- }
326
- return null;
327
- }
328
- function formatTerminalCompileJobMessage(job) {
329
- const detail = firstNonEmpty(job.errorMessage, job.message);
330
- const phase = firstNonEmpty(job.phase);
331
- const prefix = `Compile ${job.status.toLowerCase()}${phase ? ` [${phase}]` : ""}`;
332
- return detail ? `${prefix}: ${detail}` : `${prefix}: job ${job.jobId} ended before a compiled result was created.`;
333
- }
334
- function compareCreatedAtDesc(left, right) {
335
- const leftTime = Date.parse(left.createdAt);
336
- const rightTime = Date.parse(right.createdAt);
337
- if (Number.isFinite(leftTime) && Number.isFinite(rightTime)) {
338
- return rightTime - leftTime;
339
- }
340
- if (Number.isFinite(rightTime)) {
341
- return 1;
342
- }
343
- if (Number.isFinite(leftTime)) {
344
- return -1;
345
- }
346
- return 0;
347
- }
348
- async function findFallbackCompiledResultForJob(options) {
349
- const { gameId, projectId, job } = options;
350
- if (!projectId) {
351
- return null;
352
- }
353
- const results = await listProjectCompiledResults({
354
- path: { projectId },
355
- query: { limit: 100 }
356
- });
357
- if (results.error || !results.data) {
358
- return null;
359
- }
360
- if (results.data.results.length === 0) {
361
- return null;
362
- }
363
- const jobCreatedAtMs = Date.parse(job.createdAt);
364
- const resultsCreatedAfterJob = Number.isFinite(jobCreatedAtMs) ? results.data.results.filter((result) => {
365
- const resultCreatedAtMs = Date.parse(result.createdAt);
366
- return !Number.isFinite(resultCreatedAtMs) || resultCreatedAtMs >= jobCreatedAtMs;
367
- }) : results.data.results;
368
- const candidateResults = resultsCreatedAfterJob.length > 0 ? resultsCreatedAfterJob : results.data.results;
369
- return [...candidateResults].sort(compareCreatedAtDesc)[0] ?? null;
370
- }
371
- async function getCompiledResultSdk(gameId, compiledResultId) {
372
- void gameId;
373
- void compiledResultId;
374
- throw new Error("Game-scoped compiled result lookup is no longer supported.");
375
- }
376
- async function findProjectCompiledResultsForRevision(options) {
377
- const { projectId, revisionDigest } = options;
378
- const { data, error, response } = await listProjectCompiledResults({
379
- path: { projectId },
380
- query: { limit: 100 }
381
- });
382
- if (error || !data) {
383
- throw toDreamboardApiError(
384
- error,
385
- response,
386
- "Failed to list compiled results"
387
- );
388
- }
389
- return data.results.filter(
390
- (result) => result.revisionDigest === revisionDigest
391
- );
392
- }
393
- async function getProjectCompiledResultSdk(projectId, compiledResultId) {
394
- const { data, error, response } = await getProjectCompiledResult({
395
- path: { projectId, compiledResultId }
396
- });
397
- if (error || !data) {
398
- throw toDreamboardApiError(
399
- error,
400
- response,
401
- "Failed to fetch compiled result"
402
- );
403
- }
404
- return data;
405
- }
406
- async function queueProjectRevisionCompileSdk(options) {
407
- const { data, error, response } = await queueProjectRevisionCompile({
408
- path: {
409
- projectId: options.projectId,
410
- revisionDigest: options.revisionDigest
411
- }
412
- });
413
- if (error || !data) {
414
- throw toDreamboardApiError(error, response, "Failed to create compile job");
415
- }
416
- return data;
417
- }
418
- async function waitForCompiledResultJobSdk(options) {
419
- const { gameId, projectId, jobId, onProgress } = options;
420
- let previousTransitionKey = null;
421
- const startedAt = Date.now();
422
- const timeoutMs = readCompileJobWaitTimeoutMs();
423
- while (Date.now() - startedAt < timeoutMs) {
424
- const {
425
- data: job,
426
- error,
427
- response
428
- } = await getJob({
429
- path: { jobId }
430
- });
431
- if (error || !job) {
432
- if (isTransientJobPollError(error, response)) {
433
- await sleep(COMPILE_JOB_POLL_INTERVAL_MS);
434
- continue;
435
- }
436
- throw toDreamboardApiError(error, response, "Failed to get job");
437
- }
438
- const transitionKey = `${job.status}:${job.phase ?? ""}`;
439
- if (transitionKey !== previousTransitionKey) {
440
- previousTransitionKey = transitionKey;
441
- onProgress?.(job);
442
- }
443
- if (job.status === "COMPLETED" || job.status === "FAILED") {
444
- const compiledResultId = job.createdCompiledResultId ?? job.createdAppScriptId;
445
- if (compiledResultId) {
446
- if (projectId) {
447
- const compiledResult2 = await getProjectCompiledResultSdk(
448
- projectId,
449
- compiledResultId
450
- );
451
- return { job, compiledResult: compiledResult2 };
452
- }
453
- const compiledResult = await getCompiledResultSdk(
454
- gameId,
455
- compiledResultId
456
- );
457
- return { job, compiledResult };
458
- }
459
- const fallbackCompiledResult = await findFallbackCompiledResultForJob({
460
- gameId,
461
- projectId,
462
- job
463
- });
464
- if (fallbackCompiledResult) {
465
- return { job, compiledResult: fallbackCompiledResult };
466
- }
467
- throw new Error(formatTerminalCompileJobMessage(job));
468
- }
469
- if (job.status === "CANCELLED" || job.status === "INTERRUPTED") {
470
- throw new Error(formatTerminalCompileJobMessage(job));
471
- }
472
- await sleep(COMPILE_JOB_POLL_INTERVAL_MS);
473
- }
474
- throw new Error(`Compile job ${jobId} did not complete in time.`);
475
- }
476
- function readCompileJobWaitTimeoutMs() {
477
- const raw = process.env.DREAMBOARD_COMPILE_WAIT_TIMEOUT_MS;
478
- if (!raw) return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;
479
- const parsed = Number(raw);
480
- if (!Number.isFinite(parsed) || parsed <= 0) {
481
- return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;
482
- }
483
- return parsed;
484
- }
485
- function isTransientJobPollError(error, response) {
486
- if (response) return false;
487
- if (!error) return false;
488
- if (error instanceof Error) {
489
- return isTransientJobPollMessage(error.message);
490
- }
491
- if (typeof error === "object" && error !== null && "message" in error) {
492
- return isTransientJobPollMessage(String(error.message));
493
- }
494
- return isTransientJobPollMessage(String(error));
495
- }
496
- function isTransientJobPollMessage(message) {
497
- const normalized = message.toLowerCase();
498
- return normalized.includes("fetch failed") || normalized.includes("network") || normalized.includes("timeout") || normalized.includes("econnreset") || normalized.includes("econnrefused") || normalized.includes("socket");
499
- }
500
-
501
- // src/services/api/project-api.ts
502
- async function loadRemoteProjectIdentity() {
503
- const [versionResponse, userResponse] = await Promise.all([
504
- getApiVersion(),
505
- getCurrentAuthUser()
506
- ]);
507
- if (versionResponse.error || !versionResponse.data) {
508
- throw toDreamboardApiError(
509
- versionResponse.error,
510
- versionResponse.response,
511
- "Failed to resolve backend deployment identity"
512
- );
513
- }
514
- if (userResponse.error || !userResponse.data) {
515
- throw toDreamboardApiError(
516
- userResponse.error,
517
- userResponse.response,
518
- "Failed to resolve authenticated owner scope"
519
- );
520
- }
521
- const deploymentId = versionResponse.data.deploymentId;
522
- const ownerScopeId = userResponse.data.ownerScopeId;
523
- return {
524
- deploymentId,
525
- ownerScopeId,
526
- bindingKey: `${deploymentId}:${ownerScopeId}`
527
- };
528
- }
529
- async function ensureProjectSdk(options) {
530
- const { data, error, response } = await ensureProject({
531
- path: { projectId: options.projectId },
532
- body: {
533
- slug: options.slug,
534
- name: titleFromSlug(options.slug),
535
- description: options.description ?? `Dreamboard workspace for ${options.slug}.`,
536
- ...options.updateAlias ? { updateAlias: true } : {}
537
- }
538
- });
539
- if (error || !data) {
540
- throw toDreamboardApiError(error, response, "Failed to ensure project");
541
- }
542
- return data;
543
- }
544
- async function createGameRevisionSdk(options) {
545
- const { data, error, response } = await createGameRevision({
546
- path: { projectId: options.projectId },
547
- body: options.request
548
- });
549
- if (error || !data) {
550
- throw toDreamboardApiError(
551
- error,
552
- response,
553
- "Failed to create game revision"
554
- );
555
- }
556
- return data;
557
- }
558
-
559
- // src/services/api/preview-api.ts
560
- async function uploadInitialProjectionSdk(gameId, projectionJson) {
561
- const { error, response } = await uploadProjectInitialProjection({
562
- path: { projectId: gameId },
563
- body: { projectionJson }
564
- });
565
- if (error) {
566
- throw toDreamboardApiError(
567
- error,
568
- response,
569
- "Failed to upload initial preview projection"
570
- );
571
- }
572
- }
573
-
574
- // src/services/api/source-revisions-api.ts
575
- var SOURCE_BLOB_UPLOAD_BATCH_SIZE = 20;
576
- async function uploadProjectSourceBlobsSdk(projectId, blobs) {
577
- try {
578
- for (const batch of chunkSourceBlobs(blobs)) {
579
- await uploadProjectSourceBlobs({ projectId, blobs: batch });
580
- }
581
- } catch (error) {
582
- if (error instanceof SourceBlobSessionRequestError) {
583
- throw toDreamboardApiError(
584
- error.apiError,
585
- error.response,
586
- error.message
587
- );
588
- }
589
- throw error;
590
- }
591
- }
592
- function chunkSourceBlobs(blobs) {
593
- const chunks = [];
594
- for (let index = 0; index < blobs.length; index += SOURCE_BLOB_UPLOAD_BATCH_SIZE) {
595
- chunks.push(blobs.slice(index, index + SOURCE_BLOB_UPLOAD_BATCH_SIZE));
596
- }
597
- return chunks;
598
- }
599
-
600
- export {
601
- defineCommand,
602
- materializeSourceChangeOperations,
603
- mapUpsertBlobContentsByContentHash,
604
- CONFIG_FLAG_ARGS,
605
- parseConfigFlags,
606
- parseSyncCommandArgs,
607
- parseCompileCommandArgs,
608
- findProjectCompiledResultsForRevision,
609
- getProjectCompiledResultSdk,
610
- queueProjectRevisionCompileSdk,
611
- waitForCompiledResultJobSdk,
612
- loadRemoteProjectIdentity,
613
- ensureProjectSdk,
614
- createGameRevisionSdk,
615
- uploadInitialProjectionSdk,
616
- uploadProjectSourceBlobsSdk
617
- };
618
- //# sourceMappingURL=chunk-LEWM26XR.mjs.map