@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.
Files changed (196) hide show
  1. package/dist/__tests__/auth-status.test.d.ts +2 -0
  2. package/dist/__tests__/auth-status.test.d.ts.map +1 -0
  3. package/dist/__tests__/auth-status.test.js +290 -0
  4. package/dist/__tests__/auth-status.test.js.map +1 -0
  5. package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
  6. package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-upgrade.test.js +161 -0
  8. package/dist/__tests__/auth-upgrade.test.js.map +1 -0
  9. package/dist/__tests__/create-app-urls.test.d.ts +2 -0
  10. package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
  11. package/dist/__tests__/create-app-urls.test.js +102 -0
  12. package/dist/__tests__/create-app-urls.test.js.map +1 -0
  13. package/dist/__tests__/enter.test.d.ts +2 -0
  14. package/dist/__tests__/enter.test.d.ts.map +1 -0
  15. package/dist/__tests__/enter.test.js +90 -0
  16. package/dist/__tests__/enter.test.js.map +1 -0
  17. package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
  18. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
  19. package/dist/__tests__/host-cp-gh-token.test.js +119 -0
  20. package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
  21. package/dist/__tests__/host-cp.test.d.ts +9 -0
  22. package/dist/__tests__/host-cp.test.d.ts.map +1 -0
  23. package/dist/__tests__/host-cp.test.js +254 -0
  24. package/dist/__tests__/host-cp.test.js.map +1 -0
  25. package/dist/__tests__/keys.test.d.ts +9 -0
  26. package/dist/__tests__/keys.test.d.ts.map +1 -0
  27. package/dist/__tests__/keys.test.js +145 -0
  28. package/dist/__tests__/keys.test.js.map +1 -0
  29. package/dist/__tests__/logs.test.d.ts +9 -0
  30. package/dist/__tests__/logs.test.d.ts.map +1 -0
  31. package/dist/__tests__/logs.test.js +124 -0
  32. package/dist/__tests__/logs.test.js.map +1 -0
  33. package/dist/__tests__/ps.test.d.ts +2 -0
  34. package/dist/__tests__/ps.test.d.ts.map +1 -0
  35. package/dist/__tests__/ps.test.js +172 -0
  36. package/dist/__tests__/ps.test.js.map +1 -0
  37. package/dist/__tests__/status-app-urls.test.d.ts +2 -0
  38. package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
  39. package/dist/__tests__/status-app-urls.test.js +125 -0
  40. package/dist/__tests__/status-app-urls.test.js.map +1 -0
  41. package/dist/__tests__/upgrade.test.d.ts +9 -0
  42. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  43. package/dist/__tests__/upgrade.test.js +262 -0
  44. package/dist/__tests__/upgrade.test.js.map +1 -0
  45. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
  46. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
  47. package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
  48. package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
  49. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
  50. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
  51. package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
  52. package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
  53. package/dist/commands/__tests__/refresh.test.d.ts +13 -0
  54. package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
  55. package/dist/commands/__tests__/refresh.test.js +170 -0
  56. package/dist/commands/__tests__/refresh.test.js.map +1 -0
  57. package/dist/commands/auth-status.d.ts +43 -0
  58. package/dist/commands/auth-status.d.ts.map +1 -0
  59. package/dist/commands/auth-status.js +208 -0
  60. package/dist/commands/auth-status.js.map +1 -0
  61. package/dist/commands/auth-upgrade.d.ts +47 -0
  62. package/dist/commands/auth-upgrade.d.ts.map +1 -0
  63. package/dist/commands/auth-upgrade.js +277 -0
  64. package/dist/commands/auth-upgrade.js.map +1 -0
  65. package/dist/commands/auth.d.ts +16 -0
  66. package/dist/commands/auth.d.ts.map +1 -0
  67. package/dist/commands/auth.js +283 -0
  68. package/dist/commands/auth.js.map +1 -0
  69. package/dist/commands/create.d.ts +8 -0
  70. package/dist/commands/create.d.ts.map +1 -0
  71. package/dist/commands/create.js +512 -0
  72. package/dist/commands/create.js.map +1 -0
  73. package/dist/commands/crystallize.d.ts +8 -0
  74. package/dist/commands/crystallize.d.ts.map +1 -0
  75. package/dist/commands/crystallize.js +101 -0
  76. package/dist/commands/crystallize.js.map +1 -0
  77. package/dist/commands/destroy.d.ts +6 -0
  78. package/dist/commands/destroy.d.ts.map +1 -0
  79. package/dist/commands/destroy.js +54 -0
  80. package/dist/commands/destroy.js.map +1 -0
  81. package/dist/commands/dispatch.d.ts +9 -0
  82. package/dist/commands/dispatch.d.ts.map +1 -0
  83. package/dist/commands/dispatch.js +94 -0
  84. package/dist/commands/dispatch.js.map +1 -0
  85. package/dist/commands/enter.d.ts +63 -0
  86. package/dist/commands/enter.d.ts.map +1 -0
  87. package/dist/commands/enter.js +206 -0
  88. package/dist/commands/enter.js.map +1 -0
  89. package/dist/commands/host-cp.d.ts +191 -0
  90. package/dist/commands/host-cp.d.ts.map +1 -0
  91. package/dist/commands/host-cp.js +797 -0
  92. package/dist/commands/host-cp.js.map +1 -0
  93. package/dist/commands/init.d.ts +9 -0
  94. package/dist/commands/init.d.ts.map +1 -0
  95. package/dist/commands/init.js +143 -0
  96. package/dist/commands/init.js.map +1 -0
  97. package/dist/commands/install.d.ts +22 -0
  98. package/dist/commands/install.d.ts.map +1 -0
  99. package/dist/commands/install.js +203 -0
  100. package/dist/commands/install.js.map +1 -0
  101. package/dist/commands/keys.d.ts +26 -0
  102. package/dist/commands/keys.d.ts.map +1 -0
  103. package/dist/commands/keys.js +151 -0
  104. package/dist/commands/keys.js.map +1 -0
  105. package/dist/commands/lanes.d.ts +18 -0
  106. package/dist/commands/lanes.d.ts.map +1 -0
  107. package/dist/commands/lanes.js +122 -0
  108. package/dist/commands/lanes.js.map +1 -0
  109. package/dist/commands/list.d.ts +6 -0
  110. package/dist/commands/list.d.ts.map +1 -0
  111. package/dist/commands/list.js +39 -0
  112. package/dist/commands/list.js.map +1 -0
  113. package/dist/commands/logs.d.ts +38 -0
  114. package/dist/commands/logs.d.ts.map +1 -0
  115. package/dist/commands/logs.js +177 -0
  116. package/dist/commands/logs.js.map +1 -0
  117. package/dist/commands/observe.d.ts +9 -0
  118. package/dist/commands/observe.d.ts.map +1 -0
  119. package/dist/commands/observe.js +34 -0
  120. package/dist/commands/observe.js.map +1 -0
  121. package/dist/commands/policy-check.d.ts +14 -0
  122. package/dist/commands/policy-check.d.ts.map +1 -0
  123. package/dist/commands/policy-check.js +76 -0
  124. package/dist/commands/policy-check.js.map +1 -0
  125. package/dist/commands/pr.d.ts +17 -0
  126. package/dist/commands/pr.d.ts.map +1 -0
  127. package/dist/commands/pr.js +148 -0
  128. package/dist/commands/pr.js.map +1 -0
  129. package/dist/commands/ps.d.ts +25 -0
  130. package/dist/commands/ps.d.ts.map +1 -0
  131. package/dist/commands/ps.js +164 -0
  132. package/dist/commands/ps.js.map +1 -0
  133. package/dist/commands/refresh-helpers.d.ts +25 -0
  134. package/dist/commands/refresh-helpers.d.ts.map +1 -0
  135. package/dist/commands/refresh-helpers.js +56 -0
  136. package/dist/commands/refresh-helpers.js.map +1 -0
  137. package/dist/commands/refresh.d.ts +23 -0
  138. package/dist/commands/refresh.d.ts.map +1 -0
  139. package/dist/commands/refresh.js +237 -0
  140. package/dist/commands/refresh.js.map +1 -0
  141. package/dist/commands/status.d.ts +6 -0
  142. package/dist/commands/status.d.ts.map +1 -0
  143. package/dist/commands/status.js +51 -0
  144. package/dist/commands/status.js.map +1 -0
  145. package/dist/commands/upgrade.d.ts +67 -0
  146. package/dist/commands/upgrade.d.ts.map +1 -0
  147. package/dist/commands/upgrade.js +358 -0
  148. package/dist/commands/upgrade.js.map +1 -0
  149. package/dist/commands/workspace.d.ts +23 -0
  150. package/dist/commands/workspace.d.ts.map +1 -0
  151. package/dist/commands/workspace.js +198 -0
  152. package/dist/commands/workspace.js.map +1 -0
  153. package/dist/commands/world-snapshot.d.ts +18 -0
  154. package/dist/commands/world-snapshot.d.ts.map +1 -0
  155. package/dist/commands/world-snapshot.js +327 -0
  156. package/dist/commands/world-snapshot.js.map +1 -0
  157. package/dist/context.d.ts +26 -0
  158. package/dist/context.d.ts.map +1 -0
  159. package/dist/context.js +51 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/index.d.ts +9 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +18007 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/mcp-server.js +32236 -0
  166. package/dist/output.d.ts +10 -0
  167. package/dist/output.d.ts.map +1 -0
  168. package/dist/output.js +31 -0
  169. package/dist/output.js.map +1 -0
  170. package/host-cp/compose.yaml +126 -0
  171. package/host-cp/src/auth-secret-hint.mjs +45 -0
  172. package/host-cp/src/auth.mjs +155 -0
  173. package/host-cp/src/compose-worlds-sources.mjs +170 -0
  174. package/host-cp/src/container-secret-fetcher.mjs +163 -0
  175. package/host-cp/src/docker-events.mjs +184 -0
  176. package/host-cp/src/local-worlds-source.mjs +83 -0
  177. package/host-cp/src/plan-orchestrator.mjs +829 -0
  178. package/host-cp/src/plan-progress.mjs +282 -0
  179. package/host-cp/src/pr-cache.mjs +201 -0
  180. package/host-cp/src/pr-merge-poller.mjs +154 -0
  181. package/host-cp/src/process-poller.mjs +250 -0
  182. package/host-cp/src/proxy.mjs +245 -0
  183. package/host-cp/src/pylon-worlds-source.mjs +68 -0
  184. package/host-cp/src/redact.mjs +67 -0
  185. package/host-cp/src/secret-cache.mjs +104 -0
  186. package/host-cp/src/server.mjs +2215 -0
  187. package/host-cp/src/sse-gate.mjs +117 -0
  188. package/host-cp/src/version-status.mjs +209 -0
  189. package/host-cp/src/workspace-catalog.mjs +149 -0
  190. package/host-cp/src/world-names-store.mjs +176 -0
  191. package/host-cp/src/world-pr-state.mjs +97 -0
  192. package/host-cp/src/world-progress.mjs +322 -0
  193. package/host-cp/src/world-tunnel-manager.mjs +288 -0
  194. package/host-cp/src/worlds-db-source.mjs +191 -0
  195. package/host-cp/src/worlds-source.mjs +59 -0
  196. package/package.json +38 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * `olam auth upgrade` — rebuild the olam-auth image and force-recreate the container.
