@pleri/olam-cli 0.1.7
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/__tests__/auth-status.test.d.ts +2 -0
- package/dist/__tests__/auth-status.test.d.ts.map +1 -0
- package/dist/__tests__/auth-status.test.js +290 -0
- package/dist/__tests__/auth-status.test.js.map +1 -0
- package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
- package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/auth-upgrade.test.js +161 -0
- package/dist/__tests__/auth-upgrade.test.js.map +1 -0
- package/dist/__tests__/create-app-urls.test.d.ts +2 -0
- package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/create-app-urls.test.js +102 -0
- package/dist/__tests__/create-app-urls.test.js.map +1 -0
- package/dist/__tests__/enter.test.d.ts +2 -0
- package/dist/__tests__/enter.test.d.ts.map +1 -0
- package/dist/__tests__/enter.test.js +90 -0
- package/dist/__tests__/enter.test.js.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
- package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp-gh-token.test.js +119 -0
- package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
- package/dist/__tests__/host-cp.test.d.ts +9 -0
- package/dist/__tests__/host-cp.test.d.ts.map +1 -0
- package/dist/__tests__/host-cp.test.js +254 -0
- package/dist/__tests__/host-cp.test.js.map +1 -0
- package/dist/__tests__/keys.test.d.ts +9 -0
- package/dist/__tests__/keys.test.d.ts.map +1 -0
- package/dist/__tests__/keys.test.js +145 -0
- package/dist/__tests__/keys.test.js.map +1 -0
- package/dist/__tests__/logs.test.d.ts +9 -0
- package/dist/__tests__/logs.test.d.ts.map +1 -0
- package/dist/__tests__/logs.test.js +124 -0
- package/dist/__tests__/logs.test.js.map +1 -0
- package/dist/__tests__/ps.test.d.ts +2 -0
- package/dist/__tests__/ps.test.d.ts.map +1 -0
- package/dist/__tests__/ps.test.js +172 -0
- package/dist/__tests__/ps.test.js.map +1 -0
- package/dist/__tests__/status-app-urls.test.d.ts +2 -0
- package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
- package/dist/__tests__/status-app-urls.test.js +125 -0
- package/dist/__tests__/status-app-urls.test.js.map +1 -0
- package/dist/__tests__/upgrade.test.d.ts +9 -0
- package/dist/__tests__/upgrade.test.d.ts.map +1 -0
- package/dist/__tests__/upgrade.test.js +262 -0
- package/dist/__tests__/upgrade.test.js.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
- package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
- package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
- package/dist/commands/__tests__/refresh.test.d.ts +13 -0
- package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
- package/dist/commands/__tests__/refresh.test.js +170 -0
- package/dist/commands/__tests__/refresh.test.js.map +1 -0
- package/dist/commands/auth-status.d.ts +43 -0
- package/dist/commands/auth-status.d.ts.map +1 -0
- package/dist/commands/auth-status.js +208 -0
- package/dist/commands/auth-status.js.map +1 -0
- package/dist/commands/auth-upgrade.d.ts +47 -0
- package/dist/commands/auth-upgrade.d.ts.map +1 -0
- package/dist/commands/auth-upgrade.js +277 -0
- package/dist/commands/auth-upgrade.js.map +1 -0
- package/dist/commands/auth.d.ts +16 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +283 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/create.d.ts +8 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +512 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/crystallize.d.ts +8 -0
- package/dist/commands/crystallize.d.ts.map +1 -0
- package/dist/commands/crystallize.js +101 -0
- package/dist/commands/crystallize.js.map +1 -0
- package/dist/commands/destroy.d.ts +6 -0
- package/dist/commands/destroy.d.ts.map +1 -0
- package/dist/commands/destroy.js +54 -0
- package/dist/commands/destroy.js.map +1 -0
- package/dist/commands/dispatch.d.ts +9 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +94 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/enter.d.ts +63 -0
- package/dist/commands/enter.d.ts.map +1 -0
- package/dist/commands/enter.js +206 -0
- package/dist/commands/enter.js.map +1 -0
- package/dist/commands/host-cp.d.ts +191 -0
- package/dist/commands/host-cp.d.ts.map +1 -0
- package/dist/commands/host-cp.js +797 -0
- package/dist/commands/host-cp.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +143 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +22 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +203 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/keys.d.ts +26 -0
- package/dist/commands/keys.d.ts.map +1 -0
- package/dist/commands/keys.js +151 -0
- package/dist/commands/keys.js.map +1 -0
- package/dist/commands/lanes.d.ts +18 -0
- package/dist/commands/lanes.d.ts.map +1 -0
- package/dist/commands/lanes.js +122 -0
- package/dist/commands/lanes.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +39 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/logs.d.ts +38 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +177 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/observe.d.ts +9 -0
- package/dist/commands/observe.d.ts.map +1 -0
- package/dist/commands/observe.js +34 -0
- package/dist/commands/observe.js.map +1 -0
- package/dist/commands/policy-check.d.ts +14 -0
- package/dist/commands/policy-check.d.ts.map +1 -0
- package/dist/commands/policy-check.js +76 -0
- package/dist/commands/policy-check.js.map +1 -0
- package/dist/commands/pr.d.ts +17 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +148 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/ps.d.ts +25 -0
- package/dist/commands/ps.d.ts.map +1 -0
- package/dist/commands/ps.js +164 -0
- package/dist/commands/ps.js.map +1 -0
- package/dist/commands/refresh-helpers.d.ts +25 -0
- package/dist/commands/refresh-helpers.d.ts.map +1 -0
- package/dist/commands/refresh-helpers.js +56 -0
- package/dist/commands/refresh-helpers.js.map +1 -0
- package/dist/commands/refresh.d.ts +23 -0
- package/dist/commands/refresh.d.ts.map +1 -0
- package/dist/commands/refresh.js +237 -0
- package/dist/commands/refresh.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +51 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/upgrade.d.ts +67 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +358 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/workspace.d.ts +23 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +198 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/commands/world-snapshot.d.ts +18 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -0
- package/dist/commands/world-snapshot.js +327 -0
- package/dist/commands/world-snapshot.js.map +1 -0
- package/dist/context.d.ts +26 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +51 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18007 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server.js +32236 -0
- package/dist/output.d.ts +10 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +31 -0
- package/dist/output.js.map +1 -0
- package/host-cp/compose.yaml +126 -0
- package/host-cp/src/auth-secret-hint.mjs +45 -0
- package/host-cp/src/auth.mjs +155 -0
- package/host-cp/src/compose-worlds-sources.mjs +170 -0
- package/host-cp/src/container-secret-fetcher.mjs +163 -0
- package/host-cp/src/docker-events.mjs +184 -0
- package/host-cp/src/local-worlds-source.mjs +83 -0
- package/host-cp/src/plan-orchestrator.mjs +829 -0
- package/host-cp/src/plan-progress.mjs +282 -0
- package/host-cp/src/pr-cache.mjs +201 -0
- package/host-cp/src/pr-merge-poller.mjs +154 -0
- package/host-cp/src/process-poller.mjs +250 -0
- package/host-cp/src/proxy.mjs +245 -0
- package/host-cp/src/pylon-worlds-source.mjs +68 -0
- package/host-cp/src/redact.mjs +67 -0
- package/host-cp/src/secret-cache.mjs +104 -0
- package/host-cp/src/server.mjs +2215 -0
- package/host-cp/src/sse-gate.mjs +117 -0
- package/host-cp/src/version-status.mjs +209 -0
- package/host-cp/src/workspace-catalog.mjs +149 -0
- package/host-cp/src/world-names-store.mjs +176 -0
- package/host-cp/src/world-pr-state.mjs +97 -0
- package/host-cp/src/world-progress.mjs +322 -0
- package/host-cp/src/world-tunnel-manager.mjs +288 -0
- package/host-cp/src/worlds-db-source.mjs +191 -0
- package/host-cp/src/worlds-source.mjs +59 -0
- package/package.json +38 -0
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `olam world snapshot` — Phase A snapshot capture/list commands.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* create <worldId> --kind gems|node|pg|all
|
|
6
|
+
* Capture installed state (gems, node_modules, postgres data) from a
|
|
7
|
+
* running world into tarballs under ~/.olam/snapshots/<worldId>/.
|
|
8
|
+
* Writes a manifest JSON alongside each tarball.
|
|
9
|
+
*
|
|
10
|
+
* list [--world <id>]
|
|
11
|
+
* List captured snapshots with fingerprints, sizes, and ages.
|
|
12
|
+
*
|
|
13
|
+
* Phase B (auto-restore on create) and Phase C (eviction / auto-capture)
|
|
14
|
+
* are NOT wired here — they live in follow-up PRs.
|
|
15
|
+
*/
|
|
16
|
+
import * as fs from 'node:fs';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
import { execSync } from 'node:child_process';
|
|
19
|
+
import pc from 'picocolors';
|
|
20
|
+
import { computeGemsFingerprint, computeNodeFingerprint, computePgFingerprint, packTarball, snapshotTarPath, writeManifest, listSnapshots, } from '@olam/core/src/world/snapshot.js';
|
|
21
|
+
import { printError, printSuccess, printWarning, printHeader } from '../output.js';
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Registration
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
export function registerWorldSnapshot(program) {
|
|
26
|
+
const world = program
|
|
27
|
+
.command('world')
|
|
28
|
+
.description('World management subcommands');
|
|
29
|
+
const snapshot = world
|
|
30
|
+
.command('snapshot')
|
|
31
|
+
.description('Manage world snapshots for fast boot');
|
|
32
|
+
// ── create ────────────────────────────────────────────────────────────────
|
|
33
|
+
snapshot
|
|
34
|
+
.command('create <worldId>')
|
|
35
|
+
.description('Capture installed state from a running world into tarballs')
|
|
36
|
+
.option('--kind <kind>', 'Layer(s) to capture: gems, node, pg, or all', 'all')
|
|
37
|
+
.action(async (worldId, opts) => {
|
|
38
|
+
await handleCreate(worldId, opts.kind);
|
|
39
|
+
});
|
|
40
|
+
// ── list ──────────────────────────────────────────────────────────────────
|
|
41
|
+
snapshot
|
|
42
|
+
.command('list')
|
|
43
|
+
.description('List captured snapshots')
|
|
44
|
+
.option('--world <id>', 'Filter to a specific world id')
|
|
45
|
+
.action((opts) => {
|
|
46
|
+
handleList(opts.world);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
// ---------------------------------------------------------------------------
|
|
50
|
+
// create handler
|
|
51
|
+
// ---------------------------------------------------------------------------
|
|
52
|
+
async function handleCreate(worldId, kindArg) {
|
|
53
|
+
const kinds = resolveKinds(kindArg);
|
|
54
|
+
if (kinds.length === 0) {
|
|
55
|
+
printError(`Unknown --kind "${kindArg}". Use: gems, node, pg, or all.`);
|
|
56
|
+
process.exitCode = 1;
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Load world metadata to get workspacePath + repo list.
|
|
60
|
+
let workspacePath;
|
|
61
|
+
let repoNames;
|
|
62
|
+
try {
|
|
63
|
+
({ workspacePath, repoNames } = await loadWorldMeta(worldId));
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
printError(err instanceof Error ? err.message : String(err));
|
|
67
|
+
process.exitCode = 1;
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const results = [];
|
|
71
|
+
for (const kind of kinds) {
|
|
72
|
+
if (kind === 'gems') {
|
|
73
|
+
for (const repo of repoNames) {
|
|
74
|
+
const result = await captureGems(worldId, workspacePath, repo);
|
|
75
|
+
results.push({ kind, repo, ...result });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
else if (kind === 'node') {
|
|
79
|
+
for (const repo of repoNames) {
|
|
80
|
+
const result = await captureNode(worldId, workspacePath, repo);
|
|
81
|
+
results.push({ kind, repo, ...result });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
else if (kind === 'pg') {
|
|
85
|
+
const result = await capturePg(worldId, workspacePath, repoNames);
|
|
86
|
+
results.push({ kind, repo: null, ...result });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Print results.
|
|
90
|
+
console.log();
|
|
91
|
+
printHeader(`Snapshot results for ${worldId}`);
|
|
92
|
+
console.log();
|
|
93
|
+
for (const r of results) {
|
|
94
|
+
const label = r.repo ? `${r.kind}/${r.repo}` : r.kind;
|
|
95
|
+
if (r.ok) {
|
|
96
|
+
printSuccess(`${label}`);
|
|
97
|
+
console.log(` ${pc.dim(r.tarPath)}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
printWarning(`${label}: ${r.msg ?? 'skipped'}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
console.log();
|
|
104
|
+
}
|
|
105
|
+
function resolveKinds(arg) {
|
|
106
|
+
if (arg === 'all')
|
|
107
|
+
return ['gems', 'node', 'pg'];
|
|
108
|
+
const valid = ['gems', 'node', 'pg'];
|
|
109
|
+
if (valid.includes(arg))
|
|
110
|
+
return [arg];
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Per-kind capture helpers
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
async function captureGems(worldId, workspacePath, repo) {
|
|
117
|
+
const repoDir = path.join(workspacePath, repo);
|
|
118
|
+
const fingerprint = computeGemsFingerprint(repoDir);
|
|
119
|
+
if (!fingerprint) {
|
|
120
|
+
return { ok: false, tarPath: '', msg: 'no Gemfile.lock — layer does not apply' };
|
|
121
|
+
}
|
|
122
|
+
const tarPath = snapshotTarPath(worldId, 'gems', repo, fingerprint);
|
|
123
|
+
// Prefer vendor/bundle (on bind mount — directly accessible on host).
|
|
124
|
+
// Fall back to bundler config inside the devbox container.
|
|
125
|
+
const vendorBundle = path.join(repoDir, 'vendor', 'bundle');
|
|
126
|
+
if (fs.existsSync(vendorBundle)) {
|
|
127
|
+
try {
|
|
128
|
+
packTarball(vendorBundle, tarPath);
|
|
129
|
+
const stat = fs.statSync(tarPath);
|
|
130
|
+
const manifest = {
|
|
131
|
+
kind: 'gems',
|
|
132
|
+
worldId,
|
|
133
|
+
repo,
|
|
134
|
+
fingerprint,
|
|
135
|
+
sizeBytes: stat.size,
|
|
136
|
+
tarPath,
|
|
137
|
+
createdAt: new Date().toISOString(),
|
|
138
|
+
};
|
|
139
|
+
writeManifest(manifest, tarPath);
|
|
140
|
+
return { ok: true, tarPath };
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
return { ok: false, tarPath, msg: `pack failed: ${String(err)}` };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// vendor/bundle not found — exec into container to find $BUNDLE_PATH.
|
|
147
|
+
const containerName = `olam-${worldId}-devbox`;
|
|
148
|
+
let bundlePath;
|
|
149
|
+
try {
|
|
150
|
+
bundlePath = execSync(`docker exec ${containerName} sh -c 'bundle config get path 2>/dev/null || echo ~/.bundle'`, { encoding: 'utf-8', timeout: 10_000 }).trim();
|
|
151
|
+
if (!bundlePath)
|
|
152
|
+
bundlePath = `/home/olam/.bundle`;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return { ok: false, tarPath, msg: 'container not reachable; start the world first' };
|
|
156
|
+
}
|
|
157
|
+
// Pack via docker exec to avoid host-path issues for container-internal dirs.
|
|
158
|
+
try {
|
|
159
|
+
const tmpTar = `/tmp/olam-snap-gems-${repo}-${fingerprint}.tar.gz`;
|
|
160
|
+
execSync(`docker exec ${containerName} sh -c 'mkdir -p "$(dirname ${tmpTar})" && tar -czf ${tmpTar}.tmp -C ${bundlePath} . && mv ${tmpTar}.tmp ${tmpTar}'`, { stdio: 'pipe', timeout: 120_000 });
|
|
161
|
+
fs.mkdirSync(path.dirname(tarPath), { recursive: true });
|
|
162
|
+
execSync(`docker cp ${containerName}:${tmpTar} "${tarPath}"`, { stdio: 'pipe', timeout: 120_000 });
|
|
163
|
+
execSync(`docker exec ${containerName} rm -f ${tmpTar}`, { stdio: 'pipe' });
|
|
164
|
+
const stat = fs.statSync(tarPath);
|
|
165
|
+
const manifest = {
|
|
166
|
+
kind: 'gems',
|
|
167
|
+
worldId,
|
|
168
|
+
repo,
|
|
169
|
+
fingerprint,
|
|
170
|
+
sizeBytes: stat.size,
|
|
171
|
+
tarPath,
|
|
172
|
+
createdAt: new Date().toISOString(),
|
|
173
|
+
};
|
|
174
|
+
writeManifest(manifest, tarPath);
|
|
175
|
+
return { ok: true, tarPath };
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
return { ok: false, tarPath, msg: `docker capture failed: ${String(err)}` };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function captureNode(worldId, workspacePath, repo) {
|
|
182
|
+
const repoDir = path.join(workspacePath, repo);
|
|
183
|
+
const fingerprint = computeNodeFingerprint(repoDir);
|
|
184
|
+
if (!fingerprint) {
|
|
185
|
+
return { ok: false, tarPath: '', msg: 'no lockfile — layer does not apply' };
|
|
186
|
+
}
|
|
187
|
+
const nodeModules = path.join(repoDir, 'node_modules');
|
|
188
|
+
if (!fs.existsSync(nodeModules)) {
|
|
189
|
+
return { ok: false, tarPath: '', msg: 'node_modules not installed yet' };
|
|
190
|
+
}
|
|
191
|
+
const tarPath = snapshotTarPath(worldId, 'node', repo, fingerprint);
|
|
192
|
+
try {
|
|
193
|
+
packTarball(nodeModules, tarPath);
|
|
194
|
+
const stat = fs.statSync(tarPath);
|
|
195
|
+
const manifest = {
|
|
196
|
+
kind: 'node',
|
|
197
|
+
worldId,
|
|
198
|
+
repo,
|
|
199
|
+
fingerprint,
|
|
200
|
+
sizeBytes: stat.size,
|
|
201
|
+
tarPath,
|
|
202
|
+
createdAt: new Date().toISOString(),
|
|
203
|
+
};
|
|
204
|
+
writeManifest(manifest, tarPath);
|
|
205
|
+
return { ok: true, tarPath };
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return { ok: false, tarPath, msg: `pack failed: ${String(err)}` };
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
async function capturePg(worldId, workspacePath, repoNames) {
|
|
212
|
+
const repoDirs = repoNames.map((r) => path.join(workspacePath, r));
|
|
213
|
+
const fingerprint = computePgFingerprint(repoDirs);
|
|
214
|
+
if (!fingerprint) {
|
|
215
|
+
return { ok: false, tarPath: '', msg: 'no Gemfile.lock / schema.rb — layer does not apply' };
|
|
216
|
+
}
|
|
217
|
+
const tarPath = snapshotTarPath(worldId, 'pg', null, fingerprint);
|
|
218
|
+
const containerName = `olam-${worldId}-postgres`;
|
|
219
|
+
const volumeName = `olam-${worldId}-postgres-data`;
|
|
220
|
+
// Verify postgres container/volume exists.
|
|
221
|
+
try {
|
|
222
|
+
execSync(`docker inspect ${containerName}`, { stdio: 'pipe', timeout: 5_000 });
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return { ok: false, tarPath, msg: 'postgres container not found; world may not use postgres' };
|
|
226
|
+
}
|
|
227
|
+
// Stop postgres, snapshot PGDATA via an alpine sidecar, restart.
|
|
228
|
+
// Using raw PGDATA rather than pg_dumpall for byte-exact restore in Phase B.
|
|
229
|
+
try {
|
|
230
|
+
execSync(`docker stop ${containerName}`, { stdio: 'pipe', timeout: 30_000 });
|
|
231
|
+
fs.mkdirSync(path.dirname(tarPath), { recursive: true });
|
|
232
|
+
execSync(`docker run --rm \
|
|
233
|
+
-v "${volumeName}:/pgdata:ro" \
|
|
234
|
+
-v "${path.dirname(tarPath)}:/dest" \
|
|
235
|
+
alpine \
|
|
236
|
+
sh -c 'tar -czf /dest/${path.basename(tarPath)}.tmp -C /pgdata . && mv /dest/${path.basename(tarPath)}.tmp /dest/${path.basename(tarPath)}'`, { stdio: 'pipe', timeout: 180_000 });
|
|
237
|
+
execSync(`docker start ${containerName}`, { stdio: 'pipe', timeout: 30_000 });
|
|
238
|
+
const stat = fs.statSync(tarPath);
|
|
239
|
+
const manifest = {
|
|
240
|
+
kind: 'pg',
|
|
241
|
+
worldId,
|
|
242
|
+
fingerprint,
|
|
243
|
+
sizeBytes: stat.size,
|
|
244
|
+
tarPath,
|
|
245
|
+
createdAt: new Date().toISOString(),
|
|
246
|
+
};
|
|
247
|
+
writeManifest(manifest, tarPath);
|
|
248
|
+
return { ok: true, tarPath };
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
// Always try to restart postgres on failure.
|
|
252
|
+
try {
|
|
253
|
+
execSync(`docker start ${containerName}`, { stdio: 'pipe', timeout: 10_000 });
|
|
254
|
+
}
|
|
255
|
+
catch { /* best-effort */ }
|
|
256
|
+
return { ok: false, tarPath, msg: `pg capture failed: ${String(err)}` };
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
// ---------------------------------------------------------------------------
|
|
260
|
+
// list handler
|
|
261
|
+
// ---------------------------------------------------------------------------
|
|
262
|
+
function handleList(worldIdFilter) {
|
|
263
|
+
const entries = listSnapshots(worldIdFilter);
|
|
264
|
+
if (entries.length === 0) {
|
|
265
|
+
const where = worldIdFilter ? ` for world "${worldIdFilter}"` : '';
|
|
266
|
+
console.log(pc.dim(`No snapshots found${where}. Run \`olam world snapshot create <worldId>\` first.`));
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
printHeader(`${entries.length} snapshot(s)`);
|
|
270
|
+
console.log();
|
|
271
|
+
let lastWorldId = '';
|
|
272
|
+
for (const entry of entries) {
|
|
273
|
+
const { manifest } = entry;
|
|
274
|
+
if (manifest.worldId !== lastWorldId) {
|
|
275
|
+
console.log(pc.bold(manifest.worldId));
|
|
276
|
+
lastWorldId = manifest.worldId;
|
|
277
|
+
}
|
|
278
|
+
const repo = manifest.repo ?? '(all repos)';
|
|
279
|
+
const size = formatBytes(manifest.sizeBytes);
|
|
280
|
+
const age = formatAge(entry.ageMs);
|
|
281
|
+
const kindColor = manifest.kind === 'gems'
|
|
282
|
+
? pc.magenta(manifest.kind)
|
|
283
|
+
: manifest.kind === 'node'
|
|
284
|
+
? pc.cyan(manifest.kind)
|
|
285
|
+
: pc.yellow(manifest.kind);
|
|
286
|
+
console.log(` ${kindColor.padEnd(6)} ${pc.dim(repo.padEnd(24))} ${manifest.fingerprint} ${size.padStart(8)} ${age}`);
|
|
287
|
+
}
|
|
288
|
+
console.log();
|
|
289
|
+
}
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// World metadata loading
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
async function loadWorldMeta(worldId) {
|
|
294
|
+
const { loadContext } = await import('../context.js');
|
|
295
|
+
const { ctx, error } = await loadContext();
|
|
296
|
+
if (!ctx) {
|
|
297
|
+
throw new Error(error?.message ?? 'Olam is not configured. Run `olam init` first.');
|
|
298
|
+
}
|
|
299
|
+
const world = ctx.worldManager.getWorld(worldId);
|
|
300
|
+
if (!world) {
|
|
301
|
+
throw new Error(`World "${worldId}" not found. Run \`olam list\` to see active worlds.`);
|
|
302
|
+
}
|
|
303
|
+
return { workspacePath: world.workspacePath, repoNames: [...world.repos] };
|
|
304
|
+
}
|
|
305
|
+
// ---------------------------------------------------------------------------
|
|
306
|
+
// Formatting helpers
|
|
307
|
+
// ---------------------------------------------------------------------------
|
|
308
|
+
function formatBytes(bytes) {
|
|
309
|
+
if (bytes < 1024)
|
|
310
|
+
return `${bytes}B`;
|
|
311
|
+
if (bytes < 1024 * 1024)
|
|
312
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
313
|
+
if (bytes < 1024 * 1024 * 1024)
|
|
314
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
315
|
+
return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
|
|
316
|
+
}
|
|
317
|
+
function formatAge(ms) {
|
|
318
|
+
const minutes = Math.floor(ms / 60_000);
|
|
319
|
+
if (minutes < 60)
|
|
320
|
+
return `${minutes}m ago`;
|
|
321
|
+
const hours = Math.floor(minutes / 60);
|
|
322
|
+
if (hours < 24)
|
|
323
|
+
return `${hours}h ago`;
|
|
324
|
+
const days = Math.floor(hours / 24);
|
|
325
|
+
return `${days}d ago`;
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=world-snapshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"world-snapshot.js","sourceRoot":"","sources":["../../src/commands/world-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,aAAa,EACb,aAAa,GAGd,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEnF,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,8BAA8B,CAAC,CAAC;IAE/C,MAAM,QAAQ,GAAG,KAAK;SACnB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,sCAAsC,CAAC,CAAC;IAEvD,6EAA6E;IAC7E,QAAQ;SACL,OAAO,CAAC,kBAAkB,CAAC;SAC3B,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CACL,eAAe,EACf,6CAA6C,EAC7C,KAAK,CACN;SACA,MAAM,CAAC,KAAK,EAAE,OAAe,EAAE,IAAsB,EAAE,EAAE;QACxD,MAAM,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEL,6EAA6E;IAC7E,QAAQ;SACL,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,yBAAyB,CAAC;SACtC,MAAM,CAAC,cAAc,EAAE,+BAA+B,CAAC;SACvD,MAAM,CAAC,CAAC,IAAwB,EAAE,EAAE;QACnC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,OAAe;IAC1D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,UAAU,CAAC,mBAAmB,OAAO,iCAAiC,CAAC,CAAC;QACxE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,wDAAwD;IACxD,IAAI,aAAqB,CAAC;IAC1B,IAAI,SAAmB,CAAC;IACxB,IAAI,CAAC;QACH,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAmG,EAAE,CAAC;IAEnH,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,WAAW,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;YACT,YAAY,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,GAAG,IAAI,SAAS,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,KAAK,GAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAmB,CAAC;QAAE,OAAO,CAAC,GAAmB,CAAC,CAAC;IACtE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAC9E,2BAA2B;AAC3B,8EAA8E;AAE9E,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,aAAqB,EACrB,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,wCAAwC,EAAE,CAAC;IACnF,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAEpE,sEAAsE;IACtE,2DAA2D;IAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAqB;gBACjC,IAAI,EAAE,MAAM;gBACZ,OAAO;gBACP,IAAI;gBACJ,WAAW;gBACX,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,OAAO;gBACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;YACF,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACpE,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,MAAM,aAAa,GAAG,QAAQ,OAAO,SAAS,CAAC;IAC/C,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,QAAQ,CACnB,eAAe,aAAa,+DAA+D,EAC3F,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CACvC,CAAC,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,UAAU;YAAE,UAAU,GAAG,oBAAoB,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gDAAgD,EAAE,CAAC;IACvF,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,uBAAuB,IAAI,IAAI,WAAW,SAAS,CAAC;QACnE,QAAQ,CACN,eAAe,aAAa,+BAA+B,MAAM,kBAAkB,MAAM,WAAW,UAAU,YAAY,MAAM,QAAQ,MAAM,GAAG,EACjJ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CACpC,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,QAAQ,CAAC,aAAa,aAAa,IAAI,MAAM,KAAK,OAAO,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACnG,QAAQ,CAAC,eAAe,aAAa,UAAU,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAE5E,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAqB;YACjC,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,0BAA0B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAAe,EACf,aAAqB,EACrB,IAAY;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,oCAAoC,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACvD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,gCAAgC,EAAE,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IACpE,IAAI,CAAC;QACH,WAAW,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAqB;YACjC,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,gBAAgB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACpE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,OAAe,EACf,aAAqB,EACrB,SAAmB;IAEnB,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,oDAAoD,EAAE,CAAC;IAC/F,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,QAAQ,OAAO,WAAW,CAAC;IACjD,MAAM,UAAU,GAAG,QAAQ,OAAO,gBAAgB,CAAC;IAEnD,2CAA2C;IAC3C,IAAI,CAAC;QACH,QAAQ,CAAC,kBAAkB,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,0DAA0D,EAAE,CAAC;IACjG,CAAC;IAED,iEAAiE;IACjE,6EAA6E;IAC7E,IAAI,CAAC;QACH,QAAQ,CAAC,eAAe,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE7E,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,QAAQ,CACN;cACQ,UAAU;cACV,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;;gCAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iCAAiC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAC9I,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CACpC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAE9E,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAqB;YACjC,IAAI,EAAE,IAAI;YACV,OAAO;YACP,WAAW;YACX,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,OAAO;YACP,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,6CAA6C;QAC7C,IAAI,CAAC;YAAC,QAAQ,CAAC,gBAAgB,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QAClH,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,sBAAsB,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IAC1E,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,SAAS,UAAU,CAAC,aAAsB;IACxC,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,qBAAqB,KAAK,uDAAuD,CAAC,CAAC,CAAC;QACvG,OAAO;IACT,CAAC;IAED,WAAW,CAAC,GAAG,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;QAC3B,IAAI,QAAQ,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YACvC,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,aAAa,CAAC;QAC5C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,KAAK,MAAM;YACxC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC3B,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,MAAM;gBACxB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACxB,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE/B,OAAO,CAAC,GAAG,CACT,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,WAAW,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAC7G,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,KAAK,UAAU,aAAa,CAAC,OAAe;IAC1C,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,EAAE,CAAC;IAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,gDAAgD,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,UAAU,OAAO,sDAAsD,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjE,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1D,CAAC;AAED,SAAS,SAAS,CAAC,EAAU;IAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;IACxC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACvC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACpC,OAAO,GAAG,IAAI,OAAO,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI context — mirrors the MCP server's OlamContext initialization.
|
|
3
|
+
*
|
|
4
|
+
* Loads config, creates WorldManager, CostTracker, and compute provider.
|
|
5
|
+
* Returns undefined with an error if Olam is not configured.
|
|
6
|
+
*/
|
|
7
|
+
import type { WorldManager } from '@olam/core/src/world/manager.js';
|
|
8
|
+
import type { CostTracker } from '@olam/core/src/cost/tracker.js';
|
|
9
|
+
import type { OlamConfig } from '@olam/core/src/config/schema.js';
|
|
10
|
+
import type { ComputeProvider } from '@olam/adapters';
|
|
11
|
+
import type { DashboardManager } from '@olam/core/src/dashboard/index.js';
|
|
12
|
+
import type { PleriClient } from '@olam/core/src/pleri/index.js';
|
|
13
|
+
export interface CliContext {
|
|
14
|
+
readonly worldManager: WorldManager;
|
|
15
|
+
readonly costTracker: CostTracker;
|
|
16
|
+
readonly computeProvider: ComputeProvider;
|
|
17
|
+
readonly config: OlamConfig;
|
|
18
|
+
readonly dashboardManager: DashboardManager;
|
|
19
|
+
readonly pleriClient?: PleriClient;
|
|
20
|
+
}
|
|
21
|
+
export interface ContextResult {
|
|
22
|
+
readonly ctx?: CliContext;
|
|
23
|
+
readonly error?: Error;
|
|
24
|
+
}
|
|
25
|
+
export declare function loadContext(): Promise<ContextResult>;
|
|
26
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAqD1D"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI context — mirrors the MCP server's OlamContext initialization.
|
|
3
|
+
*
|
|
4
|
+
* Loads config, creates WorldManager, CostTracker, and compute provider.
|
|
5
|
+
* Returns undefined with an error if Olam is not configured.
|
|
6
|
+
*/
|
|
7
|
+
export async function loadContext() {
|
|
8
|
+
try {
|
|
9
|
+
const { loadConfig } = await import('@olam/core/src/config/loader.js');
|
|
10
|
+
const { WorldManager } = await import('@olam/core/src/world/manager.js');
|
|
11
|
+
const { WorldRegistry } = await import('@olam/core/src/world/registry.js');
|
|
12
|
+
const { CostTracker } = await import('@olam/core/src/cost/tracker.js');
|
|
13
|
+
const { DockerProvider } = await import('@olam/adapters');
|
|
14
|
+
const { DashboardManager } = await import('@olam/core/src/dashboard/index.js');
|
|
15
|
+
const { PleriClient } = await import('@olam/core/src/pleri/index.js');
|
|
16
|
+
const config = loadConfig(process.env.OLAM_CONFIG_DIR);
|
|
17
|
+
const registry = new WorldRegistry();
|
|
18
|
+
const computeProvider = new DockerProvider();
|
|
19
|
+
const dashboardManager = new DashboardManager(config.dashboard);
|
|
20
|
+
let pleriClient;
|
|
21
|
+
if (config.pleri) {
|
|
22
|
+
pleriClient = new PleriClient({
|
|
23
|
+
baseUrl: config.pleri.base_url,
|
|
24
|
+
planeId: config.pleri.plane_id,
|
|
25
|
+
apiKey: config.pleri.api_key,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const worldManager = new WorldManager(config, computeProvider, registry, dashboardManager, pleriClient);
|
|
29
|
+
const costTracker = new CostTracker({
|
|
30
|
+
maxPerWorldUsd: config.cost.max_per_world_usd,
|
|
31
|
+
maxDailyUsd: config.cost.max_daily_usd,
|
|
32
|
+
warningThreshold: config.cost.warning_threshold,
|
|
33
|
+
});
|
|
34
|
+
return {
|
|
35
|
+
ctx: {
|
|
36
|
+
worldManager,
|
|
37
|
+
costTracker,
|
|
38
|
+
computeProvider,
|
|
39
|
+
config,
|
|
40
|
+
dashboardManager,
|
|
41
|
+
pleriClient,
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
return {
|
|
47
|
+
error: err instanceof Error ? err : new Error(String(err)),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAuBH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACvE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC;QACzE,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAC3E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QACvE,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC;QAC/E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,IAAI,cAAc,EAAE,CAAC;QAC7C,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEhE,IAAI,WAAoC,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,WAAW,GAAG,IAAI,WAAW,CAAC;gBAC5B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC9B,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;gBAC9B,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,MAAM,EACN,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,WAAW,CACZ,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC;YAClC,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB;YAC7C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa;YACtC,gBAAgB,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB;SAChD,CAAC,CAAC;QAEH,OAAO;YACL,GAAG,EAAE;gBACH,YAAY;gBACZ,WAAW;gBACX,eAAe;gBACf,MAAM;gBACN,gBAAgB;gBAChB,WAAW;aACZ;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;SAC3D,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @olam/cli — Standalone CLI for the Olam agentic thinking platform.
|
|
4
|
+
*
|
|
5
|
+
* Commands mirror the MCP server tools, delegating to the same
|
|
6
|
+
* core functions (WorldManager, CostTracker, etc.).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|