@dreamboard-games/cli 0.1.30-alpha.2 → 0.1.30-alpha.4
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.
- package/dist/agent-verifier/agent-workspace-verifier.mjs +227 -0
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
- package/dist/agent-verifier/chunk-27EEIZCI.mjs +185 -0
- package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +1 -0
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs +226 -0
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +1 -0
- package/dist/agent-verifier/chunk-776W3UGV.mjs +167 -0
- package/dist/agent-verifier/chunk-776W3UGV.mjs.map +1 -0
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs +2909 -0
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +1 -0
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs +302 -0
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
- package/dist/agent-verifier/chunk-G42BGGG2.mjs +70 -0
- package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +1 -0
- package/dist/agent-verifier/chunk-H6XDQJ3N.mjs +11 -0
- package/dist/agent-verifier/chunk-H76MT5UR.mjs +57 -0
- package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +1 -0
- package/dist/agent-verifier/chunk-IAYRNVUC.mjs +49 -0
- package/dist/agent-verifier/chunk-IAYRNVUC.mjs.map +1 -0
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs +222 -0
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +1 -0
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs +1744 -0
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +1 -0
- package/dist/agent-verifier/chunk-JZTH3EMV.mjs +14523 -0
- package/dist/agent-verifier/chunk-JZTH3EMV.mjs.map +1 -0
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs +624 -0
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +1 -0
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs +729 -0
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +1 -0
- package/dist/agent-verifier/chunk-NAK77WXW.mjs +767 -0
- package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +1 -0
- package/dist/agent-verifier/chunk-ON62IGWK.mjs +3137 -0
- package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +1 -0
- package/dist/agent-verifier/chunk-QBAF7EYR.mjs +214 -0
- package/dist/agent-verifier/chunk-QBAF7EYR.mjs.map +1 -0
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs +39 -0
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +1 -0
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs +107 -0
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +1 -0
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs +150 -0
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +1 -0
- package/dist/agent-verifier/chunk-XKCJBIRY.mjs +75 -0
- package/dist/agent-verifier/chunk-XKCJBIRY.mjs.map +1 -0
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs +382 -0
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +1 -0
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs +45 -0
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +1 -0
- package/dist/agent-verifier/chunk-YE7UAO3T.mjs +129 -0
- package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs +261 -0
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +1 -0
- package/dist/agent-verifier/chunk-ZEELHSY3.mjs +20 -0
- package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
- package/dist/agent-verifier/compile-576O7TYP.mjs +312 -0
- package/dist/agent-verifier/compile-576O7TYP.mjs.map +1 -0
- package/dist/agent-verifier/global-config-NYCSCAUI.mjs +18 -0
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs +135 -0
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +1 -0
- package/dist/agent-verifier/local-files-QVJ2H3MH.mjs +45 -0
- package/dist/agent-verifier/local-files-QVJ2H3MH.mjs.map +1 -0
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +10 -0
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs.map +1 -0
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs +89 -0
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +1 -0
- package/dist/agent-verifier/project-state-XKUSCFSV.mjs +33 -0
- package/dist/agent-verifier/project-state-XKUSCFSV.mjs.map +1 -0
- package/dist/agent-verifier/prompt-VKHMCQT6.mjs +756 -0
- package/dist/agent-verifier/prompt-VKHMCQT6.mjs.map +1 -0
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +20 -0
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs.map +1 -0
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +11 -0
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs.map +1 -0
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +50 -0
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map +1 -0
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +27 -0
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs.map +1 -0
- package/dist/agent-verifier/sync-C6S3OGCD.mjs +588 -0
- package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +1 -0
- package/dist/agent-verifier/test-Y5UGQV7J.mjs +353 -0
- package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +1 -0
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs +10 -0
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +1 -0
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs +15 -0
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +1 -0
- package/dist/chunk-2H7UOFLK.js +11 -0
- package/dist/chunk-2H7UOFLK.js.map +1 -0
- package/dist/{chunk-N7XPNNUI.js → chunk-3NRROR4P.js} +3 -3
- package/dist/{chunk-TAQKH67O.js → chunk-M4SCKH5M.js} +8 -2224
- package/dist/chunk-M4SCKH5M.js.map +1 -0
- package/dist/{global-config-S4ZIPECE.js → global-config-YBFEGJQG.js} +3 -3
- package/dist/global-config-YBFEGJQG.js.map +1 -0
- package/dist/index.js +4 -4
- package/dist/internal.js +3 -3
- package/dist/{keychain-backend-HDF4TZDL.js → keychain-backend-JHTXAKWC.js} +2 -2
- package/dist/{prompt-NDV3AE5L.js → prompt-GMZABCJC.js} +2 -2
- package/package.json +3 -2
- package/dist/chunk-SEGVTWSK.js +0 -44
- package/dist/chunk-TAQKH67O.js.map +0 -1
- /package/dist/{chunk-SEGVTWSK.js.map → agent-verifier/chunk-H6XDQJ3N.mjs.map} +0 -0
- /package/dist/{global-config-S4ZIPECE.js.map → agent-verifier/global-config-NYCSCAUI.mjs.map} +0 -0
- /package/dist/{chunk-N7XPNNUI.js.map → chunk-3NRROR4P.js.map} +0 -0
- /package/dist/{keychain-backend-HDF4TZDL.js.map → keychain-backend-JHTXAKWC.js.map} +0 -0
- /package/dist/{prompt-NDV3AE5L.js.map → prompt-GMZABCJC.js.map} +0 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
CLIENT_PROBLEM_TYPES,
|
|
4
|
+
SERVER_PROBLEM_TYPES,
|
|
5
|
+
zProblemDetails
|
|
6
|
+
} from "./chunk-C3VW3DTA.mjs";
|
|
7
|
+
|
|
8
|
+
// src/utils/problem-types.ts
|
|
9
|
+
var CLI_PROBLEM_TYPES = {
|
|
10
|
+
...SERVER_PROBLEM_TYPES,
|
|
11
|
+
...CLIENT_PROBLEM_TYPES
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
// src/utils/errors.ts
|
|
15
|
+
var STALE_CONTRACT_ARTIFACT_CODE = "STALE_CONTRACT_ARTIFACT";
|
|
16
|
+
var STALE_CONTRACT_ARTIFACT_EXIT_CODE = 42;
|
|
17
|
+
function isProblemViolationArray(value) {
|
|
18
|
+
return Array.isArray(value) && value.every(
|
|
19
|
+
(entry) => typeof entry === "object" && entry !== null && typeof entry.message === "string"
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
function isProblemDetails(value) {
|
|
23
|
+
return zProblemDetails.safeParse(value).success;
|
|
24
|
+
}
|
|
25
|
+
function coerceViolations(value) {
|
|
26
|
+
if (isProblemViolationArray(value)) {
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) {
|
|
30
|
+
return value.map((message) => ({ message }));
|
|
31
|
+
}
|
|
32
|
+
return void 0;
|
|
33
|
+
}
|
|
34
|
+
function getRequestId(response) {
|
|
35
|
+
return response?.headers?.get?.("X-Correlation-ID") ?? response?.headers?.get?.("x-correlation-id") ?? void 0;
|
|
36
|
+
}
|
|
37
|
+
function toApiProblem(error, response, fallback) {
|
|
38
|
+
if (isProblemDetails(error)) {
|
|
39
|
+
return {
|
|
40
|
+
...error,
|
|
41
|
+
status: error.status || response?.status || 0,
|
|
42
|
+
requestId: error.requestId ?? getRequestId(response)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
if (error instanceof Error) {
|
|
46
|
+
return {
|
|
47
|
+
type: CLI_PROBLEM_TYPES.TRANSPORT_ERROR,
|
|
48
|
+
title: response?.statusText || "API error",
|
|
49
|
+
status: response?.status ?? 0,
|
|
50
|
+
detail: error.message || fallback,
|
|
51
|
+
requestId: getRequestId(response)
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (error && typeof error === "object") {
|
|
55
|
+
const obj = error;
|
|
56
|
+
const detail2 = typeof obj.detail === "string" ? obj.detail : typeof obj.message === "string" ? obj.message : void 0;
|
|
57
|
+
const title = typeof obj.title === "string" ? obj.title : response?.statusText || "API error";
|
|
58
|
+
const violations = coerceViolations(obj.violations) ?? coerceViolations(obj.errors);
|
|
59
|
+
if (detail2) {
|
|
60
|
+
return {
|
|
61
|
+
type: typeof obj.type === "string" ? obj.type : CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,
|
|
62
|
+
title,
|
|
63
|
+
status: typeof obj.status === "number" ? obj.status : response?.status ?? 0,
|
|
64
|
+
detail: detail2,
|
|
65
|
+
requestId: typeof obj.requestId === "string" ? obj.requestId : getRequestId(response),
|
|
66
|
+
retryable: typeof obj.retryable === "boolean" ? obj.retryable : void 0,
|
|
67
|
+
context: typeof obj.context === "object" && obj.context !== null ? obj.context : void 0,
|
|
68
|
+
violations,
|
|
69
|
+
timestamp: typeof obj.timestamp === "string" ? obj.timestamp : void 0,
|
|
70
|
+
instance: typeof obj.instance === "string" ? obj.instance : void 0
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const detail = typeof error === "string" ? error.trim() || fallback : fallback;
|
|
75
|
+
return {
|
|
76
|
+
type: CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,
|
|
77
|
+
title: response?.statusText || "API error",
|
|
78
|
+
status: response?.status ?? 0,
|
|
79
|
+
detail,
|
|
80
|
+
requestId: getRequestId(response)
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function formatProblem(problem) {
|
|
84
|
+
const base = problem.detail || problem.title;
|
|
85
|
+
const violations = problem.violations && problem.violations.length > 0 ? ` (${problem.violations.map((entry) => entry.message).join("; ")})` : "";
|
|
86
|
+
const statusSuffix = problem.status && problem.status > 0 ? ` (HTTP ${problem.status})` : "";
|
|
87
|
+
return `${base}${violations}${statusSuffix}`;
|
|
88
|
+
}
|
|
89
|
+
var DreamboardApiError = class extends Error {
|
|
90
|
+
problem;
|
|
91
|
+
status;
|
|
92
|
+
requestId;
|
|
93
|
+
retryable;
|
|
94
|
+
constructor(problem, cause) {
|
|
95
|
+
super(formatProblem(problem), { cause });
|
|
96
|
+
this.name = "DreamboardApiError";
|
|
97
|
+
this.problem = problem;
|
|
98
|
+
this.status = problem.status;
|
|
99
|
+
this.requestId = problem.requestId;
|
|
100
|
+
this.retryable = problem.retryable;
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
function toDreamboardApiError(error, response, fallback) {
|
|
104
|
+
return new DreamboardApiError(toApiProblem(error, response, fallback), error);
|
|
105
|
+
}
|
|
106
|
+
function isDreamboardApiError(error) {
|
|
107
|
+
return error instanceof DreamboardApiError;
|
|
108
|
+
}
|
|
109
|
+
function getObjectStringProperty(value, property) {
|
|
110
|
+
return value && typeof value === "object" && typeof value[property] === "string" ? value[property] : void 0;
|
|
111
|
+
}
|
|
112
|
+
function isStaleContractArtifactMessage(message) {
|
|
113
|
+
return message.includes(STALE_CONTRACT_ARTIFACT_CODE) || message.includes("StaleContractArtifactError") || message.toLowerCase().includes("stale contract artifact");
|
|
114
|
+
}
|
|
115
|
+
function isStaleContractArtifactError(error) {
|
|
116
|
+
if (getObjectStringProperty(error, "code") === STALE_CONTRACT_ARTIFACT_CODE) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
if (getObjectStringProperty(error, "name") === "StaleContractArtifactError") {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
const message = getObjectStringProperty(error, "message");
|
|
123
|
+
return message ? isStaleContractArtifactMessage(message) : false;
|
|
124
|
+
}
|
|
125
|
+
function isGameNotFoundProblem(problem) {
|
|
126
|
+
return problem.status === 404 && (problem.detail?.startsWith("Game not found: ") === true || problem.instance?.includes("/source-blobs/upload-sessions") === true);
|
|
127
|
+
}
|
|
128
|
+
function getProblemResolution(problem) {
|
|
129
|
+
if (isGameNotFoundProblem(problem)) {
|
|
130
|
+
return [
|
|
131
|
+
"Run `dreamboard sync --force` to recreate the remote game state from your current local files if this is a local workspace.",
|
|
132
|
+
"If you meant to use an existing remote game, check that your selected `--env` points at the backend that has that game."
|
|
133
|
+
].join(" ");
|
|
134
|
+
}
|
|
135
|
+
switch (problem.type) {
|
|
136
|
+
case CLI_PROBLEM_TYPES.UNAUTHORIZED:
|
|
137
|
+
return "Run `dreamboard login` to authenticate again.";
|
|
138
|
+
case CLI_PROBLEM_TYPES.FORBIDDEN:
|
|
139
|
+
return "Check that the signed-in account has access to this game, or run `dreamboard login` with the correct account.";
|
|
140
|
+
case CLI_PROBLEM_TYPES.TOO_MANY_REQUESTS:
|
|
141
|
+
return "Wait a moment, then retry the command.";
|
|
142
|
+
case CLI_PROBLEM_TYPES.TRANSPORT_ERROR:
|
|
143
|
+
return "Check that the selected Dreamboard server is reachable and try again later.";
|
|
144
|
+
case CLI_PROBLEM_TYPES.VALIDATION_FAILED:
|
|
145
|
+
return "Fix the validation issue above, then retry the command.";
|
|
146
|
+
case CLI_PROBLEM_TYPES.ACTIVE_JOB_CONFLICT:
|
|
147
|
+
return "Wait for the active job to finish, then retry the command.";
|
|
148
|
+
case CLI_PROBLEM_TYPES.GAME_SLUG_CONFLICT:
|
|
149
|
+
return "Choose a different game slug, or use the existing workspace for that slug.";
|
|
150
|
+
case CLI_PROBLEM_TYPES.SOURCE_REVISION_NOT_FOUND:
|
|
151
|
+
return "Run `dreamboard sync --force` to recreate the remote source revision from your current local files.";
|
|
152
|
+
case CLI_PROBLEM_TYPES.SOURCE_REVISION_DRIFT:
|
|
153
|
+
case CLI_PROBLEM_TYPES.AUTHORING_STATE_DRIFT:
|
|
154
|
+
case CLI_PROBLEM_TYPES.STATE_CONFLICT:
|
|
155
|
+
return "Run `dreamboard pull` to reconcile remote changes before retrying. If this local workspace is the source of truth, rerun the command with `--force` when supported.";
|
|
156
|
+
case CLI_PROBLEM_TYPES.SOURCE_REVISION_BASE_MISSING:
|
|
157
|
+
case CLI_PROBLEM_TYPES.AUTHORING_STATE_BASE_MISSING:
|
|
158
|
+
return "Run `dreamboard pull --force` in a clean workspace to recover the remote authored state. If the remote has no authored state, run `dreamboard sync --force` from the local source-of-truth workspace.";
|
|
159
|
+
case CLI_PROBLEM_TYPES.INTERNAL_ERROR:
|
|
160
|
+
return "Retry the command. If it still fails, include the request id when asking for help.";
|
|
161
|
+
default:
|
|
162
|
+
return void 0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function getProblemDetails(problem) {
|
|
166
|
+
return [
|
|
167
|
+
`Problem: ${problem.type}`,
|
|
168
|
+
problem.instance ? `Endpoint: ${problem.instance}` : void 0,
|
|
169
|
+
problem.requestId ? `Request ID: ${problem.requestId}` : void 0,
|
|
170
|
+
problem.timestamp ? `Timestamp: ${problem.timestamp}` : void 0
|
|
171
|
+
].filter((detail) => Boolean(detail));
|
|
172
|
+
}
|
|
173
|
+
function presentCliError(error) {
|
|
174
|
+
if (isDreamboardApiError(error)) {
|
|
175
|
+
return {
|
|
176
|
+
message: formatProblem(error.problem),
|
|
177
|
+
resolution: getProblemResolution(error.problem),
|
|
178
|
+
details: getProblemDetails(error.problem)
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
if (error instanceof Error) {
|
|
182
|
+
return {
|
|
183
|
+
message: error.message,
|
|
184
|
+
details: []
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (typeof error === "object" && error !== null) {
|
|
188
|
+
let serialized;
|
|
189
|
+
try {
|
|
190
|
+
serialized = JSON.stringify(error);
|
|
191
|
+
} catch {
|
|
192
|
+
serialized = String(error);
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
message: serialized,
|
|
196
|
+
details: []
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
message: String(error),
|
|
201
|
+
details: []
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function formatCliError(error) {
|
|
205
|
+
const presentation = presentCliError(error);
|
|
206
|
+
return [
|
|
207
|
+
presentation.message,
|
|
208
|
+
presentation.resolution ? `Resolution: ${presentation.resolution}` : void 0,
|
|
209
|
+
...presentation.details
|
|
210
|
+
].filter((line) => Boolean(line)).join("\n");
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export {
|
|
214
|
+
STALE_CONTRACT_ARTIFACT_CODE,
|
|
215
|
+
STALE_CONTRACT_ARTIFACT_EXIT_CODE,
|
|
216
|
+
toDreamboardApiError,
|
|
217
|
+
isDreamboardApiError,
|
|
218
|
+
isStaleContractArtifactMessage,
|
|
219
|
+
isStaleContractArtifactError,
|
|
220
|
+
formatCliError
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=chunk-IDVQXGAO.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/problem-types.ts","../../src/utils/errors.ts"],"sourcesContent":["import {\n CLIENT_PROBLEM_TYPES,\n SERVER_PROBLEM_TYPES,\n} from \"@dreamboard-games/api-client/problem-types\";\n\nexport { CLIENT_PROBLEM_TYPES, SERVER_PROBLEM_TYPES };\n\nexport const CLI_PROBLEM_TYPES = {\n ...SERVER_PROBLEM_TYPES,\n ...CLIENT_PROBLEM_TYPES,\n} as const;\n\nexport type CliProblemType =\n (typeof CLI_PROBLEM_TYPES)[keyof typeof CLI_PROBLEM_TYPES];\n","import type {\n ProblemDetails,\n ProblemViolation,\n} from \"@dreamboard-games/api-client\";\nimport { zProblemDetails } from \"@dreamboard-games/api-client/zod.gen\";\nimport { CLI_PROBLEM_TYPES } from \"./problem-types.js\";\nimport type { CliProblemType } from \"./problem-types.js\";\n\ntype ApiClientError =\n | ProblemDetails\n | Error\n | string\n | Record<string, unknown>\n | null\n | undefined;\n\ntype ApiProblem = Omit<ProblemDetails, \"type\"> & {\n type: CliProblemType | (string & {});\n};\n\ntype CliErrorPresentation = {\n message: string;\n resolution?: string;\n details: string[];\n};\n\nexport const STALE_CONTRACT_ARTIFACT_CODE = \"STALE_CONTRACT_ARTIFACT\";\nexport const STALE_CONTRACT_ARTIFACT_EXIT_CODE = 42;\n\ntype ResponseLike = {\n status?: number;\n statusText?: string;\n headers?: {\n get?: (name: string) => string | null | undefined;\n };\n};\n\nfunction isProblemViolationArray(value: unknown): value is ProblemViolation[] {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { message?: unknown }).message === \"string\",\n )\n );\n}\n\nexport function isProblemDetails(value: unknown): value is ProblemDetails {\n return zProblemDetails.safeParse(value).success;\n}\n\nfunction coerceViolations(value: unknown): ProblemViolation[] | undefined {\n if (isProblemViolationArray(value)) {\n return value;\n }\n\n if (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === \"string\")\n ) {\n return value.map((message) => ({ message }));\n }\n\n return undefined;\n}\n\nfunction getRequestId(response?: ResponseLike): string | undefined {\n return (\n response?.headers?.get?.(\"X-Correlation-ID\") ??\n response?.headers?.get?.(\"x-correlation-id\") ??\n undefined\n );\n}\n\nexport function toApiProblem(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): ApiProblem {\n if (isProblemDetails(error)) {\n return {\n ...error,\n status: error.status || response?.status || 0,\n requestId: error.requestId ?? getRequestId(response),\n };\n }\n\n if (error instanceof Error) {\n return {\n type: CLI_PROBLEM_TYPES.TRANSPORT_ERROR,\n title: response?.statusText || \"API error\",\n status: response?.status ?? 0,\n detail: error.message || fallback,\n requestId: getRequestId(response),\n };\n }\n\n if (error && typeof error === \"object\") {\n const obj = error as Record<string, unknown>;\n const detail =\n typeof obj.detail === \"string\"\n ? obj.detail\n : typeof obj.message === \"string\"\n ? obj.message\n : undefined;\n const title =\n typeof obj.title === \"string\"\n ? obj.title\n : response?.statusText || \"API error\";\n const violations =\n coerceViolations(obj.violations) ?? coerceViolations(obj.errors);\n\n if (detail) {\n return {\n type:\n typeof obj.type === \"string\"\n ? obj.type\n : CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,\n title,\n status:\n typeof obj.status === \"number\" ? obj.status : (response?.status ?? 0),\n detail,\n requestId:\n typeof obj.requestId === \"string\"\n ? obj.requestId\n : getRequestId(response),\n retryable:\n typeof obj.retryable === \"boolean\" ? obj.retryable : undefined,\n context:\n typeof obj.context === \"object\" && obj.context !== null\n ? (obj.context as Record<string, string>)\n : undefined,\n violations,\n timestamp:\n typeof obj.timestamp === \"string\" ? obj.timestamp : undefined,\n instance: typeof obj.instance === \"string\" ? obj.instance : undefined,\n };\n }\n }\n\n const detail =\n typeof error === \"string\" ? error.trim() || fallback : fallback;\n\n return {\n type: CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,\n title: response?.statusText || \"API error\",\n status: response?.status ?? 0,\n detail,\n requestId: getRequestId(response),\n };\n}\n\nfunction formatProblem(problem: ApiProblem): string {\n const base = problem.detail || problem.title;\n const violations =\n problem.violations && problem.violations.length > 0\n ? ` (${problem.violations.map((entry) => entry.message).join(\"; \")})`\n : \"\";\n const statusSuffix =\n problem.status && problem.status > 0 ? ` (HTTP ${problem.status})` : \"\";\n return `${base}${violations}${statusSuffix}`;\n}\n\nexport class DreamboardApiError extends Error {\n readonly problem: ApiProblem;\n readonly status: number;\n readonly requestId?: string;\n readonly retryable?: boolean;\n\n constructor(problem: ApiProblem, cause?: unknown) {\n super(formatProblem(problem), { cause });\n this.name = \"DreamboardApiError\";\n this.problem = problem;\n this.status = problem.status;\n this.requestId = problem.requestId;\n this.retryable = problem.retryable;\n }\n}\n\nexport function toDreamboardApiError(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): DreamboardApiError {\n return new DreamboardApiError(toApiProblem(error, response, fallback), error);\n}\n\nexport function formatApiError(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): string {\n return formatProblem(toApiProblem(error, response, fallback));\n}\n\nexport function isDreamboardApiError(\n error: unknown,\n): error is DreamboardApiError {\n return error instanceof DreamboardApiError;\n}\n\nexport function isProblemType(error: unknown, ...types: string[]): boolean {\n return isDreamboardApiError(error) && types.includes(error.problem.type);\n}\n\nfunction getObjectStringProperty(\n value: unknown,\n property: string,\n): string | undefined {\n return value &&\n typeof value === \"object\" &&\n typeof (value as Record<string, unknown>)[property] === \"string\"\n ? ((value as Record<string, unknown>)[property] as string)\n : undefined;\n}\n\nexport function isStaleContractArtifactMessage(message: string): boolean {\n return (\n message.includes(STALE_CONTRACT_ARTIFACT_CODE) ||\n message.includes(\"StaleContractArtifactError\") ||\n message.toLowerCase().includes(\"stale contract artifact\")\n );\n}\n\nexport function isStaleContractArtifactError(error: unknown): boolean {\n if (getObjectStringProperty(error, \"code\") === STALE_CONTRACT_ARTIFACT_CODE) {\n return true;\n }\n if (getObjectStringProperty(error, \"name\") === \"StaleContractArtifactError\") {\n return true;\n }\n const message = getObjectStringProperty(error, \"message\");\n return message ? isStaleContractArtifactMessage(message) : false;\n}\n\nexport function getCliErrorExitCode(error: unknown): number {\n return isStaleContractArtifactError(error)\n ? STALE_CONTRACT_ARTIFACT_EXIT_CODE\n : 1;\n}\n\nexport function getProblemContext(\n error: unknown,\n): Record<string, string> | undefined {\n return isDreamboardApiError(error) ? error.problem.context : undefined;\n}\n\nexport function getProblemContextValue(\n error: unknown,\n key: string,\n): string | undefined {\n return getProblemContext(error)?.[key];\n}\n\nfunction isGameNotFoundProblem(problem: ApiProblem): boolean {\n return (\n problem.status === 404 &&\n (problem.detail?.startsWith(\"Game not found: \") === true ||\n problem.instance?.includes(\"/source-blobs/upload-sessions\") === true)\n );\n}\n\nfunction getProblemResolution(problem: ApiProblem): string | undefined {\n if (isGameNotFoundProblem(problem)) {\n return [\n \"Run `dreamboard sync --force` to recreate the remote game state from your current local files if this is a local workspace.\",\n \"If you meant to use an existing remote game, check that your selected `--env` points at the backend that has that game.\",\n ].join(\" \");\n }\n\n switch (problem.type) {\n case CLI_PROBLEM_TYPES.UNAUTHORIZED:\n return \"Run `dreamboard login` to authenticate again.\";\n case CLI_PROBLEM_TYPES.FORBIDDEN:\n return \"Check that the signed-in account has access to this game, or run `dreamboard login` with the correct account.\";\n case CLI_PROBLEM_TYPES.TOO_MANY_REQUESTS:\n return \"Wait a moment, then retry the command.\";\n case CLI_PROBLEM_TYPES.TRANSPORT_ERROR:\n return \"Check that the selected Dreamboard server is reachable and try again later.\";\n case CLI_PROBLEM_TYPES.VALIDATION_FAILED:\n return \"Fix the validation issue above, then retry the command.\";\n case CLI_PROBLEM_TYPES.ACTIVE_JOB_CONFLICT:\n return \"Wait for the active job to finish, then retry the command.\";\n case CLI_PROBLEM_TYPES.GAME_SLUG_CONFLICT:\n return \"Choose a different game slug, or use the existing workspace for that slug.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_NOT_FOUND:\n return \"Run `dreamboard sync --force` to recreate the remote source revision from your current local files.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_DRIFT:\n case CLI_PROBLEM_TYPES.AUTHORING_STATE_DRIFT:\n case CLI_PROBLEM_TYPES.STATE_CONFLICT:\n return \"Run `dreamboard pull` to reconcile remote changes before retrying. If this local workspace is the source of truth, rerun the command with `--force` when supported.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_BASE_MISSING:\n case CLI_PROBLEM_TYPES.AUTHORING_STATE_BASE_MISSING:\n return \"Run `dreamboard pull --force` in a clean workspace to recover the remote authored state. If the remote has no authored state, run `dreamboard sync --force` from the local source-of-truth workspace.\";\n case CLI_PROBLEM_TYPES.INTERNAL_ERROR:\n return \"Retry the command. If it still fails, include the request id when asking for help.\";\n default:\n return undefined;\n }\n}\n\nfunction getProblemDetails(problem: ApiProblem): string[] {\n return [\n `Problem: ${problem.type}`,\n problem.instance ? `Endpoint: ${problem.instance}` : undefined,\n problem.requestId ? `Request ID: ${problem.requestId}` : undefined,\n problem.timestamp ? `Timestamp: ${problem.timestamp}` : undefined,\n ].filter((detail): detail is string => Boolean(detail));\n}\n\nexport function presentCliError(error: unknown): CliErrorPresentation {\n if (isDreamboardApiError(error)) {\n return {\n message: formatProblem(error.problem),\n resolution: getProblemResolution(error.problem),\n details: getProblemDetails(error.problem),\n };\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n details: [],\n };\n }\n\n if (typeof error === \"object\" && error !== null) {\n let serialized: string;\n try {\n serialized = JSON.stringify(error);\n } catch {\n serialized = String(error);\n }\n return {\n message: serialized,\n details: [],\n };\n }\n\n return {\n message: String(error),\n details: [],\n };\n}\n\nexport function formatCliError(error: unknown): string {\n const presentation = presentCliError(error);\n return [\n presentation.message,\n presentation.resolution\n ? `Resolution: ${presentation.resolution}`\n : undefined,\n ...presentation.details,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n}\n"],"mappings":"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","names":["detail"]}
|