oblien 2.0.6 → 2.0.8
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/cli/commands/auth.d.ts.map +1 -1
- package/dist/cli/commands/auth.js +31 -8
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/lifecycle.d.ts.map +1 -1
- package/dist/cli/commands/lifecycle.js +7 -5
- package/dist/cli/commands/lifecycle.js.map +1 -1
- package/dist/cli/commands/scp.d.ts +3 -0
- package/dist/cli/commands/scp.d.ts.map +1 -0
- package/dist/cli/commands/scp.js +126 -0
- package/dist/cli/commands/scp.js.map +1 -0
- package/dist/cli/commands/ssh-util.d.ts +6 -0
- package/dist/cli/commands/ssh-util.d.ts.map +1 -0
- package/dist/cli/commands/ssh-util.js +24 -0
- package/dist/cli/commands/ssh-util.js.map +1 -0
- package/dist/cli/commands/ssh.d.ts.map +1 -1
- package/dist/cli/commands/ssh.js +62 -13
- package/dist/cli/commands/ssh.js.map +1 -1
- package/dist/cli/commands/types.d.ts +1 -0
- package/dist/cli/commands/types.d.ts.map +1 -1
- package/dist/cli/commands/workspaces.d.ts.map +1 -1
- package/dist/cli/commands/workspaces.js +15 -14
- package/dist/cli/commands/workspaces.js.map +1 -1
- package/dist/cli/index.js +8 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/output.d.ts +1 -0
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +5 -0
- package/dist/cli/output.js.map +1 -1
- package/dist/mcp/tools.js +1 -1
- package/dist/mcp/tools.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/resources.d.ts +5 -3
- package/dist/types/resources.d.ts.map +1 -1
- package/dist/types/workspace-resources.d.ts +18 -5
- package/dist/types/workspace-resources.d.ts.map +1 -1
- package/dist/types/workspace.d.ts +56 -9
- package/dist/types/workspace.d.ts.map +1 -1
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +12 -1
- package/dist/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAoM3C,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B5E"}
|
|
@@ -129,21 +129,44 @@ function authLogout() {
|
|
|
129
129
|
printSuccess('Logged out. Credentials removed.');
|
|
130
130
|
}
|
|
131
131
|
// ── Status ──────────────────────────────────────────────────────────
|
|
132
|
-
function authStatus() {
|
|
132
|
+
async function authStatus(flags) {
|
|
133
133
|
const config = loadConfig();
|
|
134
134
|
if (!config?.token && !config?.clientId) {
|
|
135
135
|
console.log('Not logged in.\n\nRun: oblien login');
|
|
136
136
|
return;
|
|
137
137
|
}
|
|
138
|
-
|
|
138
|
+
const base = config.baseUrl ?? flags.baseUrl ?? DEFAULT_BASE;
|
|
139
|
+
// Verify credentials are still valid
|
|
140
|
+
const headers = { 'Content-Type': 'application/json' };
|
|
139
141
|
if (config.token) {
|
|
140
|
-
|
|
142
|
+
headers['Authorization'] = `Bearer ${config.token}`;
|
|
143
|
+
}
|
|
144
|
+
else if (config.clientId && config.clientSecret) {
|
|
145
|
+
headers['X-Client-ID'] = config.clientId;
|
|
146
|
+
headers['X-Client-Secret'] = config.clientSecret;
|
|
147
|
+
}
|
|
148
|
+
try {
|
|
149
|
+
const res = await fetch(`${base}/settings/profile`, { headers });
|
|
150
|
+
const data = await res.json();
|
|
151
|
+
if (data.error || !data.success) {
|
|
152
|
+
printError('Session expired. Run: oblien login');
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const user = data.user;
|
|
156
|
+
console.log(` Logged in as ${user?.name ?? user?.email ?? 'unknown'}`);
|
|
157
|
+
if (user?.email)
|
|
158
|
+
console.log(` Email: ${user.email}`);
|
|
159
|
+
console.log(` Auth: ${config.token ? 'Token' : 'API Key'}`);
|
|
160
|
+
if (config.clientId)
|
|
161
|
+
console.log(` Client ID: ${config.clientId.slice(0, 16)}…`);
|
|
162
|
+
console.log(` Config: ${configPath()}`);
|
|
141
163
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
console.log(`
|
|
164
|
+
catch {
|
|
165
|
+
// Network error — show cached info
|
|
166
|
+
console.log(` Logged in (offline — could not verify)`);
|
|
167
|
+
console.log(` Auth: ${config.token ? 'Token' : 'API Key'}`);
|
|
168
|
+
console.log(` Config: ${configPath()}`);
|
|
145
169
|
}
|
|
146
|
-
console.log(` Config: ${configPath()}`);
|
|
147
170
|
}
|
|
148
171
|
// ── Router ──────────────────────────────────────────────────────────
|
|
149
172
|
export async function authCmd(args, flags) {
|
|
@@ -154,7 +177,7 @@ export async function authCmd(args, flags) {
|
|
|
154
177
|
case 'logout':
|
|
155
178
|
return authLogout();
|
|
156
179
|
case 'status':
|
|
157
|
-
return authStatus();
|
|
180
|
+
return authStatus(flags);
|
|
158
181
|
default:
|
|
159
182
|
console.log(`
|
|
160
183
|
oblien auth - Authenticate with Oblien
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAgCjF"}
|
|
@@ -21,12 +21,14 @@ export async function lifecycleCmd(args, flags) {
|
|
|
21
21
|
oblien lifecycle destroy <ws-id> Destroy workspace
|
|
22
22
|
|
|
23
23
|
Temporary mode flags:
|
|
24
|
-
--ttl <
|
|
25
|
-
--ttl-action <action> stop or remove (default: stop)
|
|
24
|
+
--ttl <duration> Time-to-live (seconds or e.g. "1h", "30m")
|
|
25
|
+
--ttl-action <action> Action on TTL expiry: stop, pause, suspend, or remove (default: stop)
|
|
26
26
|
|
|
27
27
|
Examples:
|
|
28
28
|
oblien lifecycle get ws_abc123
|
|
29
29
|
oblien lifecycle make-temporary ws_abc123 --ttl 3600
|
|
30
|
+
oblien lifecycle make-temporary ws_abc123 --ttl 1h --ttl-action pause
|
|
31
|
+
oblien lifecycle update-ttl ws_abc123 --ttl 2h --ttl-action suspend
|
|
30
32
|
oblien lifecycle make-permanent ws_abc123
|
|
31
33
|
`);
|
|
32
34
|
}
|
|
@@ -50,11 +52,11 @@ async function lcMakeTemporary(id, args, flags) {
|
|
|
50
52
|
const ttl = parseFlag(args, '--ttl');
|
|
51
53
|
const action = parseFlag(args, '--ttl-action');
|
|
52
54
|
if (ttl)
|
|
53
|
-
params.ttl =
|
|
55
|
+
params.ttl = ttl;
|
|
54
56
|
if (action)
|
|
55
57
|
params.ttl_action = action;
|
|
56
58
|
await client.workspaces.lifecycle.makeTemporary(wsId, params);
|
|
57
|
-
printSuccess(`Set ${wsId} to temporary mode${ttl ? ` (TTL: ${ttl}
|
|
59
|
+
printSuccess(`Set ${wsId} to temporary mode${ttl ? ` (TTL: ${ttl})` : ''}`);
|
|
58
60
|
}
|
|
59
61
|
async function lcUpdateTtl(id, args, flags) {
|
|
60
62
|
const wsId = requireId(id, 'update-ttl');
|
|
@@ -63,7 +65,7 @@ async function lcUpdateTtl(id, args, flags) {
|
|
|
63
65
|
const ttl = parseFlag(args, '--ttl');
|
|
64
66
|
const action = parseFlag(args, '--ttl-action');
|
|
65
67
|
if (ttl)
|
|
66
|
-
params.ttl =
|
|
68
|
+
params.ttl = ttl;
|
|
67
69
|
if (action)
|
|
68
70
|
params.ttl_action = action;
|
|
69
71
|
await client.workspaces.lifecycle.updateTtl(wsId, params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG7D,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAc,EAAE,KAAe;IAChE,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAEpB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC,CAAc,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,KAAK,gBAAgB,CAAC,CAAG,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAChE,KAAK,gBAAgB,CAAC,CAAG,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/E,KAAK,YAAY,CAAC,CAAO,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC3E,KAAK,SAAS,CAAC,CAAU,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D;YACE,OAAO,CAAC,GAAG,CAAC
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/cli/commands/lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scp.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/scp.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAM3C,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { buildClient } from '../auth.js';
|
|
2
|
+
import { requireId } from './helpers.js';
|
|
3
|
+
import { spawn } from 'child_process';
|
|
4
|
+
export async function scpCmd(args, flags) {
|
|
5
|
+
const sub = args[0];
|
|
6
|
+
switch (sub) {
|
|
7
|
+
case 'push':
|
|
8
|
+
case 'upload': return scpPush(args[1], args.slice(2), flags);
|
|
9
|
+
case 'pull':
|
|
10
|
+
case 'download': return scpPull(args[1], args.slice(2), flags);
|
|
11
|
+
default:
|
|
12
|
+
console.log(`
|
|
13
|
+
oblien scp - Transfer files via SCP (SSH-based)
|
|
14
|
+
|
|
15
|
+
Works over the SSH bastion — no runtime API needed.
|
|
16
|
+
SSH must be enabled on the workspace. Use "oblien ssh enable <ws>" first,
|
|
17
|
+
or these commands will auto-enable it for you.
|
|
18
|
+
|
|
19
|
+
Usage:
|
|
20
|
+
oblien scp push <ws> <local-paths...> [--dest <remote-dir>]
|
|
21
|
+
oblien scp pull <ws> <remote-paths...> [--dest <local-dir>]
|
|
22
|
+
|
|
23
|
+
Aliases:
|
|
24
|
+
push = upload
|
|
25
|
+
pull = download
|
|
26
|
+
|
|
27
|
+
Examples:
|
|
28
|
+
oblien scp push my-app ./src ./package.json --dest /app
|
|
29
|
+
oblien scp push my-app ./deploy.sh
|
|
30
|
+
oblien scp pull my-app /app/dist --dest ./build
|
|
31
|
+
oblien scp pull my-app /var/log/app.log
|
|
32
|
+
|
|
33
|
+
Notes:
|
|
34
|
+
- Uses SCP over the SSH bastion (ProxyJump).
|
|
35
|
+
- For bulk transfers, "oblien files push/pull" uses the runtime API
|
|
36
|
+
and may be faster for large directory trees.
|
|
37
|
+
- Set your SSH key with "oblien ssh set-key" for passwordless transfers.
|
|
38
|
+
`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Ensure SSH is enabled and return connection info. */
|
|
42
|
+
async function ensureSshConnection(wsId, flags) {
|
|
43
|
+
const client = buildClient(flags);
|
|
44
|
+
let status = await client.workspaces.ssh.status(wsId);
|
|
45
|
+
if (!status.ssh_enabled) {
|
|
46
|
+
console.error('SSH is not enabled. Enabling...');
|
|
47
|
+
const res = await client.workspaces.ssh.enable(wsId);
|
|
48
|
+
const password = res.ssh_password;
|
|
49
|
+
if (password) {
|
|
50
|
+
console.error(`SSH password: ${password}`);
|
|
51
|
+
}
|
|
52
|
+
status = await client.workspaces.ssh.status(wsId);
|
|
53
|
+
}
|
|
54
|
+
if (!status.connection) {
|
|
55
|
+
console.error('SSH is enabled but no connection info available.');
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return status.connection;
|
|
59
|
+
}
|
|
60
|
+
// ── Push: local → workspace ──────────────────────────────────────────
|
|
61
|
+
async function scpPush(wsId, args, flags) {
|
|
62
|
+
const id = requireId(wsId, 'scp push <workspace> <local-paths...>');
|
|
63
|
+
let dest = '/root/';
|
|
64
|
+
const localPaths = [];
|
|
65
|
+
for (let i = 0; i < args.length; i++) {
|
|
66
|
+
if (args[i] === '--dest' && i + 1 < args.length) {
|
|
67
|
+
dest = args[++i];
|
|
68
|
+
}
|
|
69
|
+
else if (!args[i].startsWith('-')) {
|
|
70
|
+
localPaths.push(args[i]);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (localPaths.length === 0) {
|
|
74
|
+
console.error('Usage: oblien scp push <ws> <local-paths...> [--dest <remote-dir>]');
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
const conn = await ensureSshConnection(id, flags);
|
|
78
|
+
// Build: scp -o 'ProxyJump root@bastion' -r <paths...> root@host:<dest>
|
|
79
|
+
const scpArgs = [
|
|
80
|
+
'-o', `ProxyJump ${conn.user}@${conn.bastion}`,
|
|
81
|
+
'-r',
|
|
82
|
+
...localPaths,
|
|
83
|
+
`${conn.user}@${conn.host}:${dest}`,
|
|
84
|
+
];
|
|
85
|
+
console.error(`Uploading ${localPaths.length} path(s) to ${dest}...`);
|
|
86
|
+
runScp(scpArgs);
|
|
87
|
+
}
|
|
88
|
+
// ── Pull: workspace → local ─────────────────────────────────────────
|
|
89
|
+
async function scpPull(wsId, args, flags) {
|
|
90
|
+
const id = requireId(wsId, 'scp pull <workspace> <remote-paths...>');
|
|
91
|
+
let localDest = '.';
|
|
92
|
+
const remotePaths = [];
|
|
93
|
+
for (let i = 0; i < args.length; i++) {
|
|
94
|
+
if (args[i] === '--dest' && i + 1 < args.length) {
|
|
95
|
+
localDest = args[++i];
|
|
96
|
+
}
|
|
97
|
+
else if (!args[i].startsWith('-')) {
|
|
98
|
+
remotePaths.push(args[i]);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (remotePaths.length === 0) {
|
|
102
|
+
console.error('Usage: oblien scp pull <ws> <remote-paths...> [--dest <local-dir>]');
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const conn = await ensureSshConnection(id, flags);
|
|
106
|
+
// Build: scp -o 'ProxyJump root@bastion' -r root@host:<path1> root@host:<path2> <local>
|
|
107
|
+
const remoteArgs = remotePaths.map(p => `${conn.user}@${conn.host}:${p}`);
|
|
108
|
+
const scpArgs = [
|
|
109
|
+
'-o', `ProxyJump ${conn.user}@${conn.bastion}`,
|
|
110
|
+
'-r',
|
|
111
|
+
...remoteArgs,
|
|
112
|
+
localDest,
|
|
113
|
+
];
|
|
114
|
+
console.error(`Downloading ${remotePaths.length} path(s) to ${localDest}...`);
|
|
115
|
+
runScp(scpArgs);
|
|
116
|
+
}
|
|
117
|
+
// ── Helpers ──────────────────────────────────────────────────────────
|
|
118
|
+
function runScp(scpArgs) {
|
|
119
|
+
const child = spawn('scp', scpArgs, { stdio: 'inherit' });
|
|
120
|
+
child.on('close', (code) => process.exit(code ?? 0));
|
|
121
|
+
child.on('error', (err) => {
|
|
122
|
+
console.error(`Failed to start scp: ${err.message}`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=scp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scp.js","sourceRoot":"","sources":["../../../src/cli/commands/scp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remove all known_hosts entries that reference the given host.
|
|
3
|
+
* Matches plain `host`, bracketed `[host]:port`, and comma-separated lists containing the host.
|
|
4
|
+
*/
|
|
5
|
+
export declare function removeKnownHost(host: string): void;
|
|
6
|
+
//# sourceMappingURL=ssh-util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-util.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ssh-util.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBlD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Remove all known_hosts entries that reference the given host.
|
|
6
|
+
* Matches plain `host`, bracketed `[host]:port`, and comma-separated lists containing the host.
|
|
7
|
+
*/
|
|
8
|
+
export function removeKnownHost(host) {
|
|
9
|
+
const knownHostsPath = join(homedir(), '.ssh', 'known_hosts');
|
|
10
|
+
if (!existsSync(knownHostsPath))
|
|
11
|
+
return;
|
|
12
|
+
const lines = readFileSync(knownHostsPath, 'utf-8').split('\n');
|
|
13
|
+
const filtered = lines.filter((line) => {
|
|
14
|
+
const hostField = line.split(/\s/)[0] ?? '';
|
|
15
|
+
// Check each comma-separated host pattern in the first field
|
|
16
|
+
const hosts = hostField.split(',');
|
|
17
|
+
return !hosts.some((h) => h === host || h === `[${host}]` || h.startsWith(`[${host}]:`));
|
|
18
|
+
});
|
|
19
|
+
if (filtered.length !== lines.length) {
|
|
20
|
+
writeFileSync(knownHostsPath, filtered.join('\n'), { mode: 0o600 });
|
|
21
|
+
console.log(`Removed stale SSH fingerprint for ${host} from known_hosts`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ssh-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh-util.js","sourceRoot":"","sources":["../../../src/cli/commands/ssh-util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9D,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO;IAExC,MAAM,KAAK,GAAG,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,6DAA6D;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,IAAI,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QACrC,aAAa,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,qCAAqC,IAAI,mBAAmB,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ssh.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/ssh.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAmB3C,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAqC3E"}
|
package/dist/cli/commands/ssh.js
CHANGED
|
@@ -2,6 +2,18 @@ import { buildClient } from '../auth.js';
|
|
|
2
2
|
import { printResult, printSuccess } from '../output.js';
|
|
3
3
|
import { parseFlag, requireId } from './helpers.js';
|
|
4
4
|
import { spawn } from 'child_process';
|
|
5
|
+
import { removeKnownHost } from './ssh-util.js';
|
|
6
|
+
import { createInterface } from 'node:readline';
|
|
7
|
+
/** Prompt the user for a line of input (promise-based). */
|
|
8
|
+
function prompt(message) {
|
|
9
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
10
|
+
return new Promise((resolve) => {
|
|
11
|
+
rl.question(message, (answer) => {
|
|
12
|
+
rl.close();
|
|
13
|
+
resolve(answer);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
5
17
|
export async function sshCmd(args, flags) {
|
|
6
18
|
const sub = args[0];
|
|
7
19
|
switch (sub) {
|
|
@@ -16,7 +28,7 @@ export async function sshCmd(args, flags) {
|
|
|
16
28
|
oblien ssh - Manage SSH access
|
|
17
29
|
|
|
18
30
|
Usage:
|
|
19
|
-
oblien ssh connect <ws>
|
|
31
|
+
oblien ssh connect <ws> [--passwordless] Connect via SSH
|
|
20
32
|
oblien ssh status <ws> Check SSH status
|
|
21
33
|
oblien ssh enable <ws> Enable SSH
|
|
22
34
|
oblien ssh disable <ws> Disable SSH
|
|
@@ -25,8 +37,13 @@ export async function sshCmd(args, flags) {
|
|
|
25
37
|
|
|
26
38
|
<ws> can be a workspace ID or slug.
|
|
27
39
|
|
|
40
|
+
Flags:
|
|
41
|
+
--passwordless Auto-enable SSH and set a public key if needed, then
|
|
42
|
+
connect without a password prompt.
|
|
43
|
+
|
|
28
44
|
Examples:
|
|
29
45
|
oblien ssh connect my-dev-env
|
|
46
|
+
oblien ssh connect my-dev-env --passwordless
|
|
30
47
|
oblien ssh status ws_abc123
|
|
31
48
|
oblien ssh enable my-api
|
|
32
49
|
oblien ssh set-password ws_abc123 --password mysecret
|
|
@@ -37,32 +54,64 @@ export async function sshCmd(args, flags) {
|
|
|
37
54
|
async function sshConnect(id, flags) {
|
|
38
55
|
const wsId = requireId(id, 'ssh connect <workspace>');
|
|
39
56
|
const client = buildClient(flags);
|
|
40
|
-
|
|
57
|
+
let status = await client.workspaces.ssh.status(wsId);
|
|
58
|
+
// ── Passwordless flow ──────────────────────────────────────────────
|
|
59
|
+
if (flags.passwordless) {
|
|
60
|
+
// Ensure SSH is enabled
|
|
61
|
+
if (!status.ssh_enabled) {
|
|
62
|
+
await client.workspaces.ssh.enable(wsId);
|
|
63
|
+
status = await client.workspaces.ssh.status(wsId);
|
|
64
|
+
}
|
|
65
|
+
// Ensure a public key is authorized
|
|
66
|
+
if (!status.ssh_key_set) {
|
|
67
|
+
console.log('No SSH key set for this workspace.');
|
|
68
|
+
const pubkey = await prompt('Paste your SSH public key: ');
|
|
69
|
+
if (!pubkey.trim()) {
|
|
70
|
+
console.error('No key provided. Aborting.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
await client.workspaces.ssh.setKey(wsId, { public_key: pubkey.trim() });
|
|
74
|
+
console.log('SSH key set. Connecting...');
|
|
75
|
+
status = await client.workspaces.ssh.status(wsId);
|
|
76
|
+
}
|
|
77
|
+
const conn = status.connection;
|
|
78
|
+
if (!conn) {
|
|
79
|
+
console.error('SSH is enabled but no connection info available.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
startSsh(conn);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// ── Normal flow ────────────────────────────────────────────────────
|
|
86
|
+
// Clean stale known_hosts entry when the VM was rebuilt
|
|
87
|
+
if (status.connection?.host) {
|
|
88
|
+
removeKnownHost(status.connection.host);
|
|
89
|
+
}
|
|
41
90
|
if (!status.ssh_enabled) {
|
|
42
91
|
console.log('SSH is not enabled on this workspace. Enabling...');
|
|
43
92
|
const enableRes = await client.workspaces.ssh.enable(wsId);
|
|
44
93
|
const password = enableRes.ssh_password;
|
|
45
94
|
if (password) {
|
|
46
95
|
console.log(`SSH password: ${password}`);
|
|
96
|
+
console.log('Tip: Use "oblien ssh connect <ws> --passwordless" or set your public key for key-based access.');
|
|
47
97
|
}
|
|
48
|
-
|
|
49
|
-
const updated = await client.workspaces.ssh.status(wsId);
|
|
50
|
-
if (!updated.connection) {
|
|
51
|
-
console.error('Failed to get SSH connection info after enabling.');
|
|
52
|
-
process.exit(1);
|
|
53
|
-
}
|
|
54
|
-
startSsh(updated.connection);
|
|
55
|
-
return;
|
|
98
|
+
status = await client.workspaces.ssh.status(wsId);
|
|
56
99
|
}
|
|
57
|
-
|
|
100
|
+
const conn = status.connection;
|
|
101
|
+
if (!conn) {
|
|
58
102
|
console.error('SSH is enabled but no connection info available.');
|
|
59
103
|
process.exit(1);
|
|
60
104
|
}
|
|
61
|
-
startSsh(
|
|
105
|
+
startSsh(conn);
|
|
62
106
|
}
|
|
63
107
|
function startSsh(connection) {
|
|
64
|
-
const parts = connection.command.split(/\s+/);
|
|
108
|
+
const parts = connection.command.split(/\s+/).filter(Boolean);
|
|
65
109
|
const bin = parts[0];
|
|
110
|
+
// Only allow the ssh binary — never execute arbitrary commands from the API
|
|
111
|
+
if (bin !== 'ssh') {
|
|
112
|
+
console.error(`Unexpected SSH command: ${connection.command}`);
|
|
113
|
+
process.exit(1);
|
|
114
|
+
}
|
|
66
115
|
const sshArgs = parts.slice(1);
|
|
67
116
|
const child = spawn(bin, sshArgs, { stdio: 'inherit' });
|
|
68
117
|
child.on('close', (code) => process.exit(code ?? 0));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../../src/cli/commands/ssh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../../src/cli/commands/ssh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/types.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workspaces.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/workspaces.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA+DlF"}
|
|
@@ -49,13 +49,14 @@ export async function workspacesCmd(args, flags) {
|
|
|
49
49
|
--name <name> Workspace name
|
|
50
50
|
--cpus <n> CPU cores
|
|
51
51
|
--memory <mb> Memory in MB
|
|
52
|
-
--disk <mb>
|
|
52
|
+
--disk <mb> Writable disk in MB
|
|
53
53
|
--mode <mode> permanent or temporary
|
|
54
54
|
--namespace <ns> Namespace
|
|
55
|
-
--
|
|
55
|
+
--ssh Enable SSH access on creation
|
|
56
56
|
|
|
57
57
|
Examples:
|
|
58
58
|
oblien ws create --image node-20 --name my-app --cpus 2 --memory 2048
|
|
59
|
+
oblien ws create --image ubuntu --name dev --ssh
|
|
59
60
|
oblien ws list --status running --limit 10
|
|
60
61
|
oblien ws start ws_abc123
|
|
61
62
|
oblien ws stop ws_abc123
|
|
@@ -74,7 +75,7 @@ async function wsCreate(args, flags) {
|
|
|
74
75
|
const disk = parseFlag(args, '--disk');
|
|
75
76
|
const mode = parseFlag(args, '--mode');
|
|
76
77
|
const namespace = parseFlag(args, '--namespace');
|
|
77
|
-
const
|
|
78
|
+
const sshAccess = args.includes('--ssh');
|
|
78
79
|
if (image)
|
|
79
80
|
params.image = image;
|
|
80
81
|
if (name)
|
|
@@ -83,15 +84,14 @@ async function wsCreate(args, flags) {
|
|
|
83
84
|
params.mode = mode;
|
|
84
85
|
if (namespace)
|
|
85
86
|
params.namespace = namespace;
|
|
86
|
-
if (
|
|
87
|
-
params.
|
|
88
|
-
if (
|
|
89
|
-
params.
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
};
|
|
94
|
-
}
|
|
87
|
+
if (cpus)
|
|
88
|
+
params.cpus = Number(cpus);
|
|
89
|
+
if (memory)
|
|
90
|
+
params.memory_mb = Number(memory);
|
|
91
|
+
if (disk)
|
|
92
|
+
params.disk_size_mb = Number(disk);
|
|
93
|
+
if (sshAccess)
|
|
94
|
+
params.config = { ...(params.config || {}), ssh_access: true };
|
|
95
95
|
const ws = await client.workspaces.create(params);
|
|
96
96
|
printResult(ws, flags.json);
|
|
97
97
|
}
|
|
@@ -116,10 +116,11 @@ async function wsList(args, flags) {
|
|
|
116
116
|
id: w.id,
|
|
117
117
|
name: w.name ?? '-',
|
|
118
118
|
status: w.status,
|
|
119
|
+
mode: w.mode ?? '-',
|
|
119
120
|
image: w.image,
|
|
120
121
|
created: w.created_at?.slice(0, 10) ?? '-',
|
|
121
122
|
}));
|
|
122
|
-
printTable(rows, ['id', 'name', 'status', 'image', 'created']);
|
|
123
|
+
printTable(rows, ['id', 'name', 'status', 'mode', 'image', 'created']);
|
|
123
124
|
console.log(`\n${res.total} workspace(s) total`);
|
|
124
125
|
}
|
|
125
126
|
}
|
|
@@ -236,7 +237,7 @@ async function wsResources(id, args, flags) {
|
|
|
236
237
|
if (memory)
|
|
237
238
|
params.memory_mb = Number(memory);
|
|
238
239
|
if (disk)
|
|
239
|
-
params.
|
|
240
|
+
params.disk_size_mb = Number(disk);
|
|
240
241
|
const method = patch ? 'patch' : 'update';
|
|
241
242
|
const res = await client.workspaces.resources[method](wsId, params);
|
|
242
243
|
printResult(res, flags.json);
|