ai-world-sdk 1.5.9 → 1.5.10

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.
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPluginTokenCommands(program: Command): void;
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerPluginTokenCommands = registerPluginTokenCommands;
4
+ const config_1 = require("../config");
5
+ const output_1 = require("../output");
6
+ const utils_1 = require("../utils");
7
+ function collectOpts(cmd) {
8
+ const chain = [];
9
+ for (let c = cmd; c; c = c.parent)
10
+ chain.unshift(c);
11
+ const o = {};
12
+ for (const c of chain)
13
+ Object.assign(o, c.opts());
14
+ return o;
15
+ }
16
+ function resolveAndInit(cmd) {
17
+ const o = collectOpts(cmd);
18
+ const auth = (0, config_1.resolveAuth)({
19
+ baseUrl: o.baseUrl,
20
+ token: o.token,
21
+ pluginId: o.pluginId,
22
+ });
23
+ (0, utils_1.initSDK)(auth);
24
+ return o;
25
+ }
26
+ function parsePositiveInt(raw, flag) {
27
+ if (raw == null || raw === '')
28
+ return undefined;
29
+ const n = parseInt(raw, 10);
30
+ if (!Number.isFinite(n)) {
31
+ const err = new Error(`无效的 ${flag}: ${raw}`);
32
+ err.code = 'VALIDATION_ERROR';
33
+ throw err;
34
+ }
35
+ return n;
36
+ }
37
+ function registerPluginTokenCommands(program) {
38
+ const pt = program.command('plugin-token').description('插件 Token 管理(需管理员权限)');
39
+ pt.command('list')
40
+ .description('列出插件 Token')
41
+ .option('--plugin-id <id>', '按插件 ID 过滤')
42
+ .option('--active', '仅显示启用')
43
+ .option('--inactive', '仅显示停用')
44
+ .option('--page <n>', '页码')
45
+ .option('--page-size <n>', '每页条数')
46
+ .action(async (opts, cmd) => {
47
+ try {
48
+ const o = resolveAndInit(cmd);
49
+ const { PluginTokenClient } = require('../../plugin-token');
50
+ const client = new PluginTokenClient();
51
+ const isActive = opts.active ? true : opts.inactive ? false : undefined;
52
+ const result = await client.list({
53
+ pluginId: opts.pluginId,
54
+ isActive,
55
+ page: parsePositiveInt(opts.page, '--page') || 1,
56
+ pageSize: parsePositiveInt(opts.pageSize, '--page-size') || 20,
57
+ });
58
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
59
+ }
60
+ catch (err) {
61
+ (0, utils_1.handleError)(err, 'plugin-token list');
62
+ }
63
+ });
64
+ pt.command('create')
65
+ .description('创建插件 Token')
66
+ .requiredOption('--plugin-id <id>', '插件 ID')
67
+ .requiredOption('--name <name>', 'Token 名称')
68
+ .requiredOption('--role-id <id>', '角色 ID')
69
+ .option('--description <desc>', '描述')
70
+ .option('--expires <date>', '过期时间 (ISO 8601)')
71
+ .action(async (opts, cmd) => {
72
+ try {
73
+ resolveAndInit(cmd);
74
+ const { PluginTokenClient } = require('../../plugin-token');
75
+ const client = new PluginTokenClient();
76
+ const result = await client.create({
77
+ plugin_id: opts.pluginId,
78
+ name: opts.name,
79
+ role_id: Number(opts.roleId),
80
+ description: opts.description,
81
+ expires_at: opts.expires,
82
+ });
83
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
84
+ console.error(`\n⚠️ Token 仅显示一次,请妥善保存: ${result.token}`);
85
+ }
86
+ catch (err) {
87
+ (0, utils_1.handleError)(err, 'plugin-token create');
88
+ }
89
+ });
90
+ pt.command('get')
91
+ .argument('<id>', 'Token ID')
92
+ .description('获取插件 Token 详情')
93
+ .action(async (idArg, _opts, cmd) => {
94
+ try {
95
+ resolveAndInit(cmd);
96
+ const { PluginTokenClient } = require('../../plugin-token');
97
+ const client = new PluginTokenClient();
98
+ const result = await client.get(Number(idArg));
99
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
100
+ }
101
+ catch (err) {
102
+ (0, utils_1.handleError)(err, 'plugin-token get');
103
+ }
104
+ });
105
+ pt.command('update')
106
+ .argument('<id>', 'Token ID')
107
+ .description('更新插件 Token')
108
+ .option('--name <name>', '名称')
109
+ .option('--description <desc>', '描述')
110
+ .option('--role-id <id>', '角色 ID')
111
+ .option('--expires <date>', '过期时间 (ISO 8601)')
112
+ .action(async (idArg, opts, cmd) => {
113
+ try {
114
+ resolveAndInit(cmd);
115
+ const { PluginTokenClient } = require('../../plugin-token');
116
+ const client = new PluginTokenClient();
117
+ const data = {};
118
+ if (opts.name != null)
119
+ data.name = opts.name;
120
+ if (opts.description != null)
121
+ data.description = opts.description;
122
+ if (opts.roleId != null)
123
+ data.role_id = Number(opts.roleId);
124
+ if (opts.expires != null)
125
+ data.expires_at = opts.expires;
126
+ const result = await client.update(Number(idArg), data);
127
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
128
+ }
129
+ catch (err) {
130
+ (0, utils_1.handleError)(err, 'plugin-token update');
131
+ }
132
+ });
133
+ pt.command('delete')
134
+ .argument('<id>', 'Token ID')
135
+ .description('删除插件 Token')
136
+ .action(async (idArg, _opts, cmd) => {
137
+ try {
138
+ resolveAndInit(cmd);
139
+ const { PluginTokenClient } = require('../../plugin-token');
140
+ const client = new PluginTokenClient();
141
+ await client.delete(Number(idArg));
142
+ (0, output_1.output)({ deleted: true, id: Number(idArg) }, (0, utils_1.getFormat)(program));
143
+ }
144
+ catch (err) {
145
+ (0, utils_1.handleError)(err, 'plugin-token delete');
146
+ }
147
+ });
148
+ pt.command('regenerate')
149
+ .argument('<id>', 'Token ID')
150
+ .description('重新生成 Token(旧 Token 立即失效)')
151
+ .action(async (idArg, _opts, cmd) => {
152
+ try {
153
+ resolveAndInit(cmd);
154
+ const { PluginTokenClient } = require('../../plugin-token');
155
+ const client = new PluginTokenClient();
156
+ const result = await client.regenerate(Number(idArg));
157
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
158
+ console.error(`\n⚠️ 新 Token 仅显示一次: ${result.token}`);
159
+ }
160
+ catch (err) {
161
+ (0, utils_1.handleError)(err, 'plugin-token regenerate');
162
+ }
163
+ });
164
+ pt.command('toggle')
165
+ .argument('<id>', 'Token ID')
166
+ .description('切换启用/停用状态')
167
+ .action(async (idArg, _opts, cmd) => {
168
+ try {
169
+ resolveAndInit(cmd);
170
+ const { PluginTokenClient } = require('../../plugin-token');
171
+ const client = new PluginTokenClient();
172
+ const result = await client.toggle(Number(idArg));
173
+ const status = result.is_active ? '已启用' : '已停用';
174
+ console.error(`Token #${idArg} ${status}`);
175
+ (0, output_1.output)(result, (0, utils_1.getFormat)(program));
176
+ }
177
+ catch (err) {
178
+ (0, utils_1.handleError)(err, 'plugin-token toggle');
179
+ }
180
+ });
181
+ }
package/dist/cli/index.js CHANGED
@@ -104,6 +104,7 @@ const stats_1 = require("./commands/stats");
104
104
  const ai_config_1 = require("./commands/ai-config");
