@lobehub/market-sdk 0.0.7 → 0.0.9

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/index.d.mts CHANGED
@@ -1,5 +1,28 @@
1
1
  import { z } from 'zod';
2
2
 
3
+ interface PluginQueryParams {
4
+ page?: number;
5
+ pageSize?: number;
6
+ category?: string;
7
+ tags?: string;
8
+ q?: string;
9
+ sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';
10
+ order?: 'asc' | 'desc';
11
+ locale?: string;
12
+ }
13
+
14
+ /**
15
+ * 更新插件信息参数
16
+ */
17
+ interface PluginUpdateParams {
18
+ identifier?: string;
19
+ visibility?: 'public' | 'private' | 'unlisted';
20
+ status?: 'published' | 'draft' | 'review' | 'rejected';
21
+ isFeatured?: boolean;
22
+ tags?: string[];
23
+ meta?: Record<string, any>;
24
+ }
25
+
3
26
  declare const PluginTypeEnum: z.ZodEnum<["lobe", "openai", "mcp"]>;
4
27
  type PluginType = z.infer<typeof PluginTypeEnum>;
5
28
  declare const ConnectionTypeEnum: z.ZodEnum<["http", "stdio"]>;
@@ -21,9 +44,14 @@ interface ConnectionConfig {
21
44
  args?: string[];
22
45
  url?: string;
23
46
  }
