@pleri/olam-cli 0.1.101 → 0.1.103
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/commands/bootstrap.d.ts +8 -0
- package/dist/commands/bootstrap.d.ts.map +1 -1
- package/dist/commands/bootstrap.js.map +1 -1
- package/dist/commands/kg-build.d.ts +59 -0
- package/dist/commands/kg-build.d.ts.map +1 -0
- package/dist/commands/kg-build.js +247 -0
- package/dist/commands/kg-build.js.map +1 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +35 -8
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/docker-host.d.ts +13 -34
- package/dist/docker-host.d.ts.map +1 -1
- package/dist/docker-host.js +12 -62
- package/dist/docker-host.js.map +1 -1
- package/dist/image-digests.json +6 -5
- package/dist/index.js +505 -138
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +175 -9
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/mcp-server.js
CHANGED
|
@@ -21871,7 +21871,7 @@ var WorldRegistry = class {
|
|
|
21871
21871
|
this.db.pragma("foreign_keys = ON");
|
|
21872
21872
|
this.db.exec(CREATE_TABLE);
|
|
21873
21873
|
this.db.exec(CREATE_META);
|
|
21874
|
-
for (const col of ["readiness_chain TEXT", "expected_services TEXT", "app_port_urls TEXT"]) {
|
|
21874
|
+
for (const col of ["readiness_chain TEXT", "expected_services TEXT", "app_port_urls TEXT", "tailscale_paths TEXT"]) {
|
|
21875
21875
|
try {
|
|
21876
21876
|
this.db.exec(`ALTER TABLE worlds ADD COLUMN ${col}`);
|
|
21877
21877
|
} catch {
|
|
@@ -21989,6 +21989,27 @@ var WorldRegistry = class {
|
|
|
21989
21989
|
const max = rows.length > 0 ? rows[rows.length - 1].port_offset : -100;
|
|
21990
21990
|
return max + 100;
|
|
21991
21991
|
}
|
|
21992
|
+
/**
|
|
21993
|
+
* Persist tailscale serve paths registered for a world.
|
|
21994
|
+
* Paths are stored as a JSON array in the tailscale_paths column.
|
|
21995
|
+
*/
|
|
21996
|
+
storeTailscalePaths(worldId, paths) {
|
|
21997
|
+
this.db.prepare("UPDATE worlds SET tailscale_paths = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(paths), (/* @__PURE__ */ new Date()).toISOString(), worldId);
|
|
21998
|
+
}
|
|
21999
|
+
/**
|
|
22000
|
+
* Load tailscale serve paths for a world. Returns [] when none stored or
|
|
22001
|
+
* column absent (pre-migration rows).
|
|
22002
|
+
*/
|
|
22003
|
+
loadTailscalePaths(worldId) {
|
|
22004
|
+
const row = this.db.prepare("SELECT tailscale_paths FROM worlds WHERE id = ?").get(worldId);
|
|
22005
|
+
if (!row?.tailscale_paths)
|
|
22006
|
+
return [];
|
|
22007
|
+
try {
|
|
22008
|
+
return JSON.parse(row.tailscale_paths);
|
|
22009
|
+
} catch {
|
|
22010
|
+
return [];
|
|
22011
|
+
}
|
|
22012
|
+
}
|
|
21992
22013
|
close() {
|
|
21993
22014
|
this.db.close();
|
|
21994
22015
|
}
|
|
@@ -23074,7 +23095,7 @@ var createServiceContainer = async (docker, worldId, worldName, service, portOff
|
|
|
23074
23095
|
await container.start();
|
|
23075
23096
|
return container;
|
|
23076
23097
|
};
|
|
23077
|
-
var DEFAULT_IMAGE2 = "olam-devbox:
|
|
23098
|
+
var DEFAULT_IMAGE2 = "olam-devbox:base";
|
|
23078
23099
|
var CONTROL_PLANE_PORT = 8080;
|
|
23079
23100
|
var HOST_CONTROL_PLANE_BASE2 = 19080;
|
|
23080
23101
|
var HOST_APP_PORT_BASE_DELTA = 1e4;
|
|
@@ -23299,6 +23320,46 @@ var execInContainer = async (container, cmd, opts) => {
|
|
|
23299
23320
|
};
|
|
23300
23321
|
};
|
|
23301
23322
|
|
|
23323
|
+
// ../adapters/dist/docker/host.js
|
|
23324
|
+
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
23325
|
+
function resolveDockerHostOptions(spawnImpl = spawnSync2) {
|
|
23326
|
+
if (process.env.DOCKER_HOST && process.env.DOCKER_HOST.length > 0) {
|
|
23327
|
+
return {};
|
|
23328
|
+
}
|
|
23329
|
+
try {
|
|
23330
|
+
const result = spawnImpl("docker", ["context", "inspect", "--format", "{{.Endpoints.docker.Host}}"], { encoding: "utf-8", stdio: ["ignore", "pipe", "pipe"] });
|
|
23331
|
+
if (result.status === 0) {
|
|
23332
|
+
const host = (result.stdout ?? "").trim();
|
|
23333
|
+
if (host.startsWith("unix://")) {
|
|
23334
|
+
return { socketPath: host.slice("unix://".length) };
|
|
23335
|
+
}
|
|
23336
|
+
if (host.startsWith("npipe://")) {
|
|
23337
|
+
return { socketPath: host.slice("npipe://".length) };
|
|
23338
|
+
}
|
|
23339
|
+
if (host.startsWith("tcp://") || host.startsWith("http://") || host.startsWith("https://")) {
|
|
23340
|
+
const url = new URL(host.startsWith("tcp://") ? host.replace("tcp://", "http://") : host);
|
|
23341
|
+
const protocol = host.startsWith("https://") ? "https" : "http";
|
|
23342
|
+
const port = url.port ? parseInt(url.port, 10) : protocol === "https" ? 2376 : 2375;
|
|
23343
|
+
return { host: url.hostname, port, protocol };
|
|
23344
|
+
}
|
|
23345
|
+
}
|
|
23346
|
+
} catch {
|
|
23347
|
+
}
|
|
23348
|
+
return { socketPath: "/var/run/docker.sock" };
|
|
23349
|
+
}
|
|
23350
|
+
function describeDockerEndpoint(opts) {
|
|
23351
|
+
if (!opts || Object.keys(opts).length === 0) {
|
|
23352
|
+
return process.env.DOCKER_HOST ? `DOCKER_HOST=${process.env.DOCKER_HOST}` : "/var/run/docker.sock (default)";
|
|
23353
|
+
}
|
|
23354
|
+
if (opts.socketPath) {
|
|
23355
|
+
return `socketPath=${opts.socketPath}`;
|
|
23356
|
+
}
|
|
23357
|
+
if (opts.host) {
|
|
23358
|
+
return `${opts.protocol ?? "http"}://${opts.host}:${opts.port ?? "?"}`;
|
|
23359
|
+
}
|
|
23360
|
+
return JSON.stringify(opts);
|
|
23361
|
+
}
|
|
23362
|
+
|
|
23302
23363
|
// ../adapters/dist/docker/provider.js
|
|
23303
23364
|
var DockerWorld = class {
|
|
23304
23365
|
id;
|
|
@@ -23351,9 +23412,11 @@ var DockerProvider = class extends ComputeProvider {
|
|
|
23351
23412
|
maxLifetimeMinutes: null
|
|
23352
23413
|
};
|
|
23353
23414
|
docker;
|
|
23415
|
+
dockerOptions;
|
|
23354
23416
|
constructor(dockerOptions) {
|
|
23355
23417
|
super();
|
|
23356
23418
|
this.docker = new Dockerode(dockerOptions);
|
|
23419
|
+
this.dockerOptions = dockerOptions;
|
|
23357
23420
|
}
|
|
23358
23421
|
// -----------------------------------------------------------------------
|
|
23359
23422
|
// createWorld
|
|
@@ -23362,8 +23425,10 @@ var DockerProvider = class extends ComputeProvider {
|
|
|
23362
23425
|
const { id, name, services = [], portOffset = 0 } = config2;
|
|
23363
23426
|
try {
|
|
23364
23427
|
await this.docker.ping();
|
|
23365
|
-
} catch {
|
|
23366
|
-
|
|
23428
|
+
} catch (err) {
|
|
23429
|
+
const where = describeDockerEndpoint(this.dockerOptions);
|
|
23430
|
+
const cause = err instanceof Error ? err.message : String(err);
|
|
23431
|
+
throw new Error(`Docker daemon is not available at ${where}. Ensure Docker is running and the resolved endpoint is correct. (underlying: ${cause})`);
|
|
23367
23432
|
}
|
|
23368
23433
|
await createNetwork(this.docker, id, name);
|
|
23369
23434
|
for (const svc of services) {
|
|
@@ -24300,7 +24365,7 @@ function selectComputeProvider(config2, env) {
|
|
|
24300
24365
|
"Compute provider 'e2b' is not implemented. Use 'docker', 'ssh', or 'cloudflare'."
|
|
24301
24366
|
);
|
|
24302
24367
|
case "docker":
|
|
24303
|
-
return new DockerProvider();
|
|
24368
|
+
return new DockerProvider(resolveDockerHostOptions());
|
|
24304
24369
|
default: {
|
|
24305
24370
|
const exhaustive = kind;
|
|
24306
24371
|
throw new Error(`Unknown compute provider: ${String(exhaustive)}`);
|
|
@@ -27906,7 +27971,7 @@ function decideWorkspaceMatch(input) {
|
|
|
27906
27971
|
}
|
|
27907
27972
|
|
|
27908
27973
|
// ../core/dist/util/open-url.js
|
|
27909
|
-
import { spawnSync as
|
|
27974
|
+
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
27910
27975
|
function openUrl(url) {
|
|
27911
27976
|
if (process.env.CI === "true") {
|
|
27912
27977
|
return { opened: false, reason: "CI environment detected" };
|
|
@@ -27930,7 +27995,7 @@ function openUrl(url) {
|
|
|
27930
27995
|
args = [url];
|
|
27931
27996
|
}
|
|
27932
27997
|
try {
|
|
27933
|
-
const result =
|
|
27998
|
+
const result = spawnSync3(cmd, args, { stdio: "ignore", timeout: 5e3 });
|
|
27934
27999
|
if (result.error) {
|
|
27935
28000
|
return { opened: false, reason: `spawn ${cmd}: ${result.error.message}` };
|
|
27936
28001
|
}
|
|
@@ -31253,6 +31318,34 @@ async function runSeedHooks(seeds, containerName, servicePortMap, exec) {
|
|
|
31253
31318
|
}
|
|
31254
31319
|
|
|
31255
31320
|
// ../core/dist/world/tmux-supervisor.js
|
|
31321
|
+
function injectBindAll(start) {
|
|
31322
|
+
let result = start;
|
|
31323
|
+
const userBoundRails = /(^|\s)(-b|--binding)(\s+|=)\S+/.test(start);
|
|
31324
|
+
const userBoundNext = /(^|\s)(-H|--hostname)(\s+|=)\S+/.test(start);
|
|
31325
|
+
const userBoundVite = /(^|\s)--host(\s+\S+|=\S+)/.test(start);
|
|
31326
|
+
const userBoundGunicorn = /(^|\s)(-h|--bind)(\s+|=)\S+/.test(start);
|
|
31327
|
+
const userHostEnv = /(^|\s)HOST=\S+/.test(start);
|
|
31328
|
+
const anyUserBound = userBoundRails || userBoundNext || userBoundVite || userBoundGunicorn;
|
|
31329
|
+
if (!userHostEnv && !anyUserBound) {
|
|
31330
|
+
result = `HOST=0.0.0.0 ${result}`;
|
|
31331
|
+
}
|
|
31332
|
+
if (!userBoundRails && /\brails\s+s(?:erver)?\b/.test(start)) {
|
|
31333
|
+
result = `${result} -b 0.0.0.0`;
|
|
31334
|
+
}
|
|
31335
|
+
if (!userBoundNext && /\bnext\s+dev\b/.test(start)) {
|
|
31336
|
+
result = `${result} -H 0.0.0.0`;
|
|
31337
|
+
}
|
|
31338
|
+
if (!userBoundVite && /\b(?:^|\s|=)vite\b/.test(start)) {
|
|
31339
|
+
result = `${result} --host 0.0.0.0`;
|
|
31340
|
+
}
|
|
31341
|
+
if (!userBoundVite && /\b(?:flask\s+run|uvicorn|hypercorn)\b/.test(start)) {
|
|
31342
|
+
result = `${result} --host 0.0.0.0`;
|
|
31343
|
+
}
|
|
31344
|
+
if (!userBoundGunicorn && /\bgunicorn\b/.test(start)) {
|
|
31345
|
+
result = `${result} --bind 0.0.0.0`;
|
|
31346
|
+
}
|
|
31347
|
+
return result;
|
|
31348
|
+
}
|
|
31256
31349
|
var PortInUseError = class extends Error {
|
|
31257
31350
|
port;
|
|
31258
31351
|
repo;
|
|
@@ -31301,7 +31394,7 @@ async function startSupervisedApps(containerName, worldId, repos, exec, options
|
|
|
31301
31394
|
windowsExisting.push(repo.name);
|
|
31302
31395
|
continue;
|
|
31303
31396
|
}
|
|
31304
|
-
const expandedStart = repo.start.replace(/\$\{?PORT\}?/g, String(repo.hostPort));
|
|
31397
|
+
const expandedStart = injectBindAll(repo.start).replace(/\$\{?PORT\}?/g, String(repo.hostPort));
|
|
31305
31398
|
const startCmd = `cd ${shellQuote2(repo.dir)} && exec ${expandedStart}`;
|
|
31306
31399
|
exec(containerName, `tmux new-window -t ${sessionName} -n ${repo.name} -d ${shellQuote2(startCmd)}`);
|
|
31307
31400
|
windowsCreated.push(repo.name);
|
|
@@ -31462,7 +31555,7 @@ ${stderr.split("\n").slice(0, 3).join(" ")}`);
|
|
|
31462
31555
|
Likely cause: corrupt local image, a custom devbox image without
|
|
31463
31556
|
the olam user (line 10 of devbox.Dockerfile), or NSS resolver
|
|
31464
31557
|
failure under cross-arch QEMU emulation.
|
|
31465
|
-
Remedy: docker rmi olam-devbox:
|
|
31558
|
+
Remedy: docker rmi olam-devbox:base && olam upgrade -y
|
|
31466
31559
|
(or set OLAM_DEVBOX_IMAGE to a known-good ref before \`olam create\`).
|
|
31467
31560
|
PR push from inside the world will not work until this is resolved.`);
|
|
31468
31561
|
return;
|
|
@@ -31716,6 +31809,71 @@ function buildManifestRuntime(worldId, repos) {
|
|
|
31716
31809
|
}
|
|
31717
31810
|
return { worldId, repos: runtimeRepos };
|
|
31718
31811
|
}
|
|
31812
|
+
function exposeWorldOverTailscale(appPortUrls, worldId, registry2, _exec = execSync5) {
|
|
31813
|
+
if (process.env["OLAM_TAILSCALE_SERVE"] !== "true")
|
|
31814
|
+
return;
|
|
31815
|
+
if (appPortUrls.length === 0)
|
|
31816
|
+
return;
|
|
31817
|
+
const bin = resolveTailscaleBin(_exec);
|
|
31818
|
+
if (!bin) {
|
|
31819
|
+
console.warn("[tailscale] WARN: OLAM_TAILSCALE_SERVE=true but no tailscale binary found. Set TAILSCALE_BIN or install tailscale. Skipping serve mapping.");
|
|
31820
|
+
return;
|
|
31821
|
+
}
|
|
31822
|
+
const registeredPaths = [];
|
|
31823
|
+
for (const { repoName, hostPort } of appPortUrls) {
|
|
31824
|
+
const servePath = `/world/${worldId}/${repoName}`;
|
|
31825
|
+
try {
|
|
31826
|
+
_exec(`"${bin}" serve --bg --set-path=${servePath} http://localhost:${hostPort}`, {
|
|
31827
|
+
timeout: 1e4
|
|
31828
|
+
});
|
|
31829
|
+
console.log(`[tailscale] exposed ${worldId}/${repoName} at https://<machine>.<tailnet>/world/${worldId}/${repoName}`);
|
|
31830
|
+
registeredPaths.push(servePath);
|
|
31831
|
+
} catch (err) {
|
|
31832
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31833
|
+
console.warn(`[tailscale] WARN: serve failed for ${repoName} (port ${hostPort}): ${msg}`);
|
|
31834
|
+
}
|
|
31835
|
+
}
|
|
31836
|
+
if (registeredPaths.length > 0) {
|
|
31837
|
+
registry2.storeTailscalePaths(worldId, registeredPaths);
|
|
31838
|
+
}
|
|
31839
|
+
}
|
|
31840
|
+
function cleanupWorldTailscale(worldId, registry2, _exec = execSync5) {
|
|
31841
|
+
const paths = registry2.loadTailscalePaths(worldId);
|
|
31842
|
+
if (paths.length === 0)
|
|
31843
|
+
return;
|
|
31844
|
+
const bin = resolveTailscaleBin(_exec);
|
|
31845
|
+
if (!bin) {
|
|
31846
|
+
console.warn("[tailscale] WARN: Cannot cleanup tailscale serve paths \u2014 binary not found.");
|
|
31847
|
+
return;
|
|
31848
|
+
}
|
|
31849
|
+
for (const servePath of paths) {
|
|
31850
|
+
try {
|
|
31851
|
+
_exec(`"${bin}" serve --bg --set-path=${servePath} off`, { timeout: 1e4 });
|
|
31852
|
+
console.log(`[tailscale] cleaned up serve path ${servePath}`);
|
|
31853
|
+
} catch (err) {
|
|
31854
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
31855
|
+
console.warn(`[tailscale] WARN: cleanup failed for ${servePath}: ${msg}`);
|
|
31856
|
+
}
|
|
31857
|
+
}
|
|
31858
|
+
}
|
|
31859
|
+
function resolveTailscaleBin(_exec = execSync5) {
|
|
31860
|
+
const candidates = [
|
|
31861
|
+
process.env["TAILSCALE_BIN"],
|
|
31862
|
+
"/Applications/Tailscale.app/Contents/MacOS/Tailscale",
|
|
31863
|
+
"/usr/local/bin/tailscale",
|
|
31864
|
+
"/opt/homebrew/bin/tailscale"
|
|
31865
|
+
];
|
|
31866
|
+
for (const c of candidates) {
|
|
31867
|
+
if (!c)
|
|
31868
|
+
continue;
|
|
31869
|
+
try {
|
|
31870
|
+
_exec(`test -x "${c}"`, { timeout: 2e3 });
|
|
31871
|
+
return c;
|
|
31872
|
+
} catch {
|
|
31873
|
+
}
|
|
31874
|
+
}
|
|
31875
|
+
return void 0;
|
|
31876
|
+
}
|
|
31719
31877
|
var WorldManager = class {
|
|
31720
31878
|
config;
|
|
31721
31879
|
provider;
|
|
@@ -32394,6 +32552,10 @@ ${opts.task}`;
|
|
|
32394
32552
|
}
|
|
32395
32553
|
} catch {
|
|
32396
32554
|
}
|
|
32555
|
+
try {
|
|
32556
|
+
exposeWorldOverTailscale(appPortUrls, worldId, this.registry);
|
|
32557
|
+
} catch {
|
|
32558
|
+
}
|
|
32397
32559
|
return {
|
|
32398
32560
|
...metadata,
|
|
32399
32561
|
status: "running",
|
|
@@ -32441,6 +32603,10 @@ ${opts.task}`;
|
|
|
32441
32603
|
} catch {
|
|
32442
32604
|
}
|
|
32443
32605
|
}
|
|
32606
|
+
try {
|
|
32607
|
+
cleanupWorldTailscale(worldId, this.registry);
|
|
32608
|
+
} catch {
|
|
32609
|
+
}
|
|
32444
32610
|
try {
|
|
32445
32611
|
await this.provider.destroyWorld(worldId);
|
|
32446
32612
|
} catch {
|