@lobehub/market-sdk 0.0.5 → 0.0.7
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 +27 -27
- package/dist/index.mjs +55 -30
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -1
package/dist/index.d.mts
CHANGED
|
@@ -145,7 +145,7 @@ interface MarketSDKOptions {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
/**
|
|
148
|
-
* LobeHub Market SDK
|
|
148
|
+
* LobeHub Market SDK Client
|
|
149
149
|
*/
|
|
150
150
|
declare class MarketSDK {
|
|
151
151
|
private baseUrl;
|
|
@@ -153,32 +153,32 @@ declare class MarketSDK {
|
|
|
153
153
|
private discoveryDoc?;
|
|
154
154
|
private headers;
|
|
155
155
|
/**
|
|
156
|
-
*
|
|
157
|
-
* @param options SDK
|
|
156
|
+
* Create MarketSDK instance
|
|
157
|
+
* @param options SDK configuration options
|
|
158
158
|
*/
|
|
159
159
|
constructor(options?: MarketSDKOptions);
|
|
160
160
|
/**
|
|
161
|
-
*
|
|
162
|
-
* @param url
|
|
163
|
-
* @param options fetch
|
|
164
|
-
* @returns
|
|
161
|
+
* Send request and handle response
|
|
162
|
+
* @param url Request URL
|
|
163
|
+
* @param options fetch options
|
|
164
|
+
* @returns Response data
|
|
165
165
|
*/
|
|
166
166
|
private request;
|
|
167
167
|
/**
|
|
168
|
-
*
|
|
169
|
-
* @param params
|
|
170
|
-
* @returns
|
|
168
|
+
* Build query string
|
|
169
|
+
* @param params Query parameters
|
|
170
|
+
* @returns Query string
|
|
171
171
|
*/
|
|
172
172
|
private buildQueryString;
|
|
173
173
|
/**
|
|
174
|
-
*
|
|
175
|
-
* @returns
|
|
174
|
+
* Get market service discovery document
|
|
175
|
+
* @returns Service discovery document
|
|
176
176
|
*/
|
|
177
177
|
getDiscoveryDocument(): Promise<DiscoveryDocument>;
|
|
178
178
|
/**
|
|
179
|
-
*
|
|
180
|
-
* @param params
|
|
181
|
-
* @returns
|
|
179
|
+
* Get plugin list
|
|
180
|
+
* @param params Query parameters
|
|
181
|
+
* @returns Plugin list response
|
|
182
182
|
*/
|
|
183
183
|
getPluginList(params?: {
|
|
184
184
|
page?: number;
|
|
@@ -191,30 +191,30 @@ declare class MarketSDK {
|
|
|
191
191
|
locale?: string;
|
|
192
192
|
}): Promise<PluginListResponse>;
|
|
193
193
|
/**
|
|
194
|
-
*
|
|
195
|
-
* @param identifier
|
|
196
|
-
* @param locale
|
|
197
|
-
* @param version
|
|
198
|
-
* @returns
|
|
194
|
+
* Get plugin manifest
|
|
195
|
+
* @param identifier Plugin identifier
|
|
196
|
+
* @param locale Language
|
|
197
|
+
* @param version Version
|
|
198
|
+
* @returns Plugin manifest
|
|
199
199
|
*/
|
|
200
200
|
getPluginManifest(identifier: string, locale?: string, version?: string): Promise<PluginManifest>;
|
|
201
201
|
/**
|
|
202
|
-
*
|
|
203
|
-
* @param manifests
|
|
204
|
-
* @param ownerId
|
|
205
|
-
* @returns
|
|
202
|
+
* Import plugin manifests (requires admin privileges)
|
|
203
|
+
* @param manifests Plugin manifest array
|
|
204
|
+
* @param ownerId Owner ID
|
|
205
|
+
* @returns Import result
|
|
206
206
|
*/
|
|
207
207
|
importManifests(manifests: PluginManifest[], ownerId?: number): Promise<{
|
|
208
208
|
success: number;
|
|
209
209
|
failed: number;
|
|
210
210
|
}>;
|
|
211
211
|
/**
|
|
212
|
-
*
|
|
213
|
-
* @param token
|
|
212
|
+
* Set authentication token
|
|
213
|
+
* @param token Authentication token
|
|
214
214
|
*/
|
|
215
215
|
setAuthToken(token: string): void;
|
|
216
216
|
/**
|
|
217
|
-
*
|
|
217
|
+
* Clear authentication token
|
|
218
218
|
*/
|
|
219
219
|
clearAuthToken(): void;
|
|
220
220
|
}
|
package/dist/index.mjs
CHANGED
|
@@ -12,10 +12,12 @@ var InstallationMethodEnum = z.enum([
|
|
|
12
12
|
]);
|
|
13
13
|
|
|
14
14
|
// src/market-sdk.ts
|
|
15
|
+
import debug from "debug";
|
|
16
|
+
var log = debug("lobe-market-sdk");
|
|
15
17
|
var MarketSDK = class {
|
|
16
18
|
/**
|
|
17
|
-
*
|
|
18
|
-
* @param options SDK
|
|
19
|
+
* Create MarketSDK instance
|
|
20
|
+
* @param options SDK configuration options
|
|
19
21
|
*/
|
|
20
22
|
constructor(options = {}) {
|
|
21
23
|
this.baseUrl = options.baseUrl || "https://market.lobehub.com/api";
|
|
@@ -24,14 +26,16 @@ var MarketSDK = class {
|
|
|
24
26
|
"Content-Type": "application/json",
|
|
25
27
|
...options.apiKey ? { Authorization: `Bearer ${options.apiKey}` } : {}
|
|
26
28
|
};
|
|
29
|
+
log("MarketSDK instance created: %O", { baseUrl: this.baseUrl, defaultLocale: this.defaultLocale });
|
|
27
30
|
}
|
|
28
31
|
/**
|
|
29
|
-
*
|
|
30
|
-
* @param url
|
|
31
|
-
* @param options fetch
|
|
32
|
-
* @returns
|
|
32
|
+
* Send request and handle response
|
|
33
|
+
* @param url Request URL
|
|
34
|
+
* @param options fetch options
|
|
35
|
+
* @returns Response data
|
|
33
36
|
*/
|
|
34
37
|
async request(url, options = {}) {
|
|
38
|
+
log("Sending request: %s", `${this.baseUrl}${url}`);
|
|
35
39
|
const response = await fetch(`${this.baseUrl}${url}`, {
|
|
36
40
|
...options,
|
|
37
41
|
headers: {
|
|
@@ -40,62 +44,80 @@ var MarketSDK = class {
|
|
|
40
44
|
}
|
|
41
45
|
});
|
|
42
46
|
if (!response.ok) {
|
|
43
|
-
|
|
47
|
+
const errorMsg = `Request failed: ${response.status} ${response.statusText}`;
|
|
48
|
+
log("Request error: %s", errorMsg);
|
|
49
|
+
throw new Error(errorMsg);
|
|
44
50
|
}
|
|
51
|
+
log("Request successful: %s", url);
|
|
45
52
|
return response.json();
|
|
46
53
|
}
|
|
47
54
|
/**
|
|
48
|
-
*
|
|
49
|
-
* @param params
|
|
50
|
-
* @returns
|
|
55
|
+
* Build query string
|
|
56
|
+
* @param params Query parameters
|
|
57
|
+
* @returns Query string
|
|
51
58
|
*/
|
|
52
59
|
buildQueryString(params) {
|
|
53
60
|
const query = Object.entries(params).filter(([_, value]) => value !== void 0 && value !== null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
|
|
54
61
|
return query ? `?${query}` : "";
|
|
55
62
|
}
|
|
56
63
|
/**
|
|
57
|
-
*
|
|
58
|
-
* @returns
|
|
64
|
+
* Get market service discovery document
|
|
65
|
+
* @returns Service discovery document
|
|
59
66
|
*/
|
|
60
67
|
async getDiscoveryDocument() {
|
|
61
|
-
|
|
68
|
+
log("Getting service discovery document");
|
|
69
|
+
if (this.discoveryDoc) {
|
|
70
|
+
log("Returning cached discovery document");
|
|
71
|
+
return this.discoveryDoc;
|
|
72
|
+
}
|
|
62
73
|
this.discoveryDoc = await this.request("/market/.well-known/discovery");
|
|
74
|
+
log("Successfully retrieved service discovery document");
|
|
63
75
|
return this.discoveryDoc;
|
|
64
76
|
}
|
|
65
77
|
/**
|
|
66
|
-
*
|
|
67
|
-
* @param params
|
|
68
|
-
* @returns
|
|
78
|
+
* Get plugin list
|
|
79
|
+
* @param params Query parameters
|
|
80
|
+
* @returns Plugin list response
|
|
69
81
|
*/
|
|
70
82
|
async getPluginList(params = {}) {
|
|
71
83
|
const locale = params.locale || this.defaultLocale;
|
|
72
84
|
const queryParams = { ...params, locale };
|
|
73
85
|
const queryString = this.buildQueryString(queryParams);
|
|
74
|
-
|
|
86
|
+
log("Getting plugin list: %O", queryParams);
|
|
87
|
+
const result = await this.request(`/v1/plugins${queryString}`);
|
|
88
|
+
log("Retrieved %d plugins", result.items.length);
|
|
89
|
+
return result;
|
|
75
90
|
}
|
|
76
91
|
/**
|
|
77
|
-
*
|
|
78
|
-
* @param identifier
|
|
79
|
-
* @param locale
|
|
80
|
-
* @param version
|
|
81
|
-
* @returns
|
|
92
|
+
* Get plugin manifest
|
|
93
|
+
* @param identifier Plugin identifier
|
|
94
|
+
* @param locale Language
|
|
95
|
+
* @param version Version
|
|
96
|
+
* @returns Plugin manifest
|
|
82
97
|
*/
|
|
83
98
|
async getPluginManifest(identifier, locale, version) {
|
|
99
|
+
log("Getting plugin manifest: %O", { identifier, version, locale });
|
|
84
100
|
const localeParam = locale || this.defaultLocale;
|
|
85
101
|
const params = { locale: localeParam };
|
|
86
102
|
if (version) {
|
|
87
103
|
params.version = version;
|
|
88
104
|
}
|
|
89
105
|
const queryString = this.buildQueryString(params);
|
|
90
|
-
|
|
106
|
+
const manifest = await this.request(`/v1/plugins/${identifier}/manifest${queryString}`);
|
|
107
|
+
log("Successfully retrieved plugin manifest: %s", identifier);
|
|
108
|
+
return manifest;
|
|
91
109
|
}
|
|
92
110
|
/**
|
|
93
|
-
*
|
|
94
|
-
* @param manifests
|
|
95
|
-
* @param ownerId
|
|
96
|
-
* @returns
|
|
111
|
+
* Import plugin manifests (requires admin privileges)
|
|
112
|
+
* @param manifests Plugin manifest array
|
|
113
|
+
* @param ownerId Owner ID
|
|
114
|
+
* @returns Import result
|
|
97
115
|
*/
|
|
98
116
|
async importManifests(manifests, ownerId) {
|
|
117
|
+
log(`Starting batch import of ${manifests.length} manifests`);
|
|
118
|
+
if (ownerId) {
|
|
119
|
+
log(`Using specified owner ID: ${ownerId}`);
|
|
120
|
+
}
|
|
99
121
|
const response = await this.request("/v1/admin/plugins/import", {
|
|
100
122
|
method: "POST",
|
|
101
123
|
body: JSON.stringify({
|
|
@@ -103,19 +125,22 @@ var MarketSDK = class {
|
|
|
103
125
|
ownerId
|
|
104
126
|
})
|
|
105
127
|
});
|
|
128
|
+
log(`Batch import completed: ${response.data.success} successful, ${response.data.failed} failed`);
|
|
106
129
|
return response.data;
|
|
107
130
|
}
|
|
108
131
|
/**
|
|
109
|
-
*
|
|
110
|
-
* @param token
|
|
132
|
+
* Set authentication token
|
|
133
|
+
* @param token Authentication token
|
|
111
134
|
*/
|
|
112
135
|
setAuthToken(token) {
|
|
136
|
+
log("Setting authentication token");
|
|
113
137
|
this.headers.Authorization = `Bearer ${token}`;
|
|
114
138
|
}
|
|
115
139
|
/**
|
|
116
|
-
*
|
|
140
|
+
* Clear authentication token
|
|
117
141
|
*/
|
|
118
142
|
clearAuthToken() {
|
|
143
|
+
log("Clearing authentication token");
|
|
119
144
|
delete this.headers.Authorization;
|
|
120
145
|
}
|
|
121
146
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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';\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":[]}
|
|
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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lobehub/market-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.7",
|
|
4
4
|
"description": "LobeHub Market JavaScript SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"lobehub",
|
|
@@ -30,7 +30,11 @@
|
|
|
30
30
|
"prepublishOnly": "npm run build",
|
|
31
31
|
"release": "npm publish"
|
|
32
32
|
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"debug": "^4.4.1"
|
|
35
|
+
},
|
|
33
36
|
"devDependencies": {
|
|
37
|
+
"@types/debug": "^4.1.12",
|
|
34
38
|
"tsup": "^8.4.0",
|
|
35
39
|
"typescript": "^5.8.3",
|
|
36
40
|
"zod": "^3.24.4"
|