@seaverse/conversation-sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +284 -0
- package/dist/aggregated/apps-with-conversations.d.ts +47 -0
- package/dist/aggregated/apps-with-conversations.d.ts.map +1 -0
- package/dist/aggregated/apps-with-conversations.js +90 -0
- package/dist/aggregated/apps-with-conversations.js.map +1 -0
- package/dist/aggregated/index.d.ts +3 -0
- package/dist/aggregated/index.d.ts.map +1 -0
- package/dist/aggregated/index.js +2 -0
- package/dist/aggregated/index.js.map +1 -0
- package/dist/client/ConversationClient.d.ts +24 -0
- package/dist/client/ConversationClient.d.ts.map +1 -0
- package/dist/client/ConversationClient.js +56 -0
- package/dist/client/ConversationClient.js.map +1 -0
- package/dist/client/ConversationsClient.d.ts +31 -0
- package/dist/client/ConversationsClient.d.ts.map +1 -0
- package/dist/client/ConversationsClient.js +50 -0
- package/dist/client/ConversationsClient.js.map +1 -0
- package/dist/client/EnvironmentConfig.d.ts +12 -0
- package/dist/client/EnvironmentConfig.d.ts.map +1 -0
- package/dist/client/EnvironmentConfig.js +21 -0
- package/dist/client/EnvironmentConfig.js.map +1 -0
- package/dist/client/MessagesClient.d.ts +31 -0
- package/dist/client/MessagesClient.d.ts.map +1 -0
- package/dist/client/MessagesClient.js +57 -0
- package/dist/client/MessagesClient.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/data/DbClient.d.ts +76 -0
- package/dist/data/DbClient.d.ts.map +1 -0
- package/dist/data/DbClient.js +107 -0
- package/dist/data/DbClient.js.map +1 -0
- package/dist/data/index.d.ts +2 -0
- package/dist/data/index.d.ts.map +1 -0
- package/dist/data/index.js +2 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/postgrest-headers.d.ts +10 -0
- package/dist/data/postgrest-headers.d.ts.map +1 -0
- package/dist/data/postgrest-headers.js +58 -0
- package/dist/data/postgrest-headers.js.map +1 -0
- package/dist/data/query.types.d.ts +62 -0
- package/dist/data/query.types.d.ts.map +1 -0
- package/dist/data/query.types.js +2 -0
- package/dist/data/query.types.js.map +1 -0
- package/dist/errors/AuthError.d.ts +8 -0
- package/dist/errors/AuthError.d.ts.map +1 -0
- package/dist/errors/AuthError.js +10 -0
- package/dist/errors/AuthError.js.map +1 -0
- package/dist/errors/BaseError.d.ts +17 -0
- package/dist/errors/BaseError.d.ts.map +1 -0
- package/dist/errors/BaseError.js +26 -0
- package/dist/errors/BaseError.js.map +1 -0
- package/dist/errors/NetworkError.d.ts +8 -0
- package/dist/errors/NetworkError.d.ts.map +1 -0
- package/dist/errors/NetworkError.js +10 -0
- package/dist/errors/NetworkError.js.map +1 -0
- package/dist/errors/ProtocolError.d.ts +8 -0
- package/dist/errors/ProtocolError.d.ts.map +1 -0
- package/dist/errors/ProtocolError.js +10 -0
- package/dist/errors/ProtocolError.js.map +1 -0
- package/dist/errors/TimeoutError.d.ts +8 -0
- package/dist/errors/TimeoutError.d.ts.map +1 -0
- package/dist/errors/TimeoutError.js +10 -0
- package/dist/errors/TimeoutError.js.map +1 -0
- package/dist/errors/index.d.ts +6 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +6 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/functional-api.d.ts +24 -0
- package/dist/functional-api.d.ts.map +1 -0
- package/dist/functional-api.js +59 -0
- package/dist/functional-api.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/AppsResource.d.ts +37 -0
- package/dist/resources/AppsResource.d.ts.map +1 -0
- package/dist/resources/AppsResource.js +51 -0
- package/dist/resources/AppsResource.js.map +1 -0
- package/dist/resources/ConversationsResource.d.ts +81 -0
- package/dist/resources/ConversationsResource.d.ts.map +1 -0
- package/dist/resources/ConversationsResource.js +103 -0
- package/dist/resources/ConversationsResource.js.map +1 -0
- package/dist/resources/MessagesResource.d.ts +56 -0
- package/dist/resources/MessagesResource.d.ts.map +1 -0
- package/dist/resources/MessagesResource.js +115 -0
- package/dist/resources/MessagesResource.js.map +1 -0
- package/dist/session/session-token.d.ts +38 -0
- package/dist/session/session-token.d.ts.map +1 -0
- package/dist/session/session-token.js +74 -0
- package/dist/session/session-token.js.map +1 -0
- package/dist/transforms/app.transform.d.ts +6 -0
- package/dist/transforms/app.transform.d.ts.map +1 -0
- package/dist/transforms/app.transform.js +39 -0
- package/dist/transforms/app.transform.js.map +1 -0
- package/dist/transforms/conversation.transform.d.ts +10 -0
- package/dist/transforms/conversation.transform.d.ts.map +1 -0
- package/dist/transforms/conversation.transform.js +45 -0
- package/dist/transforms/conversation.transform.js.map +1 -0
- package/dist/transforms/message.transform.d.ts +12 -0
- package/dist/transforms/message.transform.d.ts.map +1 -0
- package/dist/transforms/message.transform.js +119 -0
- package/dist/transforms/message.transform.js.map +1 -0
- package/dist/transport/HttpClient.d.ts +34 -0
- package/dist/transport/HttpClient.d.ts.map +1 -0
- package/dist/transport/HttpClient.js +158 -0
- package/dist/transport/HttpClient.js.map +1 -0
- package/dist/transport/config.types.d.ts +40 -0
- package/dist/transport/config.types.d.ts.map +1 -0
- package/dist/transport/config.types.js +2 -0
- package/dist/transport/config.types.js.map +1 -0
- package/dist/transport/index.d.ts +10 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +11 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/timeout.d.ts +12 -0
- package/dist/transport/timeout.d.ts.map +1 -0
- package/dist/transport/timeout.js +29 -0
- package/dist/transport/timeout.js.map +1 -0
- package/dist/types/common.types.d.ts +24 -0
- package/dist/types/common.types.d.ts.map +1 -0
- package/dist/types/common.types.js +5 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/config.types.d.ts +28 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +2 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/http.types.d.ts +47 -0
- package/dist/types/http.types.d.ts.map +1 -0
- package/dist/types/http.types.js +2 -0
- package/dist/types/http.types.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.types.d.ts +118 -0
- package/dist/types/models.types.d.ts.map +1 -0
- package/dist/types/models.types.js +5 -0
- package/dist/types/models.types.js.map +1 -0
- package/dist/types/pagination.types.d.ts +69 -0
- package/dist/types/pagination.types.d.ts.map +1 -0
- package/dist/types/pagination.types.js +24 -0
- package/dist/types/pagination.types.js.map +1 -0
- package/dist/types/token.types.d.ts +6 -0
- package/dist/types/token.types.d.ts.map +1 -0
- package/dist/types/token.types.js +2 -0
- package/dist/types/token.types.js.map +1 -0
- package/package.json +38 -0
package/README.md
ADDED
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
# @seaverse/conversation-sdk
|
|
2
|
+
|
|
3
|
+
SeaVerse Conversation SDK - 用于对话(Conversations)和消息(Messages)管理的函数式 SDK。
|
|
4
|
+
|
|
5
|
+
## 安装
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @seaverse/conversation-sdk
|
|
9
|
+
# 或
|
|
10
|
+
pnpm add @seaverse/conversation-sdk
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 快速开始
|
|
14
|
+
|
|
15
|
+
### 初始化 SDK
|
|
16
|
+
|
|
17
|
+
```typescript
|
|
18
|
+
import { initConversationSdk } from '@seaverse/conversation-sdk';
|
|
19
|
+
|
|
20
|
+
const sdk = initConversationSdk({
|
|
21
|
+
environment: 'prod', // 'dev' | 'prod'
|
|
22
|
+
token: 'your-access-token'
|
|
23
|
+
});
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 获取 Apps 及其会话列表
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// 获取所有 apps,每个 app 返回消息数最多的一个会话
|
|
30
|
+
const result = await sdk.getAppsWithConversationsList({
|
|
31
|
+
page: 1,
|
|
32
|
+
pageSize: 20
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
console.log(result.apps); // AppWithConversations[]
|
|
36
|
+
console.log(result.hasMore); // boolean - 是否有下一页
|
|
37
|
+
|
|
38
|
+
// 获取指定 app
|
|
39
|
+
const appResult = await sdk.getAppsWithConversationsList({
|
|
40
|
+
appId: 'app-123',
|
|
41
|
+
page: 1,
|
|
42
|
+
pageSize: 20
|
|
43
|
+
});
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 获取消息列表
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// 获取指定会话的消息列表(倒序,最新的在前)
|
|
50
|
+
const result = await sdk.getMessagesList('conversation-id', {
|
|
51
|
+
page: 1,
|
|
52
|
+
pageSize: 50
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
console.log(result.messages); // Message[]
|
|
56
|
+
console.log(result.hasMore); // boolean - 是否有下一页
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## API 参考
|
|
60
|
+
|
|
61
|
+
### initConversationSdk(config)
|
|
62
|
+
|
|
63
|
+
初始化 Conversation SDK 并返回函数式 API。
|
|
64
|
+
|
|
65
|
+
**参数**:
|
|
66
|
+
```typescript
|
|
67
|
+
{
|
|
68
|
+
environment: 'dev' | 'prod'; // 环境配置
|
|
69
|
+
token: string; // 访问令牌
|
|
70
|
+
getToken?: () => Promise<string>; // 动态获取令牌(可选)
|
|
71
|
+
fetch?: typeof fetch; // 自定义 fetch 实现(可选)
|
|
72
|
+
timeout?: number; // 请求超时时间,默认 30000ms(可选)
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**返回**: 包含以下方法的对象
|
|
77
|
+
|
|
78
|
+
### getAppsWithConversationsList(options?)
|
|
79
|
+
|
|
80
|
+
获取 Apps 列表,每个 app 只返回消息数最多的那一个会话。
|
|
81
|
+
|
|
82
|
+
**参数**:
|
|
83
|
+
```typescript
|
|
84
|
+
{
|
|
85
|
+
appId?: string; // 可选,按应用 ID 过滤
|
|
86
|
+
page?: number; // 页码,默认 1
|
|
87
|
+
pageSize?: number; // 每页数量,默认 20
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**返回**:
|
|
92
|
+
```typescript
|
|
93
|
+
Promise<{
|
|
94
|
+
apps: AppWithConversations[];
|
|
95
|
+
hasMore: boolean; // 是否有下一页
|
|
96
|
+
}>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### getMessagesList(conversationId, options?)
|
|
100
|
+
|
|
101
|
+
获取指定会话的消息列表(按时间倒序,最新消息在前)。
|
|
102
|
+
|
|
103
|
+
**参数**:
|
|
104
|
+
- `conversationId`: `string` - 会话 ID(必需)
|
|
105
|
+
- `options?`: 可选查询选项
|
|
106
|
+
```typescript
|
|
107
|
+
{
|
|
108
|
+
page?: number; // 页码,默认 1
|
|
109
|
+
pageSize?: number; // 每页数量,默认 100
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
**返回**:
|
|
114
|
+
```typescript
|
|
115
|
+
Promise<{
|
|
116
|
+
messages: Message[];
|
|
117
|
+
hasMore: boolean; // 是否有下一页
|
|
118
|
+
}>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 类型定义
|
|
122
|
+
|
|
123
|
+
### Message
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
interface Message {
|
|
127
|
+
id: string;
|
|
128
|
+
role?: 'user' | 'assistant' | 'system'; // tips 消息无 role
|
|
129
|
+
content?: string; // tips 消息不返回此字段
|
|
130
|
+
timestamp: number; // 秒级时间戳
|
|
131
|
+
type?: 'text' | 'conversation_tips' | string;
|
|
132
|
+
tips?: string[]; // conversation_tips 类型专有
|
|
133
|
+
toolCalls?: ToolCall[]; // 工具调用信息
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Tips 消息格式**:
|
|
138
|
+
```typescript
|
|
139
|
+
{
|
|
140
|
+
id: string;
|
|
141
|
+
conversation_id: string; // 仅 tips 消息有此字段
|
|
142
|
+
timestamp: number;
|
|
143
|
+
type: "conversation_tips";
|
|
144
|
+
tips: string[];
|
|
145
|
+
// 注意: tips 消息没有 content 和 role 字段
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### ToolCall
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
interface ToolCall {
|
|
153
|
+
id: string;
|
|
154
|
+
toolName: string;
|
|
155
|
+
toolInput: Record<string, unknown>;
|
|
156
|
+
isCompleted: boolean;
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Conversation
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
interface Conversation {
|
|
164
|
+
id: string;
|
|
165
|
+
title: string;
|
|
166
|
+
appId: string | null;
|
|
167
|
+
userId: string;
|
|
168
|
+
createdAt: number; // 毫秒时间戳
|
|
169
|
+
updatedAt: number; // 毫秒时间戳
|
|
170
|
+
lastActiveAt: number; // 毫秒时间戳
|
|
171
|
+
messageCount?: number; // 消息计数
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### AppWithConversations
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
interface AppWithConversations {
|
|
179
|
+
app: App;
|
|
180
|
+
conversations: Conversation[]; // 只有一个元素(消息数最多的会话)
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### App
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
interface App {
|
|
188
|
+
id: string;
|
|
189
|
+
name: string;
|
|
190
|
+
displayName: string;
|
|
191
|
+
description: string;
|
|
192
|
+
thumbnailUrls: string[];
|
|
193
|
+
userName: string;
|
|
194
|
+
version: string;
|
|
195
|
+
tags: string[] | null;
|
|
196
|
+
status: 'draft' | 'published' | 'archived';
|
|
197
|
+
positiveCount: number;
|
|
198
|
+
forkCount: number;
|
|
199
|
+
commentCount: number;
|
|
200
|
+
createdAt: number; // 毫秒时间戳
|
|
201
|
+
updatedAt: number; // 毫秒时间戳
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 错误处理
|
|
206
|
+
|
|
207
|
+
SDK 提供了几种错误类型:
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
import {
|
|
211
|
+
BaseError,
|
|
212
|
+
NetworkError,
|
|
213
|
+
AuthError,
|
|
214
|
+
TimeoutError,
|
|
215
|
+
ProtocolError
|
|
216
|
+
} from '@seaverse/conversation-sdk';
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
const result = await sdk.getAppsWithConversationsList();
|
|
220
|
+
} catch (error) {
|
|
221
|
+
if (error instanceof AuthError) {
|
|
222
|
+
console.error('认证失败:', error.message);
|
|
223
|
+
} else if (error instanceof NetworkError) {
|
|
224
|
+
console.error('网络错误:', error.message);
|
|
225
|
+
} else if (error instanceof TimeoutError) {
|
|
226
|
+
console.error('请求超时:', error.message);
|
|
227
|
+
} else {
|
|
228
|
+
console.error('未知错误:', error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## 完整示例
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { initConversationSdk } from '@seaverse/conversation-sdk';
|
|
237
|
+
|
|
238
|
+
// 初始化 SDK
|
|
239
|
+
const sdk = initConversationSdk({
|
|
240
|
+
environment: 'prod',
|
|
241
|
+
token: 'your-access-token'
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
// 1. 获取所有 apps 及其热门会话
|
|
245
|
+
const appsResult = await sdk.getAppsWithConversationsList({
|
|
246
|
+
page: 1,
|
|
247
|
+
pageSize: 20
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
console.log('Apps:', appsResult.apps);
|
|
251
|
+
console.log('有下一页:', appsResult.hasMore);
|
|
252
|
+
|
|
253
|
+
// 2. 获取某个会话的消息
|
|
254
|
+
const conversationId = appsResult.apps[0]?.conversations[0]?.id;
|
|
255
|
+
if (conversationId) {
|
|
256
|
+
const messagesResult = await sdk.getMessagesList(conversationId, {
|
|
257
|
+
page: 1,
|
|
258
|
+
pageSize: 50
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
console.log('消息列表:', messagesResult.messages);
|
|
262
|
+
console.log('有更多消息:', messagesResult.hasMore);
|
|
263
|
+
|
|
264
|
+
// 处理不同类型的消息
|
|
265
|
+
messagesResult.messages.forEach(msg => {
|
|
266
|
+
if (msg.type === 'conversation_tips') {
|
|
267
|
+
console.log('Tips:', msg.tips);
|
|
268
|
+
} else {
|
|
269
|
+
console.log('消息:', msg.content);
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## 环境配置
|
|
276
|
+
|
|
277
|
+
SDK 会根据 `environment` 参数自动选择对应的服务端点:
|
|
278
|
+
|
|
279
|
+
- `'dev'`: 开发环境
|
|
280
|
+
- `'prod'`: 生产环境
|
|
281
|
+
|
|
282
|
+
## 许可证
|
|
283
|
+
|
|
284
|
+
MIT
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { DbClient } from '../data/DbClient.js';
|
|
2
|
+
import type { ListAppsWithConversationsResult } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration for aggregated query
|
|
5
|
+
*/
|
|
6
|
+
export interface ListAppsWithConversationsConfig {
|
|
7
|
+
/**
|
|
8
|
+
* Optional app ID to filter by
|
|
9
|
+
*/
|
|
10
|
+
appId?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Page number (1-based)
|
|
13
|
+
* @default 1
|
|
14
|
+
*/
|
|
15
|
+
page?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Page size
|
|
18
|
+
* @default 20
|
|
19
|
+
*/
|
|
20
|
+
pageSize?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Database client
|
|
23
|
+
*/
|
|
24
|
+
db: DbClient;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* List apps with their conversations (aggregated query)
|
|
28
|
+
* Each app returns only ONE conversation - the one with the most messages.
|
|
29
|
+
*
|
|
30
|
+
* Implementation: Real-time message counting
|
|
31
|
+
* - Queries all conversations
|
|
32
|
+
* - Counts messages for each conversation from messages table
|
|
33
|
+
* - Selects the conversation with highest message count per app
|
|
34
|
+
*
|
|
35
|
+
* This ensures accuracy even if message_count field is not maintained.
|
|
36
|
+
*
|
|
37
|
+
* Replaces `/api/apps/with-conversations` endpoint
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* const result = await listAppsWithConversations({
|
|
41
|
+
* db: dbClient,
|
|
42
|
+
* getUrlSessionToken,
|
|
43
|
+
* accessToken: 'user-token',
|
|
44
|
+
* });
|
|
45
|
+
*/
|
|
46
|
+
export declare function listAppsWithConversations(config: ListAppsWithConversationsConfig): Promise<ListAppsWithConversationsResult>;
|
|
47
|
+
//# sourceMappingURL=apps-with-conversations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps-with-conversations.d.ts","sourceRoot":"","sources":["../../src/aggregated/apps-with-conversations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAGV,+BAA+B,EAChC,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,EAAE,EAAE,QAAQ,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAAC,+BAA+B,CAAC,CA2F1C"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { transformConversation } from '../transforms/conversation.transform.js';
|
|
2
|
+
import { transformApp } from '../transforms/app.transform.js';
|
|
3
|
+
import { pageToOffset } from '../types/pagination.types.js';
|
|
4
|
+
/**
|
|
5
|
+
* List apps with their conversations (aggregated query)
|
|
6
|
+
* Each app returns only ONE conversation - the one with the most messages.
|
|
7
|
+
*
|
|
8
|
+
* Implementation: Real-time message counting
|
|
9
|
+
* - Queries all conversations
|
|
10
|
+
* - Counts messages for each conversation from messages table
|
|
11
|
+
* - Selects the conversation with highest message count per app
|
|
12
|
+
*
|
|
13
|
+
* This ensures accuracy even if message_count field is not maintained.
|
|
14
|
+
*
|
|
15
|
+
* Replaces `/api/apps/with-conversations` endpoint
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* const result = await listAppsWithConversations({
|
|
19
|
+
* db: dbClient,
|
|
20
|
+
* getUrlSessionToken,
|
|
21
|
+
* accessToken: 'user-token',
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
24
|
+
export async function listAppsWithConversations(config) {
|
|
25
|
+
const { appId, page = 1, pageSize = 20, db, } = config;
|
|
26
|
+
// Calculate pagination params
|
|
27
|
+
const { limit, offset } = pageToOffset(page, pageSize);
|
|
28
|
+
// Parallel requests to avoid waterfall
|
|
29
|
+
const [dbApps, dbConversations] = await Promise.all([
|
|
30
|
+
// Get apps with pagination
|
|
31
|
+
db.get('apps', appId
|
|
32
|
+
? { filter: { app_id: `eq.${appId}` }, limit, offset, count: 'exact' }
|
|
33
|
+
: { limit, offset, count: 'exact' }),
|
|
34
|
+
// Get conversations (all conversations to find max message_count per app)
|
|
35
|
+
db.get('conversations', appId ? { filter: { app_id: `eq.${appId}` } } : {}),
|
|
36
|
+
]);
|
|
37
|
+
// Extract all conversation IDs for message counting
|
|
38
|
+
const conversationIds = dbConversations.data
|
|
39
|
+
.map((conv) => conv.conversation_id || conv.id)
|
|
40
|
+
.filter(Boolean);
|
|
41
|
+
// Fetch all messages for these conversations and count them
|
|
42
|
+
let realMessageCounts = new Map();
|
|
43
|
+
if (conversationIds.length > 0) {
|
|
44
|
+
// Query all messages for these conversations
|
|
45
|
+
const dbMessages = await db.get('messages', {
|
|
46
|
+
filter: { conversation_id: `in.(${conversationIds.join(',')})` },
|
|
47
|
+
select: 'conversation_id',
|
|
48
|
+
});
|
|
49
|
+
// Count messages per conversation
|
|
50
|
+
for (const msg of dbMessages.data) {
|
|
51
|
+
const count = realMessageCounts.get(msg.conversation_id) || 0;
|
|
52
|
+
realMessageCounts.set(msg.conversation_id, count + 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
// Group conversations by appId and select the one with highest REAL message count
|
|
56
|
+
const topConversationByAppId = new Map();
|
|
57
|
+
for (const dbConv of dbConversations.data) {
|
|
58
|
+
const conv = transformConversation(dbConv);
|
|
59
|
+
const convId = dbConv.conversation_id || dbConv.id;
|
|
60
|
+
// Use real message count instead of db field
|
|
61
|
+
const realCount = realMessageCounts.get(convId) || 0;
|
|
62
|
+
// Only process conversations with appId (skip global conversations)
|
|
63
|
+
if (conv.appId) {
|
|
64
|
+
const existing = topConversationByAppId.get(conv.appId);
|
|
65
|
+
const existingCount = existing?.messageCount || 0;
|
|
66
|
+
// Only keep the conversation with highest REAL message count
|
|
67
|
+
if (!existing || realCount > existingCount) {
|
|
68
|
+
// Update messageCount with real count
|
|
69
|
+
conv.messageCount = realCount;
|
|
70
|
+
topConversationByAppId.set(conv.appId, conv);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Build response (each app has at most 1 conversation - the one with highest message_count)
|
|
75
|
+
const appsWithConversations = dbApps.data.map((dbApp) => {
|
|
76
|
+
const topConv = topConversationByAppId.get((dbApp.app_id || dbApp.id));
|
|
77
|
+
return {
|
|
78
|
+
app: transformApp(dbApp),
|
|
79
|
+
conversations: topConv ? [topConv] : [],
|
|
80
|
+
};
|
|
81
|
+
});
|
|
82
|
+
// Calculate hasMore (是否还有下一页)
|
|
83
|
+
const total = dbApps.count || 0;
|
|
84
|
+
const hasMore = page * pageSize < total;
|
|
85
|
+
return {
|
|
86
|
+
apps: appsWithConversations,
|
|
87
|
+
hasMore,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=apps-with-conversations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apps-with-conversations.js","sourceRoot":"","sources":["../../src/aggregated/apps-with-conversations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/aggregated/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,YAAY,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/aggregated/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ConversationClientConfig } from '../types/config.types.js';
|
|
2
|
+
import { ConversationsResource } from '../resources/ConversationsResource.js';
|
|
3
|
+
import { MessagesResource } from '../resources/MessagesResource.js';
|
|
4
|
+
import { AppsResource } from '../resources/AppsResource.js';
|
|
5
|
+
/**
|
|
6
|
+
* Conversation SDK 客户端
|
|
7
|
+
*/
|
|
8
|
+
export declare class ConversationClient {
|
|
9
|
+
private readonly config;
|
|
10
|
+
private readonly db;
|
|
11
|
+
readonly conversations: ConversationsResource;
|
|
12
|
+
readonly messages: MessagesResource;
|
|
13
|
+
readonly apps: AppsResource;
|
|
14
|
+
constructor(config: ConversationClientConfig);
|
|
15
|
+
/**
|
|
16
|
+
* 获取 URL session token
|
|
17
|
+
*/
|
|
18
|
+
getUrlSessionToken(): Promise<string | null>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 创建 Conversation SDK 客户端(工厂函数)
|
|
22
|
+
*/
|
|
23
|
+
export declare function createClient(config: ConversationClientConfig): ConversationClient;
|
|
24
|
+
//# sourceMappingURL=ConversationClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationClient.d.ts","sourceRoot":"","sources":["../../src/client/ConversationClient.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAErB;IACF,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;IAG9B,SAAgB,aAAa,EAAE,qBAAqB,CAAC;IACrD,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAC3C,SAAgB,IAAI,EAAE,YAAY,CAAC;gBAEvB,MAAM,EAAE,wBAAwB;IA6B5C;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAUnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,CAEjF"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { createHttpClient } from '../transport/index.js';
|
|
2
|
+
import { DbClient } from '../data/DbClient.js';
|
|
3
|
+
import { getUrlSessionToken as getToken } from '../session/session-token.js';
|
|
4
|
+
import { getEnvironmentConfig } from './EnvironmentConfig.js';
|
|
5
|
+
import { ConversationsResource } from '../resources/ConversationsResource.js';
|
|
6
|
+
import { MessagesResource } from '../resources/MessagesResource.js';
|
|
7
|
+
import { AppsResource } from '../resources/AppsResource.js';
|
|
8
|
+
/**
|
|
9
|
+
* Conversation SDK 客户端
|
|
10
|
+
*/
|
|
11
|
+
export class ConversationClient {
|
|
12
|
+
constructor(config) {
|
|
13
|
+
// 环境配置解析
|
|
14
|
+
const envConfig = getEnvironmentConfig(config.environment);
|
|
15
|
+
this.config = {
|
|
16
|
+
environment: config.environment,
|
|
17
|
+
token: config.token,
|
|
18
|
+
getToken: config.getToken || (() => config.token),
|
|
19
|
+
fetch: config.fetch || globalThis.fetch,
|
|
20
|
+
timeout: config.timeout || 30000,
|
|
21
|
+
urls: envConfig,
|
|
22
|
+
};
|
|
23
|
+
// 创建底层客户端
|
|
24
|
+
const http = createHttpClient({
|
|
25
|
+
baseUrl: this.config.urls.postgrest,
|
|
26
|
+
fetch: this.config.fetch,
|
|
27
|
+
getAuthToken: this.config.getToken,
|
|
28
|
+
timeoutMs: this.config.timeout,
|
|
29
|
+
});
|
|
30
|
+
this.db = new DbClient(http);
|
|
31
|
+
// 初始化资源
|
|
32
|
+
this.conversations = new ConversationsResource(this.db);
|
|
33
|
+
this.messages = new MessagesResource(this.db);
|
|
34
|
+
this.apps = new AppsResource(this.db);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 获取 URL session token
|
|
38
|
+
*/
|
|
39
|
+
async getUrlSessionToken() {
|
|
40
|
+
const token = await this.config.getToken();
|
|
41
|
+
if (!token)
|
|
42
|
+
return null;
|
|
43
|
+
return getToken({
|
|
44
|
+
authBaseUrl: this.config.urls.auth,
|
|
45
|
+
accessToken: token,
|
|
46
|
+
fetch: this.config.fetch,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* 创建 Conversation SDK 客户端(工厂函数)
|
|
52
|
+
*/
|
|
53
|
+
export function createClient(config) {
|
|
54
|
+
return new ConversationClient(config);
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=ConversationClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationClient.js","sourceRoot":"","sources":["../../src/client/ConversationClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,kBAAkB,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAW7B,YAAY,MAAgC;QAC1C,SAAS;QACT,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE3D,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;YACjD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK;YACvC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;YAChC,IAAI,EAAE,SAAS;SAChB,CAAC;QAEF,UAAU;QACV,MAAM,IAAI,GAAG,gBAAgB,CAAC;YAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS;YACnC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAClC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;SAC/B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAE7B,QAAQ;QACR,IAAI,CAAC,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,OAAO,QAAQ,CAAC;YACd,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI;YAClC,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;SACzB,CAAC,CAAC;IACL,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgC;IAC3D,OAAO,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DbClient } from '../data/DbClient.js';
|
|
2
|
+
import type { QueryOptions, MutationOptions } from '../data/query.types.js';
|
|
3
|
+
import type { Conversation } from '../types/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Client for conversation operations
|
|
6
|
+
*/
|
|
7
|
+
export declare class ConversationsClient {
|
|
8
|
+
private readonly db;
|
|
9
|
+
constructor(db: DbClient);
|
|
10
|
+
/**
|
|
11
|
+
* List conversations
|
|
12
|
+
*/
|
|
13
|
+
list(options?: QueryOptions): Promise<Conversation[]>;
|
|
14
|
+
/**
|
|
15
|
+
* Get a single conversation by ID
|
|
16
|
+
*/
|
|
17
|
+
get(id: string): Promise<Conversation | null>;
|
|
18
|
+
/**
|
|
19
|
+
* Create a new conversation
|
|
20
|
+
*/
|
|
21
|
+
create(data: Partial<Conversation>, options?: MutationOptions): Promise<Conversation>;
|
|
22
|
+
/**
|
|
23
|
+
* Update a conversation
|
|
24
|
+
*/
|
|
25
|
+
update(id: string, data: Partial<Conversation>, options?: MutationOptions): Promise<Conversation>;
|
|
26
|
+
/**
|
|
27
|
+
* Delete a conversation
|
|
28
|
+
*/
|
|
29
|
+
delete(id: string): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=ConversationsClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationsClient.d.ts","sourceRoot":"","sources":["../../src/client/ConversationsClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;GAEG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC;;OAEG;IACG,IAAI,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAK3D;;OAEG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAMnD;;OAEG;IACG,MAAM,CACV,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,EAC3B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,YAAY,CAAC;IAQxB;;OAEG;IACG,MAAM,CACV,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,EAC3B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,YAAY,CAAC;IAaxB;;OAEG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGxC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client for conversation operations
|
|
3
|
+
*/
|
|
4
|
+
export class ConversationsClient {
|
|
5
|
+
constructor(db) {
|
|
6
|
+
this.db = db;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* List conversations
|
|
10
|
+
*/
|
|
11
|
+
async list(options) {
|
|
12
|
+
const result = await this.db.get('conversations', options);
|
|
13
|
+
return result.data;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get a single conversation by ID
|
|
17
|
+
*/
|
|
18
|
+
async get(id) {
|
|
19
|
+
return this.db.getOne('conversations', {
|
|
20
|
+
filter: { id: `eq.${id}` },
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a new conversation
|
|
25
|
+
*/
|
|
26
|
+
async create(data, options) {
|
|
27
|
+
const results = await this.db.post('conversations', data, {
|
|
28
|
+
returning: 'representation',
|
|
29
|
+
...options,
|
|
30
|
+
});
|
|
31
|
+
return results[0];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Update a conversation
|
|
35
|
+
*/
|
|
36
|
+
async update(id, data, options) {
|
|
37
|
+
const results = await this.db.patch('conversations', { id: `eq.${id}` }, data, {
|
|
38
|
+
returning: 'representation',
|
|
39
|
+
...options,
|
|
40
|
+
});
|
|
41
|
+
return results[0];
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Delete a conversation
|
|
45
|
+
*/
|
|
46
|
+
async delete(id) {
|
|
47
|
+
await this.db.delete('conversations', { id: `eq.${id}` });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ConversationsClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConversationsClient.js","sourceRoot":"","sources":["../../src/client/ConversationsClient.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAC9B,YAA6B,EAAY;QAAZ,OAAE,GAAF,EAAE,CAAU;IAAG,CAAC;IAE7C;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAsB;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAe,eAAe,EAAE,OAAO,CAAC,CAAC;QACzE,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,EAAU;QAClB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAe,eAAe,EAAE;YACnD,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,IAA2B,EAC3B,OAAyB;QAEzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAAe,eAAe,EAAE,IAAI,EAAE;YACtE,SAAS,EAAE,gBAAgB;YAC3B,GAAG,OAAO;SACX,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,EAAU,EACV,IAA2B,EAC3B,OAAyB;QAEzB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CACjC,eAAe,EACf,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAClB,IAAI,EACJ;YACE,SAAS,EAAE,gBAAgB;YAC3B,GAAG,OAAO;SACX,CACF,CAAC;QACF,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 环境 URL 配置
|
|
3
|
+
*/
|
|
4
|
+
export interface EnvironmentUrls {
|
|
5
|
+
postgrest: string;
|
|
6
|
+
auth: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* 获取环境配置
|
|
10
|
+
*/
|
|
11
|
+
export declare function getEnvironmentConfig(env: 'dev' | 'prod'): EnvironmentUrls;
|
|
12
|
+
//# sourceMappingURL=EnvironmentConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentConfig.d.ts","sourceRoot":"","sources":["../../src/client/EnvironmentConfig.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAiBD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,KAAK,GAAG,MAAM,GAAG,eAAe,CAEzE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 环境配置映射
|
|
3
|
+
*/
|
|
4
|
+
const ENV_CONFIGS = {
|
|
5
|
+
dev: {
|
|
6
|
+
// 开发/测试环境:用于浏览器联调的 PostgREST / Auth
|
|
7
|
+
postgrest: 'https://postgrest.sg.seaverse.dev',
|
|
8
|
+
auth: 'https://auth.sg.seaverse.dev',
|
|
9
|
+
},
|
|
10
|
+
prod: {
|
|
11
|
+
postgrest: 'https://db.seaverse.ai',
|
|
12
|
+
auth: 'https://auth.sg.seaverse.dev',
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 获取环境配置
|
|
17
|
+
*/
|
|
18
|
+
export function getEnvironmentConfig(env) {
|
|
19
|
+
return ENV_CONFIGS[env];
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=EnvironmentConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvironmentConfig.js","sourceRoot":"","sources":["../../src/client/EnvironmentConfig.ts"],"names":[],"mappings":"AAQA;;GAEG;AACH,MAAM,WAAW,GAA4C;IAC3D,GAAG,EAAE;QACH,oCAAoC;QACpC,SAAS,EAAE,mCAAmC;QAC9C,IAAI,EAAE,8BAA8B;KACrC;IACD,IAAI,EAAE;QACJ,SAAS,EAAE,wBAAwB;QACnC,IAAI,EAAE,8BAA8B;KACrC;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAmB;IACtD,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC"}
|