@agentage/cli 0.1.2 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +244 -48
  2. package/dist/cli.js +20 -0
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cli.test.js +21 -12
  5. package/dist/cli.test.js.map +1 -1
  6. package/dist/commands/init.d.ts +3 -0
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +21 -11
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/init.test.js +28 -23
  11. package/dist/commands/init.test.js.map +1 -1
  12. package/dist/commands/login.d.ts +2 -0
  13. package/dist/commands/login.d.ts.map +1 -0
  14. package/dist/commands/login.js +67 -0
  15. package/dist/commands/login.js.map +1 -0
  16. package/dist/commands/login.test.d.ts +2 -0
  17. package/dist/commands/login.test.d.ts.map +1 -0
  18. package/dist/commands/login.test.js +157 -0
  19. package/dist/commands/login.test.js.map +1 -0
  20. package/dist/commands/logout.d.ts +2 -0
  21. package/dist/commands/logout.d.ts.map +1 -0
  22. package/dist/commands/logout.js +29 -0
  23. package/dist/commands/logout.js.map +1 -0
  24. package/dist/commands/logout.test.d.ts +2 -0
  25. package/dist/commands/logout.test.d.ts.map +1 -0
  26. package/dist/commands/logout.test.js +49 -0
  27. package/dist/commands/logout.test.js.map +1 -0
  28. package/dist/commands/update.d.ts +8 -0
  29. package/dist/commands/update.d.ts.map +1 -0
  30. package/dist/commands/update.js +43 -0
  31. package/dist/commands/update.js.map +1 -0
  32. package/dist/commands/update.test.d.ts +2 -0
  33. package/dist/commands/update.test.d.ts.map +1 -0
  34. package/dist/commands/update.test.js +134 -0
  35. package/dist/commands/update.test.js.map +1 -0
  36. package/dist/commands/whoami.d.ts +2 -0
  37. package/dist/commands/whoami.d.ts.map +1 -0
  38. package/dist/commands/whoami.js +47 -0
  39. package/dist/commands/whoami.js.map +1 -0
  40. package/dist/commands/whoami.test.d.ts +2 -0
  41. package/dist/commands/whoami.test.d.ts.map +1 -0
  42. package/dist/commands/whoami.test.js +96 -0
  43. package/dist/commands/whoami.test.js.map +1 -0
  44. package/dist/services/auth.service.d.ts +10 -0
  45. package/dist/services/auth.service.d.ts.map +1 -0
  46. package/dist/services/auth.service.js +97 -0
  47. package/dist/services/auth.service.js.map +1 -0
  48. package/dist/services/auth.service.test.d.ts +2 -0
  49. package/dist/services/auth.service.test.d.ts.map +1 -0
  50. package/dist/services/auth.service.test.js +215 -0
  51. package/dist/services/auth.service.test.js.map +1 -0
  52. package/dist/types/config.types.d.ts +159 -0
  53. package/dist/types/config.types.d.ts.map +1 -0
  54. package/dist/types/config.types.js +20 -0
  55. package/dist/types/config.types.js.map +1 -0
  56. package/dist/utils/config.d.ts +10 -0
  57. package/dist/utils/config.d.ts.map +1 -0
  58. package/dist/utils/config.js +49 -0
  59. package/dist/utils/config.js.map +1 -0
  60. package/dist/utils/config.test.d.ts +2 -0
  61. package/dist/utils/config.test.d.ts.map +1 -0
  62. package/dist/utils/config.test.js +118 -0
  63. package/dist/utils/config.test.js.map +1 -0
  64. package/package.json +3 -2
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whoami.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.test.d.ts","sourceRoot":"","sources":["../../src/commands/whoami.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
1
+ import * as authService from '../services/auth.service.js';
2
+ import { AuthError } from '../services/auth.service.js';
3
+ import * as configUtils from '../utils/config.js';
4
+ import { whoamiCommand } from './whoami.js';
5
+ jest.mock('../services/auth.service.js', () => {
6
+ const original = jest.requireActual('../services/auth.service.js');
7
+ return {
8
+ ...original,
9
+ getMe: jest.fn(),
10
+ };
11
+ });
12
+ jest.mock('../utils/config.js');
13
+ const mockGetMe = authService.getMe;
14
+ const mockLoadConfig = configUtils.loadConfig;
15
+ const mockGetRegistryUrl = configUtils.getRegistryUrl;
16
+ describe('whoamiCommand', () => {
17
+ let consoleSpy;
18
+ let consoleErrorSpy;
19
+ let processExitSpy;
20
+ beforeEach(() => {
21
+ jest.clearAllMocks();
22
+ consoleSpy = jest.spyOn(console, 'log').mockImplementation();
23
+ consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
24
+ processExitSpy = jest.spyOn(process, 'exit').mockImplementation(() => {
25
+ throw new Error('process.exit called');
26
+ });
27
+ mockGetRegistryUrl.mockResolvedValue('https://dev.agentage.io');
28
+ });
29
+ afterEach(() => {
30
+ consoleSpy.mockRestore();
31
+ consoleErrorSpy.mockRestore();
32
+ processExitSpy.mockRestore();
33
+ });
34
+ it('shows not logged in when no token', async () => {
35
+ mockLoadConfig.mockResolvedValue({});
36
+ await whoamiCommand();
37
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Not logged in'));
38
+ });
39
+ it('displays user info when authenticated', async () => {
40
+ mockLoadConfig.mockResolvedValue({
41
+ auth: { token: 'test-token' },
42
+ });
43
+ mockGetMe.mockResolvedValue({
44
+ id: '123',
45
+ email: 'test@example.com',
46
+ name: 'Test User',
47
+ });
48
+ await whoamiCommand();
49
+ expect(mockGetMe).toHaveBeenCalled();
50
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Logged in to'), expect.any(String));
51
+ });
52
+ it('handles session expired error', async () => {
53
+ mockLoadConfig.mockResolvedValue({
54
+ auth: { token: 'expired-token' },
55
+ });
56
+ mockGetMe.mockRejectedValue(new AuthError('Session expired', 'session_expired'));
57
+ await expect(whoamiCommand()).rejects.toThrow('process.exit called');
58
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Session expired'));
59
+ });
60
+ it('handles not_authenticated error', async () => {
61
+ mockLoadConfig.mockResolvedValue({
62
+ auth: { token: 'test-token' },
63
+ });
64
+ mockGetMe.mockRejectedValue(new AuthError('Not authenticated', 'not_authenticated'));
65
+ await expect(whoamiCommand()).rejects.toThrow('process.exit called');
66
+ expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('Not logged in'));
67
+ });
68
+ it('handles other AuthError errors', async () => {
69
+ mockLoadConfig.mockResolvedValue({
70
+ auth: { token: 'test-token' },
71
+ });
72
+ mockGetMe.mockRejectedValue(new AuthError('Server error', 'server_error'));
73
+ await expect(whoamiCommand()).rejects.toThrow('process.exit called');
74
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Error'), 'Server error');
75
+ });
76
+ it('handles non-AuthError errors', async () => {
77
+ mockLoadConfig.mockResolvedValue({
78
+ auth: { token: 'test-token' },
79
+ });
80
+ mockGetMe.mockRejectedValue(new Error('Network error'));
81
+ await expect(whoamiCommand()).rejects.toThrow('process.exit called');
82
+ expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('Error'), 'Network error');
83
+ });
84
+ it('displays user without name', async () => {
85
+ mockLoadConfig.mockResolvedValue({
86
+ auth: { token: 'test-token' },
87
+ });
88
+ mockGetMe.mockResolvedValue({
89
+ id: '123',
90
+ email: 'test@example.com',
91
+ });
92
+ await whoamiCommand();
93
+ expect(consoleSpy).toHaveBeenCalledWith(' Email:', expect.stringContaining('test@example.com'));
94
+ });
95
+ });
96
+ //# sourceMappingURL=whoami.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.test.js","sourceRoot":"","sources":["../../src/commands/whoami.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { DeviceCodeResponse, TokenResponse, User } from '../types/config.types.js';
2
+ export declare class AuthError extends Error {
3
+ code: string;
4
+ constructor(message: string, code: string);
5
+ }
6
+ export declare const requestDeviceCode: () => Promise<DeviceCodeResponse>;
7
+ export declare const pollForToken: (deviceCode: string, interval: number, expiresIn: number) => Promise<TokenResponse>;
8
+ export declare const getMe: () => Promise<User>;
9
+ export declare const logout: () => Promise<void>;
10
+ //# sourceMappingURL=auth.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.d.ts","sourceRoot":"","sources":["../../src/services/auth.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,aAAa,EACb,IAAI,EACL,MAAM,0BAA0B,CAAC;AAMlC,qBAAa,SAAU,SAAQ,KAAK;IACE,IAAI,EAAE,MAAM;gBAApC,OAAO,EAAE,MAAM,EAAS,IAAI,EAAE,MAAM;CAIjD;AAKD,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,kBAAkB,CAkBpE,CAAC;AAKF,eAAO,MAAM,YAAY,GACvB,YAAY,MAAM,EAClB,UAAU,MAAM,EAChB,WAAW,MAAM,KAChB,OAAO,CAAC,aAAa,CA6CvB,CAAC;AAYF,eAAO,MAAM,KAAK,QAAa,OAAO,CAAC,IAAI,CA8B1C,CAAC;AAKF,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAkB3C,CAAC"}
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auth.service.test.d.ts.map
@@ -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":"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"}
@@ -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"}