@amigo-ai/platform-sdk 0.9.3 → 0.11.0
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/core/device-code.js +411 -0
- package/dist/core/device-code.js.map +1 -0
- package/dist/index.cjs +387 -0
- package/dist/index.cjs.map +4 -4
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +387 -0
- package/dist/index.mjs.map +4 -4
- package/dist/types/core/device-code.d.ts +134 -0
- package/dist/types/core/device-code.d.ts.map +1 -0
- package/dist/types/generated/api.d.ts +71 -3
- package/dist/types/generated/api.d.ts.map +1 -1
- package/dist/types/index.d.cts +2 -0
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/resources/functions.d.ts.map +1 -1
- package/dist/types/resources/metrics.d.ts.map +1 -1
- package/dist/types/resources/settings.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 8628 Device Authorization Grant for desktop and CLI apps.
|
|
3
|
+
*
|
|
4
|
+
* Authenticates users via the identity service's device code flow:
|
|
5
|
+
* the app displays a code, the user approves in their browser,
|
|
6
|
+
* and the app receives a workspace-scoped JWT.
|
|
7
|
+
*/
|
|
8
|
+
import { AmigoError, AuthenticationError, NetworkError, RateLimitError } from './errors.js';
|
|
9
|
+
// --- Errors ---
|
|
10
|
+
export class DeviceCodeExpiredError extends AmigoError {
|
|
11
|
+
constructor(message = 'Device code expired. Please restart the login flow.') {
|
|
12
|
+
super(message, { errorCode: 'device_code_expired' });
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class DeviceCodeDeniedError extends AmigoError {
|
|
16
|
+
constructor(message = 'Authorization request was denied.') {
|
|
17
|
+
super(message, { errorCode: 'device_code_denied' });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class RefreshTokenExpiredError extends AuthenticationError {
|
|
21
|
+
constructor(message = 'Refresh token expired. Please log in again.') {
|
|
22
|
+
super(message, { errorCode: 'refresh_token_expired' });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class LoginCancelledError extends AmigoError {
|
|
26
|
+
constructor() {
|
|
27
|
+
super('Login cancelled', { errorCode: 'login_cancelled' });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// --- Identity Client ---
|
|
31
|
+
const DEFAULT_IDENTITY_URL = 'https://identity.platform.amigo.ai';
|
|
32
|
+
async function identityPost(baseUrl, path, body, fetchFn) {
|
|
33
|
+
try {
|
|
34
|
+
// redirect: 'manual' is required because the identity service uses HTTP 300
|
|
35
|
+
// (non-standard) for multi-workspace selection. Without it, fetch follows
|
|
36
|
+
// the redirect automatically and the caller never sees the 300.
|
|
37
|
+
return await fetchFn(`${baseUrl}${path}`, {
|
|
38
|
+
method: 'POST',
|
|
39
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
40
|
+
body: body.toString(),
|
|
41
|
+
redirect: 'manual',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
throw new NetworkError('Network error contacting identity service', err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
async function requestDeviceCode(baseUrl, params, fetchFn) {
|
|
49
|
+
const body = new URLSearchParams();
|
|
50
|
+
if (params.clientDescription)
|
|
51
|
+
body.set('client_description', params.clientDescription);
|
|
52
|
+
if (params.scope)
|
|
53
|
+
body.set('scope', params.scope);
|
|
54
|
+
const res = await identityPost(baseUrl, '/device/code', body, fetchFn);
|
|
55
|
+
if (res.status === 429) {
|
|
56
|
+
const retryAfter = parseInt(res.headers.get('Retry-After') ?? '', 10);
|
|
57
|
+
throw new RateLimitError('Rate limited', { retryAfter: isNaN(retryAfter) ? undefined : retryAfter });
|
|
58
|
+
}
|
|
59
|
+
if (!res.ok) {
|
|
60
|
+
const err = (await res.json().catch(() => ({})));
|
|
61
|
+
throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {
|
|
62
|
+
statusCode: res.status,
|
|
63
|
+
errorCode: err.error,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
return (await res.json());
|
|
67
|
+
}
|
|
68
|
+
async function pollDeviceCode(baseUrl, deviceCode, scope, fetchFn) {
|
|
69
|
+
const body = new URLSearchParams({ grant_type: 'device_code', device_code: deviceCode });
|
|
70
|
+
if (scope)
|
|
71
|
+
body.set('scope', scope);
|
|
72
|
+
const res = await identityPost(baseUrl, '/token', body, fetchFn);
|
|
73
|
+
if (res.status === 300)
|
|
74
|
+
return { type: 'multi_workspace', data: (await res.json()) };
|
|
75
|
+
if (res.status === 200)
|
|
76
|
+
return { type: 'token', data: (await res.json()) };
|
|
77
|
+
if (res.status === 400) {
|
|
78
|
+
const err = (await res.json().catch(() => ({ error: 'unknown' })));
|
|
79
|
+
if (err.error === 'authorization_pending')
|
|
80
|
+
return { type: 'pending' };
|
|
81
|
+
if (err.error === 'slow_down')
|
|
82
|
+
return { type: 'slow_down' };
|
|
83
|
+
throw new AmigoError(err.error_description ?? err.error ?? `Identity error (400)`, {
|
|
84
|
+
statusCode: 400,
|
|
85
|
+
errorCode: err.error,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
throw new AmigoError(`Identity error (${res.status})`, { statusCode: res.status });
|
|
89
|
+
}
|
|
90
|
+
async function doRefreshToken(baseUrl, params, fetchFn) {
|
|
91
|
+
const body = new URLSearchParams({
|
|
92
|
+
grant_type: 'refresh_token',
|
|
93
|
+
refresh_token: params.refreshToken,
|
|
94
|
+
});
|
|
95
|
+
if (params.workspaceId)
|
|
96
|
+
body.set('workspace_id', params.workspaceId);
|
|
97
|
+
if (params.scope)
|
|
98
|
+
body.set('scope', params.scope);
|
|
99
|
+
const res = await identityPost(baseUrl, '/token', body, fetchFn);
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
const err = (await res.json().catch(() => ({})));
|
|
102
|
+
throw new AmigoError(err.error_description ?? `Identity error (${res.status})`, {
|
|
103
|
+
statusCode: res.status,
|
|
104
|
+
errorCode: err.error,
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return (await res.json());
|
|
108
|
+
}
|
|
109
|
+
// --- JWT decode (no verification — server validates) ---
|
|
110
|
+
export function decodeJwtPayload(jwt) {
|
|
111
|
+
try {
|
|
112
|
+
const parts = jwt.split('.');
|
|
113
|
+
if (parts.length !== 3 || !parts[1])
|
|
114
|
+
return null;
|
|
115
|
+
const payload = Buffer.from(parts[1], 'base64url').toString();
|
|
116
|
+
return JSON.parse(payload);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// --- Device Code Login ---
|
|
123
|
+
function sleep(ms, signal) {
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
if (signal?.aborted) {
|
|
126
|
+
reject(new LoginCancelledError());
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const timer = setTimeout(resolve, ms);
|
|
130
|
+
signal?.addEventListener('abort', () => {
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
reject(new LoginCancelledError());
|
|
133
|
+
}, { once: true });
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
function toAuthResult(token, workspaceIdOverride) {
|
|
137
|
+
const claims = decodeJwtPayload(token.access_token);
|
|
138
|
+
const workspaceId = workspaceIdOverride ?? claims?.workspace_id ?? '';
|
|
139
|
+
if (!workspaceId) {
|
|
140
|
+
throw new AmigoError('Token does not contain a workspace_id claim', {
|
|
141
|
+
errorCode: 'missing_workspace',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
accessToken: token.access_token,
|
|
146
|
+
refreshToken: token.refresh_token ?? '',
|
|
147
|
+
workspaceId,
|
|
148
|
+
expiresAt: claims?.exp ?? (token.expires_in ? Math.floor(Date.now() / 1000) + token.expires_in : Math.floor(Date.now() / 1000) + 900),
|
|
149
|
+
scope: token.scope,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
export async function loginWithDeviceCode(options) {
|
|
153
|
+
const baseUrl = (options.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\/+$/, '');
|
|
154
|
+
const fetchFn = options.fetch ?? globalThis.fetch;
|
|
155
|
+
const issuance = await requestDeviceCode(baseUrl, { clientDescription: options.clientDescription, scope: options.scope }, fetchFn);
|
|
156
|
+
await options.onCode(issuance);
|
|
157
|
+
// Poll loop
|
|
158
|
+
let interval = issuance.interval * 1000;
|
|
159
|
+
const deadline = Date.now() + issuance.expires_in * 1000;
|
|
160
|
+
while (Date.now() < deadline) {
|
|
161
|
+
if (options.signal?.aborted)
|
|
162
|
+
throw new LoginCancelledError();
|
|
163
|
+
await sleep(interval, options.signal);
|
|
164
|
+
if (options.signal?.aborted)
|
|
165
|
+
throw new LoginCancelledError();
|
|
166
|
+
options.onStatus?.('polling');
|
|
167
|
+
try {
|
|
168
|
+
const result = await pollDeviceCode(baseUrl, issuance.device_code, options.scope, fetchFn);
|
|
169
|
+
if (result.type === 'pending') {
|
|
170
|
+
options.onStatus?.('authorization_pending');
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
// RFC 8628 §3.5: increase interval by 5 seconds on slow_down
|
|
174
|
+
if (result.type === 'slow_down') {
|
|
175
|
+
interval += 5000;
|
|
176
|
+
options.onStatus?.('slow_down');
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
options.onStatus?.('approved');
|
|
180
|
+
if (result.type === 'token') {
|
|
181
|
+
return toAuthResult(result.data);
|
|
182
|
+
}
|
|
183
|
+
// multi_workspace — ask developer which workspace
|
|
184
|
+
const workspaceId = await options.onWorkspaceRequired(result.data.workspaces);
|
|
185
|
+
if (!result.data.refresh_token) {
|
|
186
|
+
throw new AmigoError('Multi-workspace response missing refresh_token', {
|
|
187
|
+
errorCode: 'server_error',
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const tokenResponse = await doRefreshToken(baseUrl, { refreshToken: result.data.refresh_token, workspaceId, scope: options.scope }, fetchFn);
|
|
191
|
+
return toAuthResult(tokenResponse, workspaceId);
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
if (err instanceof AmigoError && err.errorCode === 'expired_token') {
|
|
195
|
+
options.onStatus?.('expired');
|
|
196
|
+
throw new DeviceCodeExpiredError();
|
|
197
|
+
}
|
|
198
|
+
if (err instanceof AmigoError && err.errorCode === 'access_denied') {
|
|
199
|
+
options.onStatus?.('denied');
|
|
200
|
+
throw new DeviceCodeDeniedError();
|
|
201
|
+
}
|
|
202
|
+
throw err;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
options.onStatus?.('expired');
|
|
206
|
+
throw new DeviceCodeExpiredError();
|
|
207
|
+
}
|
|
208
|
+
// --- Token Manager ---
|
|
209
|
+
const REFRESH_BUFFER_SECONDS = 60;
|
|
210
|
+
export class TokenManager {
|
|
211
|
+
_storage;
|
|
212
|
+
_baseUrl;
|
|
213
|
+
_fetch;
|
|
214
|
+
_cached = null;
|
|
215
|
+
_refreshPromise = null;
|
|
216
|
+
constructor(config = {}) {
|
|
217
|
+
this._storage = config.storage ?? new FileTokenStorage();
|
|
218
|
+
this._baseUrl = (config.identityBaseUrl ?? DEFAULT_IDENTITY_URL).replace(/\/+$/, '');
|
|
219
|
+
this._fetch = config.fetch ?? globalThis.fetch;
|
|
220
|
+
}
|
|
221
|
+
async store(result) {
|
|
222
|
+
const creds = {
|
|
223
|
+
access_token: result.accessToken,
|
|
224
|
+
refresh_token: result.refreshToken,
|
|
225
|
+
workspace_id: result.workspaceId,
|
|
226
|
+
expires_at: result.expiresAt,
|
|
227
|
+
scope: result.scope,
|
|
228
|
+
};
|
|
229
|
+
this._cached = creds;
|
|
230
|
+
await this._storage.save(creds);
|
|
231
|
+
}
|
|
232
|
+
async getAccessToken() {
|
|
233
|
+
const creds = await this._loadCached();
|
|
234
|
+
if (!creds)
|
|
235
|
+
return null;
|
|
236
|
+
if (creds.expires_at - Math.floor(Date.now() / 1000) >= REFRESH_BUFFER_SECONDS) {
|
|
237
|
+
return { token: creds.access_token, workspaceId: creds.workspace_id };
|
|
238
|
+
}
|
|
239
|
+
const refreshed = await this._refresh(creds);
|
|
240
|
+
return { token: refreshed.access_token, workspaceId: refreshed.workspace_id };
|
|
241
|
+
}
|
|
242
|
+
async hasCredentials() {
|
|
243
|
+
return (await this._loadCached()) !== null;
|
|
244
|
+
}
|
|
245
|
+
async clear() {
|
|
246
|
+
this._cached = null;
|
|
247
|
+
this._refreshPromise = null;
|
|
248
|
+
await this._storage.clear();
|
|
249
|
+
}
|
|
250
|
+
async _loadCached() {
|
|
251
|
+
if (this._cached)
|
|
252
|
+
return this._cached;
|
|
253
|
+
const loaded = await this._storage.load();
|
|
254
|
+
if (loaded)
|
|
255
|
+
this._cached = loaded;
|
|
256
|
+
return loaded;
|
|
257
|
+
}
|
|
258
|
+
async _refresh(current) {
|
|
259
|
+
if (this._refreshPromise)
|
|
260
|
+
return this._refreshPromise;
|
|
261
|
+
this._refreshPromise = this._doRefresh(current).finally(() => {
|
|
262
|
+
this._refreshPromise = null;
|
|
263
|
+
});
|
|
264
|
+
return this._refreshPromise;
|
|
265
|
+
}
|
|
266
|
+
async _doRefresh(current) {
|
|
267
|
+
if (!current.refresh_token)
|
|
268
|
+
throw new RefreshTokenExpiredError('No refresh token available');
|
|
269
|
+
try {
|
|
270
|
+
const response = await doRefreshToken(this._baseUrl, { refreshToken: current.refresh_token, workspaceId: current.workspace_id, scope: current.scope }, this._fetch);
|
|
271
|
+
const claims = decodeJwtPayload(response.access_token);
|
|
272
|
+
const refreshed = {
|
|
273
|
+
access_token: response.access_token,
|
|
274
|
+
refresh_token: response.refresh_token ?? current.refresh_token,
|
|
275
|
+
workspace_id: current.workspace_id,
|
|
276
|
+
expires_at: claims?.exp ?? Math.floor(Date.now() / 1000) + response.expires_in,
|
|
277
|
+
scope: response.scope ?? current.scope,
|
|
278
|
+
};
|
|
279
|
+
this._cached = refreshed;
|
|
280
|
+
await this._storage.save(refreshed);
|
|
281
|
+
return refreshed;
|
|
282
|
+
}
|
|
283
|
+
catch (err) {
|
|
284
|
+
if (err instanceof AmigoError && (err.statusCode === 401 || err.errorCode === 'invalid_grant')) {
|
|
285
|
+
await this.clear();
|
|
286
|
+
throw new RefreshTokenExpiredError();
|
|
287
|
+
}
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// --- Token Storage ---
|
|
293
|
+
export class FileTokenStorage {
|
|
294
|
+
_explicitPath;
|
|
295
|
+
_resolvedPath;
|
|
296
|
+
constructor(filePath) {
|
|
297
|
+
this._explicitPath = filePath;
|
|
298
|
+
}
|
|
299
|
+
async _filePath() {
|
|
300
|
+
if (this._explicitPath)
|
|
301
|
+
return this._explicitPath;
|
|
302
|
+
if (this._resolvedPath)
|
|
303
|
+
return this._resolvedPath;
|
|
304
|
+
const os = await import('node:os');
|
|
305
|
+
const path = await import('node:path');
|
|
306
|
+
this._resolvedPath = path.join(os.homedir(), '.amigo', 'credentials.json');
|
|
307
|
+
return this._resolvedPath;
|
|
308
|
+
}
|
|
309
|
+
async load() {
|
|
310
|
+
const fs = await import('node:fs/promises');
|
|
311
|
+
const filePath = await this._filePath();
|
|
312
|
+
try {
|
|
313
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
314
|
+
const data = JSON.parse(raw);
|
|
315
|
+
if (typeof data.access_token === 'string' &&
|
|
316
|
+
typeof data.refresh_token === 'string' &&
|
|
317
|
+
typeof data.workspace_id === 'string' &&
|
|
318
|
+
typeof data.expires_at === 'number') {
|
|
319
|
+
return data;
|
|
320
|
+
}
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT')
|
|
325
|
+
return null;
|
|
326
|
+
throw err;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async save(credentials) {
|
|
330
|
+
const fs = await import('node:fs/promises');
|
|
331
|
+
const path = await import('node:path');
|
|
332
|
+
const filePath = await this._filePath();
|
|
333
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true, mode: 0o700 });
|
|
334
|
+
await fs.writeFile(filePath, JSON.stringify(credentials, null, 2) + '\n', { mode: 0o600 });
|
|
335
|
+
await fs.chmod(filePath, 0o600);
|
|
336
|
+
}
|
|
337
|
+
async clear() {
|
|
338
|
+
const fs = await import('node:fs/promises');
|
|
339
|
+
const filePath = await this._filePath();
|
|
340
|
+
try {
|
|
341
|
+
await fs.unlink(filePath);
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT')
|
|
345
|
+
return;
|
|
346
|
+
throw err;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
export class MemoryTokenStorage {
|
|
351
|
+
_credentials = null;
|
|
352
|
+
async load() {
|
|
353
|
+
return this._credentials;
|
|
354
|
+
}
|
|
355
|
+
async save(credentials) {
|
|
356
|
+
this._credentials = { ...credentials };
|
|
357
|
+
}
|
|
358
|
+
async clear() {
|
|
359
|
+
this._credentials = null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// --- CLI Helpers ---
|
|
363
|
+
export function formatDeviceCodeInstructions(issuance) {
|
|
364
|
+
return [
|
|
365
|
+
'',
|
|
366
|
+
' To sign in, open your browser and visit:',
|
|
367
|
+
'',
|
|
368
|
+
` ${issuance.verification_uri}`,
|
|
369
|
+
'',
|
|
370
|
+
' Then enter this code:',
|
|
371
|
+
'',
|
|
372
|
+
` ${issuance.user_code}`,
|
|
373
|
+
'',
|
|
374
|
+
` This code expires in ${Math.floor(issuance.expires_in / 60)} minutes.`,
|
|
375
|
+
'',
|
|
376
|
+
].join('\n');
|
|
377
|
+
}
|
|
378
|
+
export function formatDeviceCodeLink(issuance) {
|
|
379
|
+
return `\x1b]8;;${issuance.verification_uri_complete}\x07Open browser to approve\x1b]8;;\x07`;
|
|
380
|
+
}
|
|
381
|
+
export async function openBrowser(url) {
|
|
382
|
+
const { spawn } = await import('node:child_process');
|
|
383
|
+
const openers = {
|
|
384
|
+
darwin: { cmd: 'open', args: [url] },
|
|
385
|
+
win32: { cmd: 'cmd', args: ['/c', 'start', '', url] },
|
|
386
|
+
linux: { cmd: 'xdg-open', args: [url] },
|
|
387
|
+
};
|
|
388
|
+
const opener = openers[process.platform];
|
|
389
|
+
if (!opener)
|
|
390
|
+
return false;
|
|
391
|
+
return new Promise((resolve) => {
|
|
392
|
+
// shell: false prevents command injection from malformed URLs
|
|
393
|
+
const child = spawn(opener.cmd, opener.args, { stdio: 'ignore', shell: false, detached: true });
|
|
394
|
+
child.on('error', () => resolve(false));
|
|
395
|
+
child.on('close', (code) => resolve(code === 0));
|
|
396
|
+
child.unref();
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
export function formatWorkspaceList(workspaces) {
|
|
400
|
+
const lines = ['', ' Available workspaces:', ''];
|
|
401
|
+
workspaces.forEach((ws, i) => {
|
|
402
|
+
const name = ws.name ?? ws.workspace_id;
|
|
403
|
+
const role = ws.role ? ` (${ws.role})` : '';
|
|
404
|
+
lines.push(` ${i + 1}. ${name}${role}`);
|
|
405
|
+
if (ws.name)
|
|
406
|
+
lines.push(` ${ws.workspace_id}`);
|
|
407
|
+
});
|
|
408
|
+
lines.push('');
|
|
409
|
+
return lines.join('\n');
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=device-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-code.js","sourceRoot":"","sources":["../../src/core/device-code.ts"],"names":[],"mappings":"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"}
|