@agentage/cli 0.1.2 → 0.1.6
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 +244 -48
- package/dist/cli.js +15 -0
- package/dist/cli.js.map +1 -1
- package/dist/cli.test.js +20 -12
- package/dist/cli.test.js.map +1 -1
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +21 -11
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/init.test.js +28 -23
- package/dist/commands/init.test.js.map +1 -1
- package/dist/commands/login.d.ts +2 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +67 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/login.test.d.ts +2 -0
- package/dist/commands/login.test.d.ts.map +1 -0
- package/dist/commands/login.test.js +157 -0
- package/dist/commands/login.test.js.map +1 -0
- package/dist/commands/logout.d.ts +2 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +29 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logout.test.d.ts +2 -0
- package/dist/commands/logout.test.d.ts.map +1 -0
- package/dist/commands/logout.test.js +49 -0
- package/dist/commands/logout.test.js.map +1 -0
- package/dist/commands/whoami.d.ts +2 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +47 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/whoami.test.d.ts +2 -0
- package/dist/commands/whoami.test.d.ts.map +1 -0
- package/dist/commands/whoami.test.js +96 -0
- package/dist/commands/whoami.test.js.map +1 -0
- package/dist/services/auth.service.d.ts +10 -0
- package/dist/services/auth.service.d.ts.map +1 -0
- package/dist/services/auth.service.js +97 -0
- package/dist/services/auth.service.js.map +1 -0
- package/dist/services/auth.service.test.d.ts +2 -0
- package/dist/services/auth.service.test.d.ts.map +1 -0
- package/dist/services/auth.service.test.js +215 -0
- package/dist/services/auth.service.test.js.map +1 -0
- package/dist/types/config.types.d.ts +159 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +20 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/utils/config.d.ts +10 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +49 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/config.test.d.ts +2 -0
- package/dist/utils/config.test.d.ts.map +1 -0
- package/dist/utils/config.test.js +118 -0
- package/dist/utils/config.test.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { getAuthToken, getRegistryUrl } from '../utils/config.js';
|
|
2
|
+
export class AuthError extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(message, code) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.name = 'AuthError';
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export const requestDeviceCode = async () => {
|
|
11
|
+
const registryUrl = await getRegistryUrl();
|
|
12
|
+
const response = await fetch(`${registryUrl}/api/auth/device/code`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: {
|
|
15
|
+
'Content-Type': 'application/json',
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
const error = (await response.json());
|
|
20
|
+
throw new AuthError(error.error_description || 'Failed to request device code', error.error || 'request_failed');
|
|
21
|
+
}
|
|
22
|
+
return response.json();
|
|
23
|
+
};
|
|
24
|
+
export const pollForToken = async (deviceCode, interval, expiresIn) => {
|
|
25
|
+
const registryUrl = await getRegistryUrl();
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const expiryTime = startTime + expiresIn * 1000;
|
|
28
|
+
let currentInterval = interval;
|
|
29
|
+
while (Date.now() < expiryTime) {
|
|
30
|
+
await sleep(currentInterval * 1000);
|
|
31
|
+
const response = await fetch(`${registryUrl}/api/auth/device/token`, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({ device_code: deviceCode }),
|
|
37
|
+
});
|
|
38
|
+
if (response.ok) {
|
|
39
|
+
return response.json();
|
|
40
|
+
}
|
|
41
|
+
const error = (await response.json());
|
|
42
|
+
switch (error.error) {
|
|
43
|
+
case 'authorization_pending':
|
|
44
|
+
continue;
|
|
45
|
+
case 'slow_down':
|
|
46
|
+
currentInterval += 5;
|
|
47
|
+
continue;
|
|
48
|
+
case 'expired_token':
|
|
49
|
+
throw new AuthError('Login timed out. Please try again.', error.error);
|
|
50
|
+
case 'access_denied':
|
|
51
|
+
throw new AuthError('Authorization was denied.', error.error);
|
|
52
|
+
default:
|
|
53
|
+
throw new AuthError(error.error_description || 'Authentication failed', error.error || 'unknown_error');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
throw new AuthError('Login timed out. Please try again.', 'expired_token');
|
|
57
|
+
};
|
|
58
|
+
export const getMe = async () => {
|
|
59
|
+
const registryUrl = await getRegistryUrl();
|
|
60
|
+
const token = await getAuthToken();
|
|
61
|
+
if (!token) {
|
|
62
|
+
throw new AuthError('Not authenticated', 'not_authenticated');
|
|
63
|
+
}
|
|
64
|
+
const response = await fetch(`${registryUrl}/api/auth/me`, {
|
|
65
|
+
headers: {
|
|
66
|
+
Authorization: `Bearer ${token}`,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
if (response.status === 401) {
|
|
71
|
+
throw new AuthError('Session expired. Please login again.', 'session_expired');
|
|
72
|
+
}
|
|
73
|
+
const error = (await response.json());
|
|
74
|
+
throw new AuthError(error.error_description || 'Failed to get user info', error.error || 'request_failed');
|
|
75
|
+
}
|
|
76
|
+
const data = (await response.json());
|
|
77
|
+
return data.user;
|
|
78
|
+
};
|
|
79
|
+
export const logout = async () => {
|
|
80
|
+
const registryUrl = await getRegistryUrl();
|
|
81
|
+
const token = await getAuthToken();
|
|
82
|
+
if (!token) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
await fetch(`${registryUrl}/api/auth/logout`, {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
Authorization: `Bearer ${token}`,
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
97
|
+
//# sourceMappingURL=auth.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAKlE,MAAM,OAAO,SAAU,SAAQ,KAAK;IACE;IAApC,YAAY,OAAe,EAAS,IAAY;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADmB,SAAI,GAAJ,IAAI,CAAQ;QAE9C,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAKD,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,IAAiC,EAAE;IACvE,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,uBAAuB,EAAE;QAClE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC3D,MAAM,IAAI,SAAS,CACjB,KAAK,CAAC,iBAAiB,IAAI,+BAA+B,EAC1D,KAAK,CAAC,KAAK,IAAI,gBAAgB,CAChC,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAiC,CAAC;AACxD,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,UAAkB,EAClB,QAAgB,EAChB,SAAiB,EACO,EAAE;IAC1B,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC;IAChD,IAAI,eAAe,GAAG,QAAQ,CAAC;IAE/B,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;QAE/B,MAAM,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;QAEpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,wBAAwB,EAAE;YACnE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;SAClD,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,QAAQ,CAAC,IAAI,EAA4B,CAAC;QACnD,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAE3D,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC;YACpB,KAAK,uBAAuB;gBAE1B,SAAS;YACX,KAAK,WAAW;gBAEd,eAAe,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,KAAK,eAAe;gBAClB,MAAM,IAAI,SAAS,CAAC,oCAAoC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACzE,KAAK,eAAe;gBAClB,MAAM,IAAI,SAAS,CAAC,2BAA2B,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAChE;gBACE,MAAM,IAAI,SAAS,CACjB,KAAK,CAAC,iBAAiB,IAAI,uBAAuB,EAClD,KAAK,CAAC,KAAK,IAAI,eAAe,CAC/B,CAAC;QACN,CAAC;IACH,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,oCAAoC,EAAE,eAAe,CAAC,CAAC;AAC7E,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,IAAmB,EAAE;IAC7C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,SAAS,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,cAAc,EAAE;QACzD,OAAO,EAAE;YACP,aAAa,EAAE,UAAU,KAAK,EAAE;SACjC;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CACjB,sCAAsC,EACtC,iBAAiB,CAClB,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;QAC3D,MAAM,IAAI,SAAS,CACjB,KAAK,CAAC,iBAAiB,IAAI,yBAAyB,EACpD,KAAK,CAAC,KAAK,IAAI,gBAAgB,CAChC,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;IACnD,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;IAC9C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAEnC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,WAAW,kBAAkB,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC,CAAC;AAKF,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.test.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import * as configUtils from '../utils/config.js';
|
|
2
|
+
import { AuthError, getMe, logout, pollForToken, requestDeviceCode, } from './auth.service.js';
|
|
3
|
+
jest.mock('../utils/config.js');
|
|
4
|
+
const mockGetRegistryUrl = configUtils.getRegistryUrl;
|
|
5
|
+
const mockGetAuthToken = configUtils.getAuthToken;
|
|
6
|
+
const mockFetch = jest.fn();
|
|
7
|
+
global.fetch = mockFetch;
|
|
8
|
+
describe('auth.service', () => {
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
jest.clearAllMocks();
|
|
11
|
+
mockGetRegistryUrl.mockResolvedValue('https://dev.agentage.io');
|
|
12
|
+
});
|
|
13
|
+
describe('requestDeviceCode', () => {
|
|
14
|
+
it('returns device code response on success', async () => {
|
|
15
|
+
const deviceCodeResponse = {
|
|
16
|
+
device_code: 'abc123',
|
|
17
|
+
user_code: 'ABCD-1234',
|
|
18
|
+
verification_uri: 'https://dev.agentage.io/device',
|
|
19
|
+
expires_in: 900,
|
|
20
|
+
interval: 5,
|
|
21
|
+
};
|
|
22
|
+
mockFetch.mockResolvedValue({
|
|
23
|
+
ok: true,
|
|
24
|
+
json: () => Promise.resolve(deviceCodeResponse),
|
|
25
|
+
});
|
|
26
|
+
const result = await requestDeviceCode();
|
|
27
|
+
expect(result).toEqual(deviceCodeResponse);
|
|
28
|
+
expect(mockFetch).toHaveBeenCalledWith('https://dev.agentage.io/api/auth/device/code', {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers: { 'Content-Type': 'application/json' },
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
it('throws AuthError on failure', async () => {
|
|
34
|
+
mockFetch.mockResolvedValue({
|
|
35
|
+
ok: false,
|
|
36
|
+
json: () => Promise.resolve({
|
|
37
|
+
error: 'server_error',
|
|
38
|
+
error_description: 'Something went wrong',
|
|
39
|
+
}),
|
|
40
|
+
});
|
|
41
|
+
await expect(requestDeviceCode()).rejects.toThrow(AuthError);
|
|
42
|
+
await expect(requestDeviceCode()).rejects.toThrow('Something went wrong');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('pollForToken', () => {
|
|
46
|
+
it('returns token on successful authentication', async () => {
|
|
47
|
+
const tokenResponse = {
|
|
48
|
+
access_token: 'token123',
|
|
49
|
+
token_type: 'Bearer',
|
|
50
|
+
user: { id: '1', email: 'test@example.com' },
|
|
51
|
+
};
|
|
52
|
+
mockFetch.mockResolvedValue({
|
|
53
|
+
ok: true,
|
|
54
|
+
json: () => Promise.resolve(tokenResponse),
|
|
55
|
+
});
|
|
56
|
+
const result = await pollForToken('device123', 0.01, 60);
|
|
57
|
+
expect(result).toEqual(tokenResponse);
|
|
58
|
+
expect(mockFetch).toHaveBeenCalledWith('https://dev.agentage.io/api/auth/device/token', expect.objectContaining({
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body: JSON.stringify({ device_code: 'device123' }),
|
|
61
|
+
}));
|
|
62
|
+
});
|
|
63
|
+
it('throws on access_denied', async () => {
|
|
64
|
+
mockFetch.mockResolvedValue({
|
|
65
|
+
ok: false,
|
|
66
|
+
json: () => Promise.resolve({ error: 'access_denied' }),
|
|
67
|
+
});
|
|
68
|
+
await expect(pollForToken('device123', 0.01, 60)).rejects.toThrow('Authorization was denied');
|
|
69
|
+
});
|
|
70
|
+
it('throws on expired_token', async () => {
|
|
71
|
+
mockFetch.mockResolvedValue({
|
|
72
|
+
ok: false,
|
|
73
|
+
json: () => Promise.resolve({ error: 'expired_token' }),
|
|
74
|
+
});
|
|
75
|
+
await expect(pollForToken('device123', 0.01, 60)).rejects.toThrow('Login timed out');
|
|
76
|
+
});
|
|
77
|
+
it('continues polling on authorization_pending then succeeds', async () => {
|
|
78
|
+
const tokenResponse = {
|
|
79
|
+
access_token: 'token123',
|
|
80
|
+
token_type: 'Bearer',
|
|
81
|
+
};
|
|
82
|
+
mockFetch
|
|
83
|
+
.mockResolvedValueOnce({
|
|
84
|
+
ok: false,
|
|
85
|
+
json: () => Promise.resolve({ error: 'authorization_pending' }),
|
|
86
|
+
})
|
|
87
|
+
.mockResolvedValueOnce({
|
|
88
|
+
ok: true,
|
|
89
|
+
json: () => Promise.resolve(tokenResponse),
|
|
90
|
+
});
|
|
91
|
+
const result = await pollForToken('device123', 0.01, 60);
|
|
92
|
+
expect(result).toEqual(tokenResponse);
|
|
93
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
94
|
+
});
|
|
95
|
+
it('slows down polling on slow_down error', async () => {
|
|
96
|
+
const tokenResponse = {
|
|
97
|
+
access_token: 'token123',
|
|
98
|
+
token_type: 'Bearer',
|
|
99
|
+
};
|
|
100
|
+
mockFetch
|
|
101
|
+
.mockResolvedValueOnce({
|
|
102
|
+
ok: false,
|
|
103
|
+
json: () => Promise.resolve({ error: 'slow_down' }),
|
|
104
|
+
})
|
|
105
|
+
.mockResolvedValueOnce({
|
|
106
|
+
ok: true,
|
|
107
|
+
json: () => Promise.resolve(tokenResponse),
|
|
108
|
+
});
|
|
109
|
+
const result = await pollForToken('device123', 0.001, 60);
|
|
110
|
+
expect(result).toEqual(tokenResponse);
|
|
111
|
+
expect(mockFetch).toHaveBeenCalledTimes(2);
|
|
112
|
+
}, 10000);
|
|
113
|
+
it('throws on unknown error with description', async () => {
|
|
114
|
+
mockFetch.mockReset();
|
|
115
|
+
mockFetch.mockResolvedValue({
|
|
116
|
+
ok: false,
|
|
117
|
+
json: () => Promise.resolve({
|
|
118
|
+
error: 'unknown_error',
|
|
119
|
+
error_description: 'Something unexpected happened',
|
|
120
|
+
}),
|
|
121
|
+
});
|
|
122
|
+
await expect(pollForToken('device123', 0.01, 60)).rejects.toThrow('Something unexpected happened');
|
|
123
|
+
});
|
|
124
|
+
it('throws on unknown error without description', async () => {
|
|
125
|
+
mockFetch.mockReset();
|
|
126
|
+
mockFetch.mockResolvedValue({
|
|
127
|
+
ok: false,
|
|
128
|
+
json: () => Promise.resolve({ error: 'some_error' }),
|
|
129
|
+
});
|
|
130
|
+
await expect(pollForToken('device123', 0.01, 60)).rejects.toThrow('Authentication failed');
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
describe('getMe', () => {
|
|
134
|
+
beforeEach(() => {
|
|
135
|
+
mockFetch.mockReset();
|
|
136
|
+
});
|
|
137
|
+
it('returns user on success', async () => {
|
|
138
|
+
const user = { id: '1', email: 'test@example.com', name: 'Test User' };
|
|
139
|
+
mockGetAuthToken.mockResolvedValue('token123');
|
|
140
|
+
mockFetch.mockResolvedValue({
|
|
141
|
+
ok: true,
|
|
142
|
+
json: () => Promise.resolve({ user }),
|
|
143
|
+
});
|
|
144
|
+
const result = await getMe();
|
|
145
|
+
expect(result).toEqual(user);
|
|
146
|
+
expect(mockFetch).toHaveBeenCalledWith('https://dev.agentage.io/api/auth/me', {
|
|
147
|
+
headers: { Authorization: 'Bearer token123' },
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
it('throws when not authenticated', async () => {
|
|
151
|
+
mockGetAuthToken.mockResolvedValue(undefined);
|
|
152
|
+
await expect(getMe()).rejects.toThrow('Not authenticated');
|
|
153
|
+
});
|
|
154
|
+
it('throws on session expired (401)', async () => {
|
|
155
|
+
mockGetAuthToken.mockResolvedValue('expired-token');
|
|
156
|
+
mockFetch.mockResolvedValue({
|
|
157
|
+
ok: false,
|
|
158
|
+
status: 401,
|
|
159
|
+
json: () => Promise.resolve({}),
|
|
160
|
+
});
|
|
161
|
+
await expect(getMe()).rejects.toThrow('Session expired');
|
|
162
|
+
});
|
|
163
|
+
it('throws on other API errors with description', async () => {
|
|
164
|
+
mockGetAuthToken.mockResolvedValue('token123');
|
|
165
|
+
mockFetch.mockResolvedValue({
|
|
166
|
+
ok: false,
|
|
167
|
+
status: 500,
|
|
168
|
+
json: () => Promise.resolve({
|
|
169
|
+
error: 'server_error',
|
|
170
|
+
error_description: 'Internal server error',
|
|
171
|
+
}),
|
|
172
|
+
});
|
|
173
|
+
await expect(getMe()).rejects.toThrow('Internal server error');
|
|
174
|
+
});
|
|
175
|
+
it('throws on other API errors without description', async () => {
|
|
176
|
+
mockGetAuthToken.mockResolvedValue('token123');
|
|
177
|
+
mockFetch.mockResolvedValue({
|
|
178
|
+
ok: false,
|
|
179
|
+
status: 500,
|
|
180
|
+
json: () => Promise.resolve({ error: 'server_error' }),
|
|
181
|
+
});
|
|
182
|
+
await expect(getMe()).rejects.toThrow('Failed to get user info');
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe('logout', () => {
|
|
186
|
+
it('calls logout endpoint when authenticated', async () => {
|
|
187
|
+
mockGetAuthToken.mockResolvedValue('token123');
|
|
188
|
+
mockFetch.mockResolvedValue({ ok: true });
|
|
189
|
+
await logout();
|
|
190
|
+
expect(mockFetch).toHaveBeenCalledWith('https://dev.agentage.io/api/auth/logout', {
|
|
191
|
+
method: 'POST',
|
|
192
|
+
headers: { Authorization: 'Bearer token123' },
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
it('does nothing when not authenticated', async () => {
|
|
196
|
+
mockGetAuthToken.mockResolvedValue(undefined);
|
|
197
|
+
await logout();
|
|
198
|
+
expect(mockFetch).not.toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
it('ignores fetch errors', async () => {
|
|
201
|
+
mockGetAuthToken.mockResolvedValue('token123');
|
|
202
|
+
mockFetch.mockRejectedValue(new Error('Network error'));
|
|
203
|
+
await expect(logout()).resolves.not.toThrow();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
describe('AuthError', () => {
|
|
207
|
+
it('has correct name and code', () => {
|
|
208
|
+
const error = new AuthError('Test message', 'test_code');
|
|
209
|
+
expect(error.name).toBe('AuthError');
|
|
210
|
+
expect(error.message).toBe('Test message');
|
|
211
|
+
expect(error.code).toBe('test_code');
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=auth.service.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.service.test.js","sourceRoot":"","sources":["../../src/services/auth.service.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,SAAS,EACT,KAAK,EACL,MAAM,EACN,YAAY,EACZ,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAG3B,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAEhC,MAAM,kBAAkB,GAAG,WAAW,CAAC,cAEtC,CAAC;AACF,MAAM,gBAAgB,GAAG,WAAW,CAAC,YAEpC,CAAC;AAGF,MAAM,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC5B,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;AAEzB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,kBAAkB,CAAC,iBAAiB,CAAC,yBAAyB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,kBAAkB,GAAG;gBACzB,WAAW,EAAE,QAAQ;gBACrB,SAAS,EAAE,WAAW;gBACtB,gBAAgB,EAAE,gCAAgC;gBAClD,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,CAAC;aACZ,CAAC;YAEF,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,kBAAkB,CAAC;aAChD,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;YAEzC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,8CAA8C,EAC9C;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;aAChD,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CACT,OAAO,CAAC,OAAO,CAAC;oBACd,KAAK,EAAE,cAAc;oBACrB,iBAAiB,EAAE,sBAAsB;iBAC1C,CAAC;aACL,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAC5E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,UAAU;gBACxB,UAAU,EAAE,QAAQ;gBACpB,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE;aAC7C,CAAC;YAEF,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC3C,CAAC,CAAC;YAGH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,+CAA+C,EAC/C,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;aACnD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;aACxD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,0BAA0B,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;aACxD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,iBAAiB,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YACxE,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,UAAU;gBACxB,UAAU,EAAE,QAAQ;aACrB,CAAC;YAEF,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;aAChE,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC3C,CAAC,CAAC;YAEL,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,aAAa,GAAG;gBACpB,YAAY,EAAE,UAAU;gBACxB,UAAU,EAAE,QAAQ;aACrB,CAAC;YAEF,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC;aACpD,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;aAC3C,CAAC,CAAC;YAIL,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAE1D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CACT,OAAO,CAAC,OAAO,CAAC;oBACd,KAAK,EAAE,eAAe;oBACtB,iBAAiB,EAAE,+BAA+B;iBACnD,CAAC;aACL,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,+BAA+B,CAChC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,SAAS,CAAC,SAAS,EAAE,CAAC;YACtB,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;aACrD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,UAAU,CAAC,GAAG,EAAE;YACd,SAAS,CAAC,SAAS,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACvC,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;YACvE,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC/C,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,IAAI;gBACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC;YAE7B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC7B,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,qCAAqC,EACrC;gBACE,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE;aAC9C,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE9C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,gBAAgB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;YACpD,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;YAC3D,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC/C,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CACT,OAAO,CAAC,OAAO,CAAC;oBACd,KAAK,EAAE,cAAc;oBACrB,iBAAiB,EAAE,uBAAuB;iBAC3C,CAAC;aACL,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC/C,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;aACvD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC/C,SAAS,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAE1C,MAAM,MAAM,EAAE,CAAC;YAEf,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,yCAAyC,EACzC;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE;aAC9C,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,gBAAgB,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAE9C,MAAM,MAAM,EAAE,CAAC;YAEf,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC/C,SAAS,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAExD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;YAEzD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACrC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const userSchema: z.ZodObject<{
|
|
3
|
+
id: z.ZodString;
|
|
4
|
+
email: z.ZodString;
|
|
5
|
+
name: z.ZodOptional<z.ZodString>;
|
|
6
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
id: string;
|
|
9
|
+
email: string;
|
|
10
|
+
name?: string | undefined;
|
|
11
|
+
avatar?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
id: string;
|
|
14
|
+
email: string;
|
|
15
|
+
name?: string | undefined;
|
|
16
|
+
avatar?: string | undefined;
|
|
17
|
+
}>;
|
|
18
|
+
export declare const authConfigSchema: z.ZodObject<{
|
|
19
|
+
token: z.ZodString;
|
|
20
|
+
expiresAt: z.ZodOptional<z.ZodString>;
|
|
21
|
+
user: z.ZodOptional<z.ZodObject<{
|
|
22
|
+
id: z.ZodString;
|
|
23
|
+
email: z.ZodString;
|
|
24
|
+
name: z.ZodOptional<z.ZodString>;
|
|
25
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
id: string;
|
|
28
|
+
email: string;
|
|
29
|
+
name?: string | undefined;
|
|
30
|
+
avatar?: string | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
id: string;
|
|
33
|
+
email: string;
|
|
34
|
+
name?: string | undefined;
|
|
35
|
+
avatar?: string | undefined;
|
|
36
|
+
}>>;
|
|
37
|
+
}, "strip", z.ZodTypeAny, {
|
|
38
|
+
token: string;
|
|
39
|
+
expiresAt?: string | undefined;
|
|
40
|
+
user?: {
|
|
41
|
+
id: string;
|
|
42
|
+
email: string;
|
|
43
|
+
name?: string | undefined;
|
|
44
|
+
avatar?: string | undefined;
|
|
45
|
+
} | undefined;
|
|
46
|
+
}, {
|
|
47
|
+
token: string;
|
|
48
|
+
expiresAt?: string | undefined;
|
|
49
|
+
user?: {
|
|
50
|
+
id: string;
|
|
51
|
+
email: string;
|
|
52
|
+
name?: string | undefined;
|
|
53
|
+
avatar?: string | undefined;
|
|
54
|
+
} | undefined;
|
|
55
|
+
}>;
|
|
56
|
+
export declare const registryConfigSchema: z.ZodObject<{
|
|
57
|
+
url: z.ZodDefault<z.ZodString>;
|
|
58
|
+
}, "strip", z.ZodTypeAny, {
|
|
59
|
+
url: string;
|
|
60
|
+
}, {
|
|
61
|
+
url?: string | undefined;
|
|
62
|
+
}>;
|
|
63
|
+
export declare const agentageConfigSchema: z.ZodObject<{
|
|
64
|
+
auth: z.ZodOptional<z.ZodObject<{
|
|
65
|
+
token: z.ZodString;
|
|
66
|
+
expiresAt: z.ZodOptional<z.ZodString>;
|
|
67
|
+
user: z.ZodOptional<z.ZodObject<{
|
|
68
|
+
id: z.ZodString;
|
|
69
|
+
email: z.ZodString;
|
|
70
|
+
name: z.ZodOptional<z.ZodString>;
|
|
71
|
+
avatar: z.ZodOptional<z.ZodString>;
|
|
72
|
+
}, "strip", z.ZodTypeAny, {
|
|
73
|
+
id: string;
|
|
74
|
+
email: string;
|
|
75
|
+
name?: string | undefined;
|
|
76
|
+
avatar?: string | undefined;
|
|
77
|
+
}, {
|
|
78
|
+
id: string;
|
|
79
|
+
email: string;
|
|
80
|
+
name?: string | undefined;
|
|
81
|
+
avatar?: string | undefined;
|
|
82
|
+
}>>;
|
|
83
|
+
}, "strip", z.ZodTypeAny, {
|
|
84
|
+
token: string;
|
|
85
|
+
expiresAt?: string | undefined;
|
|
86
|
+
user?: {
|
|
87
|
+
id: string;
|
|
88
|
+
email: string;
|
|
89
|
+
name?: string | undefined;
|
|
90
|
+
avatar?: string | undefined;
|
|
91
|
+
} | undefined;
|
|
92
|
+
}, {
|
|
93
|
+
token: string;
|
|
94
|
+
expiresAt?: string | undefined;
|
|
95
|
+
user?: {
|
|
96
|
+
id: string;
|
|
97
|
+
email: string;
|
|
98
|
+
name?: string | undefined;
|
|
99
|
+
avatar?: string | undefined;
|
|
100
|
+
} | undefined;
|
|
101
|
+
}>>;
|
|
102
|
+
registry: z.ZodOptional<z.ZodObject<{
|
|
103
|
+
url: z.ZodDefault<z.ZodString>;
|
|
104
|
+
}, "strip", z.ZodTypeAny, {
|
|
105
|
+
url: string;
|
|
106
|
+
}, {
|
|
107
|
+
url?: string | undefined;
|
|
108
|
+
}>>;
|
|
109
|
+
}, "strip", z.ZodTypeAny, {
|
|
110
|
+
auth?: {
|
|
111
|
+
token: string;
|
|
112
|
+
expiresAt?: string | undefined;
|
|
113
|
+
user?: {
|
|
114
|
+
id: string;
|
|
115
|
+
email: string;
|
|
116
|
+
name?: string | undefined;
|
|
117
|
+
avatar?: string | undefined;
|
|
118
|
+
} | undefined;
|
|
119
|
+
} | undefined;
|
|
120
|
+
registry?: {
|
|
121
|
+
url: string;
|
|
122
|
+
} | undefined;
|
|
123
|
+
}, {
|
|
124
|
+
auth?: {
|
|
125
|
+
token: string;
|
|
126
|
+
expiresAt?: string | undefined;
|
|
127
|
+
user?: {
|
|
128
|
+
id: string;
|
|
129
|
+
email: string;
|
|
130
|
+
name?: string | undefined;
|
|
131
|
+
avatar?: string | undefined;
|
|
132
|
+
} | undefined;
|
|
133
|
+
} | undefined;
|
|
134
|
+
registry?: {
|
|
135
|
+
url?: string | undefined;
|
|
136
|
+
} | undefined;
|
|
137
|
+
}>;
|
|
138
|
+
export type User = z.infer<typeof userSchema>;
|
|
139
|
+
export type AuthConfig = z.infer<typeof authConfigSchema>;
|
|
140
|
+
export type RegistryConfig = z.infer<typeof registryConfigSchema>;
|
|
141
|
+
export type AgentageConfig = z.infer<typeof agentageConfigSchema>;
|
|
142
|
+
export interface DeviceCodeResponse {
|
|
143
|
+
device_code: string;
|
|
144
|
+
user_code: string;
|
|
145
|
+
verification_uri: string;
|
|
146
|
+
expires_in: number;
|
|
147
|
+
interval: number;
|
|
148
|
+
}
|
|
149
|
+
export interface TokenResponse {
|
|
150
|
+
access_token: string;
|
|
151
|
+
token_type: string;
|
|
152
|
+
expires_in?: number;
|
|
153
|
+
user?: User;
|
|
154
|
+
}
|
|
155
|
+
export interface AuthErrorResponse {
|
|
156
|
+
error: string;
|
|
157
|
+
error_description?: string;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=config.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;EAKrB,CAAC;AAKH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAI3B,CAAC;AAKH,eAAO,MAAM,oBAAoB;;;;;;EAE/B,CAAC;AAKH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAG/B,CAAC;AAKH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAK9C,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAK1D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAKlE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAKlE,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAKD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export const userSchema = z.object({
|
|
3
|
+
id: z.string(),
|
|
4
|
+
email: z.string().email(),
|
|
5
|
+
name: z.string().optional(),
|
|
6
|
+
avatar: z.string().url().optional(),
|
|
7
|
+
});
|
|
8
|
+
export const authConfigSchema = z.object({
|
|
9
|
+
token: z.string(),
|
|
10
|
+
expiresAt: z.string().datetime().optional(),
|
|
11
|
+
user: userSchema.optional(),
|
|
12
|
+
});
|
|
13
|
+
export const registryConfigSchema = z.object({
|
|
14
|
+
url: z.string().url().default('https://dev.agentage.io'),
|
|
15
|
+
});
|
|
16
|
+
export const agentageConfigSchema = z.object({
|
|
17
|
+
auth: authConfigSchema.optional(),
|
|
18
|
+
registry: registryConfigSchema.optional(),
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=config.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,UAAU,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,yBAAyB,CAAC;CACzD,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,gBAAgB,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;CAC1C,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AgentageConfig } from '../types/config.types.js';
|
|
2
|
+
export declare const DEFAULT_REGISTRY_URL = "https://dev.agentage.io";
|
|
3
|
+
export declare const getConfigDir: () => string;
|
|
4
|
+
export declare const getConfigPath: () => string;
|
|
5
|
+
export declare const loadConfig: () => Promise<AgentageConfig>;
|
|
6
|
+
export declare const saveConfig: (config: AgentageConfig) => Promise<void>;
|
|
7
|
+
export declare const clearConfig: () => Promise<void>;
|
|
8
|
+
export declare const getRegistryUrl: () => Promise<string>;
|
|
9
|
+
export declare const getAuthToken: () => Promise<string | undefined>;
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAwB,MAAM,0BAA0B,CAAC;AAKhF,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAK9D,eAAO,MAAM,YAAY,QAAO,MAAsC,CAAC;AAKvE,eAAO,MAAM,aAAa,QAAO,MAA6C,CAAC;AAK/E,eAAO,MAAM,UAAU,QAAa,OAAO,CAAC,cAAc,CAUzD,CAAC;AAKF,eAAO,MAAM,UAAU,GAAU,QAAQ,cAAc,KAAG,OAAO,CAAC,IAAI,CASrE,CAAC;AAKF,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CAOhD,CAAC;AAKF,eAAO,MAAM,cAAc,QAAa,OAAO,CAAC,MAAM,CAUrD,CAAC;AAKF,eAAO,MAAM,YAAY,QAAa,OAAO,CAAC,MAAM,GAAG,SAAS,CAU/D,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { mkdir, readFile, rm, writeFile } from 'fs/promises';
|
|
2
|
+
import { homedir } from 'os';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { agentageConfigSchema } from '../types/config.types.js';
|
|
5
|
+
export const DEFAULT_REGISTRY_URL = 'https://dev.agentage.io';
|
|
6
|
+
export const getConfigDir = () => join(homedir(), '.agentage');
|
|
7
|
+
export const getConfigPath = () => join(getConfigDir(), 'config.json');
|
|
8
|
+
export const loadConfig = async () => {
|
|
9
|
+
try {
|
|
10
|
+
const configPath = getConfigPath();
|
|
11
|
+
const content = await readFile(configPath, 'utf-8');
|
|
12
|
+
const parsed = JSON.parse(content);
|
|
13
|
+
return agentageConfigSchema.parse(parsed);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return {};
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export const saveConfig = async (config) => {
|
|
20
|
+
const configPath = getConfigPath();
|
|
21
|
+
const configDir = dirname(configPath);
|
|
22
|
+
await mkdir(configDir, { recursive: true });
|
|
23
|
+
await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
24
|
+
};
|
|
25
|
+
export const clearConfig = async () => {
|
|
26
|
+
try {
|
|
27
|
+
const configPath = getConfigPath();
|
|
28
|
+
await rm(configPath);
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export const getRegistryUrl = async () => {
|
|
34
|
+
const envUrl = process.env.AGENTAGE_REGISTRY_URL;
|
|
35
|
+
if (envUrl) {
|
|
36
|
+
return envUrl;
|
|
37
|
+
}
|
|
38
|
+
const config = await loadConfig();
|
|
39
|
+
return config.registry?.url || DEFAULT_REGISTRY_URL;
|
|
40
|
+
};
|
|
41
|
+
export const getAuthToken = async () => {
|
|
42
|
+
const envToken = process.env.AGENTAGE_AUTH_TOKEN;
|
|
43
|
+
if (envToken) {
|
|
44
|
+
return envToken;
|
|
45
|
+
}
|
|
46
|
+
const config = await loadConfig();
|
|
47
|
+
return config.auth?.token;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAkB,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAKhF,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC;AAK9D,MAAM,CAAC,MAAM,YAAY,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AAKvE,MAAM,CAAC,MAAM,aAAa,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAK/E,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,IAA6B,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAAE,MAAsB,EAAiB,EAAE;IACxE,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAGtC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAG5C,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACxE,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,IAAmB,EAAE;IACnD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,IAAqB,EAAE;IAExD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACjD,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,oBAAoB,CAAC;AACtD,CAAC,CAAC;AAKF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,IAAiC,EAAE;IAElE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACjD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAGD,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,OAAO,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC;AAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/utils/config.test.ts"],"names":[],"mappings":""}
|