@lobehub/market-sdk 0.0.1
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 +167 -0
- package/dist/index.d.mts +188 -0
- package/dist/index.mjs +129 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +44 -0
package/README.md
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# @lobehub/market-sdk
|
|
2
|
+
|
|
3
|
+
LobeHub Market 的 JavaScript SDK,提供对插件市场 API 的简单访问。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 使用原生 `fetch` API,无外部依赖
|
|
8
|
+
- 支持 TypeScript,提供完整类型定义
|
|
9
|
+
- 简单易用的 API 设计
|
|
10
|
+
- 支持 ESM 模块
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @lobehub/market-sdk
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## 用法
|
|
19
|
+
|
|
20
|
+
### 基本使用
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { MarketSDK } from '@lobehub/market-sdk';
|
|
24
|
+
|
|
25
|
+
// 创建 SDK 实例
|
|
26
|
+
const market = new MarketSDK({
|
|
27
|
+
// 可选配置
|
|
28
|
+
baseUrl: 'https://market.lobehub.com/api', // 默认值
|
|
29
|
+
defaultLocale: 'zh-CN', // 默认值
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// 获取服务发现文档
|
|
33
|
+
const discovery = await market.getDiscoveryDocument();
|
|
34
|
+
console.log(discovery);
|
|
35
|
+
|
|
36
|
+
// 获取插件列表
|
|
37
|
+
const plugins = await market.getPluginList({
|
|
38
|
+
page: 1,
|
|
39
|
+
pageSize: 10,
|
|
40
|
+
category: 'tools',
|
|
41
|
+
sort: 'installCount',
|
|
42
|
+
order: 'desc',
|
|
43
|
+
});
|
|
44
|
+
console.log(plugins);
|
|
45
|
+
|
|
46
|
+
// 获取插件清单
|
|
47
|
+
const manifest = await market.getPluginManifest('lobehub/web-search');
|
|
48
|
+
console.log(manifest);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 认证
|
|
52
|
+
|
|
53
|
+
对于需要管理员权限的操作,需要提供认证令牌:
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
// 创建时提供 API Key
|
|
57
|
+
const market = new MarketSDK({
|
|
58
|
+
apiKey: 'your-api-key',
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// 或者稍后设置
|
|
62
|
+
market.setAuthToken('your-api-key');
|
|
63
|
+
|
|
64
|
+
// 导入插件清单 (需要管理员权限)
|
|
65
|
+
const result = await market.importManifests([
|
|
66
|
+
{
|
|
67
|
+
id: 'my-plugin',
|
|
68
|
+
name: 'My Plugin',
|
|
69
|
+
version: '1.0.0',
|
|
70
|
+
description: '一个示例插件',
|
|
71
|
+
// 其他清单字段...
|
|
72
|
+
}
|
|
73
|
+
]);
|
|
74
|
+
console.log(result);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## API 参考
|
|
78
|
+
|
|
79
|
+
### `MarketSDK`
|
|
80
|
+
|
|
81
|
+
主要的 SDK 类
|
|
82
|
+
|
|
83
|
+
#### 构造函数
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
constructor(options?: MarketSDKOptions)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
参数:
|
|
90
|
+
- `options.baseUrl`: API 基础 URL,默认为 'https://market.lobehub.com/api'
|
|
91
|
+
- `options.defaultLocale`: 默认语言,默认为 'zh-CN'
|
|
92
|
+
- `options.apiKey`: 可选的 API 认证密钥
|
|
93
|
+
|
|
94
|
+
#### 方法
|
|
95
|
+
|
|
96
|
+
##### `getDiscoveryDocument()`
|
|
97
|
+
|
|
98
|
+
获取市场服务发现文档。
|
|
99
|
+
|
|
100
|
+
##### `getPluginList(params)`
|
|
101
|
+
|
|
102
|
+
获取插件列表。
|
|
103
|
+
|
|
104
|
+
参数:
|
|
105
|
+
- `params.page`: 页码,默认为 1
|
|
106
|
+
- `params.pageSize`: 每页数量,默认为 20
|
|
107
|
+
- `params.category`: 按分类筛选
|
|
108
|
+
- `params.tags`: 按标签筛选 (逗号分隔)
|
|
109
|
+
- `params.q`: 搜索关键词
|
|
110
|
+
- `params.sort`: 排序字段 ('installCount', 'createdAt', 'updatedAt', 'ratingAverage')
|
|
111
|
+
- `params.order`: 排序方向 ('asc' 或 'desc')
|
|
112
|
+
- `params.locale`: 语言,默认为构造函数中设置的值
|
|
113
|
+
|
|
114
|
+
##### `getPluginManifest(identifier, locale?, version?)`
|
|
115
|
+
|
|
116
|
+
获取插件清单。
|
|
117
|
+
|
|
118
|
+
参数:
|
|
119
|
+
- `identifier`: 插件标识符 (必填)
|
|
120
|
+
- `locale`: 语言,可选,默认为构造函数中设置的值
|
|
121
|
+
- `version`: 版本号,可选,默认获取最新版本
|
|
122
|
+
|
|
123
|
+
##### `importManifests(manifests, ownerId?)`
|
|
124
|
+
|
|
125
|
+
导入插件清单 (需要管理员权限)。
|
|
126
|
+
|
|
127
|
+
参数:
|
|
128
|
+
- `manifests`: 插件清单数组
|
|
129
|
+
- `ownerId`: 所有者 ID (可选)
|
|
130
|
+
|
|
131
|
+
##### `setAuthToken(token)`
|
|
132
|
+
|
|
133
|
+
设置认证令牌。
|
|
134
|
+
|
|
135
|
+
##### `clearAuthToken()`
|
|
136
|
+
|
|
137
|
+
清除认证令牌。
|
|
138
|
+
|
|
139
|
+
## 类型
|
|
140
|
+
|
|
141
|
+
SDK 导出以下类型:
|
|
142
|
+
|
|
143
|
+
- `PluginType`
|
|
144
|
+
- `ConnectionType`
|
|
145
|
+
- `InstallationMethod`
|
|
146
|
+
- `SystemDependency`
|
|
147
|
+
- `ConnectionConfig`
|
|
148
|
+
- `DeploymentOption`
|
|
149
|
+
- `PluginCompatibility`
|
|
150
|
+
- `PluginItem`
|
|
151
|
+
- `PluginListResponse`
|
|
152
|
+
- `PluginManifest`
|
|
153
|
+
- `DiscoveryDocument`
|
|
154
|
+
- `MarketSDKOptions`
|
|
155
|
+
|
|
156
|
+
## 兼容性
|
|
157
|
+
|
|
158
|
+
此SDK使用了原生fetch API,适用于:
|
|
159
|
+
- 现代浏览器
|
|
160
|
+
- Node.js 18+
|
|
161
|
+
- Deno
|
|
162
|
+
- Bun
|
|
163
|
+
- 其他支持fetch API的运行时
|
|
164
|
+
|
|
165
|
+
## 许可证
|
|
166
|
+
|
|
167
|
+
MIT
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
declare const PluginTypeEnum: z.ZodEnum<["lobe", "openai", "mcp"]>;
|
|
4
|
+
type PluginType = z.infer<typeof PluginTypeEnum>;
|
|
5
|
+
declare const ConnectionTypeEnum: z.ZodEnum<["http", "stdio"]>;
|
|
6
|
+
type ConnectionType = z.infer<typeof ConnectionTypeEnum>;
|
|
7
|
+
declare const InstallationMethodEnum: z.ZodEnum<["npm", "docker", "git", "binaryUrl", "manual", "none"]>;
|
|
8
|
+
type InstallationMethod = z.infer<typeof InstallationMethodEnum>;
|
|
9
|
+
interface SystemDependency {
|
|
10
|
+
name: string;
|
|
11
|
+
type?: string;
|
|
12
|
+
requiredVersion?: string;
|
|
13
|
+
checkCommand?: string;
|
|
14
|
+
installInstructions?: Record<string, string>;
|
|
15
|
+
versionParsingRequired?: boolean;
|
|
16
|
+
notes?: string;
|
|
17
|
+
}
|
|
18
|
+
interface ConnectionConfig {
|
|
19
|
+
type: string;
|
|
20
|
+
command?: string;
|
|
21
|
+
args?: string[];
|
|
22
|
+
url?: string;
|
|
23
|
+
}
|
|
24
|
+
interface DeploymentOption {
|
|
25
|
+
installationMethod: string;
|
|
26
|
+
installationDetails?: Record<string, any>;
|
|
27
|
+
connection: ConnectionConfig;
|
|
28
|
+
isRecommended?: boolean;
|
|
29
|
+
notes?: string;
|
|
30
|
+
systemDependencies?: SystemDependency[];
|
|
31
|
+
}
|
|
32
|
+
interface PluginCompatibility {
|
|
33
|
+
platforms?: string[];
|
|
34
|
+
minAppVersion?: string;
|
|
35
|
+
maxAppVersion?: string;
|
|
36
|
+
}
|
|
37
|
+
interface PluginItem {
|
|
38
|
+
identifier: string;
|
|
39
|
+
version: string;
|
|
40
|
+
isLatest: boolean;
|
|
41
|
+
createdAt: string;
|
|
42
|
+
type: PluginType;
|
|
43
|
+
manifestUrl?: string;
|
|
44
|
+
manifestVersion: string;
|
|
45
|
+
icon?: string;
|
|
46
|
+
author?: string;
|
|
47
|
+
homepage?: string;
|
|
48
|
+
category?: string;
|
|
49
|
+
connectionType?: ConnectionType;
|
|
50
|
+
compatibility?: PluginCompatibility;
|
|
51
|
+
capabilities: {
|
|
52
|
+
tools: boolean;
|
|
53
|
+
prompts: boolean;
|
|
54
|
+
resources: boolean;
|
|
55
|
+
};
|
|
56
|
+
displayName: string;
|
|
57
|
+
description: string;
|
|
58
|
+
tags?: string[];
|
|
59
|
+
authRequirement?: string;
|
|
60
|
+
isInstallable?: boolean;
|
|
61
|
+
}
|
|
62
|
+
interface PluginListResponse {
|
|
63
|
+
items: PluginItem[];
|
|
64
|
+
totalCount: number;
|
|
65
|
+
currentPage: number;
|
|
66
|
+
pageSize: number;
|
|
67
|
+
totalPages: number;
|
|
68
|
+
categories: string[];
|
|
69
|
+
tags: string[];
|
|
70
|
+
}
|
|
71
|
+
interface PluginManifest {
|
|
72
|
+
id: string;
|
|
73
|
+
name: string;
|
|
74
|
+
version: string;
|
|
75
|
+
description: string;
|
|
76
|
+
category?: string;
|
|
77
|
+
tags?: string[];
|
|
78
|
+
author?: {
|
|
79
|
+
name: string;
|
|
80
|
+
url?: string;
|
|
81
|
+
};
|
|
82
|
+
homepage?: string;
|
|
83
|
+
icon?: string;
|
|
84
|
+
capabilities?: {
|
|
85
|
+
tools?: boolean;
|
|
86
|
+
prompts?: boolean;
|
|
87
|
+
resources?: boolean;
|
|
88
|
+
};
|
|
89
|
+
deploymentOptions?: DeploymentOption[];
|
|
90
|
+
compatibility?: PluginCompatibility;
|
|
91
|
+
}
|
|
92
|
+
interface DiscoveryDocument {
|
|
93
|
+
issuer: string;
|
|
94
|
+
market_index_schema_version: number;
|
|
95
|
+
resource_types_supported: string[];
|
|
96
|
+
resource_endpoints: Record<string, string>;
|
|
97
|
+
manifest_endpoint_template: string | Record<string, string>;
|
|
98
|
+
support_locales: string[];
|
|
99
|
+
response_types_supported: string[];
|
|
100
|
+
authentication?: {
|
|
101
|
+
schemes_supported: Array<'none' | 'apiKey' | 'oauth2'>;
|
|
102
|
+
};
|
|
103
|
+
api_documentation_url?: string;
|
|
104
|
+
policy_url?: string;
|
|
105
|
+
terms_of_service_url?: string;
|
|
106
|
+
}
|
|
107
|
+
interface MarketSDKOptions {
|
|
108
|
+
baseUrl?: string;
|
|
109
|
+
defaultLocale?: string;
|
|
110
|
+
apiKey?: string;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* LobeHub Market SDK 客户端
|
|
115
|
+
*/
|
|
116
|
+
declare class MarketSDK {
|
|
117
|
+
private baseUrl;
|
|
118
|
+
private defaultLocale;
|
|
119
|
+
private discoveryDoc?;
|
|
120
|
+
private headers;
|
|
121
|
+
/**
|
|
122
|
+
* 创建 MarketSDK 实例
|
|
123
|
+
* @param options SDK 配置选项
|
|
124
|
+
*/
|
|
125
|
+
constructor(options?: MarketSDKOptions);
|
|
126
|
+
/**
|
|
127
|
+
* 发送请求并处理响应
|
|
128
|
+
* @param url 请求URL
|
|
129
|
+
* @param options fetch选项
|
|
130
|
+
* @returns 响应数据
|
|
131
|
+
*/
|
|
132
|
+
private request;
|
|
133
|
+
/**
|
|
134
|
+
* 构建查询字符串
|
|
135
|
+
* @param params 查询参数
|
|
136
|
+
* @returns 查询字符串
|
|
137
|
+
*/
|
|
138
|
+
private buildQueryString;
|
|
139
|
+
/**
|
|
140
|
+
* 获取市场服务发现文档
|
|
141
|
+
* @returns 服务发现文档
|
|
142
|
+
*/
|
|
143
|
+
getDiscoveryDocument(): Promise<DiscoveryDocument>;
|
|
144
|
+
/**
|
|
145
|
+
* 获取插件列表
|
|
146
|
+
* @param params 查询参数
|
|
147
|
+
* @returns 插件列表响应
|
|
148
|
+
*/
|
|
149
|
+
getPluginList(params?: {
|
|
150
|
+
page?: number;
|
|
151
|
+
pageSize?: number;
|
|
152
|
+
category?: string;
|
|
153
|
+
tags?: string;
|
|
154
|
+
q?: string;
|
|
155
|
+
sort?: 'installCount' | 'createdAt' | 'updatedAt' | 'ratingAverage';
|
|
156
|
+
order?: 'asc' | 'desc';
|
|
157
|
+
locale?: string;
|
|
158
|
+
}): Promise<PluginListResponse>;
|
|
159
|
+
/**
|
|
160
|
+
* 获取插件清单
|
|
161
|
+
* @param identifier 插件标识符
|
|
162
|
+
* @param locale 语言
|
|
163
|
+
* @param version 版本
|
|
164
|
+
* @returns 插件清单
|
|
165
|
+
*/
|
|
166
|
+
getPluginManifest(identifier: string, locale?: string, version?: string): Promise<PluginManifest>;
|
|
167
|
+
/**
|
|
168
|
+
* 导入插件清单 (需要管理员权限)
|
|
169
|
+
* @param manifests 插件清单数组
|
|
170
|
+
* @param ownerId 所有者ID
|
|
171
|
+
* @returns 导入结果
|
|
172
|
+
*/
|
|
173
|
+
importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{
|
|
174
|
+
success: number;
|
|
175
|
+
failed: number;
|
|
176
|
+
}>;
|
|
177
|
+
/**
|
|
178
|
+
* 设置认证令牌
|
|
179
|
+
* @param token 认证令牌
|
|
180
|
+
*/
|
|
181
|
+
setAuthToken(token: string): void;
|
|
182
|
+
/**
|
|
183
|
+
* 清除认证令牌
|
|
184
|
+
*/
|
|
185
|
+
clearAuthToken(): void;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
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 PluginType, PluginTypeEnum, type SystemDependency, MarketSDK as default };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
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
|
+
// src/market-sdk.ts
|
|
15
|
+
var MarketSDK = class {
|
|
16
|
+
/**
|
|
17
|
+
* 创建 MarketSDK 实例
|
|
18
|
+
* @param options SDK 配置选项
|
|
19
|
+
*/
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
this.baseUrl = options.baseUrl || "https://market.lobehub.com/api";
|
|
22
|
+
this.defaultLocale = options.defaultLocale || "zh-CN";
|
|
23
|
+
this.headers = {
|
|
24
|
+
"Content-Type": "application/json",
|
|
25
|
+
...options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 发送请求并处理响应
|
|
30
|
+
* @param url 请求URL
|
|
31
|
+
* @param options fetch选项
|
|
32
|
+
* @returns 响应数据
|
|
33
|
+
*/
|
|
34
|
+
async request(url, options = {}) {
|
|
35
|
+
const response = await fetch(`${this.baseUrl}${url}`, {
|
|
36
|
+
...options,
|
|
37
|
+
headers: {
|
|
38
|
+
...this.headers,
|
|
39
|
+
...options.headers
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
if (!response.ok) {
|
|
43
|
+
throw new Error(`\u8BF7\u6C42\u5931\u8D25: ${response.status} ${response.statusText}`);
|
|
44
|
+
}
|
|
45
|
+
return response.json();
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 构建查询字符串
|
|
49
|
+
* @param params 查询参数
|
|
50
|
+
* @returns 查询字符串
|
|
51
|
+
*/
|
|
52
|
+
buildQueryString(params) {
|
|
53
|
+
const query = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
|
|
54
|
+
return query ? `?${query}` : "";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 获取市场服务发现文档
|
|
58
|
+
* @returns 服务发现文档
|
|
59
|
+
*/
|
|
60
|
+
async getDiscoveryDocument() {
|
|
61
|
+
if (this.discoveryDoc) return this.discoveryDoc;
|
|
62
|
+
this.discoveryDoc = await this.request("/market/.well-known/discovery");
|
|
63
|
+
return this.discoveryDoc;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* 获取插件列表
|
|
67
|
+
* @param params 查询参数
|
|
68
|
+
* @returns 插件列表响应
|
|
69
|
+
*/
|
|
70
|
+
async getPluginList(params = {}) {
|
|
71
|
+
const locale = params.locale || this.defaultLocale;
|
|
72
|
+
const queryParams = { ...params, locale };
|
|
73
|
+
const queryString = this.buildQueryString(queryParams);
|
|
74
|
+
return this.request(`/v1/plugins${queryString}`);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* 获取插件清单
|
|
78
|
+
* @param identifier 插件标识符
|
|
79
|
+
* @param locale 语言
|
|
80
|
+
* @param version 版本
|
|
81
|
+
* @returns 插件清单
|
|
82
|
+
*/
|
|
83
|
+
async getPluginManifest(identifier, locale, version) {
|
|
84
|
+
const localeParam = locale || this.defaultLocale;
|
|
85
|
+
const params = { locale: localeParam };
|
|
86
|
+
if (version) {
|
|
87
|
+
params.version = version;
|
|
88
|
+
}
|
|
89
|
+
const queryString = this.buildQueryString(params);
|
|
90
|
+
return this.request(`/v1/plugins/${identifier}/manifest${queryString}`);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* 导入插件清单 (需要管理员权限)
|
|
94
|
+
* @param manifests 插件清单数组
|
|
95
|
+
* @param ownerId 所有者ID
|
|
96
|
+
* @returns 导入结果
|
|
97
|
+
*/
|
|
98
|
+
async importManifests(manifests, ownerId) {
|
|
99
|
+
const response = await this.request("/v1/admin/plugins/import", {
|
|
100
|
+
method: "POST",
|
|
101
|
+
body: JSON.stringify({
|
|
102
|
+
manifests,
|
|
103
|
+
ownerId
|
|
104
|
+
})
|
|
105
|
+
});
|
|
106
|
+
return response.data;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 设置认证令牌
|
|
110
|
+
* @param token 认证令牌
|
|
111
|
+
*/
|
|
112
|
+
setAuthToken(token) {
|
|
113
|
+
this.headers.Authorization = `Bearer ${token}`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 清除认证令牌
|
|
117
|
+
*/
|
|
118
|
+
clearAuthToken() {
|
|
119
|
+
delete this.headers.Authorization;
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
export {
|
|
123
|
+
ConnectionTypeEnum,
|
|
124
|
+
InstallationMethodEnum,
|
|
125
|
+
MarketSDK,
|
|
126
|
+
PluginTypeEnum,
|
|
127
|
+
MarketSDK as default
|
|
128
|
+
};
|
|
129
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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 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 displayName: string;\n description: string;\n tags?: string[];\n authRequirement?: string;\n isInstallable?: boolean;\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 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\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} ","import {\n DiscoveryDocument,\n MarketSDKOptions,\n PluginItem,\n PluginListResponse,\n PluginManifest,\n} from './types';\n\n/**\n * LobeHub Market SDK 客户端\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 * 创建 MarketSDK 实例\n * @param options SDK 配置选项\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 }\n\n /**\n * 发送请求并处理响应\n * @param url 请求URL\n * @param options fetch选项\n * @returns 响应数据\n */\n private async request<T>(url: string, options: RequestInit = {}): Promise<T> {\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 throw new Error(`请求失败: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n /**\n * 构建查询字符串\n * @param params 查询参数\n * @returns 查询字符串\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 * 获取市场服务发现文档\n * @returns 服务发现文档\n */\n async getDiscoveryDocument(): Promise<DiscoveryDocument> {\n if (this.discoveryDoc) return this.discoveryDoc;\n\n this.discoveryDoc = await this.request<DiscoveryDocument>('/market/.well-known/discovery');\n return this.discoveryDoc;\n }\n\n /**\n * 获取插件列表\n * @param params 查询参数\n * @returns 插件列表响应\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 return this.request<PluginListResponse>(`/v1/plugins${queryString}`);\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 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 return this.request<PluginManifest>(`/v1/plugins/${identifier}/manifest${queryString}`);\n }\n\n /**\n * 导入插件清单 (需要管理员权限)\n * @param manifests 插件清单数组\n * @param ownerId 所有者ID\n * @returns 导入结果\n */\n async importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{ success: number; failed: number }> {\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 return response.data;\n }\n\n /**\n * 设置认证令牌\n * @param token 认证令牌\n */\n setAuthToken(token: string): void {\n this.headers.Authorization = `Bearer ${token}`;\n }\n\n /**\n * 清除认证令牌\n */\n clearAuthToken(): void {\n delete this.headers.Authorization;\n }\n} "],"mappings":"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","names":[]}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lobehub/market-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "LobeHub Market JavaScript SDK",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"lobehub",
|
|
7
|
+
"market",
|
|
8
|
+
"sdk",
|
|
9
|
+
"plugins"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/lobehub/lobehub-market#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/lobehub/lobehub-market/issues"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "git+https://github.com/lobehub/lobehub-market.git"
|
|
18
|
+
},
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"author": "LobeHub",
|
|
21
|
+
"main": "dist/index.mjs",
|
|
22
|
+
"module": "dist/index.mjs",
|
|
23
|
+
"types": "dist/index.d.ts",
|
|
24
|
+
"files": [
|
|
25
|
+
"dist"
|
|
26
|
+
],
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsup",
|
|
29
|
+
"dev": "tsup --watch",
|
|
30
|
+
"prepublishOnly": "npm run build"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"tsup": "^8.4.0",
|
|
34
|
+
"typescript": "^5.8.3",
|
|
35
|
+
"zod": "^3.24.4"
|
|
36
|
+
},
|
|
37
|
+
"peerDependencies": {
|
|
38
|
+
"zod": "^3.24.4"
|
|
39
|
+
},
|
|
40
|
+
"publishConfig": {
|
|
41
|
+
"access": "public",
|
|
42
|
+
"registry": "https://registry.npmjs.org"
|
|
43
|
+
}
|
|
44
|
+
}
|