a2a-memory 0.10.11 → 0.10.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2a/client.d.ts +53 -0
- package/dist/a2a/client.d.ts.map +1 -0
- package/dist/a2a/client.js +252 -0
- package/dist/a2a/client.js.map +1 -0
- package/dist/a2a/discovery.d.ts +45 -0
- package/dist/a2a/discovery.d.ts.map +1 -0
- package/dist/a2a/discovery.js +115 -0
- package/dist/a2a/discovery.js.map +1 -0
- package/dist/a2a/index.d.ts +10 -0
- package/dist/a2a/index.d.ts.map +1 -0
- package/dist/a2a/index.js +8 -0
- package/dist/a2a/index.js.map +1 -0
- package/dist/a2a/types.d.ts +177 -0
- package/dist/a2a/types.d.ts.map +1 -0
- package/dist/a2a/types.js +42 -0
- package/dist/a2a/types.js.map +1 -0
- package/dist/sync/queue.d.ts +9 -0
- package/dist/sync/queue.d.ts.map +1 -1
- package/dist/sync/queue.js +50 -20
- package/dist/sync/queue.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol JSON-RPC 2.0 Client
|
|
3
|
+
* Google A2A Protocol RC v1.0 준수
|
|
4
|
+
*/
|
|
5
|
+
import type { A2AProtocolClientConfig, MessageSendParams, TaskGetParams, TaskCancelParams, TaskData, A2AMethod, StreamCallbacks } from './types.js';
|
|
6
|
+
export declare class A2AProtocolClient {
|
|
7
|
+
private config;
|
|
8
|
+
private timeout;
|
|
9
|
+
private requestId;
|
|
10
|
+
constructor(config: A2AProtocolClientConfig);
|
|
11
|
+
/**
|
|
12
|
+
* message/send — 동기 메시지 전송
|
|
13
|
+
*/
|
|
14
|
+
messageSend(params: MessageSendParams): Promise<TaskData>;
|
|
15
|
+
/**
|
|
16
|
+
* message/send with text shorthand
|
|
17
|
+
*/
|
|
18
|
+
sendText(taskId: string, text: string, sessionId?: string): Promise<TaskData>;
|
|
19
|
+
/**
|
|
20
|
+
* message/send with data shorthand
|
|
21
|
+
*/
|
|
22
|
+
sendData(taskId: string, data: Record<string, unknown>, sessionId?: string): Promise<TaskData>;
|
|
23
|
+
/**
|
|
24
|
+
* tasks/get — Task 상태 조회
|
|
25
|
+
*/
|
|
26
|
+
tasksGet(params: TaskGetParams): Promise<TaskData>;
|
|
27
|
+
/**
|
|
28
|
+
* tasks/cancel — Task 취소
|
|
29
|
+
*/
|
|
30
|
+
tasksCancel(params: TaskCancelParams): Promise<TaskData>;
|
|
31
|
+
/**
|
|
32
|
+
* message/stream — SSE 스트리밍 메시지 전송
|
|
33
|
+
* Node.js 환경에서 fetch + ReadableStream 사용
|
|
34
|
+
*/
|
|
35
|
+
messageStream(params: MessageSendParams, callbacks: StreamCallbacks): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* JSON-RPC 2.0 호출 (재시도 포함)
|
|
38
|
+
*/
|
|
39
|
+
rpcCall<T>(method: A2AMethod, params: Record<string, any>): Promise<T>;
|
|
40
|
+
private buildRequest;
|
|
41
|
+
private getEndpoint;
|
|
42
|
+
private getHeaders;
|
|
43
|
+
private executeRpc;
|
|
44
|
+
private processSSEStream;
|
|
45
|
+
private dispatchSSEEvent;
|
|
46
|
+
}
|
|
47
|
+
export declare class A2AProtocolError extends Error {
|
|
48
|
+
readonly code: number;
|
|
49
|
+
readonly data?: unknown;
|
|
50
|
+
readonly retryable: boolean;
|
|
51
|
+
constructor(message: string, code: number, data?: unknown, retryable?: boolean);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,uBAAuB,EACvB,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,SAAS,EACT,eAAe,EAMhB,MAAM,YAAY,CAAC;AAMpB,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAK;gBAEV,MAAM,EAAE,uBAAuB;IAO3C;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI/D;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAQnF;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC;IAQpB;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIxD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI9D;;;OAGG;IACG,aAAa,CACjB,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC;IAwChB;;OAEG;IAEG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IA2B5E,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,UAAU;YAgBJ,UAAU;YAiEV,gBAAgB;IAyC9B,OAAO,CAAC,gBAAgB;CAwBzB;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;gBAEhB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,SAAS,UAAQ;CAO7E"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol JSON-RPC 2.0 Client
|
|
3
|
+
* Google A2A Protocol RC v1.0 준수
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
6
|
+
const MAX_RETRIES = 3;
|
|
7
|
+
const RETRY_BASE_MS = 1000;
|
|
8
|
+
export class A2AProtocolClient {
|
|
9
|
+
config;
|
|
10
|
+
timeout;
|
|
11
|
+
requestId = 0;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.timeout = config.timeout ?? DEFAULT_TIMEOUT;
|
|
15
|
+
}
|
|
16
|
+
// ─── Public API ─────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* message/send — 동기 메시지 전송
|
|
19
|
+
*/
|
|
20
|
+
async messageSend(params) {
|
|
21
|
+
return this.rpcCall('message/send', params);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* message/send with text shorthand
|
|
25
|
+
*/
|
|
26
|
+
async sendText(taskId, text, sessionId) {
|
|
27
|
+
const message = {
|
|
28
|
+
role: 'user',
|
|
29
|
+
parts: [{ type: 'text', text }],
|
|
30
|
+
};
|
|
31
|
+
return this.messageSend({ id: taskId, sessionId, message });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* message/send with data shorthand
|
|
35
|
+
*/
|
|
36
|
+
async sendData(taskId, data, sessionId) {
|
|
37
|
+
const message = {
|
|
38
|
+
role: 'user',
|
|
39
|
+
parts: [{ type: 'data', data }],
|
|
40
|
+
};
|
|
41
|
+
return this.messageSend({ id: taskId, sessionId, message });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* tasks/get — Task 상태 조회
|
|
45
|
+
*/
|
|
46
|
+
async tasksGet(params) {
|
|
47
|
+
return this.rpcCall('tasks/get', params);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* tasks/cancel — Task 취소
|
|
51
|
+
*/
|
|
52
|
+
async tasksCancel(params) {
|
|
53
|
+
return this.rpcCall('tasks/cancel', params);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* message/stream — SSE 스트리밍 메시지 전송
|
|
57
|
+
* Node.js 환경에서 fetch + ReadableStream 사용
|
|
58
|
+
*/
|
|
59
|
+
async messageStream(params, callbacks) {
|
|
60
|
+
const request = this.buildRequest('message/stream', params);
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const timer = setTimeout(() => controller.abort(), this.timeout * 3); // 스트리밍은 3배 타임아웃
|
|
63
|
+
try {
|
|
64
|
+
const response = await fetch(this.getEndpoint(), {
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: this.getHeaders(),
|
|
67
|
+
body: JSON.stringify(request),
|
|
68
|
+
signal: controller.signal,
|
|
69
|
+
});
|
|
70
|
+
if (!response.ok) {
|
|
71
|
+
throw new A2AProtocolError(`Stream request failed: ${response.status}`, -32603);
|
|
72
|
+
}
|
|
73
|
+
if (!response.body) {
|
|
74
|
+
throw new A2AProtocolError('No response body for streaming', -32603);
|
|
75
|
+
}
|
|
76
|
+
await this.processSSEStream(response.body, callbacks);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
if (error instanceof A2AProtocolError) {
|
|
80
|
+
callbacks.onError?.(error);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
84
|
+
callbacks.onError?.(new A2AProtocolError(`Stream error: ${msg}`, -32603));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
clearTimeout(timer);
|
|
89
|
+
callbacks.onComplete?.();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// ─── JSON-RPC Core ──────────────────────────────────────
|
|
93
|
+
/**
|
|
94
|
+
* JSON-RPC 2.0 호출 (재시도 포함)
|
|
95
|
+
*/
|
|
96
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
97
|
+
async rpcCall(method, params) {
|
|
98
|
+
const request = this.buildRequest(method, params);
|
|
99
|
+
let lastError = null;
|
|
100
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
101
|
+
try {
|
|
102
|
+
return await this.executeRpc(request);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
106
|
+
if (error instanceof A2AProtocolError && !error.retryable) {
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
if (attempt < MAX_RETRIES) {
|
|
110
|
+
const delay = RETRY_BASE_MS * Math.pow(2, attempt);
|
|
111
|
+
await new Promise((r) => setTimeout(r, delay));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
throw lastError ?? new A2AProtocolError('Unknown error', -32603);
|
|
116
|
+
}
|
|
117
|
+
// ─── Internals ──────────────────────────────────────────
|
|
118
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
119
|
+
buildRequest(method, params) {
|
|
120
|
+
return {
|
|
121
|
+
jsonrpc: '2.0',
|
|
122
|
+
method,
|
|
123
|
+
params,
|
|
124
|
+
id: ++this.requestId,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
getEndpoint() {
|
|
128
|
+
return `${this.config.baseUrl.replace(/\/+$/, '')}/a2a/jsonrpc`;
|
|
129
|
+
}
|
|
130
|
+
getHeaders() {
|
|
131
|
+
const headers = {
|
|
132
|
+
'Content-Type': 'application/json',
|
|
133
|
+
Accept: 'application/json',
|
|
134
|
+
};
|
|
135
|
+
if (this.config.apiKey) {
|
|
136
|
+
headers['X-API-Key'] = this.config.apiKey;
|
|
137
|
+
}
|
|
138
|
+
if (this.config.jwtToken) {
|
|
139
|
+
headers['Authorization'] = `Bearer ${this.config.jwtToken}`;
|
|
140
|
+
}
|
|
141
|
+
return headers;
|
|
142
|
+
}
|
|
143
|
+
async executeRpc(request) {
|
|
144
|
+
const controller = new AbortController();
|
|
145
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
146
|
+
try {
|
|
147
|
+
const response = await fetch(this.getEndpoint(), {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
headers: this.getHeaders(),
|
|
150
|
+
body: JSON.stringify(request),
|
|
151
|
+
signal: controller.signal,
|
|
152
|
+
});
|
|
153
|
+
// JSON-RPC는 항상 200 반환 (에러도 200 + error 필드)
|
|
154
|
+
// 단, 서버 에러(5xx)는 재시도
|
|
155
|
+
if (response.status >= 500) {
|
|
156
|
+
throw new A2AProtocolError(`Server error: ${response.status}`, -32603, undefined, true);
|
|
157
|
+
}
|
|
158
|
+
if (response.status === 401 || response.status === 403) {
|
|
159
|
+
throw new A2AProtocolError(`Authentication failed: ${response.status}`, -32603, undefined, false);
|
|
160
|
+
}
|
|
161
|
+
const rpcResponse = (await response.json());
|
|
162
|
+
if (rpcResponse.error) {
|
|
163
|
+
const retryable = rpcResponse.error.code === -32603; // Internal error만 재시도
|
|
164
|
+
throw new A2AProtocolError(rpcResponse.error.message, rpcResponse.error.code, rpcResponse.error.data, retryable);
|
|
165
|
+
}
|
|
166
|
+
return rpcResponse.result;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
if (error instanceof A2AProtocolError)
|
|
170
|
+
throw error;
|
|
171
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
172
|
+
if (message.includes('abort')) {
|
|
173
|
+
throw new A2AProtocolError('Request timeout', -32603, undefined, true);
|
|
174
|
+
}
|
|
175
|
+
// 네트워크 에러는 재시도 가능
|
|
176
|
+
throw new A2AProtocolError(`Network error: ${message}`, -32603, undefined, true);
|
|
177
|
+
}
|
|
178
|
+
finally {
|
|
179
|
+
clearTimeout(timer);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async processSSEStream(body, callbacks) {
|
|
183
|
+
const reader = body.getReader();
|
|
184
|
+
const decoder = new TextDecoder();
|
|
185
|
+
let buffer = '';
|
|
186
|
+
let currentEvent = '';
|
|
187
|
+
let currentData = '';
|
|
188
|
+
try {
|
|
189
|
+
while (true) {
|
|
190
|
+
const { done, value } = await reader.read();
|
|
191
|
+
if (done)
|
|
192
|
+
break;
|
|
193
|
+
buffer += decoder.decode(value, { stream: true });
|
|
194
|
+
const lines = buffer.split('\n');
|
|
195
|
+
buffer = lines.pop() ?? '';
|
|
196
|
+
for (const line of lines) {
|
|
197
|
+
if (line.startsWith('event:')) {
|
|
198
|
+
currentEvent = line.slice(6).trim();
|
|
199
|
+
}
|
|
200
|
+
else if (line.startsWith('data:')) {
|
|
201
|
+
currentData = line.slice(5).trim();
|
|
202
|
+
}
|
|
203
|
+
else if (line === '' && currentEvent && currentData) {
|
|
204
|
+
this.dispatchSSEEvent(currentEvent, currentData, callbacks);
|
|
205
|
+
currentEvent = '';
|
|
206
|
+
currentData = '';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// 잔여 버퍼 처리
|
|
211
|
+
if (currentEvent && currentData) {
|
|
212
|
+
this.dispatchSSEEvent(currentEvent, currentData, callbacks);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
reader.releaseLock();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
dispatchSSEEvent(eventType, data, callbacks) {
|
|
220
|
+
try {
|
|
221
|
+
const parsed = JSON.parse(data);
|
|
222
|
+
if (eventType === 'TaskStatusUpdateEvent') {
|
|
223
|
+
const event = parsed;
|
|
224
|
+
callbacks.onStatusUpdate?.(event);
|
|
225
|
+
if (event.final) {
|
|
226
|
+
callbacks.onComplete?.();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else if (eventType === 'TaskArtifactUpdateEvent') {
|
|
230
|
+
const event = parsed;
|
|
231
|
+
callbacks.onArtifactUpdate?.(event);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
236
|
+
callbacks.onError?.(new Error(`SSE parse error: ${msg}`));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
export class A2AProtocolError extends Error {
|
|
241
|
+
code;
|
|
242
|
+
data;
|
|
243
|
+
retryable;
|
|
244
|
+
constructor(message, code, data, retryable = false) {
|
|
245
|
+
super(message);
|
|
246
|
+
this.name = 'A2AProtocolError';
|
|
247
|
+
this.code = code;
|
|
248
|
+
this.data = data;
|
|
249
|
+
this.retryable = retryable;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/a2a/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAA0B;IAChC,OAAO,CAAS;IAChB,SAAS,GAAG,CAAC,CAAC;IAEtB,YAAY,MAA+B;QACzC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,eAAe,CAAC;IACnD,CAAC;IAED,2DAA2D;IAE3D;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,OAAO,IAAI,CAAC,OAAO,CAAW,cAAc,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,SAAkB;QAC7D,MAAM,OAAO,GAAY;YACvB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAc,CAAC;SAC5C,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,IAA6B,EAC7B,SAAkB;QAElB,MAAM,OAAO,GAAY;YACvB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAc,CAAC;SAC5C,CAAC;QACF,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAqB;QAClC,OAAO,IAAI,CAAC,OAAO,CAAW,WAAW,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAwB;QACxC,OAAO,IAAI,CAAC,OAAO,CAAW,cAAc,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CACjB,MAAyB,EACzB,SAA0B;QAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,gBAAgB,EAAE,MAA6B,CAAC,CAAC;QACnF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB;QAEtF,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBAC/C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,gBAAgB,CACxB,0BAA0B,QAAQ,CAAC,MAAM,EAAE,EAC3C,CAAC,KAAK,CACP,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,gBAAgB,CAAC,gCAAgC,EAAE,CAAC,KAAK,CAAC,CAAC;YACvE,CAAC;YAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;gBACtC,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,gBAAgB,CAAC,iBAAiB,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,2DAA2D;IAE3D;;OAEG;IACH,8DAA8D;IAC9D,KAAK,CAAC,OAAO,CAAI,MAAiB,EAAE,MAA2B;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,SAAS,GAAiB,IAAI,CAAC;QAEnC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,CAAC,UAAU,CAAI,OAAO,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBAEtE,IAAI,KAAK,YAAY,gBAAgB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBAC1D,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,OAAO,GAAG,WAAW,EAAE,CAAC;oBAC1B,MAAM,KAAK,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBACnD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,SAAS,IAAI,IAAI,gBAAgB,CAAC,eAAe,EAAE,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,2DAA2D;IAE3D,8DAA8D;IACtD,YAAY,CAAC,MAAc,EAAE,MAA2B;QAC9D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM;YACN,MAAM;YACN,EAAE,EAAE,EAAE,IAAI,CAAC,SAAS;SACrB,CAAC;IACJ,CAAC;IAEO,WAAW;QACjB,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC;IAClE,CAAC;IAEO,UAAU;QAChB,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9D,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,UAAU,CAAI,OAAuB;QACjD,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBAC/C,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;gBAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,2CAA2C;YAC3C,qBAAqB;YACrB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,IAAI,gBAAgB,CACxB,iBAAiB,QAAQ,CAAC,MAAM,EAAE,EAClC,CAAC,KAAK,EACN,SAAS,EACT,IAAI,CACL,CAAC;YACJ,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBACvD,MAAM,IAAI,gBAAgB,CACxB,0BAA0B,QAAQ,CAAC,MAAM,EAAE,EAC3C,CAAC,KAAK,EACN,SAAS,EACT,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,WAAW,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;YAElE,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,sBAAsB;gBAC3E,MAAM,IAAI,gBAAgB,CACxB,WAAW,CAAC,KAAK,CAAC,OAAO,EACzB,WAAW,CAAC,KAAK,CAAC,IAAI,EACtB,WAAW,CAAC,KAAK,CAAC,IAAI,EACtB,SAAS,CACV,CAAC;YACJ,CAAC;YAED,OAAO,WAAW,CAAC,MAAW,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAgB;gBAAE,MAAM,KAAK,CAAC;YAEnD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YACzE,CAAC;YAED,kBAAkB;YAClB,MAAM,IAAI,gBAAgB,CACxB,kBAAkB,OAAO,EAAE,EAC3B,CAAC,KAAK,EACN,SAAS,EACT,IAAI,CACL,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,IAAgC,EAChC,SAA0B;QAE1B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtC,CAAC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;wBACpC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACrC,CAAC;yBAAM,IAAI,IAAI,KAAK,EAAE,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;wBACtD,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;wBAC5D,YAAY,GAAG,EAAE,CAAC;wBAClB,WAAW,GAAG,EAAE,CAAC;oBACnB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,WAAW;YACX,IAAI,YAAY,IAAI,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEO,gBAAgB,CACtB,SAAiB,EACjB,IAAY,EACZ,SAA0B;QAE1B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhC,IAAI,SAAS,KAAK,uBAAuB,EAAE,CAAC;gBAC1C,MAAM,KAAK,GAAG,MAA+B,CAAC;gBAC9C,SAAS,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;gBAElC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,SAAS,CAAC,UAAU,EAAE,EAAE,CAAC;gBAC3B,CAAC;YACH,CAAC;iBAAM,IAAI,SAAS,KAAK,yBAAyB,EAAE,CAAC;gBACnD,MAAM,KAAK,GAAG,MAAiC,CAAC;gBAChD,SAAS,CAAC,gBAAgB,EAAE,CAAC,KAAK,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnE,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAChC,IAAI,CAAS;IACb,IAAI,CAAW;IACf,SAAS,CAAU;IAE5B,YAAY,OAAe,EAAE,IAAY,EAAE,IAAc,EAAE,SAAS,GAAG,KAAK;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Agent Discovery
|
|
3
|
+
* .well-known/agent.json 기반 AgentCard 자동 발견 + 캐싱
|
|
4
|
+
*/
|
|
5
|
+
import type { AgentCard } from './types.js';
|
|
6
|
+
export interface DiscoveryOptions {
|
|
7
|
+
timeout?: number;
|
|
8
|
+
cacheTtlMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare class AgentDiscovery {
|
|
11
|
+
private cache;
|
|
12
|
+
private timeout;
|
|
13
|
+
private cacheTtlMs;
|
|
14
|
+
constructor(options?: DiscoveryOptions);
|
|
15
|
+
/**
|
|
16
|
+
* .well-known/agent.json에서 AgentCard를 가져온다.
|
|
17
|
+
* 캐시가 유효하면 캐시를 반환한다.
|
|
18
|
+
*/
|
|
19
|
+
discover(baseUrl: string): Promise<AgentCard>;
|
|
20
|
+
/**
|
|
21
|
+
* 캐시된 AgentCard를 반환 (없으면 null)
|
|
22
|
+
*/
|
|
23
|
+
getCached(baseUrl: string): AgentCard | null;
|
|
24
|
+
/**
|
|
25
|
+
* 특정 스킬 ID를 지원하는지 확인
|
|
26
|
+
*/
|
|
27
|
+
hasSkill(card: AgentCard, skillId: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 태그로 스킬 검색
|
|
30
|
+
*/
|
|
31
|
+
findSkillsByTag(card: AgentCard, tag: string): AgentCard['skills'];
|
|
32
|
+
/**
|
|
33
|
+
* 캐시 무효화
|
|
34
|
+
*/
|
|
35
|
+
invalidate(baseUrl?: string): void;
|
|
36
|
+
/**
|
|
37
|
+
* AgentCard 필수 필드 검증
|
|
38
|
+
*/
|
|
39
|
+
private validateCard;
|
|
40
|
+
}
|
|
41
|
+
export declare class AgentDiscoveryError extends Error {
|
|
42
|
+
readonly agentUrl: string;
|
|
43
|
+
constructor(message: string, agentUrl: string);
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/a2a/discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,CAAC,EAAE,gBAAgB;IAKtC;;;OAGG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IA2CnD;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAW5C;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC;IAIlE;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAQlC;;OAEG;IACH,OAAO,CAAC,YAAY;CAcrB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;CAK9C"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Agent Discovery
|
|
3
|
+
* .well-known/agent.json 기반 AgentCard 자동 발견 + 캐싱
|
|
4
|
+
*/
|
|
5
|
+
const DEFAULT_TIMEOUT = 10000;
|
|
6
|
+
const DEFAULT_CACHE_TTL = 5 * 60 * 1000; // 5분
|
|
7
|
+
export class AgentDiscovery {
|
|
8
|
+
cache = new Map();
|
|
9
|
+
timeout;
|
|
10
|
+
cacheTtlMs;
|
|
11
|
+
constructor(options) {
|
|
12
|
+
this.timeout = options?.timeout ?? DEFAULT_TIMEOUT;
|
|
13
|
+
this.cacheTtlMs = options?.cacheTtlMs ?? DEFAULT_CACHE_TTL;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* .well-known/agent.json에서 AgentCard를 가져온다.
|
|
17
|
+
* 캐시가 유효하면 캐시를 반환한다.
|
|
18
|
+
*/
|
|
19
|
+
async discover(baseUrl) {
|
|
20
|
+
const normalizedUrl = baseUrl.replace(/\/+$/, '');
|
|
21
|
+
const cached = this.cache.get(normalizedUrl);
|
|
22
|
+
if (cached && Date.now() - cached.fetchedAt < this.cacheTtlMs) {
|
|
23
|
+
return cached.card;
|
|
24
|
+
}
|
|
25
|
+
const wellKnownUrl = `${normalizedUrl}/.well-known/agent.json`;
|
|
26
|
+
const controller = new AbortController();
|
|
27
|
+
const timer = setTimeout(() => controller.abort(), this.timeout);
|
|
28
|
+
try {
|
|
29
|
+
const response = await fetch(wellKnownUrl, {
|
|
30
|
+
method: 'GET',
|
|
31
|
+
headers: { Accept: 'application/json' },
|
|
32
|
+
signal: controller.signal,
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw new AgentDiscoveryError(`AgentCard fetch failed: ${response.status} ${response.statusText}`, normalizedUrl);
|
|
36
|
+
}
|
|
37
|
+
const card = (await response.json());
|
|
38
|
+
this.validateCard(card);
|
|
39
|
+
this.cache.set(normalizedUrl, { card, fetchedAt: Date.now() });
|
|
40
|
+
return card;
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
if (error instanceof AgentDiscoveryError)
|
|
44
|
+
throw error;
|
|
45
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
46
|
+
throw new AgentDiscoveryError(`AgentCard discovery failed: ${message}`, normalizedUrl);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 캐시된 AgentCard를 반환 (없으면 null)
|
|
54
|
+
*/
|
|
55
|
+
getCached(baseUrl) {
|
|
56
|
+
const normalizedUrl = baseUrl.replace(/\/+$/, '');
|
|
57
|
+
const cached = this.cache.get(normalizedUrl);
|
|
58
|
+
if (!cached)
|
|
59
|
+
return null;
|
|
60
|
+
if (Date.now() - cached.fetchedAt >= this.cacheTtlMs) {
|
|
61
|
+
this.cache.delete(normalizedUrl);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
return cached.card;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 특정 스킬 ID를 지원하는지 확인
|
|
68
|
+
*/
|
|
69
|
+
hasSkill(card, skillId) {
|
|
70
|
+
return card.skills.some((s) => s.id === skillId);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 태그로 스킬 검색
|
|
74
|
+
*/
|
|
75
|
+
findSkillsByTag(card, tag) {
|
|
76
|
+
return card.skills.filter((s) => s.tags?.includes(tag));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 캐시 무효화
|
|
80
|
+
*/
|
|
81
|
+
invalidate(baseUrl) {
|
|
82
|
+
if (baseUrl) {
|
|
83
|
+
this.cache.delete(baseUrl.replace(/\/+$/, ''));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.cache.clear();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* AgentCard 필수 필드 검증
|
|
91
|
+
*/
|
|
92
|
+
validateCard(card) {
|
|
93
|
+
if (!card.name || typeof card.name !== 'string') {
|
|
94
|
+
throw new AgentDiscoveryError('AgentCard missing required field: name', '');
|
|
95
|
+
}
|
|
96
|
+
if (!card.url || typeof card.url !== 'string') {
|
|
97
|
+
throw new AgentDiscoveryError('AgentCard missing required field: url', '');
|
|
98
|
+
}
|
|
99
|
+
if (!card.version || typeof card.version !== 'string') {
|
|
100
|
+
throw new AgentDiscoveryError('AgentCard missing required field: version', '');
|
|
101
|
+
}
|
|
102
|
+
if (!Array.isArray(card.skills)) {
|
|
103
|
+
throw new AgentDiscoveryError('AgentCard missing required field: skills', '');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export class AgentDiscoveryError extends Error {
|
|
108
|
+
agentUrl;
|
|
109
|
+
constructor(message, agentUrl) {
|
|
110
|
+
super(message);
|
|
111
|
+
this.name = 'AgentDiscoveryError';
|
|
112
|
+
this.agentUrl = agentUrl;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../src/a2a/discovery.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,MAAM,eAAe,GAAG,KAAK,CAAC;AAC9B,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,KAAK;AAE9C,MAAM,OAAO,cAAc;IACjB,KAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC3C,OAAO,CAAS;IAChB,UAAU,CAAS;IAE3B,YAAY,OAA0B;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,IAAI,iBAAiB,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,QAAQ,CAAC,OAAe;QAC5B,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC9D,OAAO,MAAM,CAAC,IAAI,CAAC;QACrB,CAAC;QAED,MAAM,YAAY,GAAG,GAAG,aAAa,yBAAyB,CAAC;QAC/D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,YAAY,EAAE;gBACzC,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;gBACvC,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,mBAAmB,CAC3B,2BAA2B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EACnE,aAAa,CACd,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAc,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAExB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB;gBAAE,MAAM,KAAK,CAAC;YACtD,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,IAAI,mBAAmB,CAC3B,+BAA+B,OAAO,EAAE,EACxC,aAAa,CACd,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,OAAe;QACvB,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAe,EAAE,OAAe;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAe,EAAE,GAAW;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,IAAe;QAClC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChD,MAAM,IAAI,mBAAmB,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,mBAAmB,CAAC,uCAAuC,EAAE,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,mBAAmB,CAAC,2CAA2C,EAAE,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,mBAAmB,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,QAAQ,CAAS;IAE1B,YAAY,OAAe,EAAE,QAAgB;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol Client Module
|
|
3
|
+
* Google A2A Protocol RC v1.0
|
|
4
|
+
*/
|
|
5
|
+
export { A2AProtocolClient, A2AProtocolError } from './client.js';
|
|
6
|
+
export { AgentDiscovery, AgentDiscoveryError } from './discovery.js';
|
|
7
|
+
export type { JSONRPCRequest, JSONRPCResponse, JSONRPCError, Message, MessagePart, TextPart, FilePart, DataPart, MessageRole, TaskData, TaskStatus, Artifact, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, SSEEvent, StreamCallbacks, AgentCard, AgentSkill, AgentCapabilities, AgentExtension, SecurityScheme, AgentProvider, MessageSendParams, TaskGetParams, TaskCancelParams, A2AProtocolClientConfig, } from './types.js';
|
|
8
|
+
export { JSONRPCErrorCode, TaskState, TERMINAL_STATES, EventType, } from './types.js';
|
|
9
|
+
export type { DiscoveryOptions } from './discovery.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,YAAY,EAEV,cAAc,EACd,eAAe,EACf,YAAY,EAEZ,OAAO,EACP,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EAEX,QAAQ,EACR,UAAU,EACV,QAAQ,EAER,qBAAqB,EACrB,uBAAuB,EACvB,QAAQ,EACR,eAAe,EAEf,SAAS,EACT,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,aAAa,EAEb,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAEhB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol Client Module
|
|
3
|
+
* Google A2A Protocol RC v1.0
|
|
4
|
+
*/
|
|
5
|
+
export { A2AProtocolClient, A2AProtocolError } from './client.js';
|
|
6
|
+
export { AgentDiscovery, AgentDiscoveryError } from './discovery.js';
|
|
7
|
+
export { JSONRPCErrorCode, TaskState, TERMINAL_STATES, EventType, } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/a2a/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAoCrE,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,SAAS,GACV,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol TypeScript Types
|
|
3
|
+
* Google A2A Protocol RC v1.0 준수
|
|
4
|
+
*/
|
|
5
|
+
export interface JSONRPCRequest {
|
|
6
|
+
jsonrpc: '2.0';
|
|
7
|
+
method: string;
|
|
8
|
+
params?: Record<string, unknown>;
|
|
9
|
+
id?: string | number;
|
|
10
|
+
}
|
|
11
|
+
export interface JSONRPCResponse<T = unknown> {
|
|
12
|
+
jsonrpc: '2.0';
|
|
13
|
+
result?: T;
|
|
14
|
+
error?: JSONRPCError;
|
|
15
|
+
id?: string | number;
|
|
16
|
+
}
|
|
17
|
+
export interface JSONRPCError {
|
|
18
|
+
code: number;
|
|
19
|
+
message: string;
|
|
20
|
+
data?: unknown;
|
|
21
|
+
}
|
|
22
|
+
export declare enum JSONRPCErrorCode {
|
|
23
|
+
PARSE_ERROR = -32700,
|
|
24
|
+
INVALID_REQUEST = -32600,
|
|
25
|
+
METHOD_NOT_FOUND = -32601,
|
|
26
|
+
INVALID_PARAMS = -32602,
|
|
27
|
+
INTERNAL_ERROR = -32603,
|
|
28
|
+
TASK_NOT_FOUND = -32001,
|
|
29
|
+
TASK_NOT_CANCELABLE = -32002,
|
|
30
|
+
PUSH_NOTIFICATION_NOT_SUPPORTED = -32003,
|
|
31
|
+
UNSUPPORTED_OPERATION = -32004,
|
|
32
|
+
CONTENT_TYPE_NOT_SUPPORTED = -32005,
|
|
33
|
+
INVALID_AGENT_CARD = -32006
|
|
34
|
+
}
|
|
35
|
+
export interface TextPart {
|
|
36
|
+
type: 'text';
|
|
37
|
+
text: string;
|
|
38
|
+
}
|
|
39
|
+
export interface FilePart {
|
|
40
|
+
type: 'file';
|
|
41
|
+
file: {
|
|
42
|
+
name: string;
|
|
43
|
+
mimeType: string;
|
|
44
|
+
bytes?: string;
|
|
45
|
+
uri?: string;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface DataPart {
|
|
49
|
+
type: 'data';
|
|
50
|
+
data: Record<string, unknown>;
|
|
51
|
+
}
|
|
52
|
+
export type MessagePart = TextPart | FilePart | DataPart;
|
|
53
|
+
export type MessageRole = 'user' | 'agent';
|
|
54
|
+
export interface Message {
|
|
55
|
+
role: MessageRole;
|
|
56
|
+
parts: MessagePart[];
|
|
57
|
+
metadata?: Record<string, unknown>;
|
|
58
|
+
}
|
|
59
|
+
export declare enum TaskState {
|
|
60
|
+
SUBMITTED = "submitted",
|
|
61
|
+
WORKING = "working",
|
|
62
|
+
INPUT_REQUIRED = "input-required",
|
|
63
|
+
COMPLETED = "completed",
|
|
64
|
+
FAILED = "failed",
|
|
65
|
+
CANCELED = "canceled"
|
|
66
|
+
}
|
|
67
|
+
export declare const TERMINAL_STATES: ReadonlySet<TaskState>;
|
|
68
|
+
export interface TaskStatus {
|
|
69
|
+
state: TaskState;
|
|
70
|
+
timestamp: string;
|
|
71
|
+
message?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface Artifact {
|
|
74
|
+
name: string;
|
|
75
|
+
parts: MessagePart[];
|
|
76
|
+
}
|
|
77
|
+
export interface TaskData {
|
|
78
|
+
id: string;
|
|
79
|
+
sessionId: string;
|
|
80
|
+
status: TaskStatus;
|
|
81
|
+
messages: Message[];
|
|
82
|
+
artifacts: Artifact[];
|
|
83
|
+
history: TaskStatus[];
|
|
84
|
+
metadata: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
export declare enum EventType {
|
|
87
|
+
TASK_STATUS_UPDATE = "TaskStatusUpdateEvent",
|
|
88
|
+
TASK_ARTIFACT_UPDATE = "TaskArtifactUpdateEvent"
|
|
89
|
+
}
|
|
90
|
+
export interface TaskStatusUpdateEvent {
|
|
91
|
+
id: string;
|
|
92
|
+
status: TaskStatus;
|
|
93
|
+
final: boolean;
|
|
94
|
+
}
|
|
95
|
+
export interface TaskArtifactUpdateEvent {
|
|
96
|
+
id: string;
|
|
97
|
+
artifact: Artifact;
|
|
98
|
+
}
|
|
99
|
+
export type SSEEvent = TaskStatusUpdateEvent | TaskArtifactUpdateEvent;
|
|
100
|
+
export interface AgentSkill {
|
|
101
|
+
id: string;
|
|
102
|
+
name: string;
|
|
103
|
+
description: string;
|
|
104
|
+
tags?: string[];
|
|
105
|
+
examples?: string[];
|
|
106
|
+
inputModes?: string[];
|
|
107
|
+
outputModes?: string[];
|
|
108
|
+
}
|
|
109
|
+
export interface AgentExtension {
|
|
110
|
+
uri: string;
|
|
111
|
+
description?: string;
|
|
112
|
+
params?: Record<string, unknown>;
|
|
113
|
+
required?: boolean;
|
|
114
|
+
}
|
|
115
|
+
export interface AgentCapabilities {
|
|
116
|
+
streaming?: boolean;
|
|
117
|
+
pushNotifications?: boolean;
|
|
118
|
+
stateTransitionHistory?: boolean;
|
|
119
|
+
extensions?: AgentExtension[];
|
|
120
|
+
}
|
|
121
|
+
export interface SecurityScheme {
|
|
122
|
+
type: string;
|
|
123
|
+
name?: string;
|
|
124
|
+
in?: string;
|
|
125
|
+
scheme?: string;
|
|
126
|
+
bearerFormat?: string;
|
|
127
|
+
description?: string;
|
|
128
|
+
}
|
|
129
|
+
export interface AgentProvider {
|
|
130
|
+
organization: string;
|
|
131
|
+
url: string;
|
|
132
|
+
}
|
|
133
|
+
export interface AgentCard {
|
|
134
|
+
name: string;
|
|
135
|
+
description: string;
|
|
136
|
+
url: string;
|
|
137
|
+
version: string;
|
|
138
|
+
protocolVersion?: string;
|
|
139
|
+
skills: AgentSkill[];
|
|
140
|
+
capabilities: AgentCapabilities;
|
|
141
|
+
defaultInputModes: string[];
|
|
142
|
+
defaultOutputModes: string[];
|
|
143
|
+
securitySchemes?: Record<string, SecurityScheme>;
|
|
144
|
+
security?: Array<Record<string, string[]>>;
|
|
145
|
+
provider?: AgentProvider;
|
|
146
|
+
documentationUrl?: string;
|
|
147
|
+
iconUrl?: string;
|
|
148
|
+
preferredTransport?: string;
|
|
149
|
+
supportsAuthenticatedExtendedCard?: boolean;
|
|
150
|
+
}
|
|
151
|
+
export interface MessageSendParams {
|
|
152
|
+
id: string;
|
|
153
|
+
sessionId?: string;
|
|
154
|
+
message: Message;
|
|
155
|
+
metadata?: Record<string, unknown>;
|
|
156
|
+
}
|
|
157
|
+
export interface TaskGetParams {
|
|
158
|
+
id: string;
|
|
159
|
+
historyLength?: number;
|
|
160
|
+
}
|
|
161
|
+
export interface TaskCancelParams {
|
|
162
|
+
id: string;
|
|
163
|
+
}
|
|
164
|
+
export type A2AMethod = 'message/send' | 'message/stream' | 'tasks/get' | 'tasks/cancel' | 'tasks/pushNotification/set' | 'tasks/pushNotification/get';
|
|
165
|
+
export interface A2AProtocolClientConfig {
|
|
166
|
+
baseUrl: string;
|
|
167
|
+
apiKey?: string;
|
|
168
|
+
jwtToken?: string;
|
|
169
|
+
timeout?: number;
|
|
170
|
+
}
|
|
171
|
+
export interface StreamCallbacks {
|
|
172
|
+
onStatusUpdate?: (event: TaskStatusUpdateEvent) => void;
|
|
173
|
+
onArtifactUpdate?: (event: TaskArtifactUpdateEvent) => void;
|
|
174
|
+
onError?: (error: Error) => void;
|
|
175
|
+
onComplete?: () => void;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/a2a/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,CAAC,EAAE,CAAC,CAAC;IACX,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,oBAAY,gBAAgB;IAE1B,WAAW,SAAS;IACpB,eAAe,SAAS;IACxB,gBAAgB,SAAS;IACzB,cAAc,SAAS;IACvB,cAAc,SAAS;IAGvB,cAAc,SAAS;IACvB,mBAAmB,SAAS;IAC5B,+BAA+B,SAAS;IACxC,qBAAqB,SAAS;IAC9B,0BAA0B,SAAS;IACnC,kBAAkB,SAAS;CAC5B;AAID,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAIzD,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3C,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAID,oBAAY,SAAS;IACnB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,cAAc,mBAAmB;IACjC,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,QAAQ,aAAa;CACtB;AAED,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,SAAS,CAIjD,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAID,oBAAY,SAAS;IACnB,kBAAkB,0BAA0B;IAC5C,oBAAoB,4BAA4B;CACjD;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,MAAM,QAAQ,GAAG,qBAAqB,GAAG,uBAAuB,CAAC;AAIvE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,UAAU,CAAC,EAAE,cAAc,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,YAAY,EAAE,iBAAiB,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,QAAQ,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3C,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iCAAiC,CAAC,EAAE,OAAO,CAAC;CAC7C;AAID,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAID,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,4BAA4B,GAC5B,4BAA4B,CAAC;AAIjC,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACxD,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A2A Protocol TypeScript Types
|
|
3
|
+
* Google A2A Protocol RC v1.0 준수
|
|
4
|
+
*/
|
|
5
|
+
export var JSONRPCErrorCode;
|
|
6
|
+
(function (JSONRPCErrorCode) {
|
|
7
|
+
// Standard JSON-RPC 2.0
|
|
8
|
+
JSONRPCErrorCode[JSONRPCErrorCode["PARSE_ERROR"] = -32700] = "PARSE_ERROR";
|
|
9
|
+
JSONRPCErrorCode[JSONRPCErrorCode["INVALID_REQUEST"] = -32600] = "INVALID_REQUEST";
|
|
10
|
+
JSONRPCErrorCode[JSONRPCErrorCode["METHOD_NOT_FOUND"] = -32601] = "METHOD_NOT_FOUND";
|
|
11
|
+
JSONRPCErrorCode[JSONRPCErrorCode["INVALID_PARAMS"] = -32602] = "INVALID_PARAMS";
|
|
12
|
+
JSONRPCErrorCode[JSONRPCErrorCode["INTERNAL_ERROR"] = -32603] = "INTERNAL_ERROR";
|
|
13
|
+
// A2A Protocol Custom
|
|
14
|
+
JSONRPCErrorCode[JSONRPCErrorCode["TASK_NOT_FOUND"] = -32001] = "TASK_NOT_FOUND";
|
|
15
|
+
JSONRPCErrorCode[JSONRPCErrorCode["TASK_NOT_CANCELABLE"] = -32002] = "TASK_NOT_CANCELABLE";
|
|
16
|
+
JSONRPCErrorCode[JSONRPCErrorCode["PUSH_NOTIFICATION_NOT_SUPPORTED"] = -32003] = "PUSH_NOTIFICATION_NOT_SUPPORTED";
|
|
17
|
+
JSONRPCErrorCode[JSONRPCErrorCode["UNSUPPORTED_OPERATION"] = -32004] = "UNSUPPORTED_OPERATION";
|
|
18
|
+
JSONRPCErrorCode[JSONRPCErrorCode["CONTENT_TYPE_NOT_SUPPORTED"] = -32005] = "CONTENT_TYPE_NOT_SUPPORTED";
|
|
19
|
+
JSONRPCErrorCode[JSONRPCErrorCode["INVALID_AGENT_CARD"] = -32006] = "INVALID_AGENT_CARD";
|
|
20
|
+
})(JSONRPCErrorCode || (JSONRPCErrorCode = {}));
|
|
21
|
+
// ─── Task ───────────────────────────────────────────────────
|
|
22
|
+
export var TaskState;
|
|
23
|
+
(function (TaskState) {
|
|
24
|
+
TaskState["SUBMITTED"] = "submitted";
|
|
25
|
+
TaskState["WORKING"] = "working";
|
|
26
|
+
TaskState["INPUT_REQUIRED"] = "input-required";
|
|
27
|
+
TaskState["COMPLETED"] = "completed";
|
|
28
|
+
TaskState["FAILED"] = "failed";
|
|
29
|
+
TaskState["CANCELED"] = "canceled";
|
|
30
|
+
})(TaskState || (TaskState = {}));
|
|
31
|
+
export const TERMINAL_STATES = new Set([
|
|
32
|
+
TaskState.COMPLETED,
|
|
33
|
+
TaskState.FAILED,
|
|
34
|
+
TaskState.CANCELED,
|
|
35
|
+
]);
|
|
36
|
+
// ─── SSE Events ─────────────────────────────────────────────
|
|
37
|
+
export var EventType;
|
|
38
|
+
(function (EventType) {
|
|
39
|
+
EventType["TASK_STATUS_UPDATE"] = "TaskStatusUpdateEvent";
|
|
40
|
+
EventType["TASK_ARTIFACT_UPDATE"] = "TaskArtifactUpdateEvent";
|
|
41
|
+
})(EventType || (EventType = {}));
|
|
42
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/a2a/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,MAAM,CAAN,IAAY,gBAeX;AAfD,WAAY,gBAAgB;IAC1B,wBAAwB;IACxB,0EAAoB,CAAA;IACpB,kFAAwB,CAAA;IACxB,oFAAyB,CAAA;IACzB,gFAAuB,CAAA;IACvB,gFAAuB,CAAA;IAEvB,sBAAsB;IACtB,gFAAuB,CAAA;IACvB,0FAA4B,CAAA;IAC5B,kHAAwC,CAAA;IACxC,8FAA8B,CAAA;IAC9B,wGAAmC,CAAA;IACnC,wFAA2B,CAAA;AAC7B,CAAC,EAfW,gBAAgB,KAAhB,gBAAgB,QAe3B;AAoCD,+DAA+D;AAE/D,MAAM,CAAN,IAAY,SAOX;AAPD,WAAY,SAAS;IACnB,oCAAuB,CAAA;IACvB,gCAAmB,CAAA;IACnB,8CAAiC,CAAA;IACjC,oCAAuB,CAAA;IACvB,8BAAiB,CAAA;IACjB,kCAAqB,CAAA;AACvB,CAAC,EAPW,SAAS,KAAT,SAAS,QAOpB;AAED,MAAM,CAAC,MAAM,eAAe,GAA2B,IAAI,GAAG,CAAC;IAC7D,SAAS,CAAC,SAAS;IACnB,SAAS,CAAC,MAAM;IAChB,SAAS,CAAC,QAAQ;CACnB,CAAC,CAAC;AAuBH,+DAA+D;AAE/D,MAAM,CAAN,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,yDAA4C,CAAA;IAC5C,6DAAgD,CAAA;AAClD,CAAC,EAHW,SAAS,KAAT,SAAS,QAGpB"}
|
package/dist/sync/queue.d.ts
CHANGED
|
@@ -36,8 +36,17 @@ export declare class SyncQueue {
|
|
|
36
36
|
/**
|
|
37
37
|
* pending 메모리를 배치로 일괄 push (100개씩)
|
|
38
38
|
* 중복 제거: pending 내부 중복만 제거 (서버 측에서 synced 대비 중복은 처리)
|
|
39
|
+
*
|
|
40
|
+
* Parent-Child FK 안전:
|
|
41
|
+
* 1단계 — Parent (parentId 없는 항목) push → remote_id 획득
|
|
42
|
+
* 2단계 — Children의 parentId를 remote parent_id로 변환 후 push
|
|
39
43
|
*/
|
|
40
44
|
flush(options?: FlushOptions): Promise<QueueFlushResult>;
|
|
45
|
+
/**
|
|
46
|
+
* 배치 단위 push 공통 로직
|
|
47
|
+
* parentRemoteMap: push 성공 시 local_id→remote_id 매핑 업데이트 (Phase 1→Phase 2 전달용)
|
|
48
|
+
*/
|
|
49
|
+
private pushBatches;
|
|
41
50
|
/**
|
|
42
51
|
* 미동기화 tombstone을 원격 서버에서 삭제
|
|
43
52
|
*/
|
package/dist/sync/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/sync/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAE5D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEhD;AASD,qBAAa,SAAS;IAElB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;gBADN,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,SAAS;IAG3B;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/sync/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAcD;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAE5D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEhD;AASD,qBAAa,SAAS;IAElB,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,MAAM;gBADN,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,SAAS;IAG3B;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/B;;;;;;;OAOG;IACG,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkE9D;;;OAGG;YACW,WAAW;IAqDzB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAgCvE;;OAEG;IACH,eAAe,IAAI,MAAM;CAI1B"}
|
package/dist/sync/queue.js
CHANGED
|
@@ -48,6 +48,10 @@ export class SyncQueue {
|
|
|
48
48
|
/**
|
|
49
49
|
* pending 메모리를 배치로 일괄 push (100개씩)
|
|
50
50
|
* 중복 제거: pending 내부 중복만 제거 (서버 측에서 synced 대비 중복은 처리)
|
|
51
|
+
*
|
|
52
|
+
* Parent-Child FK 안전:
|
|
53
|
+
* 1단계 — Parent (parentId 없는 항목) push → remote_id 획득
|
|
54
|
+
* 2단계 — Children의 parentId를 remote parent_id로 변환 후 push
|
|
51
55
|
*/
|
|
52
56
|
async flush(options) {
|
|
53
57
|
const startTime = Date.now();
|
|
@@ -76,37 +80,66 @@ export class SyncQueue {
|
|
|
76
80
|
pendingHashes.set(hash, m.id);
|
|
77
81
|
return true;
|
|
78
82
|
});
|
|
79
|
-
// Parent
|
|
80
|
-
|
|
81
|
-
dedupedPending.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
83
|
+
// Parent/독립 메모리와 Children 분리
|
|
84
|
+
const parents = dedupedPending.filter(m => !m.parentId);
|
|
85
|
+
const children = dedupedPending.filter(m => !!m.parentId);
|
|
86
|
+
// local parent_id → remote parent_id 매핑
|
|
87
|
+
// 이미 synced된 parent의 remote_id를 미리 조회
|
|
88
|
+
const parentRemoteMap = new Map();
|
|
89
|
+
for (const child of children) {
|
|
90
|
+
if (child.parentId && !parentRemoteMap.has(child.parentId)) {
|
|
91
|
+
const parentSync = this.db.getSyncStatus(child.parentId);
|
|
92
|
+
if (parentSync?.remoteId) {
|
|
93
|
+
parentRemoteMap.set(child.parentId, parentSync.remoteId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// ── Phase 1: Parents + 독립 메모리 push ──
|
|
98
|
+
await this.pushBatches(parents, BATCH_SIZE, startTime, timeoutMs, result, parentRemoteMap);
|
|
99
|
+
// ── Phase 2: Children push (parent_id → remote_id 변환) ──
|
|
100
|
+
if (children.length > 0 && (timeoutMs === 0 || Date.now() - startTime < timeoutMs)) {
|
|
101
|
+
// 매핑 불가능한 children은 pending 유지
|
|
102
|
+
const mappable = children.filter(m => parentRemoteMap.has(m.parentId));
|
|
103
|
+
const unmappable = children.filter(m => !parentRemoteMap.has(m.parentId));
|
|
104
|
+
if (unmappable.length > 0) {
|
|
105
|
+
result.errors.push(`${unmappable.length}개 child — parent remote_id 미확인 (다음 flush에서 재시도)`);
|
|
106
|
+
}
|
|
107
|
+
await this.pushBatches(mappable, BATCH_SIZE, startTime, timeoutMs, result, parentRemoteMap);
|
|
108
|
+
}
|
|
109
|
+
result.duration = Date.now() - startTime;
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* 배치 단위 push 공통 로직
|
|
114
|
+
* parentRemoteMap: push 성공 시 local_id→remote_id 매핑 업데이트 (Phase 1→Phase 2 전달용)
|
|
115
|
+
*/
|
|
116
|
+
async pushBatches(items, batchSize, startTime, timeoutMs, result, parentRemoteMap) {
|
|
117
|
+
for (let i = 0; i < items.length; i += batchSize) {
|
|
88
118
|
if (timeoutMs > 0 && Date.now() - startTime > timeoutMs) {
|
|
89
|
-
const remaining =
|
|
90
|
-
result.errors.push(`타임아웃: ${
|
|
119
|
+
const remaining = items.length - i;
|
|
120
|
+
result.errors.push(`타임아웃: ${remaining}개 미처리`);
|
|
91
121
|
result.failed += remaining;
|
|
92
122
|
break;
|
|
93
123
|
}
|
|
94
|
-
const batch =
|
|
124
|
+
const batch = items.slice(i, i + batchSize);
|
|
95
125
|
try {
|
|
96
126
|
const batchResult = await this.client.createMemoriesBatch(batch.map((m) => ({
|
|
97
127
|
content: m.content,
|
|
98
128
|
category: mapCategory(m.category),
|
|
99
129
|
tier: mapTier(m.tier),
|
|
100
130
|
tags: m.tags,
|
|
101
|
-
created_at: m.createdAt,
|
|
102
|
-
|
|
131
|
+
created_at: m.createdAt,
|
|
132
|
+
// Children: local parent_id → remote parent_id 변환
|
|
133
|
+
parent_id: m.parentId ? parentRemoteMap.get(m.parentId) : undefined,
|
|
103
134
|
chunk_index: m.chunkIndex ?? undefined,
|
|
104
135
|
chunk_total: m.chunkTotal ?? undefined,
|
|
105
136
|
})));
|
|
106
|
-
// 성공한 항목들 synced로 업데이트
|
|
137
|
+
// 성공한 항목들 synced로 업데이트 + parentRemoteMap 갱신
|
|
107
138
|
for (let j = 0; j < batchResult.ids.length; j++) {
|
|
108
|
-
if (j < batch.length) {
|
|
139
|
+
if (j < batch.length && batchResult.ids[j]) {
|
|
109
140
|
this.db.setSyncStatus(batch[j].id, batchResult.ids[j], 'synced');
|
|
141
|
+
// 이 항목이 다른 child의 parent일 수 있으므로 매핑 등록
|
|
142
|
+
parentRemoteMap.set(batch[j].id, batchResult.ids[j]);
|
|
110
143
|
}
|
|
111
144
|
}
|
|
112
145
|
result.pushed += batchResult.created;
|
|
@@ -116,13 +149,10 @@ export class SyncQueue {
|
|
|
116
149
|
}
|
|
117
150
|
}
|
|
118
151
|
catch (error) {
|
|
119
|
-
|
|
120
|
-
result.errors.push(`배치 ${i / BATCH_SIZE + 1} 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
152
|
+
result.errors.push(`배치 실패: ${error instanceof Error ? error.message : String(error)}`);
|
|
121
153
|
result.failed += batch.length;
|
|
122
154
|
}
|
|
123
155
|
}
|
|
124
|
-
result.duration = Date.now() - startTime;
|
|
125
|
-
return result;
|
|
126
156
|
}
|
|
127
157
|
/**
|
|
128
158
|
* 미동기화 tombstone을 원격 서버에서 삭제
|
package/dist/sync/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/sync/queue.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzC,+DAA+D;AAC/D,oCAAoC;AACpC,+DAA+D;AAE/D,MAAM,YAAY,GAAmC;IACnD,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,MAAM,QAAQ,GAA+B;IAC3C,UAAU,EAAE,UAAU;CACvB,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAmB,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAe,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,OAAO,SAAS;IAEV;IACA;IAFV,YACU,EAAkB,EAClB,MAAiB;QADjB,OAAE,GAAF,EAAE,CAAgB;QAClB,WAAM,GAAN,MAAM,CAAW;IACxB,CAAC;IAEJ;;OAEG;IACH,OAAO,CAAC,QAAgB;QACtB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACnD,CAAC;IAED
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/sync/queue.ts"],"names":[],"mappings":"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"}
|