3
+ *
4
+ * Steps:
5
+ * bash build-auth.sh (rebuilds olam-auth:local with latest source + git SHA)
6
+ * docker stop olam-auth + docker rm olam-auth
7
+ * olam auth up logic (docker run with correct env vars via AuthContainerController)
8
+ * wait for /health
9
+ * smoke test: POST /credentials/add provider=codex must NOT return a Claude URL
10
+ */
11
+ import * as fs from 'node:fs';
12
+ import * as path from 'node:path';
13
+ import { spawnSync } from 'node:child_process';
14
+ import pc from 'picocolors';
15
+ import { printError, printSuccess, printInfo, printWarning } from '../output.js';
16
+ import { readAuthSecret } from './host-cp.js';
17
+ import { AuthContainerController } from '@olam/core/src/auth/index.js';
18
+ const AUTH_PORT = 9999;
19
+ const AUTH_HEALTH_URL = `http://127.0.0.1:${AUTH_PORT}/health`;
20
+ const AUTH_ADD_URL = `http://127.0.0.1:${AUTH_PORT}/credentials/add`;
21
+ /** Normalise raw Commander option object into typed opts. */
22
+ export function parseAuthUpgradeOpts(raw) {
23
+ return {
24
+ yes: raw.yes === true,
25
+ skipRecreate: raw.skipRecreate === true,
26
+ };
27
+ }
28
+ /**
29
+ * Check cwd looks like the olam repo root for auth-service.
30
+ * Verifies packages/auth-service/Dockerfile exists.
31
+ */
32
+ export function validateAuthRepoRoot(cwd) {
33
+ const marker = path.join(cwd, 'packages/auth-service/Dockerfile');
34
+ if (!fs.existsSync(marker)) {
35
+ return {
36
+ ok: false,
37
+ error: `Not an olam repo root (expected ${marker}).\n` +
38
+ 'Run `olam auth upgrade` from the root of your olam checkout.',
39
+ };
40
+ }
41
+ return { ok: true };
42
+ }
43
+ /** Block until auth service /health responds OK or timeout expires. */
44
+ export async function waitForAuthHealth(timeoutMs = 10_000) {
45
+ const deadline = Date.now() + timeoutMs;
46
+ while (Date.now() < deadline) {
47
+ try {
48
+ const res = await fetch(AUTH_HEALTH_URL, {
49
+ signal: AbortSignal.timeout(2000),
50
+ });
51
+ if (res.ok)
52
+ return true;
53
+ }
54
+ catch {
55
+ // not up yet
56
+ }
57
+ await new Promise((r) => setTimeout(r, 500));
58
+ }
59
+ return false;
60
+ }
61
+ /**
62
+ * Smoke test: POST /credentials/add with provider=codex.
63
+ *
64
+ * Passes when the response does NOT contain a claude.com/claude.ai loginUrl.
65
+ * A stale (pre-codex) image falls through to the Claude PKCE branch and
66
+ * returns a claude.com URL — this gate catches that.
67
+ */
68
+ export async function smokeTestCodexProvider(authSecret) {
69
+ const headers = { 'Content-Type': 'application/json' };
70
+ if (authSecret)
71
+ headers['X-Olam-Secret'] = authSecret;
72
+ let res;
73
+ try {
74
+ res = await fetch(AUTH_ADD_URL, {
75
+ method: 'POST',
76
+ headers,
77
+ body: JSON.stringify({ provider: 'codex', label: '__smoke-test__' }),
78
+ signal: AbortSignal.timeout(5000),
79
+ });
80
+ }
81
+ catch (err) {
82
+ const msg = err instanceof Error ? err.message : 'fetch failed';
83
+ return { ok: false, error: `Smoke test request failed: ${msg}` };
84
+ }
85
+ let body;
86
+ try {
87
+ body = await res.json();
88
+ }
89
+ catch {
90
+ return { ok: false, error: `Smoke test: non-JSON response (status ${res.status})` };
91
+ }
92
+ const b = body;
93
+ // A stale image returns a loginUrl pointing to claude.com.
94
+ const loginUrl = typeof b['loginUrl'] === 'string' ? b['loginUrl'] : '';
95
+ if (/claude\.com|claude\.ai/.test(loginUrl)) {
96
+ return {
97
+ ok: false,
98
+ error: `Smoke test FAILED: provider=codex returned a Claude OAuth URL (${loginUrl}). ` +
99
+ 'The deployed image is stale — Codex branch is missing from /app/dist.',
100
+ };
101
+ }
102
+ // Could be a 502 (OpenAI unreachable in CI) — that's not a stale-image failure.
103
+ // We only fail the smoke test on a Claude URL.
104
+ return { ok: true };
105
+ }
106
+ function runStep(label, cmd, args, opts = {}) {
107
+ const start = Date.now();
108
+ process.stdout.write(` ${pc.dim(label.padEnd(34))}`);
109
+ const result = spawnSync(cmd, [...args], {
110
+ encoding: 'utf-8',
111
+ stdio: ['ignore', 'pipe', 'pipe'],
112
+ cwd: opts.cwd ?? process.cwd(),
113
+ env: { ...process.env, ...(opts.env ?? {}) },
114
+ });
115
+ const durationMs = Date.now() - start;
116
+ const ok = result.status === 0 && result.error === undefined;
117
+ const dur = `${(durationMs / 1000).toFixed(1)}s`;
118
+ process.stdout.write(`${ok ? pc.green('✓') : pc.red('✗')} ${dur}\n`);
119
+ return {
120
+ ok,
121
+ stdout: result.stdout ?? '',
122
+ stderr: result.stderr ?? '',
123
+ durationMs,
124
+ };
125
+ }
126
+ async function confirm(message) {
127
+ if (!process.stdin.isTTY)
128
+ return true;
129
+ const { createInterface } = await import('node:readline');
130
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
131
+ return new Promise((resolve) => {
132
+ rl.question(`${message} [y/N] `, (answer) => {
133
+ rl.close();
134
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
135
+ });
136
+ });
137
+ }
138
+ function printTimings(timings) {
139
+ const total = timings.reduce((s, t) => s + t.durationMs, 0);
140
+ process.stdout.write('\n');
141
+ for (const t of timings) {
142
+ printInfo(t.label, `${(t.durationMs / 1000).toFixed(1)}s`);
143
+ }
144
+ printInfo('total', `${(total / 1000).toFixed(1)}s`);
145
+ }
146
+ // ── Main handler ──────────────────────────────────────────────────
147
+ async function handleAuthUpgrade(opts) {
148
+ const cwd = process.cwd();
149
+ // 1. Verify repo root.
150
+ const rootCheck = validateAuthRepoRoot(cwd);
151
+ if (!rootCheck.ok) {
152
+ printError(rootCheck.error);
153
+ process.exitCode = 1;
154
+ return;
155
+ }
156
+ // 2. Print plan.
157
+ printInfo('olam auth upgrade', '');
158
+ const steps = [
159
+ 'bash build-auth.sh (docker image)',
160
+ 'stop + remove olam-auth container',
161
+ 'docker run olam-auth:local (force-recreate)',
162
+ 'wait for /health',
163
+ 'smoke test: codex provider → OpenAI URL',
164
+ ];
165
+ if (opts.skipRecreate)
166
+ steps.splice(1, 3, '[skipping container recreate]');
167
+ printInfo('Steps', steps.join(', '));
168
+ process.stdout.write('\n');
169
+ // 3. Confirm unless --yes.
170
+ if (!opts.yes) {
171
+ const proceed = await confirm('Proceed?');
172
+ if (!proceed) {
173
+ printInfo('Aborted', 'no changes made');
174
+ return;
175
+ }
176
+ }
177
+ const timings = [];
178
+ // Step a: build the auth image.
179
+ const buildScript = path.join(cwd, 'packages/adapters/src/docker/build-auth.sh');
180
+ const imageResult = runStep('bash build-auth.sh', 'bash', [buildScript], { cwd });
181
+ timings.push({ label: 'docker image build', durationMs: imageResult.durationMs });
182
+ if (!imageResult.ok) {
183
+ printError(`Docker image build failed:\n${imageResult.stderr}`);
184
+ process.exitCode = 1;
185
+ return;
186
+ }
187
+ if (opts.skipRecreate) {
188
+ process.stdout.write('\n');
189
+ printSuccess('Image rebuilt (--skip-recreate: container not touched)');
190
+ printTimings(timings);
191
+ return;
192
+ }
193
+ // Step b: stop the running container (ignore error if not running).
194
+ const stopStart = Date.now();
195
+ process.stdout.write(` ${pc.dim('docker stop olam-auth'.padEnd(34))}`);
196
+ spawnSync('docker', ['stop', 'olam-auth'], {
197
+ encoding: 'utf-8',
198
+ stdio: ['ignore', 'pipe', 'pipe'],
199
+ });
200
+ const stopDurationMs = Date.now() - stopStart;
201
+ process.stdout.write(`${pc.green('✓')} ${(stopDurationMs / 1000).toFixed(1)}s\n`);
202
+ timings.push({ label: 'container stop', durationMs: stopDurationMs });
203
+ // Step c: remove the container so force-recreate with new image is clean.
204
+ const rmStart = Date.now();
205
+ process.stdout.write(` ${pc.dim('docker rm olam-auth'.padEnd(34))}`);
206
+ spawnSync('docker', ['rm', 'olam-auth'], {
207
+ encoding: 'utf-8',
208
+ stdio: ['ignore', 'pipe', 'pipe'],
209
+ });
210
+ const rmDurationMs = Date.now() - rmStart;
211
+ process.stdout.write(`${pc.green('✓')} ${(rmDurationMs / 1000).toFixed(1)}s\n`);
212
+ timings.push({ label: 'container remove', durationMs: rmDurationMs });
213
+ // Step d: start the new container via AuthContainerController (handles secret injection).
214
+ const startStart = Date.now();
215
+ process.stdout.write(` ${pc.dim('docker run olam-auth:local'.padEnd(34))}`);
216
+ try {
217
+ const controller = new AuthContainerController();
218
+ controller.start();
219
+ const startDurationMs = Date.now() - startStart;
220
+ process.stdout.write(`${pc.green('✓')} ${(startDurationMs / 1000).toFixed(1)}s\n`);
221
+ timings.push({ label: 'container start', durationMs: startDurationMs });
222
+ }
223
+ catch (err) {
224
+ const startDurationMs = Date.now() - startStart;
225
+ process.stdout.write(`${pc.red('✗')} ${(startDurationMs / 1000).toFixed(1)}s\n`);
226
+ timings.push({ label: 'container start', durationMs: startDurationMs });
227
+ printError(`Failed to start auth container: ${err instanceof Error ? err.message : String(err)}`);
228
+ process.exitCode = 1;
229
+ return;
230
+ }
231
+ // Step e: wait for /health.
232
+ process.stdout.write(` ${pc.dim('waiting for /health'.padEnd(34))}`);
233
+ const healthStart = Date.now();
234
+ const healthy = await waitForAuthHealth(10_000);
235
+ const healthDurationMs = Date.now() - healthStart;
236
+ const healthDur = `${(healthDurationMs / 1000).toFixed(1)}s`;
237
+ process.stdout.write(`${healthy ? pc.green('✓') : pc.yellow('?')} ${healthDur}\n`);
238
+ timings.push({ label: '/health', durationMs: healthDurationMs });
239
+ if (!healthy) {
240
+ printWarning('Auth service started but /health did not respond within 10s. Check: docker logs olam-auth');
241
+ process.exitCode = 1;
242
+ printTimings(timings);
243
+ return;
244
+ }
245
+ // Step f: smoke test — codex provider must not return a Claude URL.
246
+ process.stdout.write(` ${pc.dim('smoke test: codex provider'.padEnd(34))}`);
247
+ const smokeStart = Date.now();
248
+ const authSecret = readAuthSecret();
249
+ const smoke = await smokeTestCodexProvider(authSecret);
250
+ const smokeDurationMs = Date.now() - smokeStart;
251
+ const smokeDur = `${(smokeDurationMs / 1000).toFixed(1)}s`;
252
+ process.stdout.write(`${smoke.ok ? pc.green('✓') : pc.red('✗')} ${smokeDur}\n`);
253
+ timings.push({ label: 'smoke test', durationMs: smokeDurationMs });
254
+ if (!smoke.ok) {
255
+ printError(smoke.error);
256
+ process.exitCode = 1;
257
+ printTimings(timings);
258
+ return;
259
+ }
260
+ // 4. Summary.
261
+ process.stdout.write('\n');
262
+ printSuccess('Auth upgrade complete');
263
+ printInfo('Next', 'olam auth login --label primary (if needed)');
264
+ printTimings(timings);
265
+ }
266
+ // ── Register ──────────────────────────────────────────────────────
267
+ export function registerAuthUpgrade(auth) {
268
+ auth
269
+ .command('upgrade')
270
+ .description('Rebuild the olam-auth image and force-recreate the container')
271
+ .option('-y, --yes', 'Skip the confirmation prompt')
272
+ .option('--skip-recreate', 'Build the image only; skip container stop/rm/start')
273
+ .action(async (opts) => {
274
+ await handleAuthUpgrade(parseAuthUpgradeOpts(opts));
275
+ });
276
+ }
277
+ //# sourceMappingURL=auth-upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-upgrade.js","sourceRoot":"","sources":["../../src/commands/auth-upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * olam auth — Manage the local auth container (the long-lived Linux container
3
+ * that runs the same OAuth PKCE dance as the Cloudflare Worker and stores
4
+ * Claude tokens in a named docker volume).
5
+ *
6
+ * Subcommands:
7
+ * olam auth up — start the auth container (idempotent)
8
+ * olam auth down — stop the auth container
9
+ * olam auth status — show container state + account summary
10
+ * olam auth login — run PKCE login flow (one-time per host)
11
+ * olam auth logout — remove an account from the container
12
+ * olam auth refresh — force-refresh a token
13
+ */
14
+ import type { Command } from 'commander';
15
+ export declare function registerAuth(program: Command): void;
16
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyCzC,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgPnD"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * olam auth — Manage the local auth container (the long-lived Linux container
3
+ * that runs the same OAuth PKCE dance as the Cloudflare Worker and stores
4
+ * Claude tokens in a named docker volume).
5
+ *
6
+ * Subcommands:
7
+ * olam auth up — start the auth container (idempotent)
8
+ * olam auth down — stop the auth container
9
+ * olam auth status — show container state + account summary
10
+ * olam auth login — run PKCE login flow (one-time per host)
11
+ * olam auth logout — remove an account from the container
12
+ * olam auth refresh — force-refresh a token
13
+ */
14
+ import pc from 'picocolors';
15
+ import { AuthClient, AuthContainerController, runAuthPreflight, } from '@olam/core/src/auth/index.js';
16
+ import { printError, printHeader, printInfo, printSuccess, printWarning } from '../output.js';
17
+ import * as readline from 'node:readline/promises';
18
+ import { spawn } from 'node:child_process';
19
+ import { runAuthStatus } from './auth-status.js';
20
+ import { registerAuthUpgrade } from './auth-upgrade.js';
21
+ /**
22
+ * Best-effort browser opener. Uses the host's native "open URL" command:
23
+ * `open` on macOS, `xdg-open` on Linux, `start` on Windows. Silently
24
+ * no-ops on failure — the URL is still printed for manual copy.
25
+ */
26
+ function openBrowser(url) {
27
+ const cmd = process.platform === 'darwin' ? 'open' :
28
+ process.platform === 'win32' ? 'start' :
29
+ 'xdg-open';
30
+ try {
31
+ const child = spawn(cmd, [url], { detached: true, stdio: 'ignore' });
32
+ child.unref();
33
+ }
34
+ catch {
35
+ // Ignore — caller already printed the URL.
36
+ }
37
+ }
38
+ async function promptLine(question) {
39
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
40
+ try {
41
+ const answer = await rl.question(question);
42
+ return answer.trim();
43
+ }
44
+ finally {
45
+ rl.close();
46
+ }
47
+ }
48
+ export function registerAuth(program) {
49
+ const auth = program
50
+ .command('auth')
51
+ .description('Manage the local Claude auth container');
52
+ auth
53
+ .command('up')
54
+ .description('Start the auth container (idempotent)')
55
+ .action(async () => {
56
+ const controller = new AuthContainerController();
57
+ const initial = controller.status();
58
+ if (initial.state === 'running') {
59
+ printSuccess(`Auth container already running on :${initial.port}`);
60
+ return;
61
+ }
62
+ try {
63
+ controller.start();
64
+ }
65
+ catch (err) {
66
+ printError(err instanceof Error ? err.message : 'failed to start');
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ const ready = await controller.waitForReady(15_000);
71
+ if (!ready) {
72
+ printWarning('Container started but /health did not respond within 15s.');
73
+ process.exitCode = 1;
74
+ return;
75
+ }
76
+ printHeader('Auth container up');
77
+ printInfo('Port', String(initial.port));
78
+ printInfo('Volume', 'olam-auth-data');
79
+ console.log(`\n${pc.dim('Next: olam auth login')}`);
80
+ });
81
+ auth
82
+ .command('down')
83
+ .description('Stop the auth container (tokens persist in the volume)')
84
+ .action(() => {
85
+ const controller = new AuthContainerController();
86
+ try {
87
+ controller.stop();
88
+ printSuccess('Auth container stopped.');
89
+ }
90
+ catch (err) {
91
+ printError(err instanceof Error ? err.message : 'failed to stop');
92
+ process.exitCode = 1;
93
+ }
94
+ });
95
+ auth
96
+ .command('status')
97
+ .description('Show credential states from auth-service (same source as `auth list`)')
98
+ .action(async () => {
99
+ await runAuthStatus();
100
+ });
101
+ auth
102
+ .command('list')
103
+ .description('List all stored credentials with state, usage, and rate-limit status')
104
+ .action(async () => {
105
+ const client = new AuthClient();
106
+ const status = await client.status();
107
+ if (!status.reachable) {
108
+ printError('Auth container is not reachable. Run `olam auth up` first.');
109
+ process.exitCode = 1;
110
+ return;
111
+ }
112
+ printHeader(`Credentials (${status.accounts.length})`);
113
+ if (status.accounts.length === 0) {
114
+ console.log(` ${pc.dim('No credentials — run: olam auth login --label primary')}`);
115
+ return;
116
+ }
117
+ const stateColor = (s) => {
118
+ if (s === 'active')
119
+ return pc.green('active');
120
+ if (s === 'cooldown')
121
+ return pc.yellow('cooldown');
122
+ if (s === 'expired')
123
+ return pc.red('expired');
124
+ if (s === 'disabled')
125
+ return pc.dim('disabled');
126
+ return pc.dim(s ?? 'unknown');
127
+ };
128
+ for (const a of status.accounts) {
129
+ const label = a.accountLabel ?? a.id;
130
+ const reqs = a.usage?.requestCount5h ?? 0;
131
+ const last429 = a.usage?.last429At
132
+ ? `last429=${a.usage.last429At}`
133
+ : 'last429=never';
134
+ const reset = a.rateLimitResetsAt ? `resets=${a.rateLimitResetsAt}` : '';
135
+ console.log(` ${pc.bold(label.padEnd(18))} ${stateColor(a.state).padEnd(18)} ` +
136
+ `${pc.dim(`req5h=${reqs}`)} ${pc.dim(`exp=${a.expiresIn}`)} ${pc.dim(last429)} ${pc.yellow(reset)}`);
137
+ }
138
+ });
139
+ auth
140
+ .command('disable')
141
+ .description('Take a credential out of rotation (manual cooldown)')
142
+ .argument('<label>', 'Credential label or id')
143
+ .action(async (label) => {
144
+ const client = new AuthClient();
145
+ try {
146
+ await client.disableAccount(label);
147
+ printSuccess(`Disabled: ${label}`);
148
+ }
149
+ catch (err) {
150
+ printError(err instanceof Error ? err.message : 'failed to disable');
151
+ process.exitCode = 1;
152
+ }
153
+ });
154
+ auth
155
+ .command('enable')
156
+ .description('Re-enable a disabled credential')
157
+ .argument('<label>', 'Credential label or id')
158
+ .action(async (label) => {
159
+ const client = new AuthClient();
160
+ try {
161
+ await client.enableAccount(label);
162
+ printSuccess(`Enabled: ${label}`);
163
+ }
164
+ catch (err) {
165
+ printError(err instanceof Error ? err.message : 'failed to enable');
166
+ process.exitCode = 1;
167
+ }
168
+ });
169
+ auth
170
+ .command('remove')
171
+ .description('Permanently remove a credential (purge tokens)')
172
+ .argument('<label>', 'Credential label or id')
173
+ .action(async (label) => {
174
+ const client = new AuthClient();
175
+ try {
176
+ await client.deleteAccount(label);
177
+ printSuccess(`Removed: ${label}`);
178
+ }
179
+ catch (err) {
180
+ printError(err instanceof Error ? err.message : 'failed to remove');
181
+ process.exitCode = 1;
182
+ }
183
+ });
184
+ auth
185
+ .command('login')
186
+ .description('Run the OAuth PKCE flow to store a Claude account in the auth container')
187
+ .option('--label <label>', 'Account label (e.g. primary, burner-1). Defaults to "primary" for the first account, "burner-N" thereafter.')
188
+ .action(async (opts) => {
189
+ const preflight = await runAuthPreflight({ autoStart: true });
190
+ if (preflight.verdict !== 'ok' && preflight.verdict !== 'no-accounts') {
191
+ printError(preflight.message);
192
+ console.log(` ${pc.dim(preflight.remedy)}`);
193
+ process.exitCode = 1;
194
+ return;
195
+ }
196
+ const client = new AuthClient();
197
+ // Auto-pick a sensible label when the operator didn't supply one.
198
+ // First credential → "primary"; subsequent → "burner-N" with N
199
+ // chosen to dodge any existing label.
200
+ let label = opts.label;
201
+ if (!label) {
202
+ try {
203
+ const existing = await client.status();
204
+ if (existing.accounts.length === 0) {
205
+ label = 'primary';
206
+ }
207
+ else {
208
+ const usedLabels = new Set(existing.accounts.map((a) => a.accountLabel ?? a.id));
209
+ let n = 1;
210
+ while (usedLabels.has(`burner-${n}`))
211
+ n += 1;
212
+ label = `burner-${n}`;
213
+ }
214
+ }
215
+ catch {
216
+ label = 'primary';
217
+ }
218
+ }
219
+ let pending;
220
+ try {
221
+ pending = await client.startLogin(label);
222
+ }
223
+ catch (err) {
224
+ printError(err instanceof Error ? err.message : 'failed to start login');
225
+ process.exitCode = 1;
226
+ return;
227
+ }
228
+ printHeader('Claude OAuth — PKCE flow');
229
+ console.log(`\n ${pc.bold('1.')} Opening Claude in your default browser…`);
230
+ console.log(` ${pc.dim(pending.loginUrl)}`);
231
+ openBrowser(pending.loginUrl);
232
+ console.log(`\n ${pc.bold('2.')} After approving, paste the authorization code from the redirect page.`);
233
+ console.log(` ${pc.dim('(Format: <code>#<state> or just <code>.)')}\n`);
234
+ const raw = await promptLine(`${pc.dim('code:')} `);
235
+ if (!raw) {
236
+ printError('No code provided.');
237
+ process.exitCode = 1;
238
+ return;
239
+ }
240
+ const [codePart, statePart] = raw.includes('#') ? raw.split('#', 2) : [raw, pending.state];
241
+ try {
242
+ const result = await client.completeLogin(statePart, codePart);
243
+ printSuccess(`Account stored: ${result.account} (${result.expiresIn})`);
244
+ console.log(`\n${pc.dim('Next: olam create --name my-world')}`);
245
+ }
246
+ catch (err) {
247
+ printError(err instanceof Error ? err.message : 'token exchange failed');
248
+ process.exitCode = 1;
249
+ }
250
+ });
251
+ auth
252
+ .command('logout')
253
+ .description('Remove an account from the auth container')
254
+ .argument('<account>', 'Account id')
255
+ .action(async (accountId) => {
256
+ const client = new AuthClient();
257
+ try {
258
+ await client.deleteAccount(accountId);
259
+ printSuccess(`Account removed: ${accountId}`);
260
+ }
261
+ catch (err) {
262
+ printError(err instanceof Error ? err.message : 'failed to delete account');
263
+ process.exitCode = 1;
264
+ }
265
+ });
266
+ auth
267
+ .command('refresh')
268
+ .description('Force-refresh an account token')
269
+ .argument('<account>', 'Account id')
270
+ .action(async (accountId) => {
271
+ const client = new AuthClient();
272
+ try {
273
+ const result = await client.refreshAccount(accountId);
274
+ printSuccess(`Refreshed ${result.account} (${result.expiresIn})`);
275
+ }
276
+ catch (err) {
277
+ printError(err instanceof Error ? err.message : 'refresh failed');
278
+ process.exitCode = 1;
279
+ }
280
+ });
281
+ registerAuthUpgrade(auth);
282
+ }
283
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,UAAU,EACV,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;;GAIG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,GAAG,GACP,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACxC,UAAU,CAAC;IACb,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,2CAA2C;IAC7C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,IAAI,GAAG,OAAO;SACjB,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wCAAwC,CAAC,CAAC;IAEzD,IAAI;SACD,OAAO,CAAC,IAAI,CAAC;SACb,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,YAAY,CAAC,sCAAsC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACnE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,YAAY,CAAC,2DAA2D,CAAC,CAAC;YAC1E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,WAAW,CAAC,mBAAmB,CAAC,CAAC;QACjC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,UAAU,GAAG,IAAI,uBAAuB,EAAE,CAAC;QACjD,IAAI,CAAC;YACH,UAAU,CAAC,IAAI,EAAE,CAAC;YAClB,YAAY,CAAC,yBAAyB,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAClE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,uEAAuE,CAAC;SACpF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,aAAa,EAAE,CAAC;IACxB,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,sEAAsE,CAAC;SACnF,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACtB,UAAU,CAAC,4DAA4D,CAAC,CAAC;YACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,WAAW,CAAC,gBAAgB,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,uDAAuD,CAAC,EAAE,CAAC,CAAC;YACpF,OAAO;QACT,CAAC;QACD,MAAM,UAAU,GAAG,CAAC,CAAU,EAAU,EAAE;YACxC,IAAI,CAAC,KAAK,QAAQ;gBAAE,OAAO,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,UAAU;gBAAE,OAAO,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnD,IAAI,CAAC,KAAK,SAAS;gBAAE,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,UAAU;gBAAE,OAAO,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;QAChC,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,cAAc,IAAI,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS;gBAChC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE;gBAChC,CAAC,CAAC,eAAe,CAAC;YACpB,MAAM,KAAK,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,OAAO,CAAC,GAAG,CACT,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;gBACjE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACvG,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qDAAqD,CAAC;SAClE,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YACnC,YAAY,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClC,YAAY,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,gDAAgD,CAAC;SAC7D,QAAQ,CAAC,SAAS,EAAE,wBAAwB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClC,YAAY,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,iBAAiB,EAAE,6GAA6G,CAAC;SACxI,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI,IAAI,SAAS,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;YACtE,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAEhC,kEAAkE;QAClE,+DAA+D;QAC/D,sCAAsC;QACtC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACnC,KAAK,GAAG,SAAS,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,CACrD,CAAC;oBACF,IAAI,CAAC,GAAG,CAAC,CAAC;oBACV,OAAO,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;wBAAE,CAAC,IAAI,CAAC,CAAC;oBAC7C,KAAK,GAAG,UAAU,CAAC,EAAE,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,GAAG,SAAS,CAAC;YACpB,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;YACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,WAAW,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAChD,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAC;QAC1G,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,0CAA0C,CAAC,IAAI,CAAC,CAAC;QAE5E,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,UAAU,CAAC,mBAAmB,CAAC,CAAC;YAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAqB,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAE/G,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC/D,YAAY,CAAC,mBAAmB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;YACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2CAA2C,CAAC;SACxD,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;YACtC,YAAY,CAAC,oBAAoB,SAAS,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC;YAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;SACnC,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YACtD,YAAY,CAAC,aAAa,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,UAAU,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;YAClE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,mBAAmB,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * olam create — Provision a new isolated development world.
3
+ *
4
+ * Delegates to WorldManager.createWorld, same as the MCP server tool.
5
+ */
6
+ import type { Command } from 'commander';
7
+ export declare function registerCreate(program: Command): void;
8
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuCzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6ZrD"}