aiag-cli 1.7.1 → 2.1.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/README.md +125 -88
- package/dist/api/client.d.ts +170 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +513 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/endpoints.d.ts +112 -0
- package/dist/api/endpoints.d.ts.map +1 -0
- package/dist/api/endpoints.js +150 -0
- package/dist/api/endpoints.js.map +1 -0
- package/dist/api/types.d.ts +395 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +7 -0
- package/dist/api/types.js.map +1 -0
- package/dist/auth/credentials.d.ts +73 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +150 -0
- package/dist/auth/credentials.js.map +1 -0
- package/dist/auth/device.d.ts +58 -0
- package/dist/auth/device.d.ts.map +1 -0
- package/dist/auth/device.js +235 -0
- package/dist/auth/device.js.map +1 -0
- package/dist/auth/token.d.ts +55 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +153 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli.js +51 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/auto.d.ts.map +1 -1
- package/dist/commands/auto.js +321 -236
- package/dist/commands/auto.js.map +1 -1
- package/dist/commands/complete.d.ts +1 -0
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +30 -0
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/connect.d.ts +25 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +305 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/login.d.ts +19 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +119 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +15 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +50 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/next.d.ts +1 -0
- package/dist/commands/next.d.ts.map +1 -1
- package/dist/commands/next.js +41 -2
- package/dist/commands/next.js.map +1 -1
- package/dist/commands/project.d.ts +13 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +92 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/session.d.ts +10 -2
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +80 -3
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +51 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +33 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +555 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/work.d.ts +1 -0
- package/dist/commands/work.d.ts.map +1 -1
- package/dist/commands/work.js +22 -1
- package/dist/commands/work.js.map +1 -1
- package/dist/config/global.d.ts +54 -0
- package/dist/config/global.d.ts.map +1 -0
- package/dist/config/global.js +110 -0
- package/dist/config/global.js.map +1 -0
- package/dist/prompts/coding.d.ts +31 -0
- package/dist/prompts/coding.d.ts.map +1 -0
- package/dist/prompts/coding.js +228 -0
- package/dist/prompts/coding.js.map +1 -0
- package/dist/prompts/index.d.ts +10 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +10 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/initializer.d.ts +20 -0
- package/dist/prompts/initializer.d.ts.map +1 -0
- package/dist/prompts/initializer.js +147 -0
- package/dist/prompts/initializer.js.map +1 -0
- package/dist/sdk/client.d.ts +67 -0
- package/dist/sdk/client.d.ts.map +1 -0
- package/dist/sdk/client.js +196 -0
- package/dist/sdk/client.js.map +1 -0
- package/dist/sdk/index.d.ts +8 -0
- package/dist/sdk/index.d.ts.map +1 -0
- package/dist/sdk/index.js +8 -0
- package/dist/sdk/index.js.map +1 -0
- package/dist/sdk/security.d.ts +43 -0
- package/dist/sdk/security.d.ts.map +1 -0
- package/dist/sdk/security.js +214 -0
- package/dist/sdk/security.js.map +1 -0
- package/dist/types.d.ts +64 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/connection.d.ts +126 -0
- package/dist/utils/connection.d.ts.map +1 -0
- package/dist/utils/connection.js +226 -0
- package/dist/utils/connection.js.map +1 -0
- package/dist/utils/initializerAgent.d.ts +0 -5
- package/dist/utils/initializerAgent.d.ts.map +1 -1
- package/dist/utils/initializerAgent.js +112 -31
- package/dist/utils/initializerAgent.js.map +1 -1
- package/dist/utils/messages.d.ts +76 -0
- package/dist/utils/messages.d.ts.map +1 -1
- package/dist/utils/messages.js +87 -1
- package/dist/utils/messages.js.map +1 -1
- package/dist/utils/output.d.ts +10 -0
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +31 -0
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/prompt.d.ts +10 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js +22 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/sseClient.d.ts +183 -0
- package/dist/utils/sseClient.d.ts.map +1 -0
- package/dist/utils/sseClient.js +391 -0
- package/dist/utils/sseClient.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 클라이언트
|
|
3
|
+
*
|
|
4
|
+
* aiag-adp 서버와 통신하는 API 클라이언트
|
|
5
|
+
*
|
|
6
|
+
* 기능:
|
|
7
|
+
* - Bearer 토큰 자동 첨부
|
|
8
|
+
* - 토큰 만료 시 자동 갱신
|
|
9
|
+
* - 연결 실패 시 로컬 모드 폴백
|
|
10
|
+
* - 재시도 로직
|
|
11
|
+
*/
|
|
12
|
+
import { loadCredentials, saveCredentials, isTokenExpired, } from '../auth/credentials.js';
|
|
13
|
+
import { buildUrl, AGENT_ENDPOINTS, PROJECT_ENDPOINTS, SYNC_ENDPOINTS, AUTH_ENDPOINTS, HEALTH_ENDPOINTS } from './endpoints.js';
|
|
14
|
+
// ============================================
|
|
15
|
+
// 에러 클래스
|
|
16
|
+
// ============================================
|
|
17
|
+
/**
|
|
18
|
+
* API 에러 클래스
|
|
19
|
+
*/
|
|
20
|
+
export class ApiError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
status;
|
|
23
|
+
details;
|
|
24
|
+
constructor(message, code, status, details) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.code = code;
|
|
27
|
+
this.status = status;
|
|
28
|
+
this.details = details;
|
|
29
|
+
this.name = 'ApiError';
|
|
30
|
+
}
|
|
31
|
+
static fromResponse(status, body) {
|
|
32
|
+
if (body && typeof body === 'object' && 'error' in body) {
|
|
33
|
+
const error = body.error;
|
|
34
|
+
return new ApiError(error.message, error.code, status, error.details);
|
|
35
|
+
}
|
|
36
|
+
return new ApiError(`HTTP ${status}`, 'HTTP_ERROR', status);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 네트워크 에러 클래스
|
|
41
|
+
*/
|
|
42
|
+
export class NetworkError extends Error {
|
|
43
|
+
originalError;
|
|
44
|
+
constructor(message, originalError) {
|
|
45
|
+
super(message);
|
|
46
|
+
this.originalError = originalError;
|
|
47
|
+
this.name = 'NetworkError';
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 기본 설정값
|
|
52
|
+
*/
|
|
53
|
+
const DEFAULT_CONFIG = {
|
|
54
|
+
timeout: 30000, // 30초
|
|
55
|
+
retries: 2,
|
|
56
|
+
};
|
|
57
|
+
// ============================================
|
|
58
|
+
// API 클라이언트 클래스
|
|
59
|
+
// ============================================
|
|
60
|
+
/**
|
|
61
|
+
* API 클라이언트
|
|
62
|
+
*/
|
|
63
|
+
export class ApiClient {
|
|
64
|
+
serverUrl;
|
|
65
|
+
accessToken;
|
|
66
|
+
refreshToken;
|
|
67
|
+
timeout;
|
|
68
|
+
retries;
|
|
69
|
+
refreshPromise = null;
|
|
70
|
+
constructor(config) {
|
|
71
|
+
this.serverUrl = config.serverUrl.replace(/\/+$/, '');
|
|
72
|
+
this.accessToken = config.accessToken;
|
|
73
|
+
this.refreshToken = config.refreshToken;
|
|
74
|
+
this.timeout = config.timeout ?? DEFAULT_CONFIG.timeout;
|
|
75
|
+
this.retries = config.retries ?? DEFAULT_CONFIG.retries;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 토큰 업데이트
|
|
79
|
+
*/
|
|
80
|
+
updateTokens(accessToken, refreshToken) {
|
|
81
|
+
this.accessToken = accessToken;
|
|
82
|
+
if (refreshToken) {
|
|
83
|
+
this.refreshToken = refreshToken;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 서버 URL 반환
|
|
88
|
+
*/
|
|
89
|
+
getServerUrl() {
|
|
90
|
+
return this.serverUrl;
|
|
91
|
+
}
|
|
92
|
+
// ============================================
|
|
93
|
+
// HTTP 요청 메서드
|
|
94
|
+
// ============================================
|
|
95
|
+
/**
|
|
96
|
+
* 기본 fetch 요청
|
|
97
|
+
*/
|
|
98
|
+
async request(method, endpoint, body, options) {
|
|
99
|
+
const url = buildUrl(this.serverUrl, endpoint);
|
|
100
|
+
const headers = {
|
|
101
|
+
'Content-Type': 'application/json',
|
|
102
|
+
'Accept': 'application/json',
|
|
103
|
+
};
|
|
104
|
+
// 인증 헤더 추가
|
|
105
|
+
if (!options?.skipAuth) {
|
|
106
|
+
headers['Authorization'] = `Bearer ${this.accessToken}`;
|
|
107
|
+
}
|
|
108
|
+
const controller = new AbortController();
|
|
109
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
110
|
+
try {
|
|
111
|
+
const response = await fetch(url, {
|
|
112
|
+
method,
|
|
113
|
+
headers,
|
|
114
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
115
|
+
signal: controller.signal,
|
|
116
|
+
});
|
|
117
|
+
clearTimeout(timeoutId);
|
|
118
|
+
// 401 Unauthorized - 토큰 갱신 시도
|
|
119
|
+
if (response.status === 401 && !options?.skipAuth && this.refreshToken) {
|
|
120
|
+
await this.refreshAccessToken();
|
|
121
|
+
// 토큰 갱신 후 재시도
|
|
122
|
+
return this.request(method, endpoint, body, { ...options, retryCount: 0 });
|
|
123
|
+
}
|
|
124
|
+
// 에러 응답 처리
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
const errorBody = await response.json().catch(() => null);
|
|
127
|
+
throw ApiError.fromResponse(response.status, errorBody);
|
|
128
|
+
}
|
|
129
|
+
// 204 No Content
|
|
130
|
+
if (response.status === 204) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
return (await response.json());
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
clearTimeout(timeoutId);
|
|
137
|
+
// AbortError (timeout)
|
|
138
|
+
if (error instanceof Error && error.name === 'AbortError') {
|
|
139
|
+
throw new NetworkError('Request timeout');
|
|
140
|
+
}
|
|
141
|
+
// 네트워크 에러 - 재시도
|
|
142
|
+
if (error instanceof TypeError && error.message.includes('fetch')) {
|
|
143
|
+
const retryCount = options?.retryCount ?? 0;
|
|
144
|
+
if (retryCount < this.retries) {
|
|
145
|
+
await this.delay(1000 * (retryCount + 1)); // 점진적 백오프
|
|
146
|
+
return this.request(method, endpoint, body, {
|
|
147
|
+
...options,
|
|
148
|
+
retryCount: retryCount + 1,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
throw new NetworkError('Network error: unable to connect to server', error);
|
|
152
|
+
}
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 토큰 갱신
|
|
158
|
+
*/
|
|
159
|
+
async refreshAccessToken() {
|
|
160
|
+
// 이미 갱신 중이면 대기
|
|
161
|
+
if (this.refreshPromise) {
|
|
162
|
+
await this.refreshPromise;
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
this.refreshPromise = this.doRefreshToken();
|
|
166
|
+
try {
|
|
167
|
+
await this.refreshPromise;
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
this.refreshPromise = null;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async doRefreshToken() {
|
|
174
|
+
if (!this.refreshToken) {
|
|
175
|
+
throw new ApiError('No refresh token available', 'NO_REFRESH_TOKEN');
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
const response = await this.request('POST', AUTH_ENDPOINTS.REFRESH_TOKEN, { refreshToken: this.refreshToken }, { skipAuth: true });
|
|
179
|
+
if (response.success && response.data) {
|
|
180
|
+
this.accessToken = response.data.accessToken;
|
|
181
|
+
if (response.data.refreshToken) {
|
|
182
|
+
this.refreshToken = response.data.refreshToken;
|
|
183
|
+
}
|
|
184
|
+
// credentials 파일 업데이트
|
|
185
|
+
const credentials = loadCredentials();
|
|
186
|
+
if (credentials) {
|
|
187
|
+
const expiresAt = new Date(Date.now() + response.data.expiresIn * 1000).toISOString();
|
|
188
|
+
saveCredentials({
|
|
189
|
+
...credentials,
|
|
190
|
+
accessToken: this.accessToken,
|
|
191
|
+
refreshToken: this.refreshToken,
|
|
192
|
+
expiresAt,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new ApiError('Token refresh failed', 'REFRESH_FAILED');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
throw new ApiError('Token refresh failed', 'REFRESH_FAILED');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
delay(ms) {
|
|
205
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
206
|
+
}
|
|
207
|
+
// ============================================
|
|
208
|
+
// 프로젝트 API
|
|
209
|
+
// ============================================
|
|
210
|
+
/**
|
|
211
|
+
* 프로젝트 정보 조회
|
|
212
|
+
*/
|
|
213
|
+
async getProject(projectId) {
|
|
214
|
+
const response = await this.request('GET', PROJECT_ENDPOINTS.DETAIL(projectId));
|
|
215
|
+
if (!response.success || !response.data) {
|
|
216
|
+
throw new ApiError(response.error?.message ?? 'Failed to get project', response.error?.code ?? 'GET_PROJECT_FAILED');
|
|
217
|
+
}
|
|
218
|
+
return response.data;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 프로젝트 생성
|
|
222
|
+
*/
|
|
223
|
+
async createProject(request) {
|
|
224
|
+
const response = await this.request('POST', PROJECT_ENDPOINTS.CREATE, request);
|
|
225
|
+
if (!response.success || !response.data) {
|
|
226
|
+
throw new ApiError(response.error?.message ?? 'Failed to create project', response.error?.code ?? 'CREATE_PROJECT_FAILED');
|
|
227
|
+
}
|
|
228
|
+
return response.data;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* 프로젝트 삭제
|
|
232
|
+
*/
|
|
233
|
+
async deleteProject(projectId) {
|
|
234
|
+
const response = await this.request('DELETE', PROJECT_ENDPOINTS.DELETE(projectId));
|
|
235
|
+
if (!response.success) {
|
|
236
|
+
throw new ApiError(response.error?.message ?? 'Failed to delete project', response.error?.code ?? 'DELETE_PROJECT_FAILED');
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* 프로젝트 컨텍스트 조회 (전체 정보)
|
|
241
|
+
*/
|
|
242
|
+
async getProjectContext(projectId) {
|
|
243
|
+
const response = await this.request('GET', AGENT_ENDPOINTS.CONTEXT(projectId));
|
|
244
|
+
if (!response.success || !response.data) {
|
|
245
|
+
throw new ApiError(response.error?.message ?? 'Failed to get project context', response.error?.code ?? 'GET_CONTEXT_FAILED');
|
|
246
|
+
}
|
|
247
|
+
return response.data;
|
|
248
|
+
}
|
|
249
|
+
// ============================================
|
|
250
|
+
// Feature API
|
|
251
|
+
// ============================================
|
|
252
|
+
/**
|
|
253
|
+
* 다음 Feature 조회
|
|
254
|
+
*/
|
|
255
|
+
async getNextFeature(projectId) {
|
|
256
|
+
const response = await this.request('GET', AGENT_ENDPOINTS.NEXT_FEATURE(projectId));
|
|
257
|
+
if (!response.success) {
|
|
258
|
+
throw new ApiError(response.error?.message ?? 'Failed to get next feature', response.error?.code ?? 'GET_NEXT_FEATURE_FAILED');
|
|
259
|
+
}
|
|
260
|
+
return response.data ?? null;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Feature claim (작업 시작)
|
|
264
|
+
*/
|
|
265
|
+
async claimFeature(featureId, request) {
|
|
266
|
+
const body = {
|
|
267
|
+
agentType: request?.agentType ?? 'cli',
|
|
268
|
+
agentId: request?.agentId,
|
|
269
|
+
};
|
|
270
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.CLAIM(featureId), body);
|
|
271
|
+
if (!response.success || !response.data) {
|
|
272
|
+
throw new ApiError(response.error?.message ?? 'Failed to claim feature', response.error?.code ?? 'CLAIM_FAILED');
|
|
273
|
+
}
|
|
274
|
+
return response.data;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Feature unclaim (작업 취소)
|
|
278
|
+
*/
|
|
279
|
+
async unclaimFeature(featureId) {
|
|
280
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.UNCLAIM(featureId));
|
|
281
|
+
if (!response.success) {
|
|
282
|
+
throw new ApiError(response.error?.message ?? 'Failed to unclaim feature', response.error?.code ?? 'UNCLAIM_FAILED');
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Feature 완료
|
|
287
|
+
*/
|
|
288
|
+
async completeFeature(featureId, request) {
|
|
289
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.COMPLETE(featureId), request);
|
|
290
|
+
if (!response.success || !response.data) {
|
|
291
|
+
throw new ApiError(response.error?.message ?? 'Failed to complete feature', response.error?.code ?? 'COMPLETE_FAILED');
|
|
292
|
+
}
|
|
293
|
+
return response.data;
|
|
294
|
+
}
|
|
295
|
+
// ============================================
|
|
296
|
+
// 로그 API
|
|
297
|
+
// ============================================
|
|
298
|
+
/**
|
|
299
|
+
* Feature 로그 전송
|
|
300
|
+
*/
|
|
301
|
+
async sendLog(featureId, log) {
|
|
302
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.LOG(featureId), log);
|
|
303
|
+
if (!response.success || !response.data) {
|
|
304
|
+
throw new ApiError(response.error?.message ?? 'Failed to send log', response.error?.code ?? 'SEND_LOG_FAILED');
|
|
305
|
+
}
|
|
306
|
+
return response.data;
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Feature 로그 조회
|
|
310
|
+
*/
|
|
311
|
+
async getLogs(featureId) {
|
|
312
|
+
const response = await this.request('GET', AGENT_ENDPOINTS.LOGS(featureId));
|
|
313
|
+
if (!response.success) {
|
|
314
|
+
throw new ApiError(response.error?.message ?? 'Failed to get logs', response.error?.code ?? 'GET_LOGS_FAILED');
|
|
315
|
+
}
|
|
316
|
+
return response.data ?? [];
|
|
317
|
+
}
|
|
318
|
+
// ============================================
|
|
319
|
+
// 세션 API
|
|
320
|
+
// ============================================
|
|
321
|
+
/**
|
|
322
|
+
* 세션 시작
|
|
323
|
+
*/
|
|
324
|
+
async startSession(projectId, request) {
|
|
325
|
+
const body = {
|
|
326
|
+
agentType: request?.agentType ?? 'cli',
|
|
327
|
+
agentId: request?.agentId,
|
|
328
|
+
notes: request?.notes,
|
|
329
|
+
};
|
|
330
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.SESSION_START(projectId), body);
|
|
331
|
+
if (!response.success || !response.data) {
|
|
332
|
+
throw new ApiError(response.error?.message ?? 'Failed to start session', response.error?.code ?? 'SESSION_START_FAILED');
|
|
333
|
+
}
|
|
334
|
+
return response.data;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* 세션 종료
|
|
338
|
+
*/
|
|
339
|
+
async endSession(sessionId, summary) {
|
|
340
|
+
const response = await this.request('POST', AGENT_ENDPOINTS.SESSION_END(sessionId), summary);
|
|
341
|
+
if (!response.success || !response.data) {
|
|
342
|
+
throw new ApiError(response.error?.message ?? 'Failed to end session', response.error?.code ?? 'SESSION_END_FAILED');
|
|
343
|
+
}
|
|
344
|
+
return response.data;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* 세션 목록 조회
|
|
348
|
+
*/
|
|
349
|
+
async getSessions(projectId) {
|
|
350
|
+
const response = await this.request('GET', AGENT_ENDPOINTS.SESSIONS(projectId));
|
|
351
|
+
if (!response.success) {
|
|
352
|
+
throw new ApiError(response.error?.message ?? 'Failed to get sessions', response.error?.code ?? 'GET_SESSIONS_FAILED');
|
|
353
|
+
}
|
|
354
|
+
return response.data ?? [];
|
|
355
|
+
}
|
|
356
|
+
// ============================================
|
|
357
|
+
// 동기화 API
|
|
358
|
+
// ============================================
|
|
359
|
+
/**
|
|
360
|
+
* Feature 동기화
|
|
361
|
+
*/
|
|
362
|
+
async syncFeatures(projectId, request) {
|
|
363
|
+
const response = await this.request('POST', SYNC_ENDPOINTS.FEATURES(projectId), request);
|
|
364
|
+
if (!response.success || !response.data) {
|
|
365
|
+
throw new ApiError(response.error?.message ?? 'Failed to sync features', response.error?.code ?? 'SYNC_FAILED');
|
|
366
|
+
}
|
|
367
|
+
return response.data;
|
|
368
|
+
}
|
|
369
|
+
// ============================================
|
|
370
|
+
// 헬스 체크
|
|
371
|
+
// ============================================
|
|
372
|
+
/**
|
|
373
|
+
* 서버 연결 확인
|
|
374
|
+
*/
|
|
375
|
+
async checkHealth() {
|
|
376
|
+
try {
|
|
377
|
+
const response = await this.request('GET', HEALTH_ENDPOINTS.CHECK, undefined, { skipAuth: true });
|
|
378
|
+
return response?.status === 'ok';
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* 인증 상태 확인
|
|
386
|
+
*/
|
|
387
|
+
async checkAuth() {
|
|
388
|
+
try {
|
|
389
|
+
const response = await this.request('GET', AUTH_ENDPOINTS.ME);
|
|
390
|
+
return response.data ?? null;
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// ============================================
|
|
397
|
+
// SSE 관련 헬퍼
|
|
398
|
+
// ============================================
|
|
399
|
+
/**
|
|
400
|
+
* SSE 스트림 URL 반환
|
|
401
|
+
*/
|
|
402
|
+
getStreamUrl(projectId) {
|
|
403
|
+
return buildUrl(this.serverUrl, AGENT_ENDPOINTS.STREAM(projectId));
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* 현재 액세스 토큰 반환 (SSE 클라이언트용)
|
|
407
|
+
*/
|
|
408
|
+
getAccessToken() {
|
|
409
|
+
return this.accessToken;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
// ============================================
|
|
413
|
+
// 싱글톤 인스턴스 관리
|
|
414
|
+
// ============================================
|
|
415
|
+
let clientInstance = null;
|
|
416
|
+
/**
|
|
417
|
+
* API 클라이언트 싱글톤 반환
|
|
418
|
+
* @returns ApiClient 또는 null (로그인되지 않은 경우)
|
|
419
|
+
*/
|
|
420
|
+
export function getApiClient() {
|
|
421
|
+
if (clientInstance) {
|
|
422
|
+
return clientInstance;
|
|
423
|
+
}
|
|
424
|
+
const credentials = loadCredentials();
|
|
425
|
+
if (!credentials) {
|
|
426
|
+
return null;
|
|
427
|
+
}
|
|
428
|
+
// 토큰 만료 확인
|
|
429
|
+
if (isTokenExpired(credentials)) {
|
|
430
|
+
// 만료된 경우 null 반환 (refreshToken이 있어도 초기화 시점에는 갱신하지 않음)
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
clientInstance = new ApiClient({
|
|
434
|
+
serverUrl: credentials.serverUrl,
|
|
435
|
+
accessToken: credentials.accessToken,
|
|
436
|
+
refreshToken: credentials.refreshToken,
|
|
437
|
+
});
|
|
438
|
+
return clientInstance;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* API 클라이언트 초기화 (인증 필요 시)
|
|
442
|
+
* @returns ApiClient 또는 null
|
|
443
|
+
*/
|
|
444
|
+
export async function initApiClient() {
|
|
445
|
+
const client = getApiClient();
|
|
446
|
+
if (!client) {
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
// 서버 연결 및 인증 확인
|
|
450
|
+
const isHealthy = await client.checkHealth();
|
|
451
|
+
if (!isHealthy) {
|
|
452
|
+
return null;
|
|
453
|
+
}
|
|
454
|
+
const userInfo = await client.checkAuth();
|
|
455
|
+
if (!userInfo) {
|
|
456
|
+
return null;
|
|
457
|
+
}
|
|
458
|
+
return client;
|
|
459
|
+
}
|
|
460
|
+
/**
|
|
461
|
+
* API 클라이언트 재설정 (로그인 후 호출)
|
|
462
|
+
*/
|
|
463
|
+
export function resetApiClient() {
|
|
464
|
+
clientInstance = null;
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* 새 API 클라이언트 생성 (로그인 시 사용)
|
|
468
|
+
*/
|
|
469
|
+
export function createApiClient(config) {
|
|
470
|
+
clientInstance = new ApiClient(config);
|
|
471
|
+
return clientInstance;
|
|
472
|
+
}
|
|
473
|
+
// ============================================
|
|
474
|
+
// 헬퍼 함수
|
|
475
|
+
// ============================================
|
|
476
|
+
/**
|
|
477
|
+
* 서버 연결 상태 확인
|
|
478
|
+
*/
|
|
479
|
+
export async function isServerReachable(serverUrl) {
|
|
480
|
+
try {
|
|
481
|
+
const url = buildUrl(serverUrl, HEALTH_ENDPOINTS.CHECK);
|
|
482
|
+
const controller = new AbortController();
|
|
483
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
484
|
+
const response = await fetch(url, {
|
|
485
|
+
method: 'GET',
|
|
486
|
+
signal: controller.signal,
|
|
487
|
+
});
|
|
488
|
+
clearTimeout(timeoutId);
|
|
489
|
+
return response.ok;
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
/**
|
|
496
|
+
* 로컬 모드 폴백을 지원하는 API 호출 래퍼
|
|
497
|
+
*/
|
|
498
|
+
export async function withServerFallback(serverAction, localFallback, options) {
|
|
499
|
+
const client = getApiClient();
|
|
500
|
+
if (!client) {
|
|
501
|
+
return localFallback();
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
return await serverAction();
|
|
505
|
+
}
|
|
506
|
+
catch (error) {
|
|
507
|
+
if (!options?.silent) {
|
|
508
|
+
// 에러 로깅은 호출 측에서 처리
|
|
509
|
+
}
|
|
510
|
+
return localFallback();
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 엔드포인트 정의
|
|
3
|
+
*
|
|
4
|
+
* aiag-adp 서버 API 엔드포인트 경로 상수
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* API 버전
|
|
8
|
+
*/
|
|
9
|
+
export declare const API_VERSION = "v1";
|
|
10
|
+
/**
|
|
11
|
+
* API 기본 경로
|
|
12
|
+
*/
|
|
13
|
+
export declare const API_BASE = "/api";
|
|
14
|
+
/**
|
|
15
|
+
* 인증 관련 엔드포인트
|
|
16
|
+
*/
|
|
17
|
+
export declare const AUTH_ENDPOINTS: {
|
|
18
|
+
/** 디바이스 인증 코드 요청 */
|
|
19
|
+
readonly DEVICE_REQUEST: "/api/auth/device/request";
|
|
20
|
+
/** 디바이스 인증 토큰 폴링 */
|
|
21
|
+
readonly DEVICE_POLL: "/api/auth/device/poll";
|
|
22
|
+
/** 토큰 갱신 */
|
|
23
|
+
readonly REFRESH_TOKEN: "/api/auth/refresh";
|
|
24
|
+
/** 로그아웃 (토큰 무효화) */
|
|
25
|
+
readonly LOGOUT: "/api/auth/logout";
|
|
26
|
+
/** 현재 사용자 정보 */
|
|
27
|
+
readonly ME: "/api/auth/me";
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* 프로젝트 관련 엔드포인트
|
|
31
|
+
*/
|
|
32
|
+
export declare const PROJECT_ENDPOINTS: {
|
|
33
|
+
/** 프로젝트 목록 */
|
|
34
|
+
readonly LIST: "/api/projects";
|
|
35
|
+
/** 프로젝트 상세 (ID 필요) */
|
|
36
|
+
readonly DETAIL: (projectId: string) => string;
|
|
37
|
+
/** 프로젝트 생성 */
|
|
38
|
+
readonly CREATE: "/api/projects";
|
|
39
|
+
/** 프로젝트 수정 (ID 필요) */
|
|
40
|
+
readonly UPDATE: (projectId: string) => string;
|
|
41
|
+
/** 프로젝트 삭제 (ID 필요) */
|
|
42
|
+
readonly DELETE: (projectId: string) => string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 에이전트 관련 엔드포인트
|
|
46
|
+
*/
|
|
47
|
+
export declare const AGENT_ENDPOINTS: {
|
|
48
|
+
/** 프로젝트 컨텍스트 조회 */
|
|
49
|
+
readonly CONTEXT: (projectId: string) => string;
|
|
50
|
+
/** 다음 Feature 조회 */
|
|
51
|
+
readonly NEXT_FEATURE: (projectId: string) => string;
|
|
52
|
+
/** Feature claim (작업 시작) */
|
|
53
|
+
readonly CLAIM: (featureId: string) => string;
|
|
54
|
+
/** Feature unclaim (작업 취소) */
|
|
55
|
+
readonly UNCLAIM: (featureId: string) => string;
|
|
56
|
+
/** Feature 완료 */
|
|
57
|
+
readonly COMPLETE: (featureId: string) => string;
|
|
58
|
+
/** Feature 로그 전송 */
|
|
59
|
+
readonly LOG: (featureId: string) => string;
|
|
60
|
+
/** Feature 로그 조회 */
|
|
61
|
+
readonly LOGS: (featureId: string) => string;
|
|
62
|
+
/** 세션 시작 */
|
|
63
|
+
readonly SESSION_START: (projectId: string) => string;
|
|
64
|
+
/** 세션 종료 */
|
|
65
|
+
readonly SESSION_END: (sessionId: string) => string;
|
|
66
|
+
/** 세션 목록 조회 */
|
|
67
|
+
readonly SESSIONS: (projectId: string) => string;
|
|
68
|
+
/** 실시간 로그 스트리밍 (SSE) */
|
|
69
|
+
readonly STREAM: (projectId: string) => string;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* 동기화 관련 엔드포인트
|
|
73
|
+
*/
|
|
74
|
+
export declare const SYNC_ENDPOINTS: {
|
|
75
|
+
/** Feature 동기화 */
|
|
76
|
+
readonly FEATURES: (projectId: string) => string;
|
|
77
|
+
/** 전체 동기화 상태 */
|
|
78
|
+
readonly STATUS: (projectId: string) => string;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* 헬스체크 엔드포인트
|
|
82
|
+
*/
|
|
83
|
+
export declare const HEALTH_ENDPOINTS: {
|
|
84
|
+
/** 서버 상태 확인 */
|
|
85
|
+
readonly CHECK: "/api/health";
|
|
86
|
+
/** 상세 상태 (인증 필요) */
|
|
87
|
+
readonly DETAIL: "/api/health/detail";
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* 전체 URL 생성 헬퍼
|
|
91
|
+
* @param serverUrl 서버 기본 URL
|
|
92
|
+
* @param endpoint 엔드포인트 경로
|
|
93
|
+
* @returns 전체 URL
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildUrl(serverUrl: string, endpoint: string): string;
|
|
96
|
+
/**
|
|
97
|
+
* 쿼리 파라미터 추가 헬퍼
|
|
98
|
+
* @param url 기본 URL
|
|
99
|
+
* @param params 쿼리 파라미터 객체
|
|
100
|
+
* @returns 쿼리 파라미터가 추가된 URL
|
|
101
|
+
*/
|
|
102
|
+
export declare function withQueryParams(url: string, params: Record<string, string | number | boolean | undefined>): string;
|
|
103
|
+
/**
|
|
104
|
+
* 프로젝트 URL에서 서버 URL과 프로젝트 ID 추출
|
|
105
|
+
* @param projectUrl 프로젝트 URL (예: https://aiag-adp.example.com/projects/abc123)
|
|
106
|
+
* @returns { serverUrl, projectId } 또는 null (파싱 실패 시)
|
|
107
|
+
*/
|
|
108
|
+
export declare function parseProjectUrl(projectUrl: string): {
|
|
109
|
+
serverUrl: string;
|
|
110
|
+
projectId: string;
|
|
111
|
+
} | null;
|
|
112
|
+
//# sourceMappingURL=endpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/api/endpoints.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,WAAW,OAAO,CAAC;AAEhC;;GAEG;AACH,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB,oBAAoB;;IAGpB,oBAAoB;;IAGpB,YAAY;;IAGZ,oBAAoB;;IAGpB,gBAAgB;;CAER,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,iBAAiB;IAC5B,cAAc;;IAGd,sBAAsB;iCACF,MAAM;IAE1B,cAAc;;IAGd,sBAAsB;iCACF,MAAM;IAE1B,sBAAsB;iCACF,MAAM;CAClB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe;IAC1B,mBAAmB;kCACE,MAAM;IAE3B,oBAAoB;uCACM,MAAM;IAGhC,4BAA4B;gCACT,MAAM;IAEzB,8BAA8B;kCACT,MAAM;IAE3B,iBAAiB;mCACK,MAAM;IAE5B,oBAAoB;8BACH,MAAM;IAEvB,oBAAoB;+BACF,MAAM;IAExB,YAAY;wCACe,MAAM;IAGjC,YAAY;sCACa,MAAM;IAG/B,eAAe;mCACO,MAAM;IAE5B,wBAAwB;iCACJ,MAAM;CAClB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,cAAc;IACzB,kBAAkB;mCACI,MAAM;IAE5B,gBAAgB;iCACI,MAAM;CAClB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,gBAAgB;IAC3B,eAAe;;IAGf,oBAAoB;;CAEZ,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,GAC5D,MAAM,CAgBR;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,GACjB;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwBjD"}
|