@miosa/cli 1.0.94 → 1.0.95
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/README.md +85 -0
- package/dist/app-manifest.d.ts +40 -0
- package/dist/app-manifest.d.ts.map +1 -1
- package/dist/app-manifest.js +168 -46
- package/dist/app-manifest.js.map +1 -1
- package/dist/commands/completion.d.ts.map +1 -1
- package/dist/commands/completion.js +2 -0
- package/dist/commands/completion.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +2 -19
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +31 -11
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/env-input.d.ts +26 -0
- package/dist/commands/env-input.d.ts.map +1 -0
- package/dist/commands/env-input.js +68 -0
- package/dist/commands/env-input.js.map +1 -0
- package/dist/commands/env.d.ts.map +1 -1
- package/dist/commands/env.js +15 -3
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/sandbox-delete-guard.d.ts +4 -0
- package/dist/commands/sandbox-delete-guard.d.ts.map +1 -0
- package/dist/commands/sandbox-delete-guard.js +32 -0
- package/dist/commands/sandbox-delete-guard.js.map +1 -0
- package/dist/commands/sandbox-dev.d.ts +20 -0
- package/dist/commands/sandbox-dev.d.ts.map +1 -0
- package/dist/commands/sandbox-dev.js +583 -0
- package/dist/commands/sandbox-dev.js.map +1 -0
- package/dist/commands/sandbox.d.ts +5 -0
- package/dist/commands/sandbox.d.ts.map +1 -1
- package/dist/commands/sandbox.js +163 -65
- package/dist/commands/sandbox.js.map +1 -1
- package/dist/commands/tenant.d.ts.map +1 -1
- package/dist/commands/tenant.js +6 -5
- package/dist/commands/tenant.js.map +1 -1
- package/dist/commands/util.d.ts.map +1 -1
- package/dist/commands/util.js +28 -6
- package/dist/commands/util.js.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +3 -3
- package/dist/errors.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,583 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
import chalk from "chalk";
|
|
7
|
+
import { loadProjectManifest } from "../app-manifest.js";
|
|
8
|
+
import { loadConfig } from "../config.js";
|
|
9
|
+
import { MiosaClient } from "../client.js";
|
|
10
|
+
import { ApiResponseError, AuthError, MiosaError, NetworkError, ServerError, UserError, } from "../errors.js";
|
|
11
|
+
import { handleError, isJsonMode } from "./util.js";
|
|
12
|
+
export function registerSandboxDevCommands(sandbox) {
|
|
13
|
+
const dev = sandbox
|
|
14
|
+
.command("dev")
|
|
15
|
+
.description("Run the canonical project manifest in a persistent development sandbox");
|
|
16
|
+
dev
|
|
17
|
+
.command("up")
|
|
18
|
+
.description("Create or reuse, sync, install, start, and prove development services")
|
|
19
|
+
.option("--dir <path>", "Project directory containing miosa.app.yml", ".")
|
|
20
|
+
.option("--sandbox <id>", "Reuse this sandbox and update local resumability state")
|
|
21
|
+
.option("--json", "Output stable machine-readable JSON")
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
try {
|
|
24
|
+
const result = await devUp(opts.dir, opts.sandbox, (step) => {
|
|
25
|
+
if (!isJsonMode(opts))
|
|
26
|
+
console.error(chalk.dim(`-> ${step}`));
|
|
27
|
+
});
|
|
28
|
+
if (isJsonMode(opts)) {
|
|
29
|
+
console.log(JSON.stringify(result, null, 2));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
console.log();
|
|
33
|
+
console.log(`Sandbox ${result.sandbox_id}${result.reused ? " (reused)" : ""}`);
|
|
34
|
+
for (const [name, service] of Object.entries(result.services)) {
|
|
35
|
+
console.log(`${name} ${chalk.cyan(service.preview_url)}`);
|
|
36
|
+
}
|
|
37
|
+
console.log();
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
handleError(withDevRecovery(error, path.resolve(opts.dir)));
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export async function runFullSandboxDoctor(projectDirInput, sandboxOverride) {
|
|
45
|
+
const projectDir = path.resolve(projectDirInput);
|
|
46
|
+
const loaded = loadProjectManifest(projectDir);
|
|
47
|
+
const manifest = loaded.manifest;
|
|
48
|
+
const saved = readDevState(projectDir);
|
|
49
|
+
if (saved && !sandboxOverride && saved.project !== manifest.name) {
|
|
50
|
+
throw new UserError(`Saved sandbox state belongs to project ${saved.project}, but the loaded manifest is ${manifest.name}.`, `Pass --sandbox <id> explicitly or run miosa sandbox dev up --dir ${quote(projectDir)} to create state for this project.`);
|
|
51
|
+
}
|
|
52
|
+
const sandboxId = sandboxOverride ?? saved?.sandbox_id;
|
|
53
|
+
if (!sandboxId) {
|
|
54
|
+
throw new UserError("No sandbox ID was provided and no resumability state exists.", `Run miosa sandbox dev up --dir ${quote(projectDir)} first, or pass a sandbox ID.`);
|
|
55
|
+
}
|
|
56
|
+
const api = new MiosaClient(loadConfig());
|
|
57
|
+
const checks = [];
|
|
58
|
+
let sandbox = {};
|
|
59
|
+
try {
|
|
60
|
+
sandbox = unwrapRecord(await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}`));
|
|
61
|
+
const state = String(sandbox["state"] ?? sandbox["status"] ?? "unknown");
|
|
62
|
+
checks.push({
|
|
63
|
+
id: "api_state",
|
|
64
|
+
ok: ["running", "ready"].includes(state.toLowerCase()),
|
|
65
|
+
code: ["running", "ready"].includes(state.toLowerCase())
|
|
66
|
+
? "API_STATE_OK"
|
|
67
|
+
: "API_STATE_NOT_RUNNING",
|
|
68
|
+
message: `Sandbox API state is ${state}.`,
|
|
69
|
+
remediation: `Run miosa sandbox resume ${sandboxId} --json, then retry.`,
|
|
70
|
+
details: { state },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
checks.push(failedCheck("api_state", "API_STATE_UNAVAILABLE", error, `Verify with miosa sandbox show ${sandboxId} --json.`));
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const result = await execRaw(api, sandboxId, "printf 'MIOSA_EXEC_OK\\n'", "/", 10);
|
|
78
|
+
const ok = Number(result["exit_code"] ?? 0) === 0 && String(result["stdout"] ?? "").includes("MIOSA_EXEC_OK");
|
|
79
|
+
checks.push({
|
|
80
|
+
id: "exec_channel",
|
|
81
|
+
ok,
|
|
82
|
+
code: ok ? "EXEC_CHANNEL_OK" : "EXEC_CHANNEL_FAILED",
|
|
83
|
+
message: ok ? "Sandbox exec channel responded." : "Sandbox exec channel returned an unexpected result.",
|
|
84
|
+
remediation: `Retry miosa sandbox exec ${sandboxId} --cmd "printf MIOSA_EXEC_OK" --json.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
checks.push(failedCheck("exec_channel", "EXEC_CHANNEL_FAILED", error, `Retry miosa sandbox exec ${sandboxId} --cmd "printf MIOSA_EXEC_OK" --json.`));
|
|
89
|
+
}
|
|
90
|
+
const workdir = manifest.sandbox?.workdir ?? "/workspace";
|
|
91
|
+
try {
|
|
92
|
+
const result = await execRaw(api, sandboxId, `test -d ${quote(workdir)} && printf '%s\\n' ${quote(workdir)}`, "/", 10);
|
|
93
|
+
const ok = Number(result["exit_code"] ?? 0) === 0;
|
|
94
|
+
checks.push({
|
|
95
|
+
id: "filesystem",
|
|
96
|
+
ok,
|
|
97
|
+
code: ok ? "FILESYSTEM_OK" : "FILESYSTEM_WORKDIR_MISSING",
|
|
98
|
+
message: ok ? `Project workdir ${workdir} is accessible.` : `Project workdir ${workdir} is missing.`,
|
|
99
|
+
remediation: `Resume sync with miosa sandbox dev up --dir ${quote(projectDir)} --sandbox ${sandboxId}.`,
|
|
100
|
+
details: { workdir },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
checks.push(failedCheck("filesystem", "FILESYSTEM_UNAVAILABLE", error, `Resume sync with miosa sandbox dev up --dir ${quote(projectDir)} --sandbox ${sandboxId}.`));
|
|
105
|
+
}
|
|
106
|
+
for (const [name, service] of Object.entries(manifest.services ?? {})) {
|
|
107
|
+
try {
|
|
108
|
+
const row = unwrapRecord(await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/services/${encodeURIComponent(name)}`));
|
|
109
|
+
const status = String(row["status"] ?? "unknown");
|
|
110
|
+
const ok = status === "running";
|
|
111
|
+
checks.push({
|
|
112
|
+
id: `service:${name}`,
|
|
113
|
+
ok,
|
|
114
|
+
code: ok ? "SERVICE_RUNNING" : "SERVICE_NOT_RUNNING",
|
|
115
|
+
message: `${name} service status is ${status}.`,
|
|
116
|
+
remediation: `Run miosa sandbox dev up --dir ${quote(projectDir)} --sandbox ${sandboxId}.`,
|
|
117
|
+
details: { service: name, status },
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
checks.push(failedCheck(`service:${name}`, "SERVICE_UNAVAILABLE", error, `Run miosa sandbox dev up --dir ${quote(projectDir)} --sandbox ${sandboxId}.`));
|
|
122
|
+
}
|
|
123
|
+
try {
|
|
124
|
+
const result = await execRaw(api, sandboxId, `python3 -c ${quote(`import urllib.request; r=urllib.request.urlopen('http://127.0.0.1:${service.port}${normalizeHealthPath(service.health?.path ?? "/")}', timeout=3); print(r.status)`)}`, "/", 10);
|
|
125
|
+
const status = Number(String(result["stdout"] ?? "").trim().split(/\s+/)[0]);
|
|
126
|
+
const ok = Number(result["exit_code"] ?? 0) === 0 && status >= 200 && status < 400;
|
|
127
|
+
checks.push({
|
|
128
|
+
id: `listener:${name}`,
|
|
129
|
+
ok,
|
|
130
|
+
code: ok ? "SERVICE_LISTENER_OK" : "SERVICE_LISTENER_FAILED",
|
|
131
|
+
message: ok ? `${name} answered internally with HTTP ${status}.` : `${name} did not answer on port ${service.port}.`,
|
|
132
|
+
remediation: `Inspect miosa sandbox service logs ${sandboxId} ${name} --json.`,
|
|
133
|
+
details: { service: name, port: service.port, status: Number.isFinite(status) ? status : null },
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
checks.push(failedCheck(`listener:${name}`, "SERVICE_LISTENER_FAILED", error, `Inspect miosa sandbox service logs ${sandboxId} ${name} --json.`));
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const exposed = unwrapRecord(await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/expose`, {
|
|
141
|
+
port: service.port,
|
|
142
|
+
title: `${manifest.name} ${name} doctor`,
|
|
143
|
+
}));
|
|
144
|
+
const url = textField(exposed, "url") ?? textField(exposed, "preview_url");
|
|
145
|
+
if (!url)
|
|
146
|
+
throw new Error("Expose response did not include a URL.");
|
|
147
|
+
const status = await probePreview(url, service.health?.path ?? "/");
|
|
148
|
+
const ok = status >= 200 && status < 400;
|
|
149
|
+
checks.push({
|
|
150
|
+
id: `preview:${name}`,
|
|
151
|
+
ok,
|
|
152
|
+
code: ok ? "PREVIEW_ROUTE_OK" : "PREVIEW_ROUTE_FAILED",
|
|
153
|
+
message: `Preview route answered with HTTP ${status}.`,
|
|
154
|
+
remediation: `Recreate and inspect with miosa sandbox preview ${sandboxId} --port ${service.port} --wait --json.`,
|
|
155
|
+
details: { service: name, port: service.port, url, status },
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
checks.push(failedCheck(`preview:${name}`, "PREVIEW_ROUTE_FAILED", error, `Recreate and inspect with miosa sandbox preview ${sandboxId} --port ${service.port} --wait --json.`));
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const databaseId = databaseAttachmentId(sandbox);
|
|
163
|
+
const databaseRequired = manifest.requirements?.database === true;
|
|
164
|
+
checks.push({
|
|
165
|
+
id: "database",
|
|
166
|
+
ok: !databaseRequired || Boolean(databaseId),
|
|
167
|
+
code: !databaseRequired || databaseId ? "DATABASE_ATTACHMENT_OK" : "DATABASE_ATTACHMENT_MISSING",
|
|
168
|
+
message: databaseId
|
|
169
|
+
? `Managed database attachment ${databaseId} is present.`
|
|
170
|
+
: databaseRequired
|
|
171
|
+
? "A managed database attachment is required but missing."
|
|
172
|
+
: "No managed database attachment is required.",
|
|
173
|
+
remediation: `Attach one with miosa sandbox db attach ${sandboxId} <database-id> --json.`,
|
|
174
|
+
details: { required: databaseRequired, attached: Boolean(databaseId), database_id: databaseId },
|
|
175
|
+
});
|
|
176
|
+
let envNames = new Set();
|
|
177
|
+
try {
|
|
178
|
+
const raw = unwrapValue(await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/env`));
|
|
179
|
+
const rows = Array.isArray(raw) ? raw : [];
|
|
180
|
+
envNames = new Set(rows.flatMap((entry) => {
|
|
181
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry))
|
|
182
|
+
return [];
|
|
183
|
+
const row = entry;
|
|
184
|
+
const name = row["name"] ?? row["key"];
|
|
185
|
+
return typeof name === "string" ? [name] : [];
|
|
186
|
+
}));
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
checks.push(failedCheck("environment", "ENVIRONMENT_INSPECTION_FAILED", error, `Inspect names with miosa sandbox env list ${sandboxId} --json.`));
|
|
190
|
+
}
|
|
191
|
+
for (const name of manifest.requirements?.config ?? []) {
|
|
192
|
+
const ok = envNames.has(name);
|
|
193
|
+
checks.push({
|
|
194
|
+
id: `config:${name}`,
|
|
195
|
+
ok,
|
|
196
|
+
code: ok ? "CONFIG_PRESENT" : "CONFIG_MISSING",
|
|
197
|
+
message: ok ? `Config ${name} is present.` : `Config ${name} is missing.`,
|
|
198
|
+
remediation: `Set ${name} with miosa sandbox env set ${sandboxId} ${name}=<value>.`,
|
|
199
|
+
details: { name, present: ok },
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
for (const name of manifest.requirements?.secrets ?? []) {
|
|
203
|
+
const ok = envNames.has(name);
|
|
204
|
+
checks.push({
|
|
205
|
+
id: `secret:${name}`,
|
|
206
|
+
ok,
|
|
207
|
+
code: ok ? "SECRET_PRESENT" : "SECRET_MISSING",
|
|
208
|
+
message: ok ? `Secret ${name} is present.` : `Secret ${name} is missing.`,
|
|
209
|
+
remediation: `Set ${name} through miosa sandbox env set ${sandboxId} without logging its value.`,
|
|
210
|
+
details: { name, present: ok },
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/snapshots`);
|
|
215
|
+
checks.push({
|
|
216
|
+
id: "snapshot",
|
|
217
|
+
ok: true,
|
|
218
|
+
code: "SNAPSHOT_CAPABLE",
|
|
219
|
+
message: "Sandbox snapshot capability is available.",
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
checks.push(failedCheck("snapshot", "SNAPSHOT_UNAVAILABLE", error, `Verify with miosa sandbox snapshots list ${sandboxId} --json.`));
|
|
224
|
+
}
|
|
225
|
+
const failureCodes = checks.filter((check) => !check.ok).map((check) => check.code);
|
|
226
|
+
return {
|
|
227
|
+
ok: failureCodes.length === 0,
|
|
228
|
+
sandbox_id: sandboxId,
|
|
229
|
+
manifest: loaded.path,
|
|
230
|
+
failure_codes: failureCodes,
|
|
231
|
+
checks,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
async function devUp(projectDirInput, sandboxOverride, step) {
|
|
235
|
+
const projectDir = path.resolve(projectDirInput);
|
|
236
|
+
const loaded = loadProjectManifest(projectDir);
|
|
237
|
+
const manifest = loaded.manifest;
|
|
238
|
+
const api = new MiosaClient(loadConfig());
|
|
239
|
+
const saved = readDevState(projectDir);
|
|
240
|
+
const explicitlySelected = Boolean(sandboxOverride);
|
|
241
|
+
let sandboxId = sandboxOverride ??
|
|
242
|
+
(saved && saved.project === manifest.name ? saved.sandbox_id : null);
|
|
243
|
+
let reused = Boolean(sandboxId);
|
|
244
|
+
if (sandboxId) {
|
|
245
|
+
step(`Validating sandbox ${sandboxId}`);
|
|
246
|
+
try {
|
|
247
|
+
const row = unwrapRecord(await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}`));
|
|
248
|
+
if (isTerminalSandbox(row)) {
|
|
249
|
+
if (explicitlySelected) {
|
|
250
|
+
throw new UserError(`Explicitly selected sandbox ${sandboxId} is in a terminal state.`);
|
|
251
|
+
}
|
|
252
|
+
sandboxId = null;
|
|
253
|
+
reused = false;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (!isNotFound(error))
|
|
258
|
+
throw error;
|
|
259
|
+
if (explicitlySelected) {
|
|
260
|
+
throw new UserError(`Explicitly selected sandbox ${sandboxId} was not found.`);
|
|
261
|
+
}
|
|
262
|
+
sandboxId = null;
|
|
263
|
+
reused = false;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
if (!sandboxId) {
|
|
267
|
+
step("Creating persistent sandbox");
|
|
268
|
+
const created = unwrapRecord(await api.apiPost("/api/v1/sandboxes", {
|
|
269
|
+
name: manifest.sandbox?.name ?? `${manifest.name}-dev`,
|
|
270
|
+
template_id: manifest.sandbox?.template ?? manifest.template ?? "miosa-sandbox",
|
|
271
|
+
persistent: true,
|
|
272
|
+
}));
|
|
273
|
+
sandboxId = textField(created, "id");
|
|
274
|
+
if (!sandboxId)
|
|
275
|
+
throw new UserError("Sandbox create response did not include an id.");
|
|
276
|
+
writeDevState(projectDir, {
|
|
277
|
+
schema_version: 1,
|
|
278
|
+
project: manifest.name,
|
|
279
|
+
sandbox_id: sandboxId,
|
|
280
|
+
updated_at: new Date().toISOString(),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else if (sandboxOverride || saved?.project !== manifest.name) {
|
|
284
|
+
writeDevState(projectDir, {
|
|
285
|
+
schema_version: 1,
|
|
286
|
+
project: manifest.name,
|
|
287
|
+
sandbox_id: sandboxId,
|
|
288
|
+
updated_at: new Date().toISOString(),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
step("Waiting for sandbox API state");
|
|
292
|
+
await waitForRunning(api, sandboxId, 120);
|
|
293
|
+
step("Overlay-syncing project files without deleting runtime paths");
|
|
294
|
+
await syncProject(api, sandboxId, projectDir, manifest);
|
|
295
|
+
if (manifest.dependencies?.install !== false && manifest.dependencies?.install) {
|
|
296
|
+
step(`Installing dependencies with ${manifest.dependencies.install}`);
|
|
297
|
+
await installDependencies(api, sandboxId, projectDir, manifest);
|
|
298
|
+
}
|
|
299
|
+
const services = {};
|
|
300
|
+
for (const [name, service] of Object.entries(manifest.services ?? {})) {
|
|
301
|
+
const port = service.port;
|
|
302
|
+
const healthPath = service.health?.path ?? "/";
|
|
303
|
+
const cwd = remoteCwd(manifest, service.cwd);
|
|
304
|
+
step(`Starting service ${name}`);
|
|
305
|
+
let exists = false;
|
|
306
|
+
try {
|
|
307
|
+
await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/services/${encodeURIComponent(name)}`);
|
|
308
|
+
exists = true;
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
if (!isNotFound(error))
|
|
312
|
+
throw error;
|
|
313
|
+
}
|
|
314
|
+
if (exists) {
|
|
315
|
+
await api.apiDelete(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/services/${encodeURIComponent(name)}`);
|
|
316
|
+
await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/services`, {
|
|
317
|
+
name,
|
|
318
|
+
command: service.command,
|
|
319
|
+
cwd,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/services`, {
|
|
324
|
+
name,
|
|
325
|
+
command: service.command,
|
|
326
|
+
cwd,
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
step(`Waiting for ${name} health`);
|
|
330
|
+
const internal = await waitForInternalHealth(api, sandboxId, port, healthPath, service.health?.timeout ?? 120);
|
|
331
|
+
const exposed = unwrapRecord(await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/expose`, {
|
|
332
|
+
port,
|
|
333
|
+
title: `${manifest.name} ${name}`,
|
|
334
|
+
}));
|
|
335
|
+
const previewUrl = textField(exposed, "url") ?? textField(exposed, "preview_url");
|
|
336
|
+
if (!previewUrl)
|
|
337
|
+
throw new UserError(`Preview route for ${name} did not return a URL.`);
|
|
338
|
+
const edgeStatus = await probePreview(previewUrl, healthPath);
|
|
339
|
+
if (edgeStatus < 200 || edgeStatus >= 400) {
|
|
340
|
+
throw new UserError(`Preview health failed for ${name} with HTTP ${edgeStatus}.`, `Inspect with miosa sandbox doctor ${sandboxId} --full --json.`);
|
|
341
|
+
}
|
|
342
|
+
services[name] = {
|
|
343
|
+
healthy: true,
|
|
344
|
+
port,
|
|
345
|
+
health_path: healthPath,
|
|
346
|
+
preview_url: previewUrl,
|
|
347
|
+
internal_status: internal,
|
|
348
|
+
edge_status: edgeStatus,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
ok: true,
|
|
353
|
+
sandbox_id: sandboxId,
|
|
354
|
+
reused,
|
|
355
|
+
manifest: loaded.path,
|
|
356
|
+
services,
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
async function syncProject(api, sandboxId, projectDir, manifest) {
|
|
360
|
+
const archive = path.join(os.tmpdir(), `miosa-dev-${process.pid}-${Date.now()}.tgz`);
|
|
361
|
+
const excludes = manifest.sync?.exclude ?? [];
|
|
362
|
+
const args = excludes.flatMap((entry) => ["--exclude", entry]);
|
|
363
|
+
const tar = spawnSync("tar", [...args, "-czf", archive, "-C", projectDir, "."], { stdio: "pipe", env: { ...process.env, COPYFILE_DISABLE: "1" } });
|
|
364
|
+
if (tar.status !== 0) {
|
|
365
|
+
throw new UserError(`Could not archive project: ${tar.stderr.toString().trim() || "tar failed"}`);
|
|
366
|
+
}
|
|
367
|
+
try {
|
|
368
|
+
await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/files`, {
|
|
369
|
+
path: "/tmp/miosa-dev-sync.tgz",
|
|
370
|
+
content: fs.readFileSync(archive).toString("base64"),
|
|
371
|
+
});
|
|
372
|
+
const workdir = manifest.sandbox?.workdir ?? "/workspace";
|
|
373
|
+
await exec(api, sandboxId, `mkdir -p ${quote(workdir)} && tar -xzf /tmp/miosa-dev-sync.tgz -C ${quote(workdir)} && rm -f /tmp/miosa-dev-sync.tgz`, "/");
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
fs.rmSync(archive, { force: true });
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async function installDependencies(api, sandboxId, projectDir, manifest) {
|
|
380
|
+
const fingerprint = createHash("sha256");
|
|
381
|
+
const command = manifest.dependencies?.install;
|
|
382
|
+
const lockfiles = new Set([
|
|
383
|
+
"package-lock.json",
|
|
384
|
+
"pnpm-lock.yaml",
|
|
385
|
+
"yarn.lock",
|
|
386
|
+
"bun.lock",
|
|
387
|
+
"requirements.lock",
|
|
388
|
+
"package.json",
|
|
389
|
+
...pipLockfiles(command),
|
|
390
|
+
]);
|
|
391
|
+
for (const filename of lockfiles) {
|
|
392
|
+
const file = path.join(projectDir, filename);
|
|
393
|
+
if (fs.existsSync(file))
|
|
394
|
+
fingerprint.update(filename).update(fs.readFileSync(file));
|
|
395
|
+
}
|
|
396
|
+
const hash = fingerprint.digest("hex").slice(0, 20);
|
|
397
|
+
const marker = `.miosa-runtime/install-${hash}.done`;
|
|
398
|
+
if (!command)
|
|
399
|
+
return;
|
|
400
|
+
await exec(api, sandboxId, `mkdir -p .miosa-runtime && test -f ${quote(marker)} || (${command} && touch ${quote(marker)})`, manifest.sandbox?.workdir ?? "/workspace", 900);
|
|
401
|
+
}
|
|
402
|
+
function pipLockfiles(command) {
|
|
403
|
+
if (typeof command !== "string")
|
|
404
|
+
return [];
|
|
405
|
+
const filenames = [];
|
|
406
|
+
for (const match of command.matchAll(/(?:^|\s)(?:-r\s+|--requirement(?:=|\s+))([^\s;&|`<>]+\.lock)(?=\s|$)/g)) {
|
|
407
|
+
const filename = match[1];
|
|
408
|
+
if (!filename)
|
|
409
|
+
continue;
|
|
410
|
+
if (path.isAbsolute(filename) || filename.split(/[\\/]/).includes(".."))
|
|
411
|
+
continue;
|
|
412
|
+
filenames.push(filename);
|
|
413
|
+
}
|
|
414
|
+
return filenames;
|
|
415
|
+
}
|
|
416
|
+
async function waitForRunning(api, sandboxId, timeout) {
|
|
417
|
+
const deadline = Date.now() + timeout * 1000;
|
|
418
|
+
while (Date.now() < deadline) {
|
|
419
|
+
const row = unwrapRecord(await api.apiGet(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}`));
|
|
420
|
+
const state = String(row["state"] ?? row["status"] ?? "").toLowerCase();
|
|
421
|
+
if (state === "running" || state === "ready")
|
|
422
|
+
return;
|
|
423
|
+
if (["failed", "destroyed", "error"].includes(state)) {
|
|
424
|
+
throw new UserError(`Sandbox ${sandboxId} entered ${state} state.`);
|
|
425
|
+
}
|
|
426
|
+
await sleep(1_000);
|
|
427
|
+
}
|
|
428
|
+
throw new UserError(`Sandbox ${sandboxId} did not become running within ${timeout}s.`);
|
|
429
|
+
}
|
|
430
|
+
async function waitForInternalHealth(api, sandboxId, port, healthPath, timeout) {
|
|
431
|
+
const deadline = Date.now() + timeout * 1000;
|
|
432
|
+
let last = "not listening";
|
|
433
|
+
while (Date.now() < deadline) {
|
|
434
|
+
const result = await execRaw(api, sandboxId, `python3 -c ${quote(`import urllib.request; r=urllib.request.urlopen('http://127.0.0.1:${port}${normalizeHealthPath(healthPath)}', timeout=3); print(r.status)`)}`, "/", 10);
|
|
435
|
+
const status = Number(String(result["stdout"] ?? "").trim().split(/\s+/)[0]);
|
|
436
|
+
if (Number(result["exit_code"] ?? 0) === 0 && status >= 200 && status < 400)
|
|
437
|
+
return status;
|
|
438
|
+
last = String(result["stderr"] ?? result["stdout"] ?? last).trim();
|
|
439
|
+
await sleep(1_000);
|
|
440
|
+
}
|
|
441
|
+
throw new UserError(`Service on port ${port} did not become healthy within ${timeout}s.`, last || "Inspect service logs and listener state with miosa sandbox doctor --full.");
|
|
442
|
+
}
|
|
443
|
+
async function probePreview(baseUrl, healthPath) {
|
|
444
|
+
const url = new URL(baseUrl);
|
|
445
|
+
url.pathname = `${url.pathname.replace(/\/$/, "")}${normalizeHealthPath(healthPath)}`;
|
|
446
|
+
const response = await fetch(url, {
|
|
447
|
+
method: "GET",
|
|
448
|
+
redirect: "manual",
|
|
449
|
+
signal: AbortSignal.timeout(10_000),
|
|
450
|
+
});
|
|
451
|
+
return response.status;
|
|
452
|
+
}
|
|
453
|
+
async function exec(api, sandboxId, command, cwd, timeout) {
|
|
454
|
+
const result = await execRaw(api, sandboxId, command, cwd, timeout);
|
|
455
|
+
const exitCode = Number(result["exit_code"] ?? 0);
|
|
456
|
+
if (exitCode !== 0) {
|
|
457
|
+
throw new UserError(`Sandbox command failed with exit code ${exitCode}: ${command}`, String(result["stderr"] ?? result["stdout"] ?? ""));
|
|
458
|
+
}
|
|
459
|
+
return result;
|
|
460
|
+
}
|
|
461
|
+
async function execRaw(api, sandboxId, command, cwd, timeout) {
|
|
462
|
+
const body = { command: `cd ${quote(cwd)} && ${command}`, cwd, dir: cwd };
|
|
463
|
+
if (timeout != null)
|
|
464
|
+
body["timeout"] = timeout;
|
|
465
|
+
return unwrapRecord(await api.apiPost(`/api/v1/sandboxes/${encodeURIComponent(sandboxId)}/exec`, body));
|
|
466
|
+
}
|
|
467
|
+
function readDevState(projectDir) {
|
|
468
|
+
try {
|
|
469
|
+
return JSON.parse(fs.readFileSync(statePath(projectDir), "utf8"));
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
return null;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
function writeDevState(projectDir, state) {
|
|
476
|
+
const target = statePath(projectDir);
|
|
477
|
+
fs.mkdirSync(path.dirname(target), { recursive: true });
|
|
478
|
+
const temporary = `${target}.${process.pid}.tmp`;
|
|
479
|
+
fs.writeFileSync(temporary, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
480
|
+
fs.renameSync(temporary, target);
|
|
481
|
+
}
|
|
482
|
+
function statePath(projectDir) {
|
|
483
|
+
return path.join(projectDir, ".miosa", "sandbox.json");
|
|
484
|
+
}
|
|
485
|
+
function remoteCwd(manifest, serviceCwd) {
|
|
486
|
+
const root = manifest.sandbox?.workdir ?? "/workspace";
|
|
487
|
+
if (!serviceCwd || serviceCwd === ".")
|
|
488
|
+
return root;
|
|
489
|
+
if (serviceCwd.startsWith("/"))
|
|
490
|
+
return serviceCwd;
|
|
491
|
+
return path.posix.join(root, serviceCwd);
|
|
492
|
+
}
|
|
493
|
+
function unwrapRecord(value) {
|
|
494
|
+
const root = value && typeof value === "object" && !Array.isArray(value)
|
|
495
|
+
? value
|
|
496
|
+
: {};
|
|
497
|
+
const data = root["data"];
|
|
498
|
+
return data && typeof data === "object" && !Array.isArray(data)
|
|
499
|
+
? data
|
|
500
|
+
: root;
|
|
501
|
+
}
|
|
502
|
+
function unwrapValue(value) {
|
|
503
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
504
|
+
return value;
|
|
505
|
+
const root = value;
|
|
506
|
+
return "data" in root ? root["data"] : root;
|
|
507
|
+
}
|
|
508
|
+
function failedCheck(id, code, error, remediation) {
|
|
509
|
+
return {
|
|
510
|
+
id,
|
|
511
|
+
ok: false,
|
|
512
|
+
code,
|
|
513
|
+
message: error instanceof Error ? error.message : String(error),
|
|
514
|
+
remediation,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
function databaseAttachmentId(sandbox) {
|
|
518
|
+
for (const key of ["database_id", "attached_database_id"]) {
|
|
519
|
+
const value = sandbox[key];
|
|
520
|
+
if (typeof value === "string" && value.length > 0)
|
|
521
|
+
return value;
|
|
522
|
+
}
|
|
523
|
+
const database = sandbox["database"];
|
|
524
|
+
if (database && typeof database === "object" && !Array.isArray(database)) {
|
|
525
|
+
return textField(database, "id");
|
|
526
|
+
}
|
|
527
|
+
const databases = sandbox["databases"];
|
|
528
|
+
if (Array.isArray(databases) && databases.length > 0) {
|
|
529
|
+
const first = databases[0];
|
|
530
|
+
if (typeof first === "string")
|
|
531
|
+
return first;
|
|
532
|
+
if (first && typeof first === "object" && !Array.isArray(first)) {
|
|
533
|
+
return textField(first, "id");
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
function textField(row, key) {
|
|
539
|
+
const value = row[key];
|
|
540
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
541
|
+
}
|
|
542
|
+
function isTerminalSandbox(row) {
|
|
543
|
+
const state = String(row["state"] ?? row["status"] ?? "").toLowerCase();
|
|
544
|
+
return ["destroyed", "deleted", "failed", "error"].includes(state);
|
|
545
|
+
}
|
|
546
|
+
function isNotFound(error) {
|
|
547
|
+
return error instanceof MiosaError && /not found/i.test(error.message);
|
|
548
|
+
}
|
|
549
|
+
export function withDevRecovery(error, projectDir) {
|
|
550
|
+
if (!(error instanceof MiosaError))
|
|
551
|
+
return error;
|
|
552
|
+
const saved = readDevState(projectDir);
|
|
553
|
+
if (!saved)
|
|
554
|
+
return error;
|
|
555
|
+
const recovery = `Resume with miosa sandbox dev up --dir ${quote(projectDir)} --sandbox ${quote(saved.sandbox_id)}, or inspect with miosa sandbox doctor ${quote(saved.sandbox_id)} --full --json.`;
|
|
556
|
+
const hint = error.hint ? `${error.hint} ${recovery}` : recovery;
|
|
557
|
+
if (error instanceof ApiResponseError) {
|
|
558
|
+
return new ApiResponseError(error.code, error.message, error.exitCode, error.retryable, hint, error.details, error.requestId);
|
|
559
|
+
}
|
|
560
|
+
if (error instanceof AuthError) {
|
|
561
|
+
return new AuthError(error.message, hint, error.details, error.requestId);
|
|
562
|
+
}
|
|
563
|
+
if (error instanceof NetworkError) {
|
|
564
|
+
return new NetworkError(error.message, hint);
|
|
565
|
+
}
|
|
566
|
+
if (error instanceof UserError) {
|
|
567
|
+
return new UserError(error.message, hint);
|
|
568
|
+
}
|
|
569
|
+
if (error instanceof ServerError) {
|
|
570
|
+
return new ServerError(error.message, error.statusCode, error.body, error.requestId, hint);
|
|
571
|
+
}
|
|
572
|
+
return new MiosaError(error.message, error.exitCode, hint, error.details, error.requestId);
|
|
573
|
+
}
|
|
574
|
+
function quote(value) {
|
|
575
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
576
|
+
}
|
|
577
|
+
function normalizeHealthPath(value) {
|
|
578
|
+
return value.startsWith("/") ? value : `/${value}`;
|
|
579
|
+
}
|
|
580
|
+
function sleep(ms) {
|
|
581
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
582
|
+
}
|
|
583
|
+
//# sourceMappingURL=sandbox-dev.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox-dev.js","sourceRoot":"","sources":["../../src/commands/sandbox-dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
2
3
|
export declare function register(program: Command): void;
|
|
4
|
+
export declare function buildSandboxWebSocketRequest(config: ReturnType<typeof loadConfig>, id: string): {
|
|
5
|
+
url: string;
|
|
6
|
+
headers: Record<string, string>;
|
|
7
|
+
};
|
|
3
8
|
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkCzC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAqC1C,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4iF/C;AAgMD,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,EACrC,EAAE,EAAE,MAAM,GACT;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC,CAkBA"}
|