@hyper3d/cli 0.0.1 → 0.1.0-beta.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +167 -4
- package/dist/account.d.ts +26 -0
- package/dist/account.js +136 -0
- package/dist/account.js.map +1 -0
- package/dist/auth.d.ts +63 -0
- package/dist/auth.js +316 -0
- package/dist/auth.js.map +1 -0
- package/dist/base_schema.json +599 -0
- package/dist/endpoints.d.ts +15 -0
- package/dist/endpoints.js +29 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +106 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +99 -0
- package/dist/mcp.js +116 -0
- package/dist/mcp.js.map +1 -0
- package/dist/operations.d.ts +12 -0
- package/dist/operations.js +139 -0
- package/dist/operations.js.map +1 -0
- package/dist/output.d.ts +5 -0
- package/dist/output.js +123 -0
- package/dist/output.js.map +1 -0
- package/dist/schema.d.ts +10 -0
- package/dist/schema.js +33 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +22 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/update.d.ts +26 -0
- package/dist/update.js +151 -0
- package/dist/update.js.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.js +9 -0
- package/dist/utils.js.map +1 -0
- package/package.json +25 -5
package/dist/auth.js
ADDED
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
3
|
+
import { mkdir, readFile, writeFile, rename, rm } from 'node:fs/promises';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { setTimeout as sleep } from 'node:timers/promises';
|
|
6
|
+
import { promisify } from 'node:util';
|
|
7
|
+
import { discoverOAuthProtectedResourceMetadata, discoverAuthorizationServerMetadata, selectResourceURL, } from '@modelcontextprotocol/sdk/client/auth.js';
|
|
8
|
+
import { OAuthTokensSchema } from '@modelcontextprotocol/sdk/shared/auth.js';
|
|
9
|
+
import { secureUrl } from './endpoints.js';
|
|
10
|
+
import { getConfigDir } from './utils.js';
|
|
11
|
+
export const DEVICE_GRANT_TYPE = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
12
|
+
export const CLI_CLIENT_ID = 'https://hyper3d.ai/oauth_cimd/cli.json';
|
|
13
|
+
export const CLI_SCOPES = 'rodin:generate rodin:read account:read offline_access';
|
|
14
|
+
export function clientMetadata() {
|
|
15
|
+
return {
|
|
16
|
+
client_id: CLI_CLIENT_ID,
|
|
17
|
+
client_name: 'Hyper3D CLI',
|
|
18
|
+
client_uri: 'https://github.com/DeemosTech/hyper3d-cli',
|
|
19
|
+
application_type: 'native',
|
|
20
|
+
redirect_uris: [],
|
|
21
|
+
grant_types: [DEVICE_GRANT_TYPE, 'refresh_token'],
|
|
22
|
+
response_types: [],
|
|
23
|
+
token_endpoint_auth_method: 'none',
|
|
24
|
+
scope: CLI_SCOPES,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function credentialPath(endpoint) {
|
|
28
|
+
const key = createHash('sha256').update(new URL(endpoint).href).digest('hex');
|
|
29
|
+
return join(getConfigDir(), `${key}.json`);
|
|
30
|
+
}
|
|
31
|
+
export async function loadCredentials(endpoint) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.parse(await readFile(credentialPath(endpoint), 'utf8'));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (error.code === 'ENOENT')
|
|
37
|
+
return {};
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function saveCredentials(endpoint, data) {
|
|
42
|
+
const path = credentialPath(endpoint);
|
|
43
|
+
await mkdir(join(path, '..'), { recursive: true, mode: 0o700 });
|
|
44
|
+
const temporary = `${path}.${randomBytes(8).toString('hex')}.tmp`;
|
|
45
|
+
try {
|
|
46
|
+
await writeFile(temporary, `${JSON.stringify(data)}\n`, {
|
|
47
|
+
mode: 0o600,
|
|
48
|
+
flag: 'wx',
|
|
49
|
+
});
|
|
50
|
+
await rename(temporary, path);
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
await rm(temporary, { force: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export async function logout(endpoint) {
|
|
57
|
+
await rm(credentialPath(endpoint), { force: true });
|
|
58
|
+
}
|
|
59
|
+
export function createProvider(endpoint, data) {
|
|
60
|
+
if (data.clientId && data.clientId !== CLI_CLIENT_ID)
|
|
61
|
+
throw new Error('Stored credentials belong to a different client. Run hyper3d auth login again.');
|
|
62
|
+
data = { ...data, clientId: CLI_CLIENT_ID };
|
|
63
|
+
const metadata = clientMetadata();
|
|
64
|
+
return {
|
|
65
|
+
redirectUrl: undefined,
|
|
66
|
+
saveCodeVerifier: async () => {
|
|
67
|
+
throw new Error('Use Device Flow via hyper3d auth login.');
|
|
68
|
+
},
|
|
69
|
+
codeVerifier: async () => {
|
|
70
|
+
throw new Error('Use Device Flow via hyper3d auth login.');
|
|
71
|
+
},
|
|
72
|
+
clientMetadataUrl: CLI_CLIENT_ID,
|
|
73
|
+
get clientMetadata() {
|
|
74
|
+
return Object.fromEntries(Object.entries(metadata).filter(([key]) => key !== 'client_id'));
|
|
75
|
+
},
|
|
76
|
+
clientInformation: () => ({ client_id: CLI_CLIENT_ID }),
|
|
77
|
+
tokens: () => data.tokens,
|
|
78
|
+
saveTokens: async (tokens) => {
|
|
79
|
+
data.tokens = {
|
|
80
|
+
...tokens,
|
|
81
|
+
refresh_token: tokens.refresh_token ?? data.tokens?.refresh_token,
|
|
82
|
+
};
|
|
83
|
+
data.expiresAt = tokens.expires_in
|
|
84
|
+
? Date.now() + tokens.expires_in * 1000
|
|
85
|
+
: undefined;
|
|
86
|
+
await saveCredentials(endpoint, data);
|
|
87
|
+
},
|
|
88
|
+
prepareTokenRequest: () => {
|
|
89
|
+
if (!data.tokens?.refresh_token)
|
|
90
|
+
throw new Error('Authentication expired. Run hyper3d auth login.');
|
|
91
|
+
return new URLSearchParams({
|
|
92
|
+
grant_type: 'refresh_token',
|
|
93
|
+
refresh_token: data.tokens.refresh_token,
|
|
94
|
+
});
|
|
95
|
+
},
|
|
96
|
+
redirectToAuthorization: () => {
|
|
97
|
+
throw new Error('Run hyper3d auth login to authorize this device.');
|
|
98
|
+
},
|
|
99
|
+
invalidateCredentials: async (scope) => {
|
|
100
|
+
if (scope === 'all' || scope === 'tokens') {
|
|
101
|
+
delete data.tokens;
|
|
102
|
+
delete data.expiresAt;
|
|
103
|
+
await saveCredentials(endpoint, data);
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function openBrowser(url) {
|
|
109
|
+
const command = process.platform === 'darwin'
|
|
110
|
+
? 'open'
|
|
111
|
+
: process.platform === 'win32'
|
|
112
|
+
? 'rundll32.exe'
|
|
113
|
+
: 'xdg-open';
|
|
114
|
+
const args = process.platform === 'win32' ? ['url.dll,FileProtocolHandler', url] : [url];
|
|
115
|
+
await promisify(execFile)(command, args, { timeout: 5000 });
|
|
116
|
+
}
|
|
117
|
+
function oauthFailure(body, status) {
|
|
118
|
+
const messages = {
|
|
119
|
+
access_denied: 'Authorization denied.',
|
|
120
|
+
expired_token: 'Device code expired. Run hyper3d auth login again.',
|
|
121
|
+
invalid_grant: 'Device authorization is invalid or already used. Run hyper3d auth login again.',
|
|
122
|
+
unauthorized_client: 'Device Flow is not enabled for this CLI client.',
|
|
123
|
+
invalid_client: 'The server rejected this CLI. Update Hyper3D CLI or contact support.',
|
|
124
|
+
};
|
|
125
|
+
return new Error(messages[body?.error ?? ''] ?? `OAuth request failed (HTTP ${status}).`);
|
|
126
|
+
}
|
|
127
|
+
async function discoverDeviceFlow(endpoint, provider, request) {
|
|
128
|
+
const resourceMetadata = await discoverOAuthProtectedResourceMetadata(endpoint, undefined, request);
|
|
129
|
+
const issuer = resourceMetadata.authorization_servers?.[0];
|
|
130
|
+
if (!issuer)
|
|
131
|
+
throw new Error('MCP discovery did not advertise an authorization server.');
|
|
132
|
+
secureUrl(issuer);
|
|
133
|
+
// SDK's OIDC schema strips Device Flow extension fields. Preserve the
|
|
134
|
+
// endpoint from the same successful document while retaining SDK validation.
|
|
135
|
+
let deviceAuthorizationEndpoint;
|
|
136
|
+
const metadata = await discoverAuthorizationServerMetadata(issuer, {
|
|
137
|
+
fetchFn: async (input, init) => {
|
|
138
|
+
const response = await request(input, init);
|
|
139
|
+
if (response.ok)
|
|
140
|
+
deviceAuthorizationEndpoint = (await response.clone().json())
|
|
141
|
+
.device_authorization_endpoint;
|
|
142
|
+
return response;
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
if (!metadata || new URL(metadata.issuer).href !== new URL(issuer).href)
|
|
146
|
+
throw new Error('OAuth discovery issuer mismatch.');
|
|
147
|
+
if (typeof deviceAuthorizationEndpoint !== 'string' ||
|
|
148
|
+
!metadata.grant_types_supported?.includes(DEVICE_GRANT_TYPE))
|
|
149
|
+
throw new Error('The server does not advertise Device Flow. Deploy and enable the backend before logging in.');
|
|
150
|
+
if (!metadata.token_endpoint)
|
|
151
|
+
throw new Error('Missing OAuth token endpoint');
|
|
152
|
+
secureUrl(metadata.token_endpoint);
|
|
153
|
+
const resource = String(await selectResourceURL(new URL(endpoint), provider, resourceMetadata));
|
|
154
|
+
return {
|
|
155
|
+
deviceAuthorizationEndpoint,
|
|
156
|
+
tokenEndpoint: metadata.token_endpoint,
|
|
157
|
+
resource,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async function requestDeviceAuthorization(deviceAuthorizationEndpoint, resource, post) {
|
|
161
|
+
const response = await post(deviceAuthorizationEndpoint, {
|
|
162
|
+
client_id: CLI_CLIENT_ID,
|
|
163
|
+
resource,
|
|
164
|
+
scope: CLI_SCOPES,
|
|
165
|
+
});
|
|
166
|
+
const device = await response.json();
|
|
167
|
+
if (!response.ok)
|
|
168
|
+
throw oauthFailure(device, response.status);
|
|
169
|
+
if (typeof device.device_code !== 'string' ||
|
|
170
|
+
!device.device_code ||
|
|
171
|
+
typeof device.user_code !== 'string' ||
|
|
172
|
+
!/^[A-Za-z0-9 -]{1,64}$/.test(device.user_code) ||
|
|
173
|
+
!Number.isSafeInteger(device.expires_in) ||
|
|
174
|
+
device.expires_in <= 0 ||
|
|
175
|
+
device.expires_in > 86400 ||
|
|
176
|
+
(device.interval !== undefined &&
|
|
177
|
+
(!Number.isSafeInteger(device.interval) ||
|
|
178
|
+
device.interval <= 0 ||
|
|
179
|
+
device.interval > 86400)))
|
|
180
|
+
throw new Error('Invalid device authorization response.');
|
|
181
|
+
const verification = secureUrl(device.verification_uri);
|
|
182
|
+
const complete = device.verification_uri_complete
|
|
183
|
+
? secureUrl(device.verification_uri_complete)
|
|
184
|
+
: verification;
|
|
185
|
+
if (complete.origin !== verification.origin)
|
|
186
|
+
throw new Error('Verification URL origin mismatch.');
|
|
187
|
+
return {
|
|
188
|
+
device_code: device.device_code,
|
|
189
|
+
user_code: device.user_code,
|
|
190
|
+
expires_in: device.expires_in,
|
|
191
|
+
interval: device.interval,
|
|
192
|
+
verificationUrl: complete,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
async function pollDeviceTokens(tokenEndpoint, device, post, { active, pollSignal, deadline, wait, now, }) {
|
|
196
|
+
let interval = (device.interval ?? 5) * 1000;
|
|
197
|
+
while (now() < deadline) {
|
|
198
|
+
active.throwIfAborted();
|
|
199
|
+
await wait(Math.min(interval, deadline - now()), undefined, {
|
|
200
|
+
signal: pollSignal,
|
|
201
|
+
});
|
|
202
|
+
if (now() >= deadline)
|
|
203
|
+
break;
|
|
204
|
+
let tokenResponse;
|
|
205
|
+
try {
|
|
206
|
+
tokenResponse = await post(tokenEndpoint, {
|
|
207
|
+
grant_type: DEVICE_GRANT_TYPE,
|
|
208
|
+
client_id: CLI_CLIENT_ID,
|
|
209
|
+
device_code: device.device_code,
|
|
210
|
+
}, pollSignal);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
pollSignal.throwIfAborted();
|
|
214
|
+
if (error.name !== 'TimeoutError' &&
|
|
215
|
+
!(error instanceof TypeError))
|
|
216
|
+
throw error;
|
|
217
|
+
interval = Math.min(interval * 2, device.expires_in * 1000);
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
// Back off when the server is rate-limited or temporarily unavailable.
|
|
221
|
+
if (tokenResponse.status === 429 || tokenResponse.status >= 500) {
|
|
222
|
+
const retry = Number(tokenResponse.headers.get('Retry-After'));
|
|
223
|
+
interval = Math.max(interval + 5000, Number.isFinite(retry) && retry > 0 ? retry * 1000 : 0);
|
|
224
|
+
await tokenResponse.body?.cancel();
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
const tokens = await tokenResponse.json();
|
|
228
|
+
if (tokenResponse.ok) {
|
|
229
|
+
return OAuthTokensSchema.parse(tokens);
|
|
230
|
+
}
|
|
231
|
+
if (tokens.error === 'authorization_pending')
|
|
232
|
+
continue;
|
|
233
|
+
if (tokens.error === 'slow_down') {
|
|
234
|
+
interval += 5000;
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
throw oauthFailure(tokens, tokenResponse.status);
|
|
238
|
+
}
|
|
239
|
+
throw new Error('Device code expired. Run hyper3d auth login again.');
|
|
240
|
+
}
|
|
241
|
+
export async function login(endpoint, { browser = true, fetchFn = fetch, open = openBrowser, write = (text) => process.stderr.write(text), wait = sleep, now = Date.now, signal, } = {}) {
|
|
242
|
+
secureUrl(endpoint);
|
|
243
|
+
const provider = createProvider(endpoint, {});
|
|
244
|
+
// Set up cancellation and time limits for OAuth requests.
|
|
245
|
+
const cancelled = new AbortController();
|
|
246
|
+
const stop = () => cancelled.abort(new Error('Login cancelled'));
|
|
247
|
+
process.once('SIGINT', stop);
|
|
248
|
+
const active = signal
|
|
249
|
+
? AbortSignal.any([signal, cancelled.signal])
|
|
250
|
+
: cancelled.signal;
|
|
251
|
+
// Bound discovery and issuance too, not only the polling phase.
|
|
252
|
+
const setupSignal = AbortSignal.any([active, AbortSignal.timeout(60000)]);
|
|
253
|
+
const request = async (input, init = {}) => {
|
|
254
|
+
secureUrl(input);
|
|
255
|
+
return fetchFn(input, {
|
|
256
|
+
...init,
|
|
257
|
+
redirect: 'error',
|
|
258
|
+
signal: AbortSignal.any([
|
|
259
|
+
init.signal ?? setupSignal,
|
|
260
|
+
AbortSignal.timeout(15000),
|
|
261
|
+
]),
|
|
262
|
+
});
|
|
263
|
+
};
|
|
264
|
+
const post = async (url, fields, requestSignal) => request(url, {
|
|
265
|
+
method: 'POST',
|
|
266
|
+
headers: {
|
|
267
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
268
|
+
Accept: 'application/json',
|
|
269
|
+
},
|
|
270
|
+
body: new URLSearchParams(fields),
|
|
271
|
+
signal: requestSignal,
|
|
272
|
+
});
|
|
273
|
+
try {
|
|
274
|
+
const { deviceAuthorizationEndpoint, tokenEndpoint, resource } = await discoverDeviceFlow(endpoint, provider, request);
|
|
275
|
+
const device = await requestDeviceAuthorization(deviceAuthorizationEndpoint, resource, post);
|
|
276
|
+
// Start the expiry clock before opening the browser for authorization.
|
|
277
|
+
const deadline = now() + device.expires_in * 1000;
|
|
278
|
+
const pollSignal = AbortSignal.any([
|
|
279
|
+
active,
|
|
280
|
+
AbortSignal.timeout(device.expires_in * 1000),
|
|
281
|
+
]);
|
|
282
|
+
write(`Confirm that the browser shows this same code: ${device.user_code}\nOpen this URL on this or another device:\n${device.verificationUrl.href}\n`);
|
|
283
|
+
if (browser) {
|
|
284
|
+
try {
|
|
285
|
+
await open(device.verificationUrl.href);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
write('Could not open a browser. Open the link above manually; login is still waiting.\n');
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// Poll for tokens until authorization succeeds or the device code expires.
|
|
292
|
+
write('Waiting for authorization…\n');
|
|
293
|
+
const tokens = await pollDeviceTokens(tokenEndpoint, device, post, {
|
|
294
|
+
active,
|
|
295
|
+
pollSignal,
|
|
296
|
+
deadline,
|
|
297
|
+
wait,
|
|
298
|
+
now,
|
|
299
|
+
});
|
|
300
|
+
await provider.saveTokens(tokens);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
// Surface cancellation and timeouts as login errors.
|
|
304
|
+
if (active.aborted)
|
|
305
|
+
throw active.reason;
|
|
306
|
+
if (error instanceof Error &&
|
|
307
|
+
(error.name === 'TimeoutError' ||
|
|
308
|
+
error.cause?.name === 'TimeoutError'))
|
|
309
|
+
throw new Error('Login timed out. Run hyper3d auth login again.');
|
|
310
|
+
throw error;
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
process.removeListener('SIGINT', stop);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
|