@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.
Files changed (56) hide show
  1. package/README.md +91 -333
  2. package/dist/client.d.ts +24 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +34 -8
  5. package/dist/client.js.map +1 -1
  6. package/dist/endpoints/ai.d.ts +25 -30
  7. package/dist/endpoints/ai.d.ts.map +1 -1
  8. package/dist/endpoints/ai.js +220 -31
  9. package/dist/endpoints/ai.js.map +1 -1
  10. package/dist/endpoints/graph.d.ts +4 -1
  11. package/dist/endpoints/graph.d.ts.map +1 -1
  12. package/dist/endpoints/graph.js +10 -0
  13. package/dist/endpoints/graph.js.map +1 -1
  14. package/dist/endpoints/graphAi.d.ts +21 -0
  15. package/dist/endpoints/graphAi.d.ts.map +1 -1
  16. package/dist/endpoints/graphAi.js +24 -0
  17. package/dist/endpoints/graphAi.js.map +1 -1
  18. package/dist/endpoints/notification.d.ts +13 -0
  19. package/dist/endpoints/notification.d.ts.map +1 -1
  20. package/dist/endpoints/notification.js +17 -0
  21. package/dist/endpoints/notification.js.map +1 -1
  22. package/dist/endpoints/sync.d.ts +3 -1
  23. package/dist/endpoints/sync.d.ts.map +1 -1
  24. package/dist/endpoints/sync.js.map +1 -1
  25. package/dist/http-builder.d.ts +38 -0
  26. package/dist/http-builder.d.ts.map +1 -1
  27. package/dist/http-builder.js +43 -6
  28. package/dist/http-builder.js.map +1 -1
  29. package/dist/types/graph.d.ts +66 -0
  30. package/dist/types/graph.d.ts.map +1 -1
  31. package/package.json +2 -1
  32. package/src/client.ts +140 -0
  33. package/src/config.ts +9 -0
  34. package/src/endpoints/agent.ts +171 -0
  35. package/src/endpoints/ai.ts +296 -0
  36. package/src/endpoints/auth.apple.ts +39 -0
  37. package/src/endpoints/auth.google.ts +39 -0
  38. package/src/endpoints/conversations.ts +362 -0
  39. package/src/endpoints/graph.ts +398 -0
  40. package/src/endpoints/graphAi.ts +111 -0
  41. package/src/endpoints/health.ts +40 -0
  42. package/src/endpoints/me.ts +97 -0
  43. package/src/endpoints/note.ts +351 -0
  44. package/src/endpoints/notification.ts +69 -0
  45. package/src/endpoints/sync.ts +71 -0
  46. package/src/http-builder.ts +290 -0
  47. package/src/index.ts +60 -0
  48. package/src/types/aiInput.ts +111 -0
  49. package/src/types/conversation.ts +51 -0
  50. package/src/types/graph.ts +201 -0
  51. package/src/types/graphAi.ts +21 -0
  52. package/src/types/me.ts +49 -0
  53. package/src/types/message.ts +40 -0
  54. package/src/types/note.ts +89 -0
  55. package/src/types/problem.ts +22 -0
  56. 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;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAiC;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;gBAElC,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;YAMN,IAAI;CA6DnB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,cAAc,CAEzE"}
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"}
@@ -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 send(method, body) {
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
- headers['Content-Type'] = 'application/json';
90
- init.body = JSON.stringify(body);
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.fetchImpl(this.url(), init);
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, // Network error or other fetch-related error
164
+ statusCode: 0,
128
165
  message: err.message,
129
166
  },
130
167
  };
@@ -1 +1 @@
1
- {"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http-builder.js","sourceRoot":"","sources":["../src/http-builder.ts"],"names":[],"mappings":"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"}
@@ -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;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC"}
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;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACnC,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC;AAEzF;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC;QAClB,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE,KAAK,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,qBAAqB,EAAE,MAAM,EAAE,CAAC;QAChC,YAAY,EAAE,MAAM,CAAC;QACrB,qBAAqB,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC,CAAC;IACH,QAAQ,EAAE,KAAK,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,WAAW,EAAE,KAAK,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC;QACpB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taco_tsinghua/graphnode-sdk",
3
- "version": "0.1.17",
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
+ }