105
105
  const shared_1 = require("./commands/shared");
106
106
  const chrome_1 = require("./commands/chrome");
107
+ const plugin_token_1 = require("./commands/plugin-token");
107
108
  (0, help_1.registerHelpCommand)(program);
108
109
  (0, version_1.registerVersionCommand)(program);
109
110
  (0, auth_1.registerAuthCommands)(program);
@@ -121,6 +122,7 @@ const chrome_1 = require("./commands/chrome");
121
122
  (0, ai_config_1.registerAiConfigCommands)(program);
122
123
  (0, shared_1.registerSharedCommands)(program);
123
124
  (0, chrome_1.registerChromeCommands)(program);
125
+ (0, plugin_token_1.registerPluginTokenCommands)(program);
124
126
  program.parseAsync(process.argv).catch((err) => {
125
127
  (0, utils_1.handleError)(err, process.argv.slice(2).join(' '));
126
128
  });
package/dist/config.d.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  *
10
10
  * 注意: {VERSION} 占位符会在构建时被替换为实际版本号
11
11
  */
12
- export declare const SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.9";
12
+ export declare const SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.10";
13
13
  /**
14
14
  * 版本兼容性错误
15
15
  */
@@ -35,8 +35,8 @@ declare class SDKConfig {
35
35
  private _authCheckPromise;
36
36
  private _currentUser;
37
37
  private _cliMode;
38
- readonly sdkSignature = "AI_WORLD_SDK_V:1.5.9";
39
- readonly sdkVersion = "1.5.9";
38
+ readonly sdkSignature = "AI_WORLD_SDK_V:1.5.10";
39
+ readonly sdkVersion = "1.5.10";
40
40
  constructor();
41
41
  /**
42
42
  * Set global base URL
package/dist/config.js CHANGED
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.sdkConfig = exports.VersionCompatibilityError = exports.SDK_SIGNATURE = void 0;
8
8
  // SDK 版本号(构建时自动从 package.json 更新)
9
9
  // 此版本号会在运行 npm run build 时自动从 package.json 读取并更新
10
- const SDK_VERSION = "1.5.9";
10
+ const SDK_VERSION = "1.5.10";
11
11
  /**
12
12
  * SDK 特征码 - 用于在构建后的 JS 文件中识别 SDK 版本
13
13
  * 格式: AI_WORLD_SDK_V:版本号
@@ -15,7 +15,7 @@ const SDK_VERSION = "1.5.9";
15
15
  *
16
16
  * 注意: {VERSION} 占位符会在构建时被替换为实际版本号
17
17
  */
18
- exports.SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.9";
18
+ exports.SDK_SIGNATURE = "AI_WORLD_SDK_V:1.5.10";
19
19
  /**
20
20
  * 版本兼容性错误
21
21
  */
package/dist/index.d.ts CHANGED
@@ -39,6 +39,7 @@ export { StatsClient, DashboardClient, type StatsClientConfig, type AiApiCallsOp
39
39
  export { AIConfigClient, type AIConfigClientConfig, } from "./ai-config";
40
40
  export { SharedResourceClient, type SharedResourceClientConfig, type SharedResourceInfo, type SharedResourceListResponse, type ListSharedResourceOptions, type UpdateSharedResourceData, } from "./shared-resource";
41
41
  export { ChromeExtensionClient, type ChromeExtensionClientConfig, type ChromeExtensionInfo, type ChromeExtensionListResponse, type ListChromeExtensionsOptions, type CreateChromeExtensionData, } from "./chrome-extension";
42
+ export { PluginTokenClient, type PluginTokenClientConfig, type PluginTokenInfo, type PluginTokenCreateResponse, type PluginTokenListResponse, type ListPluginTokensOptions, type CreatePluginTokenData, type UpdatePluginTokenData, } from "./plugin-token";
42
43
  export { sdkConfig, VersionCompatibilityError, SDK_SIGNATURE, type AuthenticatedUser } from "./config";
43
44
  /**
44
45
  * Create a chat model instance based on model name
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
20
20
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
21
21
  };
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.bytesFromUrl = exports.getImageProxyConfig = exports.pollImageTask = exports.getImageTask = exports.submitImageTask = exports.generateImageSync = exports.generateKunpoImage = exports.SDK_SIGNATURE = exports.VersionCompatibilityError = exports.sdkConfig = exports.ChromeExtensionClient = exports.SharedResourceClient = exports.AIConfigClient = exports.DashboardClient = exports.StatsClient = exports.PluginManagementClient = exports.AdminClient = exports.getCurrentUserInfo = exports.AuthClient = exports.AgentSkillClient = exports.VersionedResourceClient = exports.ResourceClient = exports.MinioStorageClient = exports.DownloadClient = exports.OpenAIVideoGenerationClient = exports.VideoUnderstandingClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
23
+ exports.bytesFromUrl = exports.getImageProxyConfig = exports.pollImageTask = exports.getImageTask = exports.submitImageTask = exports.generateImageSync = exports.generateKunpoImage = exports.SDK_SIGNATURE = exports.VersionCompatibilityError = exports.sdkConfig = exports.PluginTokenClient = exports.ChromeExtensionClient = exports.SharedResourceClient = exports.AIConfigClient = exports.DashboardClient = exports.StatsClient = exports.PluginManagementClient = exports.AdminClient = exports.getCurrentUserInfo = exports.AuthClient = exports.AgentSkillClient = exports.VersionedResourceClient = exports.ResourceClient = exports.MinioStorageClient = exports.DownloadClient = exports.OpenAIVideoGenerationClient = exports.VideoUnderstandingClient = exports.VideoGenerationClient = exports.GeminiImageGenerationClient = exports.DoubaoImageGenerationClient = exports.ChatAnthropic = exports.ChatGoogleGenerativeAI = exports.ChatOpenAI = exports.BaseChatModel = exports.AIMessageChunk = exports.SystemMessage = exports.AIMessage = exports.HumanMessage = void 0;
24
24
  exports.createChatModel = createChatModel;
25
25
  const openai_1 = require("./chat_models/openai");
26
26
  const google_1 = require("./chat_models/google");
@@ -85,6 +85,9 @@ Object.defineProperty(exports, "SharedResourceClient", { enumerable: true, get:
85
85
  // Export chrome extension client
86
86
  var chrome_extension_1 = require("./chrome-extension");
87
87
  Object.defineProperty(exports, "ChromeExtensionClient", { enumerable: true, get: function () { return chrome_extension_1.ChromeExtensionClient; } });
88
+ // Export plugin token client
89
+ var plugin_token_1 = require("./plugin-token");
90
+ Object.defineProperty(exports, "PluginTokenClient", { enumerable: true, get: function () { return plugin_token_1.PluginTokenClient; } });
88
91
  // Export global configuration
89
92
  var config_2 = require("./config");
90
93
  Object.defineProperty(exports, "sdkConfig", { enumerable: true, get: function () { return config_2.sdkConfig; } });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Plugin Token Client
3
+ * 插件 Token 管理客户端(管理员接口)
4
+ */
5
+ export interface PluginTokenClientConfig {
6
+ baseUrl?: string;
7
+ token?: string;
8
+ headers?: Record<string, string>;
9
+ }
10
+ export interface PluginTokenInfo {
11
+ id: number;
12
+ plugin_id: string;
13
+ name: string;
14
+ description?: string;
15
+ is_active: boolean;
16
+ token_prefix: string;
17
+ last_used_at?: string;
18
+ expires_at?: string;
19
+ created_at: string;
20
+ updated_at: string;
21
+ role?: {
22
+ id: number;
23
+ name: string;
24
+ description?: string;
25
+ permissions: Record<string, any>;
26
+ };
27
+ created_by_name?: string;
28
+ }
29
+ export interface PluginTokenCreateResponse extends PluginTokenInfo {
30
+ token: string;
31
+ }
32
+ export interface PluginTokenListResponse {
33
+ items: PluginTokenInfo[];
34
+ total: number;
35
+ page: number;
36
+ page_size: number;
37
+ }
38
+ export interface ListPluginTokensOptions {
39
+ page?: number;
40
+ pageSize?: number;
41
+ pluginId?: string;
42
+ search?: string;
43
+ isActive?: boolean;
44
+ }
45
+ export interface CreatePluginTokenData {
46
+ plugin_id: string;
47
+ name: string;
48
+ description?: string;
49
+ role_id: number;
50
+ expires_at?: string;
51
+ }
52
+ export interface UpdatePluginTokenData {
53
+ name?: string;
54
+ description?: string;
55
+ role_id?: number;
56
+ expires_at?: string | null;
57
+ }
58
+ export declare class PluginTokenClient {
59
+ private baseUrl;
60
+ private headers;
61
+ constructor(config?: PluginTokenClientConfig);
62
+ private handleErrorResponse;
63
+ private buildUrl;
64
+ list(options?: ListPluginTokensOptions): Promise<PluginTokenListResponse>;
65
+ create(data: CreatePluginTokenData): Promise<PluginTokenCreateResponse>;
66
+ get(id: number): Promise<PluginTokenInfo>;
67
+ update(id: number, data: UpdatePluginTokenData): Promise<PluginTokenInfo>;
68
+ delete(id: number): Promise<void>;
69
+ regenerate(id: number): Promise<PluginTokenCreateResponse>;
70
+ toggle(id: number): Promise<PluginTokenInfo>;
71
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ /**
3
+ * Plugin Token Client
4
+ * 插件 Token 管理客户端(管理员接口)
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.PluginTokenClient = void 0;
8
+ const config_1 = require("./config");
9
+ const log_1 = require("./log");
10
+ class PluginTokenClient {
11
+ constructor(config = {}) {
12
+ this.baseUrl =
13
+ config.baseUrl ||
14
+ config_1.sdkConfig.getServerUrl() ||
15
+ (typeof window !== "undefined" ? window.location.origin : "");
16
+ const globalHeaders = config_1.sdkConfig.getHeaders();
17
+ const globalToken = config.token || config_1.sdkConfig.getToken();
18
+ this.headers = {
19
+ "Content-Type": "application/json",
20
+ ...globalHeaders,
21
+ ...config.headers,
22
+ };
23
+ if (globalToken) {
24
+ this.headers["Authorization"] = `Bearer ${globalToken}`;
25
+ }
26
+ }
27
+ async handleErrorResponse(response) {
28
+ let errorMessage = `Request failed: ${response.status} ${response.statusText}`;
29
+ try {
30
+ const errorText = await response.text();
31
+ const errorJson = JSON.parse(errorText);
32
+ errorMessage = errorJson.detail || errorMessage;
33
+ }
34
+ catch { }
35
+ throw new Error(errorMessage);
36
+ }
37
+ buildUrl(path, params) {
38
+ const url = `${this.baseUrl}${path}`;
39
+ if (!params)
40
+ return url;
41
+ const sp = new URLSearchParams();
42
+ for (const [k, v] of Object.entries(params)) {
43
+ if (v !== undefined && v !== null)
44
+ sp.set(k, String(v));
45
+ }
46
+ const qs = sp.toString();
47
+ return qs ? `${url}?${qs}` : url;
48
+ }
49
+ async list(options = {}) {
50
+ const url = this.buildUrl("/api/admin/plugin-tokens", {
51
+ page: options.page,
52
+ page_size: options.pageSize,
53
+ plugin_id: options.pluginId,
54
+ search: options.search,
55
+ is_active: options.isActive,
56
+ });
57
+ (0, log_1.debugLog)("PluginTokenClient.list", url);
58
+ (0, log_1.logRequest)("GET", url, this.headers);
59
+ const resp = await fetch(url, { method: "GET", headers: this.headers });
60
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
61
+ if (!resp.ok)
62
+ await this.handleErrorResponse(resp);
63
+ return resp.json();
64
+ }
65
+ async create(data) {
66
+ const url = `${this.baseUrl}/api/admin/plugin-tokens`;
67
+ (0, log_1.debugLog)("PluginTokenClient.create", url);
68
+ (0, log_1.logRequest)("POST", url, this.headers, data);
69
+ const resp = await fetch(url, {
70
+ method: "POST",
71
+ headers: this.headers,
72
+ body: JSON.stringify(data),
73
+ });
74
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
75
+ if (!resp.ok)
76
+ await this.handleErrorResponse(resp);
77
+ return resp.json();
78
+ }
79
+ async get(id) {
80
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
81
+ (0, log_1.debugLog)("PluginTokenClient.get", url);
82
+ (0, log_1.logRequest)("GET", url);
83
+ const resp = await fetch(url, { method: "GET", headers: this.headers });
84
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
85
+ if (!resp.ok)
86
+ await this.handleErrorResponse(resp);
87
+ return resp.json();
88
+ }
89
+ async update(id, data) {
90
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
91
+ (0, log_1.debugLog)("PluginTokenClient.update", url);
92
+ (0, log_1.logRequest)("PATCH", url, this.headers, data);
93
+ const resp = await fetch(url, {
94
+ method: "PATCH",
95
+ headers: this.headers,
96
+ body: JSON.stringify(data),
97
+ });
98
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
99
+ if (!resp.ok)
100
+ await this.handleErrorResponse(resp);
101
+ return resp.json();
102
+ }
103
+ async delete(id) {
104
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}`;
105
+ (0, log_1.debugLog)("PluginTokenClient.delete", url);
106
+ (0, log_1.logRequest)("DELETE", url, this.headers);
107
+ const resp = await fetch(url, { method: "DELETE", headers: this.headers });
108
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
109
+ if (!resp.ok)
110
+ await this.handleErrorResponse(resp);
111
+ }
112
+ async regenerate(id) {
113
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}/regenerate`;
114
+ (0, log_1.debugLog)("PluginTokenClient.regenerate", url);
115
+ (0, log_1.logRequest)("POST", url, this.headers);
116
+ const resp = await fetch(url, { method: "POST", headers: this.headers });
117
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
118
+ if (!resp.ok)
119
+ await this.handleErrorResponse(resp);
120
+ return resp.json();
121
+ }
122
+ async toggle(id) {
123
+ const url = `${this.baseUrl}/api/admin/plugin-tokens/${id}/toggle`;
124
+ (0, log_1.debugLog)("PluginTokenClient.toggle", url);
125
+ (0, log_1.logRequest)("PATCH", url, this.headers);
126
+ const resp = await fetch(url, { method: "PATCH", headers: this.headers });
127
+ (0, log_1.logResponse)(resp.status, resp.statusText, resp.headers);
128
+ if (!resp.ok)
129
+ await this.handleErrorResponse(resp);
130
+ return resp.json();
131
+ }
132
+ }
133
+ exports.PluginTokenClient = PluginTokenClient;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ai-world-sdk",
3
- "version": "1.5.9",
3
+ "version": "1.5.10",
4
4
  "description": "TypeScript SDK for AI World Platform - Chat Models, Image Generation, and Video Generation",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -273,6 +273,7 @@ for await (const chunk of stream.textStream) {
273
273
  - `DashboardClient` — 当前用户统计(无需管理员权限)
274
274
  - `SharedResourceClient` — 平台级文件共享(与 `ResourceClient` 的插件级 ACL 不同)
275
275
  - `ChromeExtensionClient` — Chrome 插件管理
276
+ - `PluginTokenClient` — 插件 Token 管理(创建/列表/更新/删除/重新生成/启停),需 `can_manage_plugin_tokens` 权限 → `docs/admin-api.md`
276
277
 
277
278
  ### CLI 命令行工具 → `docs/cli-usage.md`
278
279
 
@@ -131,3 +131,58 @@ await admin.deleteRow('users', { id: 1 });
131
131
  | `search` | string? | 全文搜索 |
132
132
  | `sortBy` | string? | 排序字段 |
133
133
  | `sortOrder` | "asc" \| "desc"? | 排序方向 |
134
+
135
+ ---
136
+
137
+ ## 插件 Token 管理
138
+
139
+ 通过 `PluginTokenClient` 管理插件 Token。需 `can_manage_plugin_tokens` 权限。
140
+
141
+ ```typescript
142
+ import { PluginTokenClient } from 'ai-world-sdk';
143
+
144
+ const client = new PluginTokenClient();
145
+ ```
146
+
147
+ ```typescript
148
+ // 列出 Token
149
+ const list = await client.list({ pluginId: 'example', page: 1, pageSize: 20 });
150
+
151
+ // 创建 Token(返回明文 token,仅显示一次)
152
+ const result = await client.create({
153
+ plugin_id: 'example',
154
+ name: 'CI/CD Token',
155
+ role_id: 2,
156
+ description: '持续集成使用',
157
+ });
158
+ console.log(result.token); // plt_xxxxxxxx...
159
+
160
+ // 获取详情
161
+ const info = await client.get(result.id);
162
+
163
+ // 更新
164
+ await client.update(result.id, { name: '新名称', role_id: 3 });
165
+
166
+ // 重新生成(旧 token 立即失效)
167
+ const newResult = await client.regenerate(result.id);
168
+ console.log(newResult.token);
169
+
170
+ // 启用/停用
171
+ await client.toggle(result.id);
172
+
173
+ // 删除
174
+ await client.delete(result.id);
175
+ ```
176
+
177
+ ### 使用 Token 认证
178
+
179
+ 创建的 Token 以 `plt_` 为前缀,在请求 Header 中使用:
180
+
181
+ ```typescript
182
+ // 在任何 SDK 客户端中使用插件 Token 代替 JWT
183
+ import { sdkConfig, MinioStorageClient } from 'ai-world-sdk';
184
+
185
+ sdkConfig.setToken('plt_xxxxxxxxxxxx');
186
+ const storage = new MinioStorageClient();
187
+ await storage.list(); // 使用插件 Token 认证
188
+ ```
@@ -214,3 +214,17 @@ ai-world chrome create --extension-id my-ext --name "My Extension" [--zip ext.zi
214
214
  ai-world chrome download <extension-id> [--output ext.zip]
215
215
  ai-world chrome delete <extension-id>
216
216
  ```
217
+
218
+ ## plugin-token — 插件 Token 管理
219
+
220
+ 需管理员权限(`can_manage_plugin_tokens`)。
221
+
222
+ ```bash
223
+ ai-world plugin-token list [--plugin-id example] [--active] [--inactive] [--page 1] [--page-size 20]
224
+ ai-world plugin-token create --plugin-id example --name "CI Token" --role-id 2 [--description "说明"] [--expires 2026-12-31T00:00:00Z]
225
+ ai-world plugin-token get <id>
226
+ ai-world plugin-token update <id> [--name "新名称"] [--role-id 3] [--description "新说明"]
227
+ ai-world plugin-token delete <id>
228
+ ai-world plugin-token regenerate <id>
229
+ ai-world plugin-token toggle <id>
230
+ ```