47
+ interface InstallationDetails {
48
+ packageName?: string;
49
+ repositoryUrlToClone?: string;
50
+ setupSteps?: string[];
51
+ }
24
52
  interface DeploymentOption {
25
53
  installationMethod: string;
26
- installationDetails?: Record<string, any>;
54
+ installationDetails?: InstallationDetails;
27
55
  connection: ConnectionConfig;
28
56
  isRecommended?: boolean;
29
57
  notes?: string;
@@ -143,61 +171,310 @@ interface MarketSDKOptions {
143
171
  defaultLocale?: string;
144
172
  apiKey?: string;
145
173
  }
174
+ interface Plugin {
175
+ id: number;
176
+ identifier: string;
177
+ name: string;
178
+ description: string;
179
+ ownerId: number;
180
+ type: string;
181
+ visibility: 'public' | 'private' | 'unlisted';
182
+ status: 'published' | 'draft' | 'review' | 'rejected';
183
+ isFeatured: boolean;
184
+ category: string;
185
+ tags: string[];
186
+ icon: string | null;
187
+ author: string | null;
188
+ homepage: string | null;
189
+ manifestVersion: string;
190
+ createdAt: string;
191
+ updatedAt: string;
192
+ meta: Record<string, any> | null;
193
+ installCount: number;
194
+ ratingAverage: number | null;
195
+ ratingCount: number;
196
+ reviewCount: number;
197
+ }
198
+ interface PluginVersion {
199
+ id: number;
200
+ pluginId: number;
201
+ version: string;
202
+ isLatest: boolean;
203
+ manifestUrl: string | null;
204
+ toolsCount: number;
205
+ promptsCount: number;
206
+ resourcesCount: number;
207
+ isValidated: boolean;
208
+ createdAt: string;
209
+ updatedAt: string;
210
+ manifest: PluginManifest;
211
+ meta: Record<string, any> | null;
212
+ }
213
+ interface AdminPluginParams {
214
+ status?: 'published' | 'draft' | 'review' | 'rejected';
215
+ visibility?: 'public' | 'private' | 'unlisted';
216
+ featured?: boolean;
217
+ ownerId?: number;
218
+ limit?: number;
219
+ offset?: number;
220
+ orderBy?: 'createdAt' | 'updatedAt' | 'installCount' | 'ratingAverage';
221
+ order?: 'asc' | 'desc';
222
+ }
223
+ interface PluginVersionCreateParams {
224
+ version: string;
225
+ manifest: PluginManifest;
226
+ manifestUrl?: string;
227
+ isLatest?: boolean;
228
+ isValidated?: boolean;
229
+ meta?: Record<string, any>;
230
+ }
231
+ interface PluginVersionUpdateParams {
232
+ manifestUrl?: string;
233
+ isValidated?: boolean;
234
+ meta?: Record<string, any>;
235
+ }
146
236
 
147
237
  /**
148
- * LobeHub Market SDK Client
238
+ * 基础 SDK
239
+ * 提供共享的请求逻辑和认证功能
149
240
  */
150
- declare class MarketSDK {
151
- private baseUrl;
152
- private defaultLocale;
241
+ declare class BaseSDK {
242
+ protected baseUrl: string;
243
+ protected defaultLocale: string;
244
+ protected headers: Record<string, string>;
245
+ /**
246
+ * 创建基础 SDK 实例
247
+ * @param options SDK 配置选项
248
+ * @param sharedHeaders 共享的 headers 对象(可选)
249
+ */
250
+ constructor(options?: MarketSDKOptions, sharedHeaders?: Record<string, string>);
251
+ /**
252
+ * 发送请求并处理响应
253
+ * @param url 请求 URL
254
+ * @param options fetch 选项
255
+ * @returns 响应数据
256
+ */
257
+ protected request<T>(url: string, options?: RequestInit): Promise<T>;
258
+ /**
259
+ * 构建查询字符串
260
+ * @param params 查询参数
261
+ * @returns 查询字符串
262
+ */
263
+ protected buildQueryString(params: Record<string, any>): string;
264
+ /**
265
+ * 设置认证令牌
266
+ * @param token 认证令牌
267
+ */
268
+ setAuthToken(token: string): void;
269
+ /**
270
+ * 清除认证令牌
271
+ */
272
+ clearAuthToken(): void;
273
+ }
274
+
275
+ /**
276
+ * 管理员服务
277
+ * 处理管理员相关功能
278
+ */
279
+ declare class AdminService extends BaseSDK {
280
+ /**
281
+ * 创建管理员服务实例
282
+ * @param options SDK 配置选项
283
+ * @param sharedHeaders 共享的 headers 对象(可选)
284
+ */
285
+ constructor(options?: MarketSDKOptions, sharedHeaders?: Record<string, string>);
286
+ /**
287
+ * 导入插件清单(需要管理员权限)
288
+ * @param manifests 插件清单数组
289
+ * @param ownerId 所有者 ID
290
+ * @returns 导入结果
291
+ */
292
+ importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{
293
+ success: number;
294
+ failed: number;
295
+ }>;
296
+ /**
297
+ * 获取所有插件(高级筛选)
298
+ * @param params 管理员插件查询参数
299
+ * @returns 插件列表响应
300
+ */
301
+ getPlugins(params?: AdminPluginParams): Promise<{
302
+ data: Plugin[];
303
+ meta: {
304
+ total: number;
305
+ limit: number;
306
+ offset: number;
307
+ };
308
+ }>;
309
+ /**
310
+ * 获取单个插件(含所有版本)
311
+ * @param id 插件 ID
312
+ * @returns 插件(含版本)
313
+ */
314
+ getPlugin(id: number): Promise<{
315
+ data: Plugin & {
316
+ versions: PluginVersion[];
317
+ };
318
+ }>;
319
+ /**
320
+ * 更新插件信息
321
+ * @param id 插件 ID
322
+ * @param data 插件更新数据
323
+ * @returns 更新后的插件
324
+ */
325
+ updatePlugin(id: number, data: PluginUpdateParams): Promise<{
326
+ data: Plugin;
327
+ }>;
328
+ /**
329
+ * 更新插件状态
330
+ * @param id 插件 ID
331
+ * @param status 新状态
332
+ * @returns 成功响应
333
+ */
334
+ updatePluginStatus(id: number, status: 'published' | 'draft' | 'review' | 'rejected'): Promise<{
335
+ success: boolean;
336
+ message: string;
337
+ }>;
338
+ /**
339
+ * 删除插件
340
+ * @param id 插件 ID
341
+ * @returns 成功响应
342
+ */
343
+ deletePlugin(id: number): Promise<{
344
+ success: boolean;
345
+ message: string;
346
+ }>;
347
+ /**
348
+ * 获取插件版本列表
349
+ * @param pluginId 插件 ID
350
+ * @returns 插件版本列表
351
+ */
352
+ getPluginVersions(pluginId: number): Promise<{
353
+ data: PluginVersion[];
354
+ }>;
355
+ /**
356
+ * 获取单个插件版本
357
+ * @param pluginId 插件 ID
358
+ * @param versionId 版本 ID
359
+ * @returns 插件版本
360
+ */
361
+ getPluginVersion(pluginId: number, versionId: number): Promise<{
362
+ data: PluginVersion;
363
+ }>;
364
+ /**
365
+ * 创建插件版本
366
+ * @param pluginId 插件 ID
367
+ * @param data 版本创建数据
368
+ * @returns 创建的版本
369
+ */
370
+ createPluginVersion(pluginId: number, data: PluginVersionCreateParams): Promise<{
371
+ data: PluginVersion;
372
+ }>;
373
+ /**
374
+ * 更新插件版本
375
+ * @param pluginId 插件 ID
376
+ * @param versionId 版本 ID
377
+ * @param data 版本更新数据
378
+ * @returns 更新后的版本
379
+ */
380
+ updatePluginVersion(pluginId: number, versionId: number, data: PluginVersionUpdateParams): Promise<{
381
+ data: PluginVersion;
382
+ }>;
383
+ /**
384
+ * 删除插件版本
385
+ * @param pluginId 插件 ID
386
+ * @param versionId 版本 ID
387
+ * @returns 成功响应
388
+ */
389
+ deletePluginVersion(pluginId: number, versionId: number): Promise<{
390
+ success: boolean;
391
+ message: string;
392
+ }>;
393
+ /**
394
+ * 设置插件版本为最新版本
395
+ * @param pluginId 插件 ID
396
+ * @param versionId 版本 ID
397
+ * @returns 成功响应
398
+ */
399
+ setPluginVersionAsLatest(pluginId: number, versionId: number): Promise<{
400
+ success: boolean;
401
+ message: string;
402
+ }>;
403
+ }
404
+
405
+ /**
406
+ * 插件服务
407
+ * 处理插件相关功能
408
+ */
409
+ declare class PluginsService extends BaseSDK {
410
+ /**
411
+ * 创建插件服务实例
412
+ * @param options SDK 配置选项
413
+ * @param sharedHeaders 共享的 headers 对象(可选)
414
+ */
415
+ constructor(options?: MarketSDKOptions, sharedHeaders?: Record<string, string>);
416
+ /**
417
+ * 获取插件列表
418
+ * @param params 查询参数
419
+ * @returns 插件列表响应
420
+ */
421
+ getPluginList(params?: PluginQueryParams): Promise<PluginListResponse>;
422
+ /**
423
+ * 获取插件清单
424
+ * @param identifier 插件标识符
425
+ * @param locale 语言
426
+ * @param version 版本
427
+ * @returns 插件清单
428
+ */
429
+ getPluginManifest(identifier: string, locale?: string, version?: string): Promise<PluginManifest>;
430
+ }
431
+
432
+ /**
433
+ * 发现服务
434
+ * 处理服务发现功能
435
+ */
436
+ declare class DiscoveryService extends BaseSDK {
153
437
  private discoveryDoc?;
154
- private headers;
155
438
  /**
156
- * Create MarketSDK instance
157
- * @param options SDK configuration options
439
+ * 创建发现服务实例
440
+ * @param options SDK 配置选项
441
+ * @param sharedHeaders 共享的 headers 对象(可选)
158
442
  */
159
- constructor(options?: MarketSDKOptions);
443
+ constructor(options?: MarketSDKOptions, sharedHeaders?: Record<string, string>);
444
+ /**
445
+ * 获取市场服务发现文档
446
+ * @returns 服务发现文档
447
+ */
448
+ getDiscoveryDocument(): Promise<DiscoveryDocument>;
449
+ }
450
+
451
+ /**
452
+ * LobeHub Market SDK Client
453
+ * 采用组合模式组合各个领域服务
454
+ */
455
+ declare class MarketSDK extends BaseSDK {
160
456
  /**
161
- * Send request and handle response
162
- * @param url Request URL
163
- * @param options fetch options
164
- * @returns Response data
457
+ * 插件服务
165
458
  */
166
- private request;
459
+ readonly plugins: PluginsService;
167
460
  /**
168
- * Build query string
169
- * @param params Query parameters
170
- * @returns Query string
461
+ * 管理员服务
171
462
  */
172
- private buildQueryString;
463
+ readonly admin: AdminService;
464
+ /**
465
+ * 发现服务
466
+ */
467
+ private readonly discovery;
468
+ /**
469
+ * Create MarketSDK instance
470
+ * @param options SDK configuration options
471
+ */
472
+ constructor(options?: MarketSDKOptions);
173
473
  /**
174
474
  * Get market service discovery document
175
475
  * @returns Service discovery document
176
476
  */
177
477
  getDiscoveryDocument(): Promise<DiscoveryDocument>;
178
- /**
179
- * Get plugin list
180
- * @param params Query parameters
181
- * @returns Plugin list response
182
- */
183
- getPluginList(params?: {
184
- page?: number;
185
- pageSize?: number;
186
- category?: string;
187
- tags?: string;
188
- q?: string;
189
- sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';
190
- order?: 'asc' | 'desc';
191
- locale?: string;
192
- }): Promise<PluginListResponse>;
193
- /**
194
- * Get plugin manifest
195
- * @param identifier Plugin identifier
196
- * @param locale Language
197
- * @param version Version
198
- * @returns Plugin manifest
199
- */
200
- getPluginManifest(identifier: string, locale?: string, version?: string): Promise<PluginManifest>;
201
478
  /**
202
479
  * Import plugin manifests (requires admin privileges)
203
480
  * @param manifests Plugin manifest array
@@ -208,15 +485,6 @@ declare class MarketSDK {
208
485
  success: number;
209
486
  failed: number;
210
487
  }>;
211
- /**
212
- * Set authentication token
213
- * @param token Authentication token
214
- */
215
- setAuthToken(token: string): void;
216
- /**
217
- * Clear authentication token
218
- */
219
- clearAuthToken(): void;
220
488
  }
221
489
 
222
- export { type ConnectionConfig, type ConnectionType, ConnectionTypeEnum, type DeploymentOption, type DiscoveryDocument, type InstallationMethod, InstallationMethodEnum, MarketSDK, type MarketSDKOptions, type PluginCompatibility, type PluginItem, type PluginListResponse, type PluginManifest, type PluginPrompt, type PluginResource, type PluginTool, type PluginType, PluginTypeEnum, type PromptArgument, type SystemDependency };
490
+ export { type AdminPluginParams, AdminService, type ConnectionConfig, type ConnectionType, ConnectionTypeEnum, type DeploymentOption, type DiscoveryDocument, DiscoveryService, type InstallationDetails, type InstallationMethod, InstallationMethodEnum, MarketSDK, type MarketSDKOptions, type Plugin, type PluginCompatibility, type PluginItem, type PluginListResponse, type PluginManifest, type PluginPrompt, type PluginQueryParams, type PluginResource, type PluginTool, type PluginType, PluginTypeEnum, type PluginUpdateParams, type PluginVersion, type PluginVersionCreateParams, type PluginVersionUpdateParams, PluginsService, type PromptArgument, type SystemDependency };
package/dist/index.mjs CHANGED
@@ -1,41 +1,41 @@
1
- // src/types.ts
2
- import { z } from "zod";
3
- var PluginTypeEnum = z.enum(["lobe", "openai", "mcp"]);
4
- var ConnectionTypeEnum = z.enum(["http", "stdio"]);
5
- var InstallationMethodEnum = z.enum([
6
- "npm",
7
- "docker",
8
- "git",
9
- "binaryUrl",
10
- "manual",
11
- "none"
12
- ]);
13
-
14
1
  // src/market-sdk.ts
2
+ import debug5 from "debug";
3
+
4
+ // src/core/BaseSDK.ts
15
5
  import debug from "debug";
16
- var log = debug("lobe-market-sdk");
17
- var MarketSDK = class {
6
+ var log = debug("lobe-market-sdk:core");
7
+ var BaseSDK = class {
18
8
  /**
19
- * Create MarketSDK instance
20
- * @param options SDK configuration options
9
+ * 创建基础 SDK 实例
10
+ * @param options SDK 配置选项
11
+ * @param sharedHeaders 共享的 headers 对象(可选)
21
12
  */
22
- constructor(options = {}) {
13
+ constructor(options = {}, sharedHeaders) {
23
14
  this.baseUrl = options.baseUrl || "https://market.lobehub.com/api";
24
15
  this.defaultLocale = options.defaultLocale || "zh-CN";
25
- this.headers = {
26
- "Content-Type": "application/json",
27
- ...options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}
28
- };
29
- log("MarketSDK instance created: %O", { baseUrl: this.baseUrl, defaultLocale: this.defaultLocale });
16
+ if (sharedHeaders) {
17
+ this.headers = sharedHeaders;
18
+ log("\u4F7F\u7528\u5171\u4EAB\u7684 headers \u5BF9\u8C61");
19
+ } else {
20
+ this.headers = {
21
+ "Content-Type": "application/json",
22
+ ...options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}
23
+ };
24
+ log("\u521B\u5EFA\u65B0\u7684 headers \u5BF9\u8C61");
25
+ }
26
+ log("BaseSDK \u5B9E\u4F8B\u5DF2\u521B\u5EFA: %O", {
27
+ baseUrl: this.baseUrl,
28
+ defaultLocale: this.defaultLocale
29
+ });
30
30
  }
31
31
  /**
32
- * Send request and handle response
33
- * @param url Request URL
34
- * @param options fetch options
35
- * @returns Response data
32
+ * 发送请求并处理响应
33
+ * @param url 请求 URL
34
+ * @param options fetch 选项
35
+ * @returns 响应数据
36
36
  */
37
37
  async request(url, options = {}) {
38
- log("Sending request: %s", `${this.baseUrl}${url}`);
38
+ log("\u53D1\u9001\u8BF7\u6C42: %s", `${this.baseUrl}${url}`);
39
39
  const response = await fetch(`${this.baseUrl}${url}`, {
40
40
  ...options,
41
41
  headers: {
@@ -44,110 +44,396 @@ var MarketSDK = class {
44
44
  }
45
45
  });
46
46
  if (!response.ok) {
47
- const errorMsg = `Request failed: ${response.status} ${response.statusText}`;
48
- log("Request error: %s", errorMsg);
47
+ const errorMsg = `\u8BF7\u6C42\u5931\u8D25: ${response.status} ${response.statusText}`;
48
+ log("\u8BF7\u6C42\u9519\u8BEF: %s", errorMsg);
49
49
  throw new Error(errorMsg);
50
50
  }
51
- log("Request successful: %s", url);
51
+ log("\u8BF7\u6C42\u6210\u529F: %s", url);
52
52
  return response.json();
53
53
  }
54
54
  /**
55
- * Build query string
56
- * @param params Query parameters
57
- * @returns Query string
55
+ * 构建查询字符串
56
+ * @param params 查询参数
57
+ * @returns 查询字符串
58
58
  */
59
59
  buildQueryString(params) {
60
60
  const query = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
61
61
  return query ? `?${query}` : "";
62
62
  }
63
63
  /**
64
- * Get market service discovery document
65
- * @returns Service discovery document
64
+ * 设置认证令牌
65
+ * @param token 认证令牌
66
66
  */
67
- async getDiscoveryDocument() {
68
- log("Getting service discovery document");
69
- if (this.discoveryDoc) {
70
- log("Returning cached discovery document");
71
- return this.discoveryDoc;
67
+ setAuthToken(token) {
68
+ log("\u8BBE\u7F6E\u8BA4\u8BC1\u4EE4\u724C");
69
+ this.headers.Authorization = `Bearer ${token}`;
70
+ }
71
+ /**
72
+ * 清除认证令牌
73
+ */
74
+ clearAuthToken() {
75
+ log("\u6E05\u9664\u8BA4\u8BC1\u4EE4\u724C");
76
+ delete this.headers.Authorization;
77
+ }
78
+ };
79
+
80
+ // src/services/AdminService.ts
81
+ import debug2 from "debug";
82
+ var log2 = debug2("lobe-market-sdk:admin");
83
+ var AdminService = class extends BaseSDK {
84
+ /**
85
+ * 创建管理员服务实例
86
+ * @param options SDK 配置选项
87
+ * @param sharedHeaders 共享的 headers 对象(可选)
88
+ */
89
+ constructor(options = {}, sharedHeaders) {
90
+ super(options, sharedHeaders);
91
+ log2("AdminService \u5B9E\u4F8B\u5DF2\u521B\u5EFA");
92
+ }
93
+ /**
94
+ * 导入插件清单(需要管理员权限)
95
+ * @param manifests 插件清单数组
96
+ * @param ownerId 所有者 ID
97
+ * @returns 导入结果
98
+ */
99
+ async importManifests(manifests, ownerId) {
100
+ log2(`\u5F00\u59CB\u6279\u91CF\u5BFC\u5165 ${manifests.length} \u4E2A\u6E05\u5355`);
101
+ if (ownerId) {
102
+ log2(`\u4F7F\u7528\u6307\u5B9A\u7684\u6240\u6709\u8005 ID: ${ownerId}`);
72
103
  }
73
- this.discoveryDoc = await this.request("/market/.well-known/discovery");
74
- log("Successfully retrieved service discovery document");
75
- return this.discoveryDoc;
104
+ const response = await this.request(
105
+ "/admin/plugins/import",
106
+ {
107
+ method: "POST",
108
+ body: JSON.stringify({
109
+ manifests,
110
+ ownerId
111
+ })
112
+ }
113
+ );
114
+ log2(
115
+ `\u6279\u91CF\u5BFC\u5165\u5B8C\u6210: ${response.data.success} \u4E2A\u6210\u529F, ${response.data.failed} \u4E2A\u5931\u8D25`
116
+ );
117
+ return response.data;
118
+ }
119
+ /**
120
+ * 获取所有插件(高级筛选)
121
+ * @param params 管理员插件查询参数
122
+ * @returns 插件列表响应
123
+ */
124
+ async getPlugins(params = {}) {
125
+ log2("\u83B7\u53D6\u63D2\u4EF6\u5217\u8868\uFF08\u7BA1\u7406\u5458\uFF09: %O", params);
126
+ const queryString = this.buildQueryString(params);
127
+ const result = await this.request(
128
+ `/admin/plugins${queryString}`
129
+ );
130
+ log2("\u5DF2\u83B7\u53D6 %d \u4E2A\u63D2\u4EF6", result.data.length);
131
+ return result;
132
+ }
133
+ /**
134
+ * 获取单个插件(含所有版本)
135
+ * @param id 插件 ID
136
+ * @returns 插件(含版本)
137
+ */
138
+ async getPlugin(id) {
139
+ log2("\u83B7\u53D6\u63D2\u4EF6\u8BE6\u60C5\uFF08\u7BA1\u7406\u5458\uFF09: %d", id);
140
+ const result = await this.request(
141
+ `/admin/plugins/${id}`
142
+ );
143
+ log2("\u5DF2\u83B7\u53D6\u63D2\u4EF6\uFF08\u5171 %d \u4E2A\u7248\u672C\uFF09", result.data.versions.length);
144
+ return result;
145
+ }
146
+ /**
147
+ * 更新插件信息
148
+ * @param id 插件 ID
149
+ * @param data 插件更新数据
150
+ * @returns 更新后的插件
151
+ */
152
+ async updatePlugin(id, data) {
153
+ log2("\u66F4\u65B0\u63D2\u4EF6: %d\uFF0C\u6570\u636E: %O", id, data);
154
+ const result = await this.request(
155
+ `/admin/plugins/${id}`,
156
+ {
157
+ method: "PUT",
158
+ body: JSON.stringify(data)
159
+ }
160
+ );
161
+ log2("\u63D2\u4EF6\u66F4\u65B0\u6210\u529F");
162
+ return result;
163
+ }
164
+ /**
165
+ * 更新插件状态
166
+ * @param id 插件 ID
167
+ * @param status 新状态
168
+ * @returns 成功响应
169
+ */
170
+ async updatePluginStatus(id, status) {
171
+ log2("\u66F4\u65B0\u63D2\u4EF6\u72B6\u6001: %d \u4E3A %s", id, status);
172
+ const result = await this.request(
173
+ `/admin/plugins/${id}/status`,
174
+ {
175
+ method: "PATCH",
176
+ body: JSON.stringify({ status })
177
+ }
178
+ );
179
+ log2("\u63D2\u4EF6\u72B6\u6001\u66F4\u65B0\u6210\u529F");
180
+ return result;
181
+ }
182
+ /**
183
+ * 删除插件
184
+ * @param id 插件 ID
185
+ * @returns 成功响应
186
+ */
187
+ async deletePlugin(id) {
188
+ log2("\u5220\u9664\u63D2\u4EF6: %d", id);
189
+ const result = await this.request(
190
+ `/admin/plugins/${id}`,
191
+ { method: "DELETE" }
192
+ );
193
+ log2("\u63D2\u4EF6\u5220\u9664\u6210\u529F");
194
+ return result;
195
+ }
196
+ /**
197
+ * 获取插件版本列表
198
+ * @param pluginId 插件 ID
199
+ * @returns 插件版本列表
200
+ */
201
+ async getPluginVersions(pluginId) {
202
+ log2("\u83B7\u53D6\u63D2\u4EF6\u7248\u672C: pluginId=%d", pluginId);
203
+ const result = await this.request(
204
+ `/admin/plugins/${pluginId}/versions`
205
+ );
206
+ log2("\u5DF2\u83B7\u53D6 %d \u4E2A\u7248\u672C", result.data.length);
207
+ return result;
208
+ }
209
+ /**
210
+ * 获取单个插件版本
211
+ * @param pluginId 插件 ID
212
+ * @param versionId 版本 ID
213
+ * @returns 插件版本
214
+ */
215
+ async getPluginVersion(pluginId, versionId) {
216
+ log2("\u83B7\u53D6\u7248\u672C\u8BE6\u60C5: pluginId=%d, versionId=%d", pluginId, versionId);
217
+ const result = await this.request(
218
+ `/admin/plugins/${pluginId}/versions/${versionId}`
219
+ );
220
+ log2("\u5DF2\u83B7\u53D6\u7248\u672C\u8BE6\u60C5");
221
+ return result;
222
+ }
223
+ /**
224
+ * 创建插件版本
225
+ * @param pluginId 插件 ID
226
+ * @param data 版本创建数据
227
+ * @returns 创建的版本
228
+ */
229
+ async createPluginVersion(pluginId, data) {
230
+ log2("\u521B\u5EFA\u65B0\u7248\u672C: pluginId=%d", pluginId);
231
+ const result = await this.request(
232
+ `/admin/plugins/${pluginId}/versions`,
233
+ {
234
+ method: "POST",
235
+ body: JSON.stringify(data)
236
+ }
237
+ );
238
+ log2("\u63D2\u4EF6\u7248\u672C\u521B\u5EFA\u6210\u529F");
239
+ return result;
240
+ }
241
+ /**
242
+ * 更新插件版本
243
+ * @param pluginId 插件 ID
244
+ * @param versionId 版本 ID
245
+ * @param data 版本更新数据
246
+ * @returns 更新后的版本
247
+ */
248
+ async updatePluginVersion(pluginId, versionId, data) {
249
+ log2("\u66F4\u65B0\u7248\u672C: pluginId=%d, versionId=%d", pluginId, versionId);
250
+ const result = await this.request(
251
+ `/admin/plugins/${pluginId}/versions/${versionId}`,
252
+ {
253
+ method: "PUT",
254
+ body: JSON.stringify(data)
255
+ }
256
+ );
257
+ log2("\u63D2\u4EF6\u7248\u672C\u66F4\u65B0\u6210\u529F");
258
+ return result;
259
+ }
260
+ /**
261
+ * 删除插件版本
262
+ * @param pluginId 插件 ID
263
+ * @param versionId 版本 ID
264
+ * @returns 成功响应
265
+ */
266
+ async deletePluginVersion(pluginId, versionId) {
267
+ log2("\u5220\u9664\u7248\u672C: pluginId=%d, versionId=%d", pluginId, versionId);
268
+ const result = await this.request(
269
+ `/admin/plugins/${pluginId}/versions/${versionId}`,
270
+ { method: "DELETE" }
271
+ );
272
+ log2("\u63D2\u4EF6\u7248\u672C\u5220\u9664\u6210\u529F");
273
+ return result;
76
274
  }
77
275
  /**
78
- * Get plugin list
79
- * @param params Query parameters
80
- * @returns Plugin list response
276
+ * 设置插件版本为最新版本
277
+ * @param pluginId 插件 ID
278
+ * @param versionId 版本 ID
279
+ * @returns 成功响应
280
+ */
281
+ async setPluginVersionAsLatest(pluginId, versionId) {
282
+ log2("\u8BBE\u7F6E\u7248\u672C\u4E3A\u6700\u65B0: pluginId=%d, versionId=%d", pluginId, versionId);
283
+ const result = await this.request(
284
+ `/admin/plugins/${pluginId}/versions/${versionId}/latest`,
285
+ { method: "POST" }
286
+ );
287
+ log2("\u7248\u672C\u5DF2\u8BBE\u7F6E\u4E3A\u6700\u65B0");
288
+ return result;
289
+ }
290
+ };
291
+
292
+ // src/services/PluginsService.ts
293
+ import debug3 from "debug";
294
+ var log3 = debug3("lobe-market-sdk:plugins");
295
+ var PluginsService = class extends BaseSDK {
296
+ /**
297
+ * 创建插件服务实例
298
+ * @param options SDK 配置选项
299
+ * @param sharedHeaders 共享的 headers 对象(可选)
300
+ */
301
+ constructor(options = {}, sharedHeaders) {
302
+ super(options, sharedHeaders);
303
+ log3("PluginsService \u5B9E\u4F8B\u5DF2\u521B\u5EFA");
304
+ }
305
+ /**
306
+ * 获取插件列表
307
+ * @param params 查询参数
308
+ * @returns 插件列表响应
81
309
  */
82
310
  async getPluginList(params = {}) {
83
311
  const locale = params.locale || this.defaultLocale;
84
312
  const queryParams = { ...params, locale };
85
313
  const queryString = this.buildQueryString(queryParams);
86
- log("Getting plugin list: %O", queryParams);
314
+ log3("\u83B7\u53D6\u63D2\u4EF6\u5217\u8868: %O", queryParams);
87
315
  const result = await this.request(`/v1/plugins${queryString}`);
88
- log("Retrieved %d plugins", result.items.length);
316
+ log3("\u5DF2\u83B7\u53D6 %d \u4E2A\u63D2\u4EF6", result.items.length);
89
317
  return result;
90
318
  }
91
319
  /**
92
- * Get plugin manifest
93
- * @param identifier Plugin identifier
94
- * @param locale Language
95
- * @param version Version
96
- * @returns Plugin manifest
320
+ * 获取插件清单
321
+ * @param identifier 插件标识符
322
+ * @param locale 语言
323
+ * @param version 版本
324
+ * @returns 插件清单
97
325
  */
98
326
  async getPluginManifest(identifier, locale, version) {
99
- log("Getting plugin manifest: %O", { identifier, version, locale });
327
+ log3("\u83B7\u53D6\u63D2\u4EF6\u6E05\u5355: %O", { identifier, version, locale });
100
328
  const localeParam = locale || this.defaultLocale;
101
329
  const params = { locale: localeParam };
102
330
  if (version) {
103
331
  params.version = version;
104
332
  }
105
333
  const queryString = this.buildQueryString(params);
106
- const manifest = await this.request(`/v1/plugins/${identifier}/manifest${queryString}`);
107
- log("Successfully retrieved plugin manifest: %s", identifier);
334
+ const manifest = await this.request(
335
+ `/v1/plugins/${identifier}/manifest${queryString}`
336
+ );
337
+ log3("\u6210\u529F\u83B7\u53D6\u63D2\u4EF6\u6E05\u5355: %s", identifier);
108
338
  return manifest;
109
339
  }
340
+ };
341
+
342
+ // src/services/DiscoveryService.ts
343
+ import debug4 from "debug";
344
+ var log4 = debug4("lobe-market-sdk:discovery");
345
+ var DiscoveryService = class extends BaseSDK {
346
+ /**
347
+ * 创建发现服务实例
348
+ * @param options SDK 配置选项
349
+ * @param sharedHeaders 共享的 headers 对象(可选)
350
+ */
351
+ constructor(options = {}, sharedHeaders) {
352
+ super(options, sharedHeaders);
353
+ log4("DiscoveryService \u5B9E\u4F8B\u5DF2\u521B\u5EFA");
354
+ }
110
355
  /**
111
- * Import plugin manifests (requires admin privileges)
112
- * @param manifests Plugin manifest array
113
- * @param ownerId Owner ID
114
- * @returns Import result
356
+ * 获取市场服务发现文档
357
+ * @returns 服务发现文档
115
358
  */
116
- async importManifests(manifests, ownerId) {
117
- log(`Starting batch import of ${manifests.length} manifests`);
118
- if (ownerId) {
119
- log(`Using specified owner ID: ${ownerId}`);
359
+ async getDiscoveryDocument() {
360
+ log4("\u83B7\u53D6\u670D\u52A1\u53D1\u73B0\u6587\u6863");
361
+ if (this.discoveryDoc) {
362
+ log4("\u8FD4\u56DE\u7F13\u5B58\u7684\u53D1\u73B0\u6587\u6863");
363
+ return this.discoveryDoc;
120
364
  }
121
- const response = await this.request("/v1/admin/plugins/import", {
122
- method: "POST",
123
- body: JSON.stringify({
124
- manifests,
125
- ownerId
126
- })
127
- });
128
- log(`Batch import completed: ${response.data.success} successful, ${response.data.failed} failed`);
129
- return response.data;
365
+ this.discoveryDoc = await this.request("/market/.well-known/discovery");
366
+ log4("\u6210\u529F\u83B7\u53D6\u670D\u52A1\u53D1\u73B0\u6587\u6863");
367
+ return this.discoveryDoc;
130
368
  }
369
+ };
370
+
371
+ // src/market-sdk.ts
372
+ var log5 = debug5("lobe-market-sdk");
373
+ var MarketSDK = class extends BaseSDK {
131
374
  /**
132
- * Set authentication token
133
- * @param token Authentication token
375
+ * Create MarketSDK instance
376
+ * @param options SDK configuration options
134
377
  */
135
- setAuthToken(token) {
136
- log("Setting authentication token");
137
- this.headers.Authorization = `Bearer ${token}`;
378
+ constructor(options = {}) {
379
+ super(options);
380
+ log5("MarketSDK \u5B9E\u4F8B\u5DF2\u521B\u5EFA");
381
+ this.plugins = new PluginsService(options, this.headers);
382
+ this.admin = new AdminService(options, this.headers);
383
+ this.discovery = new DiscoveryService(options, this.headers);
138
384
  }
139
385
  /**
140
- * Clear authentication token
386
+ * Get market service discovery document
387
+ * @returns Service discovery document
141
388
  */
142
- clearAuthToken() {
143
- log("Clearing authentication token");
144
- delete this.headers.Authorization;
389
+ async getDiscoveryDocument() {
390
+ return this.discovery.getDiscoveryDocument();
391
+ }
392
+ /**
393
+ * Import plugin manifests (requires admin privileges)
394
+ * @param manifests Plugin manifest array
395
+ * @param ownerId Owner ID
396
+ * @returns Import result
397
+ */
398
+ async importManifests(manifests, ownerId) {
399
+ return this.admin.importManifests(manifests, ownerId);
145
400
  }
146
401
  };
402
+
403
+ // src/types/index.ts
404
+ import { z as z2 } from "zod";
405
+
406
+ // src/types/plugins.ts
407
+ import { z } from "zod";
408
+ var PluginTypeEnum = z.enum(["lobe", "openai", "mcp"]);
409
+ var ConnectionTypeEnum = z.enum(["http", "stdio"]);
410
+ var InstallationMethodEnum = z.enum([
411
+ "npm",
412
+ "docker",
413
+ "git",
414
+ "binaryUrl",
415
+ "manual",
416
+ "none"
417
+ ]);
418
+
419
+ // src/types/index.ts
420
+ var PluginTypeEnum2 = z2.enum(["lobe", "openai", "mcp"]);
421
+ var ConnectionTypeEnum2 = z2.enum(["http", "stdio"]);
422
+ var InstallationMethodEnum2 = z2.enum([
423
+ "npm",
424
+ "docker",
425
+ "git",
426
+ "binaryUrl",
427
+ "manual",
428
+ "none"
429
+ ]);
147
430
  export {
148
- ConnectionTypeEnum,
149
- InstallationMethodEnum,
431
+ AdminService,
432
+ ConnectionTypeEnum2 as ConnectionTypeEnum,
433
+ DiscoveryService,
434
+ InstallationMethodEnum2 as InstallationMethodEnum,
150
435
  MarketSDK,
151
- PluginTypeEnum
436
+ PluginTypeEnum2 as PluginTypeEnum,
437
+ PluginsService
152
438
  };
153
439
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/market-sdk.ts"],"sourcesContent":["import { z } from 'zod';\n\n// 插件类型\nexport const PluginTypeEnum = z.enum(['lobe', 'openai', 'mcp']);\nexport type PluginType = z.infer<typeof PluginTypeEnum>;\n\n// 连接类型\nexport const ConnectionTypeEnum = z.enum(['http', 'stdio']);\nexport type ConnectionType = z.infer<typeof ConnectionTypeEnum>;\n\n// 安装方法\nexport const InstallationMethodEnum = z.enum([\n 'npm',\n 'docker',\n 'git',\n 'binaryUrl',\n 'manual',\n 'none',\n]);\nexport type InstallationMethod = z.infer<typeof InstallationMethodEnum>;\n\n// 系统依赖项\nexport interface SystemDependency {\n name: string;\n type?: string;\n requiredVersion?: string;\n checkCommand?: string;\n installInstructions?: Record<string, string>;\n versionParsingRequired?: boolean;\n notes?: string;\n}\n\n// 连接配置\nexport interface ConnectionConfig {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n}\n\n// 部署选项\nexport interface DeploymentOption {\n installationMethod: string;\n installationDetails?: Record<string, any>;\n connection: ConnectionConfig;\n isRecommended?: boolean;\n notes?: string;\n systemDependencies?: SystemDependency[];\n}\n\n// 兼容性信息\nexport interface PluginCompatibility {\n platforms?: string[];\n minAppVersion?: string;\n maxAppVersion?: string;\n}\n\n// 插件项\nexport interface PluginItem {\n identifier: string;\n version: string;\n isLatest: boolean;\n name: string;\n createdAt: string;\n type: PluginType;\n manifestUrl?: string;\n manifestVersion: string;\n icon?: string;\n author?: string;\n homepage?: string;\n category?: string;\n connectionType?: ConnectionType;\n compatibility?: PluginCompatibility;\n capabilities: {\n tools: boolean;\n prompts: boolean;\n resources: boolean;\n };\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\n toolsCount?: number;\n promptsCount?: number;\n resourcesCount?: number;\n isValidated?: boolean;\n installCount?: number;\n ratingAverage?: number;\n ratingCount?: number;\n commentCount?: number;\n}\n\n// 插件列表响应\nexport interface PluginListResponse {\n items: PluginItem[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n categories: string[];\n tags: string[];\n}\n\n// 工具项定义\nexport interface PluginTool {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n}\n\n// 资源项定义\nexport interface PluginResource {\n uri: string;\n name?: string;\n mimeType?: string;\n}\n\n// 提示词参数定义\nexport interface PromptArgument {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n}\n\n// 提示词项定义\nexport interface PluginPrompt {\n name: string;\n description: string;\n arguments?: PromptArgument[];\n}\n\n// 插件清单\nexport interface PluginManifest {\n id: string;\n name: string;\n version: string;\n description: string;\n category?: string;\n tags?: string[];\n author?: {\n name: string;\n url?: string;\n };\n homepage?: string;\n icon?: string;\n capabilities?: {\n tools?: boolean;\n prompts?: boolean;\n resources?: boolean;\n };\n deploymentOptions?: DeploymentOption[];\n compatibility?: PluginCompatibility;\n // 工具定义\n tools?: PluginTool[];\n // 资源定义\n resources?: PluginResource[];\n // 提示词定义 \n prompts?: PluginPrompt[];\n // 验证信息\n isValidated?: boolean;\n validatedAt?: string;\n}\n\n// 市场服务发现文档\nexport interface DiscoveryDocument {\n issuer: string;\n market_index_schema_version: number;\n resource_types_supported: string[];\n resource_endpoints: Record<string, string>;\n manifest_endpoint_template: string | Record<string, string>;\n support_locales: string[];\n response_types_supported: string[];\n authentication?: {\n schemes_supported: Array<'none' | 'apiKey' | 'oauth2'>;\n };\n api_documentation_url?: string;\n policy_url?: string;\n terms_of_service_url?: string;\n}\n\n// SDK 配置选项\nexport interface MarketSDKOptions {\n baseUrl?: string;\n defaultLocale?: string;\n apiKey?: string;\n}\n","import {\n DiscoveryDocument,\n MarketSDKOptions,\n PluginItem,\n PluginListResponse,\n PluginManifest,\n} from './types';\nimport debug from 'debug';\n\n// Create debug instance\nconst log = debug('lobe-market-sdk');\n\n/**\n * LobeHub Market SDK Client\n */\nexport class MarketSDK {\n private baseUrl: string;\n private defaultLocale: string;\n private discoveryDoc?: DiscoveryDocument;\n private headers: Record<string, string>;\n\n /**\n * Create MarketSDK instance\n * @param options SDK configuration options\n */\n constructor(options: MarketSDKOptions = {}) {\n this.baseUrl = options.baseUrl || 'https://market.lobehub.com/api';\n this.defaultLocale = options.defaultLocale || 'zh-CN';\n this.headers = {\n 'Content-Type': 'application/json',\n ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),\n };\n log('MarketSDK instance created: %O', { baseUrl: this.baseUrl, defaultLocale: this.defaultLocale });\n }\n\n /**\n * Send request and handle response\n * @param url Request URL\n * @param options fetch options\n * @returns Response data\n */\n private async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n log('Sending request: %s', `${this.baseUrl}${url}`);\n \n const response = await fetch(`${this.baseUrl}${url}`, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorMsg = `Request failed: ${response.status} ${response.statusText}`;\n log('Request error: %s', errorMsg);\n throw new Error(errorMsg);\n }\n\n log('Request successful: %s', url);\n return response.json() as Promise<T>;\n }\n\n /**\n * Build query string\n * @param params Query parameters\n * @returns Query string\n */\n private buildQueryString(params: Record<string, any>): string {\n const query = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n \n return query ? `?${query}` : '';\n }\n\n /**\n * Get market service discovery document\n * @returns Service discovery document\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n log('Getting service discovery document');\n if (this.discoveryDoc) {\n log('Returning cached discovery document');\n return this.discoveryDoc;\n }\n\n this.discoveryDoc = await this.request<DiscoveryDocument>('/market/.well-known/discovery');\n log('Successfully retrieved service discovery document');\n return this.discoveryDoc;\n }\n\n /**\n * Get plugin list\n * @param params Query parameters\n * @returns Plugin list response\n */\n async getPluginList(params: {\n page?: number;\n pageSize?: number;\n category?: string;\n tags?: string;\n q?: string;\n sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';\n order?: 'asc' | 'desc';\n locale?: string;\n } = {}): Promise<PluginListResponse> {\n const locale = params.locale || this.defaultLocale;\n const queryParams = { ...params, locale };\n const queryString = this.buildQueryString(queryParams);\n\n log('Getting plugin list: %O', queryParams);\n\n const result = await this.request<PluginListResponse>(`/v1/plugins${queryString}`);\n log('Retrieved %d plugins', result.items.length);\n return result;\n }\n\n /**\n * Get plugin manifest\n * @param identifier Plugin identifier\n * @param locale Language\n * @param version Version\n * @returns Plugin manifest\n */\n async getPluginManifest(\n identifier: string,\n locale?: string,\n version?: string,\n ): Promise<PluginManifest> {\n log('Getting plugin manifest: %O', { identifier, version, locale });\n const localeParam = locale || this.defaultLocale;\n const params: Record<string, string> = { locale: localeParam };\n if (version) {\n params.version = version;\n }\n const queryString = this.buildQueryString(params);\n\n const manifest = await this.request<PluginManifest>(`/v1/plugins/${identifier}/manifest${queryString}`);\n log('Successfully retrieved plugin manifest: %s', identifier);\n return manifest;\n }\n\n /**\n * Import plugin manifests (requires admin privileges)\n * @param manifests Plugin manifest array\n * @param ownerId Owner ID\n * @returns Import result\n */\n async importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{ success: number; failed: number }> {\n log(`Starting batch import of ${manifests.length} manifests`);\n if (ownerId) {\n log(`Using specified owner ID: ${ownerId}`);\n }\n\n const response = await this.request<{ data: { success: number; failed: number } }>('/v1/admin/plugins/import', {\n method: 'POST',\n body: JSON.stringify({\n manifests,\n ownerId,\n }),\n });\n\n log(`Batch import completed: ${response.data.success} successful, ${response.data.failed} failed`);\n return response.data;\n }\n\n /**\n * Set authentication token\n * @param token Authentication token\n */\n setAuthToken(token: string): void {\n log('Setting authentication token');\n this.headers.Authorization = `Bearer ${token}`;\n }\n\n /**\n * Clear authentication token\n */\n clearAuthToken(): void {\n log('Clearing authentication token');\n delete this.headers.Authorization;\n }\n} "],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/market-sdk.ts","../src/core/BaseSDK.ts","../src/services/AdminService.ts","../src/services/PluginsService.ts","../src/services/DiscoveryService.ts","../src/types/index.ts","../src/types/plugins.ts"],"sourcesContent":["import debug from 'debug';\n\nimport { BaseSDK } from './core/BaseSDK';\nimport { AdminService, DiscoveryService, PluginsService } from './services';\nimport {\n AdminPluginParams,\n DiscoveryDocument,\n MarketSDKOptions,\n Plugin,\n PluginListResponse,\n PluginManifest,\n PluginVersion,\n PluginVersionCreateParams,\n PluginVersionUpdateParams,\n} from './types';\n\n// Create debug instance\nconst log = debug('lobe-market-sdk');\n\n/**\n * LobeHub Market SDK Client\n * 采用组合模式组合各个领域服务\n */\nexport class MarketSDK extends BaseSDK {\n /**\n * 插件服务\n */\n readonly plugins: PluginsService;\n\n /**\n * 管理员服务\n */\n readonly admin: AdminService;\n\n /**\n * 发现服务\n */\n private readonly discovery: DiscoveryService;\n\n /**\n * Create MarketSDK instance\n * @param options SDK configuration options\n */\n constructor(options: MarketSDKOptions = {}) {\n super(options);\n log('MarketSDK 实例已创建');\n\n // 初始化各领域服务,共享 headers 对象\n this.plugins = new PluginsService(options, this.headers);\n this.admin = new AdminService(options, this.headers);\n this.discovery = new DiscoveryService(options, this.headers);\n }\n\n /**\n * Get market service discovery document\n * @returns Service discovery document\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n return this.discovery.getDiscoveryDocument();\n }\n\n /**\n * Import plugin manifests (requires admin privileges)\n * @param manifests Plugin manifest array\n * @param ownerId Owner ID\n * @returns Import result\n */\n async importManifests(\n manifests: PluginManifest[],\n ownerId?: number,\n ): Promise<{ success: number; failed: number }> {\n return this.admin.importManifests(manifests, ownerId);\n }\n}\n","import debug from 'debug';\n\nimport { MarketSDKOptions } from '../types';\n\n// 创建调试实例\nconst log = debug('lobe-market-sdk:core');\n\n/**\n * 基础 SDK 类\n * 提供共享的请求逻辑和认证功能\n */\nexport class BaseSDK {\n protected baseUrl: string;\n protected defaultLocale: string;\n protected headers: Record<string, string>;\n\n /**\n * 创建基础 SDK 实例\n * @param options SDK 配置选项\n * @param sharedHeaders 共享的 headers 对象(可选)\n */\n constructor(options: MarketSDKOptions = {}, sharedHeaders?: Record<string, string>) {\n this.baseUrl = options.baseUrl || 'https://market.lobehub.com/api';\n this.defaultLocale = options.defaultLocale || 'zh-CN';\n \n // 使用共享的 headers 或创建新的\n if (sharedHeaders) {\n this.headers = sharedHeaders;\n log('使用共享的 headers 对象');\n } else {\n this.headers = {\n 'Content-Type': 'application/json',\n ...(options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}),\n };\n log('创建新的 headers 对象');\n }\n\n log('BaseSDK 实例已创建: %O', {\n baseUrl: this.baseUrl,\n defaultLocale: this.defaultLocale,\n });\n }\n\n /**\n * 发送请求并处理响应\n * @param url 请求 URL\n * @param options fetch 选项\n * @returns 响应数据\n */\n protected async request<T>(url: string, options: RequestInit = {}): Promise<T> {\n log('发送请求: %s', `${this.baseUrl}${url}`);\n\n const response = await fetch(`${this.baseUrl}${url}`, {\n ...options,\n headers: {\n ...this.headers,\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const errorMsg = `请求失败: ${response.status} ${response.statusText}`;\n log('请求错误: %s', errorMsg);\n throw new Error(errorMsg);\n }\n\n log('请求成功: %s', url);\n return response.json() as Promise<T>;\n }\n\n /**\n * 构建查询字符串\n * @param params 查询参数\n * @returns 查询字符串\n */\n protected buildQueryString(params: Record<string, any>): string {\n const query = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)\n .join('&');\n\n return query ? `?${query}` : '';\n }\n\n /**\n * 设置认证令牌\n * @param token 认证令牌\n */\n setAuthToken(token: string): void {\n log('设置认证令牌');\n this.headers.Authorization = `Bearer ${token}`;\n }\n\n /**\n * 清除认证令牌\n */\n clearAuthToken(): void {\n log('清除认证令牌');\n delete this.headers.Authorization;\n }\n} ","import debug from 'debug';\n\nimport { BaseSDK } from '../core/BaseSDK';\nimport {\n AdminPluginParams,\n MarketSDKOptions,\n Plugin,\n PluginManifest,\n PluginUpdateParams,\n PluginVersion,\n PluginVersionCreateParams,\n PluginVersionUpdateParams,\n} from '../types';\n\n// 创建调试实例\nconst log = debug('lobe-market-sdk:admin');\n\n/**\n * 管理员服务\n * 处理管理员相关功能\n */\nexport class AdminService extends BaseSDK {\n /**\n * 创建管理员服务实例\n * @param options SDK 配置选项\n * @param sharedHeaders 共享的 headers 对象(可选)\n */\n constructor(options: MarketSDKOptions = {}, sharedHeaders?: Record<string, string>) {\n super(options, sharedHeaders);\n log('AdminService 实例已创建');\n }\n \n /**\n * 导入插件清单(需要管理员权限)\n * @param manifests 插件清单数组\n * @param ownerId 所有者 ID\n * @returns 导入结果\n */\n async importManifests(\n manifests: PluginManifest[],\n ownerId?: number,\n ): Promise<{ success: number; failed: number }> {\n log(`开始批量导入 ${manifests.length} 个清单`);\n if (ownerId) {\n log(`使用指定的所有者 ID: ${ownerId}`);\n }\n\n const response = await this.request<{ data: { success: number; failed: number } }>(\n '/admin/plugins/import',\n {\n method: 'POST',\n body: JSON.stringify({\n manifests,\n ownerId,\n }),\n },\n );\n\n log(\n `批量导入完成: ${response.data.success} 个成功, ${response.data.failed} 个失败`,\n );\n return response.data;\n }\n\n /**\n * 获取所有插件(高级筛选)\n * @param params 管理员插件查询参数\n * @returns 插件列表响应\n */\n async getPlugins(params: AdminPluginParams = {}): Promise<{ data: Plugin[]; meta: { total: number; limit: number; offset: number } }> {\n log('获取插件列表(管理员): %O', params);\n const queryString = this.buildQueryString(params);\n\n const result = await this.request<{ data: Plugin[]; meta: { total: number; limit: number; offset: number } }>(\n `/admin/plugins${queryString}`,\n );\n log('已获取 %d 个插件', result.data.length);\n return result;\n }\n\n /**\n * 获取单个插件(含所有版本)\n * @param id 插件 ID\n * @returns 插件(含版本)\n */\n async getPlugin(id: number): Promise<{ data: Plugin & { versions: PluginVersion[] } }> {\n log('获取插件详情(管理员): %d', id);\n \n const result = await this.request<{ data: Plugin & { versions: PluginVersion[] } }>(\n `/admin/plugins/${id}`,\n );\n log('已获取插件(共 %d 个版本)', result.data.versions.length);\n return result;\n }\n\n /**\n * 更新插件信息\n * @param id 插件 ID\n * @param data 插件更新数据\n * @returns 更新后的插件\n */\n async updatePlugin(\n id: number, \n data: PluginUpdateParams\n ): Promise<{ data: Plugin }> {\n log('更新插件: %d,数据: %O', id, data);\n \n const result = await this.request<{ data: Plugin }>(\n `/admin/plugins/${id}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n log('插件更新成功');\n return result;\n }\n\n /**\n * 更新插件状态\n * @param id 插件 ID\n * @param status 新状态\n * @returns 成功响应\n */\n async updatePluginStatus(\n id: number,\n status: 'published' | 'draft' | 'review' | 'rejected'\n ): Promise<{ success: boolean; message: string }> {\n log('更新插件状态: %d 为 %s', id, status);\n \n const result = await this.request<{ success: boolean; message: string }>(\n `/admin/plugins/${id}/status`,\n {\n method: 'PATCH',\n body: JSON.stringify({ status }),\n }\n );\n log('插件状态更新成功');\n return result;\n }\n\n /**\n * 删除插件\n * @param id 插件 ID\n * @returns 成功响应\n */\n async deletePlugin(id: number): Promise<{ success: boolean; message: string }> {\n log('删除插件: %d', id);\n \n const result = await this.request<{ success: boolean; message: string }>(\n `/admin/plugins/${id}`,\n { method: 'DELETE' }\n );\n log('插件删除成功');\n return result;\n }\n\n /**\n * 获取插件版本列表\n * @param pluginId 插件 ID\n * @returns 插件版本列表\n */\n async getPluginVersions(pluginId: number): Promise<{ data: PluginVersion[] }> {\n log('获取插件版本: pluginId=%d', pluginId);\n \n const result = await this.request<{ data: PluginVersion[] }>(\n `/admin/plugins/${pluginId}/versions`,\n );\n log('已获取 %d 个版本', result.data.length);\n return result;\n }\n\n /**\n * 获取单个插件版本\n * @param pluginId 插件 ID\n * @param versionId 版本 ID\n * @returns 插件版本\n */\n async getPluginVersion(pluginId: number, versionId: number): Promise<{ data: PluginVersion }> {\n log('获取版本详情: pluginId=%d, versionId=%d', pluginId, versionId);\n \n const result = await this.request<{ data: PluginVersion }>(\n `/admin/plugins/${pluginId}/versions/${versionId}`,\n );\n log('已获取版本详情');\n return result;\n }\n\n /**\n * 创建插件版本\n * @param pluginId 插件 ID\n * @param data 版本创建数据\n * @returns 创建的版本\n */\n async createPluginVersion(\n pluginId: number,\n data: PluginVersionCreateParams\n ): Promise<{ data: PluginVersion }> {\n log('创建新版本: pluginId=%d', pluginId);\n \n const result = await this.request<{ data: PluginVersion }>(\n `/admin/plugins/${pluginId}/versions`,\n {\n method: 'POST',\n body: JSON.stringify(data),\n }\n );\n log('插件版本创建成功');\n return result;\n }\n\n /**\n * 更新插件版本\n * @param pluginId 插件 ID\n * @param versionId 版本 ID\n * @param data 版本更新数据\n * @returns 更新后的版本\n */\n async updatePluginVersion(\n pluginId: number,\n versionId: number,\n data: PluginVersionUpdateParams\n ): Promise<{ data: PluginVersion }> {\n log('更新版本: pluginId=%d, versionId=%d', pluginId, versionId);\n \n const result = await this.request<{ data: PluginVersion }>(\n `/admin/plugins/${pluginId}/versions/${versionId}`,\n {\n method: 'PUT',\n body: JSON.stringify(data),\n }\n );\n log('插件版本更新成功');\n return result;\n }\n\n /**\n * 删除插件版本\n * @param pluginId 插件 ID\n * @param versionId 版本 ID\n * @returns 成功响应\n */\n async deletePluginVersion(pluginId: number, versionId: number): Promise<{ success: boolean; message: string }> {\n log('删除版本: pluginId=%d, versionId=%d', pluginId, versionId);\n \n const result = await this.request<{ success: boolean; message: string }>(\n `/admin/plugins/${pluginId}/versions/${versionId}`,\n { method: 'DELETE' }\n );\n log('插件版本删除成功');\n return result;\n }\n\n /**\n * 设置插件版本为最新版本\n * @param pluginId 插件 ID\n * @param versionId 版本 ID\n * @returns 成功响应\n */\n async setPluginVersionAsLatest(pluginId: number, versionId: number): Promise<{ success: boolean; message: string }> {\n log('设置版本为最新: pluginId=%d, versionId=%d', pluginId, versionId);\n \n const result = await this.request<{ success: boolean; message: string }>(\n `/admin/plugins/${pluginId}/versions/${versionId}/latest`,\n { method: 'POST' }\n );\n log('版本已设置为最新');\n return result;\n }\n} ","import debug from 'debug';\n\nimport { BaseSDK } from '../core/BaseSDK';\nimport { MarketSDKOptions, PluginListResponse, PluginManifest, PluginQueryParams } from '../types';\n\n// 创建调试实例\nconst log = debug('lobe-market-sdk:plugins');\n\n/**\n * 插件服务\n * 处理插件相关功能\n */\nexport class PluginsService extends BaseSDK {\n /**\n * 创建插件服务实例\n * @param options SDK 配置选项\n * @param sharedHeaders 共享的 headers 对象(可选)\n */\n constructor(options: MarketSDKOptions = {}, sharedHeaders?: Record<string, string>) {\n super(options, sharedHeaders);\n log('PluginsService 实例已创建');\n }\n \n /**\n * 获取插件列表\n * @param params 查询参数\n * @returns 插件列表响应\n */\n async getPluginList(params: PluginQueryParams = {}): Promise<PluginListResponse> {\n const locale = params.locale || this.defaultLocale;\n const queryParams = { ...params, locale };\n const queryString = this.buildQueryString(queryParams);\n\n log('获取插件列表: %O', queryParams);\n\n const result = await this.request<PluginListResponse>(`/v1/plugins${queryString}`);\n log('已获取 %d 个插件', result.items.length);\n return result;\n }\n\n /**\n * 获取插件清单\n * @param identifier 插件标识符\n * @param locale 语言\n * @param version 版本\n * @returns 插件清单\n */\n async getPluginManifest(\n identifier: string,\n locale?: string,\n version?: string,\n ): Promise<PluginManifest> {\n log('获取插件清单: %O', { identifier, version, locale });\n const localeParam = locale || this.defaultLocale;\n const params: Record<string, string> = { locale: localeParam };\n if (version) {\n params.version = version;\n }\n const queryString = this.buildQueryString(params);\n\n const manifest = await this.request<PluginManifest>(\n `/v1/plugins/${identifier}/manifest${queryString}`,\n );\n log('成功获取插件清单: %s', identifier);\n return manifest;\n }\n} ","import debug from 'debug';\n\nimport { BaseSDK } from '../core/BaseSDK';\nimport { DiscoveryDocument, MarketSDKOptions } from '../types';\n\n// 创建调试实例\nconst log = debug('lobe-market-sdk:discovery');\n\n/**\n * 发现服务\n * 处理服务发现功能\n */\nexport class DiscoveryService extends BaseSDK {\n private discoveryDoc?: DiscoveryDocument;\n\n /**\n * 创建发现服务实例\n * @param options SDK 配置选项\n * @param sharedHeaders 共享的 headers 对象(可选)\n */\n constructor(options: MarketSDKOptions = {}, sharedHeaders?: Record<string, string>) {\n super(options, sharedHeaders);\n log('DiscoveryService 实例已创建');\n }\n\n /**\n * 获取市场服务发现文档\n * @returns 服务发现文档\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n log('获取服务发现文档');\n if (this.discoveryDoc) {\n log('返回缓存的发现文档');\n return this.discoveryDoc;\n }\n\n this.discoveryDoc = await this.request<DiscoveryDocument>('/market/.well-known/discovery');\n log('成功获取服务发现文档');\n return this.discoveryDoc;\n }\n} ","import { z } from 'zod';\n\n// 插件类型\nexport const PluginTypeEnum = z.enum(['lobe', 'openai', 'mcp']);\nexport type PluginType = z.infer<typeof PluginTypeEnum>;\n\n// 连接类型\nexport const ConnectionTypeEnum = z.enum(['http', 'stdio']);\nexport type ConnectionType = z.infer<typeof ConnectionTypeEnum>;\n\n// 安装方法\nexport const InstallationMethodEnum = z.enum([\n 'npm',\n 'docker',\n 'git',\n 'binaryUrl',\n 'manual',\n 'none',\n]);\nexport type InstallationMethod = z.infer<typeof InstallationMethodEnum>;\n\n// 系统依赖项\nexport interface SystemDependency {\n name: string;\n type?: string;\n requiredVersion?: string;\n checkCommand?: string;\n installInstructions?: Record<string, string>;\n versionParsingRequired?: boolean;\n notes?: string;\n}\n\n// 连接配置\nexport interface ConnectionConfig {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n}\n\nexport interface InstallationDetails {\n packageName?: string;\n repositoryUrlToClone?: string;\n setupSteps?: string[];\n}\n// 部署选项\nexport interface DeploymentOption {\n installationMethod: string;\n installationDetails?: InstallationDetails;\n connection: ConnectionConfig;\n isRecommended?: boolean;\n notes?: string;\n systemDependencies?: SystemDependency[];\n}\n\n// 兼容性信息\nexport interface PluginCompatibility {\n platforms?: string[];\n minAppVersion?: string;\n maxAppVersion?: string;\n}\n\n// 插件项\nexport interface PluginItem {\n identifier: string;\n version: string;\n isLatest: boolean;\n name: string;\n createdAt: string;\n type: PluginType;\n manifestUrl?: string;\n manifestVersion: string;\n icon?: string;\n author?: string;\n homepage?: string;\n category?: string;\n connectionType?: ConnectionType;\n compatibility?: PluginCompatibility;\n capabilities: {\n tools: boolean;\n prompts: boolean;\n resources: boolean;\n };\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\n toolsCount?: number;\n promptsCount?: number;\n resourcesCount?: number;\n isValidated?: boolean;\n installCount?: number;\n ratingAverage?: number;\n ratingCount?: number;\n commentCount?: number;\n}\n\n// 插件列表响应\nexport interface PluginListResponse {\n items: PluginItem[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n categories: string[];\n tags: string[];\n}\n\n// 工具项定义\nexport interface PluginTool {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n}\n\n// 资源项定义\nexport interface PluginResource {\n uri: string;\n name?: string;\n mimeType?: string;\n}\n\n// 提示词参数定义\nexport interface PromptArgument {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n}\n\n// 提示词项定义\nexport interface PluginPrompt {\n name: string;\n description: string;\n arguments?: PromptArgument[];\n}\n\n// 插件清单\nexport interface PluginManifest {\n id: string;\n name: string;\n version: string;\n description: string;\n category?: string;\n tags?: string[];\n author?: {\n name: string;\n url?: string;\n };\n homepage?: string;\n icon?: string;\n capabilities?: {\n tools?: boolean;\n prompts?: boolean;\n resources?: boolean;\n };\n deploymentOptions?: DeploymentOption[];\n compatibility?: PluginCompatibility;\n // 工具定义\n tools?: PluginTool[];\n // 资源定义\n resources?: PluginResource[];\n // 提示词定义\n prompts?: PluginPrompt[];\n // 验证信息\n isValidated?: boolean;\n validatedAt?: string;\n}\n\n// 市场服务发现文档\nexport interface DiscoveryDocument {\n issuer: string;\n market_index_schema_version: number;\n resource_types_supported: string[];\n resource_endpoints: Record<string, string>;\n manifest_endpoint_template: string | Record<string, string>;\n support_locales: string[];\n response_types_supported: string[];\n authentication?: {\n schemes_supported: Array<'none' | 'apiKey' | 'oauth2'>;\n };\n api_documentation_url?: string;\n policy_url?: string;\n terms_of_service_url?: string;\n}\n\n// SDK 配置选项\nexport interface MarketSDKOptions {\n baseUrl?: string;\n defaultLocale?: string;\n apiKey?: string;\n}\n\n// 管理员 API 相关类型\n\n// 插件数据库模型\nexport interface Plugin {\n id: number;\n identifier: string;\n name: string;\n description: string;\n ownerId: number;\n type: string;\n visibility: 'public' | 'private' | 'unlisted';\n status: 'published' | 'draft' | 'review' | 'rejected';\n isFeatured: boolean;\n category: string;\n tags: string[];\n icon: string | null;\n author: string | null;\n homepage: string | null;\n manifestVersion: string;\n createdAt: string;\n updatedAt: string;\n meta: Record<string, any> | null;\n installCount: number;\n ratingAverage: number | null;\n ratingCount: number;\n reviewCount: number;\n}\n\n// 插件版本数据库模型\nexport interface PluginVersion {\n id: number;\n pluginId: number;\n version: string;\n isLatest: boolean;\n manifestUrl: string | null;\n toolsCount: number;\n promptsCount: number;\n resourcesCount: number;\n isValidated: boolean;\n createdAt: string;\n updatedAt: string;\n manifest: PluginManifest;\n meta: Record<string, any> | null;\n}\n\n// 管理员获取插件列表参数\nexport interface AdminPluginParams {\n status?: 'published' | 'draft' | 'review' | 'rejected';\n visibility?: 'public' | 'private' | 'unlisted';\n featured?: boolean;\n ownerId?: number;\n limit?: number;\n offset?: number;\n orderBy?: 'createdAt' | 'updatedAt' | 'installCount' | 'ratingAverage';\n order?: 'asc' | 'desc';\n}\n\n// 创建插件版本参数\nexport interface PluginVersionCreateParams {\n version: string;\n manifest: PluginManifest;\n manifestUrl?: string;\n isLatest?: boolean;\n isValidated?: boolean;\n meta?: Record<string, any>;\n}\n\n// 更新插件版本参数\nexport interface PluginVersionUpdateParams {\n manifestUrl?: string;\n isValidated?: boolean;\n meta?: Record<string, any>;\n}\n\n// 导出所有类型\nexport * from './common';\nexport * from './plugins';\nexport * from './admin';\n","import { z } from 'zod';\n\n// 插件类型\nexport const PluginTypeEnum = z.enum(['lobe', 'openai', 'mcp']);\nexport type PluginType = z.infer<typeof PluginTypeEnum>;\n\n// 连接类型\nexport const ConnectionTypeEnum = z.enum(['http', 'stdio']);\nexport type ConnectionType = z.infer<typeof ConnectionTypeEnum>;\n\n// 安装方法\nexport const InstallationMethodEnum = z.enum([\n 'npm',\n 'docker',\n 'git',\n 'binaryUrl',\n 'manual',\n 'none',\n]);\nexport type InstallationMethod = z.infer<typeof InstallationMethodEnum>;\n\n// 系统依赖项\nexport interface SystemDependency {\n name: string;\n type?: string;\n requiredVersion?: string;\n checkCommand?: string;\n installInstructions?: Record<string, string>;\n versionParsingRequired?: boolean;\n notes?: string;\n}\n\n// 连接配置\nexport interface ConnectionConfig {\n type: string;\n command?: string;\n args?: string[];\n url?: string;\n}\n\nexport interface InstallationDetails {\n packageName?: string;\n repositoryUrlToClone?: string;\n setupSteps?: string[];\n}\n\n// 部署选项\nexport interface DeploymentOption {\n installationMethod: string;\n installationDetails?: InstallationDetails;\n connection: ConnectionConfig;\n isRecommended?: boolean;\n notes?: string;\n systemDependencies?: SystemDependency[];\n}\n\n// 兼容性信息\nexport interface PluginCompatibility {\n platforms?: string[];\n minAppVersion?: string;\n maxAppVersion?: string;\n}\n\n// 插件项\nexport interface PluginItem {\n identifier: string;\n version: string;\n isLatest: boolean;\n name: string;\n createdAt: string;\n type: PluginType;\n manifestUrl?: string;\n manifestVersion: string;\n icon?: string;\n author?: string;\n homepage?: string;\n category?: string;\n connectionType?: ConnectionType;\n compatibility?: PluginCompatibility;\n capabilities: {\n tools: boolean;\n prompts: boolean;\n resources: boolean;\n };\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\n toolsCount?: number;\n promptsCount?: number;\n resourcesCount?: number;\n isValidated?: boolean;\n installCount?: number;\n ratingAverage?: number;\n ratingCount?: number;\n commentCount?: number;\n}\n\n// 插件列表响应\nexport interface PluginListResponse {\n items: PluginItem[];\n totalCount: number;\n currentPage: number;\n pageSize: number;\n totalPages: number;\n categories: string[];\n tags: string[];\n}\n\n// 工具项定义\nexport interface PluginTool {\n name: string;\n description?: string;\n parameters?: Record<string, any>;\n}\n\n// 资源项定义\nexport interface PluginResource {\n uri: string;\n name?: string;\n mimeType?: string;\n}\n\n// 提示词参数定义\nexport interface PromptArgument {\n name: string;\n required?: boolean;\n description?: string;\n type?: string;\n}\n\n// 提示词项定义\nexport interface PluginPrompt {\n name: string;\n description: string;\n arguments?: PromptArgument[];\n}\n\n// 插件清单\nexport interface PluginManifest {\n id: string;\n name: string;\n version: string;\n description: string;\n category?: string;\n tags?: string[];\n author?: {\n name: string;\n url?: string;\n };\n homepage?: string;\n icon?: string;\n capabilities?: {\n tools?: boolean;\n prompts?: boolean;\n resources?: boolean;\n };\n deploymentOptions?: DeploymentOption[];\n compatibility?: PluginCompatibility;\n // 工具定义\n tools?: PluginTool[];\n // 资源定义\n resources?: PluginResource[];\n // 提示词定义\n prompts?: PluginPrompt[];\n // 验证信息\n isValidated?: boolean;\n validatedAt?: string;\n}\n\n// 插件查询参数\nexport interface PluginQueryParams {\n page?: number;\n pageSize?: number;\n category?: string;\n tags?: string;\n q?: string;\n sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';\n order?: 'asc' | 'desc';\n locale?: string;\n} "],"mappings":"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","names":["debug","debug","log","debug","debug","log","debug","debug","log","debug","log","debug","z","PluginTypeEnum","z","ConnectionTypeEnum","InstallationMethodEnum"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lobehub/market-sdk",
3
- "version": "0.0.7",
3
+ "version": "0.0.9",
4
4
  "description": "LobeHub Market JavaScript SDK",
5
5
  "keywords": [
6
6
  "lobehub",
@@ -28,10 +28,13 @@
28
28
  "build": "tsup",
29
29
  "dev": "tsup --watch",
30
30
  "prepublishOnly": "npm run build",
31
- "release": "npm publish"
31
+ "release": "npm publish",
32
+ "test:admin": "node examples/admin-test.js",
33
+ "test:domain": "node examples/domain-usage.js"
32
34
  },
33
35
  "dependencies": {
34
- "debug": "^4.4.1"
36
+ "debug": "^4.4.1",
37
+ "dotenv": "^16.4.5"
35
38
  },
36
39
  "devDependencies": {
37
40
  "@types/debug": "^4.1.12",