@taco_tsinghua/graphnode-sdk 0.1.17 → 0.1.21
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 +91 -333
- package/dist/client.d.ts +24 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +34 -8
- package/dist/client.js.map +1 -1
- package/dist/endpoints/ai.d.ts +25 -30
- package/dist/endpoints/ai.d.ts.map +1 -1
- package/dist/endpoints/ai.js +220 -31
- package/dist/endpoints/ai.js.map +1 -1
- package/dist/endpoints/graph.d.ts +4 -1
- package/dist/endpoints/graph.d.ts.map +1 -1
- package/dist/endpoints/graph.js +10 -0
- package/dist/endpoints/graph.js.map +1 -1
- package/dist/endpoints/graphAi.d.ts +21 -0
- package/dist/endpoints/graphAi.d.ts.map +1 -1
- package/dist/endpoints/graphAi.js +24 -0
- package/dist/endpoints/graphAi.js.map +1 -1
- package/dist/endpoints/notification.d.ts +13 -0
- package/dist/endpoints/notification.d.ts.map +1 -1
- package/dist/endpoints/notification.js +17 -0
- package/dist/endpoints/notification.js.map +1 -1
- package/dist/endpoints/sync.d.ts +3 -1
- package/dist/endpoints/sync.d.ts.map +1 -1
- package/dist/endpoints/sync.js.map +1 -1
- package/dist/http-builder.d.ts +38 -0
- package/dist/http-builder.d.ts.map +1 -1
- package/dist/http-builder.js +43 -6
- package/dist/http-builder.js.map +1 -1
- package/dist/types/graph.d.ts +66 -0
- package/dist/types/graph.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/client.ts +140 -0
- package/src/config.ts +9 -0
- package/src/endpoints/agent.ts +171 -0
- package/src/endpoints/ai.ts +296 -0
- package/src/endpoints/auth.apple.ts +39 -0
- package/src/endpoints/auth.google.ts +39 -0
- package/src/endpoints/conversations.ts +362 -0
- package/src/endpoints/graph.ts +398 -0
- package/src/endpoints/graphAi.ts +111 -0
- package/src/endpoints/health.ts +40 -0
- package/src/endpoints/me.ts +97 -0
- package/src/endpoints/note.ts +351 -0
- package/src/endpoints/notification.ts +69 -0
- package/src/endpoints/sync.ts +71 -0
- package/src/http-builder.ts +290 -0
- package/src/index.ts +60 -0
- package/src/types/aiInput.ts +111 -0
- package/src/types/conversation.ts +51 -0
- package/src/types/graph.ts +201 -0
- package/src/types/graphAi.ts +21 -0
- package/src/types/me.ts +49 -0
- package/src/types/message.ts +40 -0
- package/src/types/note.ts +89 -0
- package/src/types/problem.ts +22 -0
- package/src/types/sync.ts +35 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-builder.d.ts","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9C;AAaD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAEzE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"http-builder.d.ts","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC;CAC9C;AAaD,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI;IACnC,SAAS,EAAE,IAAI,CAAC;IAChB,IAAI,EAAE,CAAC,CAAC;IACR,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE,KAAK,CAAC;IACjB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,mBAAmB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;AAEzE,qBAAa,cAAc;IACzB;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IAEjD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiC;IAE9D;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAE9C;;;;;OAKG;gBACS,IAAI,EAAE,cAAc,EAAE,QAAQ,GAAE,MAAM,EAAO,EAAE,KAAK,CAAC,EAAE,eAAe;IAUlF;;;OAGG;IACH,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc;IA6B/B;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IAmBjD,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIjD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlD,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIlD,GAAG,IAAI,MAAM;IAMP,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,OAAO,EACd,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,OAAO,CAAC,QAAQ,CAAC;YAiDN,IAAI;CA6CnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAEzE"}
|
package/dist/http-builder.js
CHANGED
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
* - 기본적으로 credentials: 'include' 로 세션 쿠키를 전송한다.
|
|
5
5
|
*/
|
|
6
6
|
export class RequestBuilder {
|
|
7
|
+
/**
|
|
8
|
+
* RequestBuilder 생성자
|
|
9
|
+
* @param opts 빌더 공통 옵션 (baseUrl, fetch, headers 등)
|
|
10
|
+
* @param segments 초기 URL 경로 조각 리스트
|
|
11
|
+
* @param query 초기 쿼리 파라미터
|
|
12
|
+
*/
|
|
7
13
|
constructor(opts, segments = [], query) {
|
|
8
14
|
this.baseUrl = opts.baseUrl.replace(/\/$/, '');
|
|
9
15
|
this.fetchImpl = opts.fetch ?? globalThis.fetch;
|
|
@@ -75,8 +81,8 @@ export class RequestBuilder {
|
|
|
75
81
|
const qs = this.queryParams.toString();
|
|
76
82
|
return this.baseUrl + path + (qs ? `?${qs}` : '');
|
|
77
83
|
}
|
|
78
|
-
async
|
|
79
|
-
const headers = { ...this.headers };
|
|
84
|
+
async sendRaw(method, body, extraHeaders) {
|
|
85
|
+
const headers = { ...this.headers, ...extraHeaders };
|
|
80
86
|
// Access Token 주입
|
|
81
87
|
if (this.accessToken) {
|
|
82
88
|
const token = typeof this.accessToken === 'function' ? this.accessToken() : this.accessToken;
|
|
@@ -86,11 +92,42 @@ export class RequestBuilder {
|
|
|
86
92
|
}
|
|
87
93
|
const init = { method, headers, credentials: this.credentials };
|
|
88
94
|
if (body !== undefined) {
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
if (typeof FormData !== 'undefined' && body instanceof FormData) {
|
|
96
|
+
init.body = body;
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
headers['Content-Type'] = 'application/json';
|
|
100
|
+
init.body = JSON.stringify(body);
|
|
101
|
+
}
|
|
91
102
|
}
|
|
103
|
+
const makeRequest = async () => this.fetchImpl(this.url(), init);
|
|
104
|
+
let res = await makeRequest();
|
|
105
|
+
// 401 Unauthorized 발생 시 Refresh Token으로 갱신 시도
|
|
106
|
+
if (res.status === 401) {
|
|
107
|
+
try {
|
|
108
|
+
// Refresh API 호출 (http-builder 내부 로직 재사용 방지 위해 fetchImpl 직접 사용)
|
|
109
|
+
const refreshUrl = `${this.baseUrl}/auth/refresh`;
|
|
110
|
+
const refreshRes = await this.fetchImpl(refreshUrl, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
headers: { 'Content-Type': 'application/json' },
|
|
113
|
+
credentials: 'include', // 쿠키 전송 필수
|
|
114
|
+
});
|
|
115
|
+
if (refreshRes.ok) {
|
|
116
|
+
// 갱신 성공 시, 원래 요청 재시도
|
|
117
|
+
// (브라우저가 새 Access Token 쿠키를 자동으로 저장했으므로, 재요청 시 새 토큰이 나감)
|
|
118
|
+
res = await makeRequest();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
// Refresh 실패 시, 원래의 401 응답을 그대로 반환 (또는 로깅)
|
|
123
|
+
console.error('Auto-refresh failed:', e);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return res;
|
|
127
|
+
}
|
|
128
|
+
async send(method, body) {
|
|
92
129
|
try {
|
|
93
|
-
const res = await this.
|
|
130
|
+
const res = await this.sendRaw(method, body);
|
|
94
131
|
const ct = res.headers.get('content-type') || '';
|
|
95
132
|
const isJson = ct.includes('application/json') || ct.includes('application/problem+json');
|
|
96
133
|
const isNoContent = res.status === 204 || res.status === 205 || res.headers.get('content-length') === '0';
|
|
@@ -124,7 +161,7 @@ export class RequestBuilder {
|
|
|
124
161
|
return {
|
|
125
162
|
isSuccess: false,
|
|
126
163
|
error: {
|
|
127
|
-
statusCode: 0,
|
|
164
|
+
statusCode: 0,
|
|
128
165
|
message: err.message,
|
|
129
166
|
},
|
|
130
167
|
};
|
package/dist/http-builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwCH,MAAM,OAAO,cAAc;
|
|
1
|
+
{"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"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"}
|
package/dist/types/graph.d.ts
CHANGED
|
@@ -94,18 +94,36 @@ export interface GraphStatsDto {
|
|
|
94
94
|
generatedAt?: string;
|
|
95
95
|
metadata?: Record<string, unknown>;
|
|
96
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* 그래프 서브클러스터 DTO
|
|
99
|
+
* @public
|
|
100
|
+
*/
|
|
101
|
+
export interface GraphSubclusterDto {
|
|
102
|
+
id: string;
|
|
103
|
+
userId: string;
|
|
104
|
+
clusterId: string;
|
|
105
|
+
nodeIds: number[];
|
|
106
|
+
representativeNodeId: number;
|
|
107
|
+
size: number;
|
|
108
|
+
density: number;
|
|
109
|
+
topKeywords: string[];
|
|
110
|
+
createdAt?: string;
|
|
111
|
+
updatedAt?: string;
|
|
112
|
+
}
|
|
97
113
|
/**
|
|
98
114
|
* 그래프 스냅샷 DTO (전체 그래프 데이터)
|
|
99
115
|
* @public
|
|
100
116
|
* @property nodes 노드 목록
|
|
101
117
|
* @property edges 엣지 목록
|
|
102
118
|
* @property clusters 클러스터 목록
|
|
119
|
+
* @property subclusters 서브클러스터 목록
|
|
103
120
|
* @property stats 그래프 통계 (userId 제외)
|
|
104
121
|
*/
|
|
105
122
|
export interface GraphSnapshotDto {
|
|
106
123
|
nodes: GraphNodeDto[];
|
|
107
124
|
edges: GraphEdgeDto[];
|
|
108
125
|
clusters: GraphClusterDto[];
|
|
126
|
+
subclusters?: GraphSubclusterDto[];
|
|
109
127
|
stats: Omit<GraphStatsDto, 'userId'>;
|
|
110
128
|
}
|
|
111
129
|
/**
|
|
@@ -123,4 +141,52 @@ export interface CreateEdgeResponse {
|
|
|
123
141
|
* @property clusterName 클러스터 이름 (선택)
|
|
124
142
|
*/
|
|
125
143
|
export type UpdateNodePayload = Partial<Pick<GraphNodeDto, 'clusterId' | 'clusterName'>>;
|
|
144
|
+
/**
|
|
145
|
+
* Graph Summary DTO
|
|
146
|
+
*/
|
|
147
|
+
export interface GraphSummaryDto {
|
|
148
|
+
overview: {
|
|
149
|
+
total_conversations: number;
|
|
150
|
+
time_span: string;
|
|
151
|
+
primary_interests: string[];
|
|
152
|
+
conversation_style: string;
|
|
153
|
+
most_active_period: string;
|
|
154
|
+
summary_text: string;
|
|
155
|
+
};
|
|
156
|
+
clusters: Array<{
|
|
157
|
+
cluster_id: string;
|
|
158
|
+
name: string;
|
|
159
|
+
size: number;
|
|
160
|
+
density: number;
|
|
161
|
+
centrality: number;
|
|
162
|
+
recency: string;
|
|
163
|
+
top_keywords: string[];
|
|
164
|
+
key_themes: string[];
|
|
165
|
+
common_question_types: string[];
|
|
166
|
+
insight_text: string;
|
|
167
|
+
notable_conversations: string[];
|
|
168
|
+
}>;
|
|
169
|
+
patterns: Array<{
|
|
170
|
+
pattern_type: string;
|
|
171
|
+
description: string;
|
|
172
|
+
evidence: string[];
|
|
173
|
+
significance: string;
|
|
174
|
+
}>;
|
|
175
|
+
connections: Array<{
|
|
176
|
+
source_cluster: string;
|
|
177
|
+
target_cluster: string;
|
|
178
|
+
connection_strength: number;
|
|
179
|
+
bridge_keywords: string[];
|
|
180
|
+
description: string;
|
|
181
|
+
}>;
|
|
182
|
+
recommendations: Array<{
|
|
183
|
+
type: string;
|
|
184
|
+
title: string;
|
|
185
|
+
description: string;
|
|
186
|
+
related_nodes: string[];
|
|
187
|
+
priority: string;
|
|
188
|
+
}>;
|
|
189
|
+
generated_at: string;
|
|
190
|
+
detail_level: string;
|
|
191
|
+
}
|
|
126
192
|
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,CAAC;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/types/graph.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@taco_tsinghua/graphnode-sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "GraphNode frontend SDK (cookie-based session)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
|
+
"src",
|
|
17
18
|
"README.md"
|
|
18
19
|
],
|
|
19
20
|
"sideEffects": false,
|
package/src/client.ts
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { createRequestBuilder, type BuilderOptions, RequestBuilder } from './http-builder.js';
|
|
2
|
+
import { GRAPHNODE_BASE_URL } from './config.js';
|
|
3
|
+
import { HealthApi } from './endpoints/health.js';
|
|
4
|
+
import { MeApi } from './endpoints/me.js';
|
|
5
|
+
import { ConversationsApi } from './endpoints/conversations.js';
|
|
6
|
+
import { GoogleAuthApi } from './endpoints/auth.google.js';
|
|
7
|
+
import { GraphApi } from './endpoints/graph.js';
|
|
8
|
+
import { GraphAiApi } from './endpoints/graphAi.js';
|
|
9
|
+
import { NoteApi } from './endpoints/note.js';
|
|
10
|
+
import { AppleAuthApi } from './endpoints/auth.apple.js';
|
|
11
|
+
import { SyncApi } from './endpoints/sync.js';
|
|
12
|
+
import { AiApi } from './endpoints/ai.js';
|
|
13
|
+
import { NotificationApi } from './endpoints/notification.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* GraphNode 클라이언트 옵션
|
|
17
|
+
* @public
|
|
18
|
+
* @property fetch 커스텀 fetch 함수 (선택)
|
|
19
|
+
* @property headers 기본 헤더 (선택)
|
|
20
|
+
* @property credentials 인증 모드 (include | omit | same-origin)
|
|
21
|
+
* @property accessToken 초기 Access Token (선택)
|
|
22
|
+
*/
|
|
23
|
+
export interface GraphNodeClientOptions extends Omit<BuilderOptions, 'baseUrl' | 'accessToken'> {
|
|
24
|
+
accessToken?: string | null;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* GraphNode API 클라이언트
|
|
29
|
+
* @public
|
|
30
|
+
* @property health 헬스 체크 API
|
|
31
|
+
* @property me 내 정보 관리 API
|
|
32
|
+
* @property conversations 대화 관리 API
|
|
33
|
+
* @property googleAuth 구글 인증 API
|
|
34
|
+
* @property graph 그래프 관리 API
|
|
35
|
+
* @property graphAi 그래프 AI 생성 API
|
|
36
|
+
* @property note 노트/폴더 관리 API
|
|
37
|
+
* @property appleAuth 애플 인증 API
|
|
38
|
+
* @property sync 데이터 동기화 API
|
|
39
|
+
* @property ai AI 채팅 API
|
|
40
|
+
*/
|
|
41
|
+
export class GraphNodeClient {
|
|
42
|
+
readonly health: HealthApi;
|
|
43
|
+
readonly me: MeApi;
|
|
44
|
+
readonly conversations: ConversationsApi;
|
|
45
|
+
readonly googleAuth: GoogleAuthApi;
|
|
46
|
+
readonly graph: GraphApi;
|
|
47
|
+
readonly graphAi: GraphAiApi;
|
|
48
|
+
readonly note: NoteApi;
|
|
49
|
+
readonly appleAuth: AppleAuthApi;
|
|
50
|
+
readonly sync: SyncApi;
|
|
51
|
+
readonly ai: AiApi;
|
|
52
|
+
readonly notification: NotificationApi;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* HTTP 요청 빌더 인스턴스.
|
|
56
|
+
* 모든 API 엔드포인트가 이 빌더를 공유하여 HTTP 요청을 수행합니다.
|
|
57
|
+
* @private
|
|
58
|
+
*/
|
|
59
|
+
private readonly rb: RequestBuilder;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* 현재 설정된 Access Token (Bearer 토큰).
|
|
63
|
+
* 쿠키 인증 방식을 사용할 경우 null일 수 있습니다.
|
|
64
|
+
* @private
|
|
65
|
+
*/
|
|
66
|
+
private _accessToken: string | null = null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* GraphNodeClient 생성자.
|
|
70
|
+
* - 실행 환경(브라우저/Node.js)에 맞는 fetch 함수를 자동으로 감지하여 설정합니다.
|
|
71
|
+
* - 기본 API URL 및 공통 헤더 등 통신 옵션을 초기화합니다.
|
|
72
|
+
*
|
|
73
|
+
* @param opts 클라이언트 설정 옵션
|
|
74
|
+
*/
|
|
75
|
+
constructor(opts: GraphNodeClientOptions = {}) {
|
|
76
|
+
// 1. fetch 함수 결정 전략
|
|
77
|
+
// 사용자가 opts.fetch로 직접 주입하지 않은 경우, 환경에 따라 적절한 기본 fetch를 찾습니다.
|
|
78
|
+
let fetchFn = opts.fetch;
|
|
79
|
+
|
|
80
|
+
if (!fetchFn) {
|
|
81
|
+
if (typeof window !== 'undefined' && window.fetch) {
|
|
82
|
+
// [Browser / Electron Renderer 환경]
|
|
83
|
+
// window.fetch는 호출 시 'this'가 window여야 하므로 bind(window)가 필수입니다.
|
|
84
|
+
// 그냥 할당하면 "Illegal invocation" 에러가 발생할 수 있습니다.
|
|
85
|
+
fetchFn = window.fetch.bind(window);
|
|
86
|
+
} else if (typeof globalThis !== 'undefined' && (globalThis as any).fetch) {
|
|
87
|
+
// [Node.js 18+ / Bun / Deno 등 환경]
|
|
88
|
+
// 전역 스코프(globalThis)에 있는 fetch를 사용합니다.
|
|
89
|
+
fetchFn = (globalThis as any).fetch.bind(globalThis);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
this._accessToken = opts.accessToken ?? null;
|
|
94
|
+
|
|
95
|
+
// 2. RequestBuilder 초기화
|
|
96
|
+
// createRequestBuilder를 통해 내부적으로 사용할 HTTP 요청 처리기를 만듭니다.
|
|
97
|
+
// 여기서 accessToken을 '함수' 형태로 넘기는 이유는,
|
|
98
|
+
// 나중에 setAccessToken()으로 값이 바뀌었을 때, RequestBuilder가 최신 값을 참조할 수 있게 하기 위함입니다.
|
|
99
|
+
this.rb = createRequestBuilder({
|
|
100
|
+
baseUrl: GRAPHNODE_BASE_URL,
|
|
101
|
+
...opts,
|
|
102
|
+
fetch: fetchFn, // 결정된 fetch 함수 주입
|
|
103
|
+
accessToken: () => this._accessToken, // [중요] 동적 토큰 참조를 위한 Getter 함수 전달
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// 3. 각 API 모듈 초기화
|
|
107
|
+
// 각 모듈은 공유된 RequestBuilder(this.rb)를 사용하여 통신합니다.
|
|
108
|
+
this.health = new HealthApi(this.rb);
|
|
109
|
+
this.me = new MeApi(this.rb);
|
|
110
|
+
this.conversations = new ConversationsApi(this.rb);
|
|
111
|
+
this.googleAuth = new GoogleAuthApi(GRAPHNODE_BASE_URL);
|
|
112
|
+
this.graph = new GraphApi(this.rb);
|
|
113
|
+
this.graphAi = new GraphAiApi(this.rb);
|
|
114
|
+
this.note = new NoteApi(this.rb);
|
|
115
|
+
this.appleAuth = new AppleAuthApi(GRAPHNODE_BASE_URL);
|
|
116
|
+
this.sync = new SyncApi(this.rb);
|
|
117
|
+
this.ai = new AiApi(this.rb);
|
|
118
|
+
this.notification = new NotificationApi(this.rb);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Access Token을 동적으로 설정합니다.
|
|
123
|
+
* - 로그인 후 발급받은 토큰을 수동으로 설정하거나, 로그아웃 시 null로 초기화할 때 사용합니다.
|
|
124
|
+
* - 쿠키 기반 인증을 사용하는 경우, 이 함수를 호출하지 않아도(null 상태여도) 정상 동작합니다.
|
|
125
|
+
*
|
|
126
|
+
* @param token JWT Access Token 문자열 또는 null (초기화)
|
|
127
|
+
*/
|
|
128
|
+
setAccessToken(token: string | null) {
|
|
129
|
+
this._accessToken = token;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* GraphNode 클라이언트 인스턴스를 생성합니다.
|
|
135
|
+
* @param opts 클라이언트 옵션
|
|
136
|
+
* @returns GraphNodeClient 인스턴스
|
|
137
|
+
*/
|
|
138
|
+
export function createGraphNodeClient(opts?: GraphNodeClientOptions): GraphNodeClient {
|
|
139
|
+
return new GraphNodeClient(opts);
|
|
140
|
+
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDK 내부에서 사용하는 GraphNode API Base URL.
|
|
3
|
+
* - FE 사용자는 직접 변경하거나 전달할 수 없다.
|
|
4
|
+
* - 런타임에서 globalThis.__GRAPHNODE_BASE_URL__ 가 존재하면 그것을 우선 사용.
|
|
5
|
+
* - 없으면 기본 프로덕션 값으로 폴백.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export const GRAPHNODE_BASE_URL: string =
|
|
9
|
+
(globalThis as any).__GRAPHNODE_BASE_URL__?.replace(/\/$/, '') || 'https://taco4graphnode.online';
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
// endpoints/agent.ts
|
|
2
|
+
import { type FetchLike } from '../http-builder.js';
|
|
3
|
+
import { GRAPHNODE_BASE_URL } from '../config.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 에이전트 채팅 모드 및 스트림 이벤트 타입들
|
|
7
|
+
*/
|
|
8
|
+
export type AgentChatMode = 'chat' | 'summary' | 'note';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* 사용자에게 제안할 에이전트 채팅 모드 힌트 타입
|
|
12
|
+
*/
|
|
13
|
+
export type AgentChatModeHint = 'summary' | 'note' | 'auto';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* 에이전트 채팅 스트림 이벤트 타입들
|
|
17
|
+
*/
|
|
18
|
+
export type AgentChatStreamEvent =
|
|
19
|
+
| { event: 'status'; data: { phase: string; message: string } }
|
|
20
|
+
| { event: 'chunk'; data: { text: string } }
|
|
21
|
+
| { event: 'result'; data: { mode: AgentChatMode; answer: string; noteContent: string | null } }
|
|
22
|
+
| { event: 'error'; data: { message: string } };
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* 에이전트 채팅 스트림 API 요청 파라미터
|
|
26
|
+
* @property userMessage 사용자 메시지
|
|
27
|
+
* @property contextText (선택) 컨텍스트 텍스트
|
|
28
|
+
* @property modeHint (선택) 에이전트 채팅 모드 힌트
|
|
29
|
+
*/
|
|
30
|
+
export interface AgentChatStreamParams {
|
|
31
|
+
userMessage: string;
|
|
32
|
+
contextText?: string;
|
|
33
|
+
modeHint?: AgentChatModeHint;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface AgentChatStreamOptions {
|
|
37
|
+
/**
|
|
38
|
+
* 커스텀 fetch (예: Node 16 환경). 기본은 globalThis.fetch 사용.
|
|
39
|
+
*/
|
|
40
|
+
fetchImpl?: FetchLike;
|
|
41
|
+
/**
|
|
42
|
+
* 스트림 취소용 AbortSignal.
|
|
43
|
+
*/
|
|
44
|
+
signal?: AbortSignal;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export type AgentChatStreamHandler = (event: AgentChatStreamEvent) => void;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* /v1/agent/chat/stream 스트리밍 API를 여는 헬퍼.
|
|
51
|
+
* - 서버는 text/event-stream(SSE) 형식으로 event/data 를 보낸다.
|
|
52
|
+
* - 이 함수는 fetch + ReadableStream 으로 SSE 프레임을 파싱해서 onEvent에 전달한다.
|
|
53
|
+
*
|
|
54
|
+
* @returns 스트림을 취소하는 cancel 함수
|
|
55
|
+
*/
|
|
56
|
+
export async function openAgentChatStream(
|
|
57
|
+
params: AgentChatStreamParams,
|
|
58
|
+
onEvent: AgentChatStreamHandler,
|
|
59
|
+
options: AgentChatStreamOptions = {}
|
|
60
|
+
): Promise<() => void> {
|
|
61
|
+
const controller = new AbortController();
|
|
62
|
+
const signal = options.signal;
|
|
63
|
+
|
|
64
|
+
// 외부에서 signal을 전달하면, 그 signal 취소 시 내부 controller도 취소되도록 연결
|
|
65
|
+
if (signal) {
|
|
66
|
+
if (signal.aborted) {
|
|
67
|
+
controller.abort(signal.reason);
|
|
68
|
+
return () => controller.abort();
|
|
69
|
+
}
|
|
70
|
+
signal.addEventListener('abort', () => {
|
|
71
|
+
controller.abort(signal.reason);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
let fetchFn: FetchLike | undefined = options.fetchImpl;
|
|
76
|
+
if (!fetchFn) {
|
|
77
|
+
if (typeof window !== 'undefined' && window.fetch) {
|
|
78
|
+
fetchFn = window.fetch.bind(window);
|
|
79
|
+
} else if (typeof globalThis !== 'undefined' && (globalThis as any).fetch) {
|
|
80
|
+
fetchFn = (globalThis as any).fetch.bind(globalThis);
|
|
81
|
+
} else {
|
|
82
|
+
throw new Error('fetch is not available in this environment. Provide options.fetchImpl.');
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const fetchImpl = fetchFn as FetchLike;
|
|
87
|
+
|
|
88
|
+
const url = `${GRAPHNODE_BASE_URL.replace(/\/$/, '')}/v1/agent/chat/stream`;
|
|
89
|
+
|
|
90
|
+
const res = await fetchImpl(url, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
Accept: 'text/event-stream',
|
|
95
|
+
},
|
|
96
|
+
credentials: 'include',
|
|
97
|
+
body: JSON.stringify(params),
|
|
98
|
+
signal: controller.signal,
|
|
99
|
+
} as RequestInit);
|
|
100
|
+
|
|
101
|
+
if (!res.body) {
|
|
102
|
+
// 즉시 끝난 경우
|
|
103
|
+
return () => controller.abort();
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const reader = (res.body as ReadableStream<Uint8Array>).getReader();
|
|
107
|
+
const decoder = new TextDecoder();
|
|
108
|
+
let buffer = '';
|
|
109
|
+
|
|
110
|
+
(async () => {
|
|
111
|
+
try {
|
|
112
|
+
while (true) {
|
|
113
|
+
const { done, value } = await reader.read();
|
|
114
|
+
if (done) break;
|
|
115
|
+
buffer += decoder.decode(value, { stream: true });
|
|
116
|
+
|
|
117
|
+
// SSE 프레임 파싱: "event: xxx\ndata: yyy\n\n"
|
|
118
|
+
let idx: number;
|
|
119
|
+
// 한 번에 여러 이벤트가 들어올 수 있으므로 루프
|
|
120
|
+
while ((idx = buffer.indexOf('\n\n')) !== -1) {
|
|
121
|
+
const rawEvent = buffer.slice(0, idx);
|
|
122
|
+
buffer = buffer.slice(idx + 2);
|
|
123
|
+
|
|
124
|
+
const lines = rawEvent.split('\n');
|
|
125
|
+
let eventName = 'message';
|
|
126
|
+
let dataLines: string[] = [];
|
|
127
|
+
|
|
128
|
+
for (const line of lines) {
|
|
129
|
+
const trimmed = line.trim();
|
|
130
|
+
if (trimmed.startsWith('event:')) {
|
|
131
|
+
eventName = trimmed.slice('event:'.length).trim();
|
|
132
|
+
} else if (trimmed.startsWith('data:')) {
|
|
133
|
+
dataLines.push(trimmed.slice('data:'.length).trim());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const dataStr = dataLines.join('\n') || '{}';
|
|
138
|
+
let parsed: any;
|
|
139
|
+
try {
|
|
140
|
+
parsed = JSON.parse(dataStr);
|
|
141
|
+
} catch {
|
|
142
|
+
parsed = { raw: dataStr };
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// 타입에 맞춰 onEvent 호출
|
|
146
|
+
if (eventName === 'status') {
|
|
147
|
+
onEvent({ event: 'status', data: parsed });
|
|
148
|
+
} else if (eventName === 'chunk') {
|
|
149
|
+
onEvent({ event: 'chunk', data: parsed });
|
|
150
|
+
} else if (eventName === 'result') {
|
|
151
|
+
onEvent({ event: 'result', data: parsed });
|
|
152
|
+
} else if (eventName === 'error') {
|
|
153
|
+
onEvent({ event: 'error', data: parsed });
|
|
154
|
+
} else {
|
|
155
|
+
// 기타 이벤트는 status로 취급하거나 무시할 수도 있음
|
|
156
|
+
onEvent({ event: 'status', data: { phase: eventName, message: dataStr } });
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
} catch (e: any) {
|
|
161
|
+
if (!controller.signal.aborted) {
|
|
162
|
+
onEvent({
|
|
163
|
+
event: 'error',
|
|
164
|
+
data: { message: e?.message ?? 'stream_error' },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
})();
|
|
169
|
+
|
|
170
|
+
return () => controller.abort();
|
|
171
|
+
}
|