jimeng-cli 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-2IIK4X7C.js +10228 -0
- package/dist/chunk-2IIK4X7C.js.map +1 -0
- package/dist/cli/index.cjs +6420 -580
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +406 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/mcp/index.cjs +6056 -513
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +111 -1
- package/dist/mcp/index.js.map +1 -1
- package/package.json +11 -16
- package/dist/chunk-JZY62VNI.js +0 -4762
- package/dist/chunk-JZY62VNI.js.map +0 -1
package/dist/mcp/index.js
CHANGED
|
@@ -6,12 +6,14 @@ import {
|
|
|
6
6
|
generateImageComposition,
|
|
7
7
|
generateImages,
|
|
8
8
|
generateVideo,
|
|
9
|
+
getAssetList,
|
|
9
10
|
getLiveModels,
|
|
10
11
|
getTaskResponse,
|
|
11
12
|
session_pool_default,
|
|
13
|
+
upscaleImage,
|
|
12
14
|
util_default,
|
|
13
15
|
waitForTaskResponse
|
|
14
|
-
} from "../chunk-
|
|
16
|
+
} from "../chunk-2IIK4X7C.js";
|
|
15
17
|
|
|
16
18
|
// src/mcp/index.ts
|
|
17
19
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -256,6 +258,47 @@ var JimengApiClient = class {
|
|
|
256
258
|
options
|
|
257
259
|
);
|
|
258
260
|
}
|
|
261
|
+
async upscaleImage(body, options) {
|
|
262
|
+
const model = typeof body.model === "string" && body.model.trim().length > 0 ? body.model : DEFAULT_IMAGE_MODEL;
|
|
263
|
+
const imageUrl = typeof body.image === "string" ? body.image : "";
|
|
264
|
+
if (!imageUrl) throw new Error("Missing required 'image' field (URL or base64)");
|
|
265
|
+
const tokenCtx = await this.pickModelToken(model, "image", options);
|
|
266
|
+
const responseFormat = body.response_format === "b64_json" ? "b64_json" : "url";
|
|
267
|
+
const upscaleResult = await upscaleImage(
|
|
268
|
+
model,
|
|
269
|
+
imageUrl,
|
|
270
|
+
{
|
|
271
|
+
resolution: body.resolution,
|
|
272
|
+
wait: body.wait,
|
|
273
|
+
waitTimeoutSeconds: body.wait_timeout_seconds,
|
|
274
|
+
pollIntervalMs: body.poll_interval_ms
|
|
275
|
+
},
|
|
276
|
+
tokenCtx.token,
|
|
277
|
+
tokenCtx.regionInfo
|
|
278
|
+
);
|
|
279
|
+
if (!Array.isArray(upscaleResult)) {
|
|
280
|
+
return upscaleResult;
|
|
281
|
+
}
|
|
282
|
+
const data = responseFormat === "b64_json" ? (await Promise.all(upscaleResult.map((url) => util_default.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 })) : upscaleResult.map((url) => ({ url }));
|
|
283
|
+
return {
|
|
284
|
+
created: util_default.unixTimestamp(),
|
|
285
|
+
data,
|
|
286
|
+
resolution: body.resolution || "4k"
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
async listTasks(options, query) {
|
|
290
|
+
const tokenCtx = await this.pickTaskToken(options);
|
|
291
|
+
const result = await getAssetList(tokenCtx.token, tokenCtx.regionInfo, {
|
|
292
|
+
count: (query == null ? void 0 : query.count) || 20,
|
|
293
|
+
type: (query == null ? void 0 : query.type) || "all"
|
|
294
|
+
});
|
|
295
|
+
return {
|
|
296
|
+
has_more: result.hasMore,
|
|
297
|
+
next_offset: result.nextOffset,
|
|
298
|
+
total: result.items.length,
|
|
299
|
+
items: result.items
|
|
300
|
+
};
|
|
301
|
+
}
|
|
259
302
|
};
|
|
260
303
|
|
|
261
304
|
// src/mcp/errors.ts
|
|
@@ -437,6 +480,22 @@ var waitTaskInputSchema = z.object({
|
|
|
437
480
|
poll_interval_ms: z.number().int().positive().optional(),
|
|
438
481
|
token: z.string().optional()
|
|
439
482
|
});
|
|
483
|
+
var upscaleImageInputSchema = z.object({
|
|
484
|
+
image: z.string().min(1).describe("Image URL or local file path to upscale"),
|
|
485
|
+
model: z.string().optional(),
|
|
486
|
+
resolution: z.enum(["2k", "4k"]).optional(),
|
|
487
|
+
response_format: z.enum(["url", "b64_json"]).optional(),
|
|
488
|
+
wait: z.boolean().optional(),
|
|
489
|
+
wait_timeout_seconds: z.number().int().positive().optional(),
|
|
490
|
+
poll_interval_ms: z.number().int().positive().optional(),
|
|
491
|
+
token: z.string().optional(),
|
|
492
|
+
confirm: z.string().optional()
|
|
493
|
+
});
|
|
494
|
+
var listTasksInputSchema = z.object({
|
|
495
|
+
type: z.enum(["image", "video", "all"]).optional(),
|
|
496
|
+
count: z.number().int().positive().max(100).optional(),
|
|
497
|
+
token: z.string().optional()
|
|
498
|
+
});
|
|
440
499
|
|
|
441
500
|
// src/mcp/result.ts
|
|
442
501
|
function toStructuredContent(data) {
|
|
@@ -754,6 +813,55 @@ function registerListModelsTool({ server, client }) {
|
|
|
754
813
|
);
|
|
755
814
|
}
|
|
756
815
|
|
|
816
|
+
// src/mcp/tools/list-tasks.ts
|
|
817
|
+
function registerListTasksTool({ server, client }) {
|
|
818
|
+
registerSafeTool(
|
|
819
|
+
server,
|
|
820
|
+
"list_tasks",
|
|
821
|
+
{
|
|
822
|
+
title: "List Tasks",
|
|
823
|
+
description: "List generation task history with optional type filter",
|
|
824
|
+
inputSchema: listTasksInputSchema,
|
|
825
|
+
annotations: { readOnlyHint: true }
|
|
826
|
+
},
|
|
827
|
+
async (args) => client.listTasks(
|
|
828
|
+
{ token: args.token },
|
|
829
|
+
{
|
|
830
|
+
type: args.type,
|
|
831
|
+
count: args.count
|
|
832
|
+
}
|
|
833
|
+
)
|
|
834
|
+
);
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
// src/mcp/tools/upscale-image.ts
|
|
838
|
+
function registerUpscaleImageTool({ server, config, client }) {
|
|
839
|
+
registerSafeTool(
|
|
840
|
+
server,
|
|
841
|
+
"upscale_image",
|
|
842
|
+
{
|
|
843
|
+
title: "Upscale Image",
|
|
844
|
+
description: "Upscale an existing image to higher resolution (2k or 4k) using super_resolution",
|
|
845
|
+
inputSchema: upscaleImageInputSchema
|
|
846
|
+
},
|
|
847
|
+
async (args) => {
|
|
848
|
+
assertRunConfirm(config, args.confirm);
|
|
849
|
+
return client.upscaleImage(
|
|
850
|
+
{
|
|
851
|
+
image: args.image,
|
|
852
|
+
model: args.model,
|
|
853
|
+
resolution: args.resolution || "4k",
|
|
854
|
+
response_format: args.response_format,
|
|
855
|
+
wait: args.wait,
|
|
856
|
+
wait_timeout_seconds: args.wait_timeout_seconds,
|
|
857
|
+
poll_interval_ms: args.poll_interval_ms
|
|
858
|
+
},
|
|
859
|
+
{ token: args.token }
|
|
860
|
+
);
|
|
861
|
+
}
|
|
862
|
+
);
|
|
863
|
+
}
|
|
864
|
+
|
|
757
865
|
// src/mcp/tools/wait-task.ts
|
|
758
866
|
function registerWaitTaskTool({ server, client }) {
|
|
759
867
|
registerSafeTool(
|
|
@@ -783,7 +891,9 @@ var MCP_TOOL_MANIFEST = [
|
|
|
783
891
|
{ id: "list_models", register: registerListModelsTool },
|
|
784
892
|
{ id: "get_task", register: registerGetTaskTool },
|
|
785
893
|
{ id: "wait_task", register: registerWaitTaskTool },
|
|
894
|
+
{ id: "list_tasks", register: registerListTasksTool },
|
|
786
895
|
{ id: "generate_image", register: registerGenerateImageTool },
|
|
896
|
+
{ id: "upscale_image", isAdvanced: true, register: registerUpscaleImageTool },
|
|
787
897
|
{ id: "edit_image", isAdvanced: true, register: registerEditImageTool },
|
|
788
898
|
{ id: "generate_video_flf", isAdvanced: true, register: registerGenerateVideoTool },
|
|
789
899
|
{ id: "generate_video_omni", isAdvanced: true, register: registerGenerateVideoOmniTool }
|
package/dist/mcp/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/mcp/index.ts","../../src/mcp/config.ts","../../src/mcp/server.ts","../../src/mcp/client.ts","../../src/mcp/errors.ts","../../src/mcp/guards.ts","../../src/mcp/schemas.ts","../../src/mcp/result.ts","../../src/mcp/tool-factory.ts","../../src/mcp/tools/edit-image.ts","../../src/mcp/tools/generate-image.ts","../../src/mcp/tools/video-utils.ts","../../src/mcp/tools/generate-video-omni.ts","../../src/mcp/tools/generate-video.ts","../../src/mcp/tools/get-task.ts","../../src/mcp/tools/health-check.ts","../../src/mcp/tools/list-models.ts","../../src/mcp/tools/wait-task.ts","../../src/mcp/tools/manifest.ts","../../src/mcp/tools/index.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\n\r\nimport { loadMcpConfig } from \"./config.ts\";\r\nimport { createJimengMcpServer } from \"./server.ts\";\r\n\r\nasync function main() {\r\n const config = loadMcpConfig();\r\n const server = createJimengMcpServer(config);\r\n const transport = new StdioServerTransport();\r\n\r\n process.on(\"SIGINT\", async () => {\r\n await server.close();\r\n process.exit(0);\r\n });\r\n\r\n process.on(\"SIGTERM\", async () => {\r\n await server.close();\r\n process.exit(0);\r\n });\r\n\r\n await server.connect(transport);\r\n console.error(\"[jimeng-cli-mcp] Server started on stdio transport\");\r\n}\r\n\r\nmain().catch((error) => {\r\n console.error(\"[jimeng-cli-mcp] Failed to start MCP server:\", error);\r\n process.exit(1);\r\n});\r\n","function parseBoolean(value: string | undefined, defaultValue: boolean): boolean {\r\n if (value == null) return defaultValue;\r\n const normalized = value.trim().toLowerCase();\r\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\r\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\r\n return defaultValue;\r\n}\r\n\r\nfunction parseNumber(value: string | undefined, defaultValue: number): number {\r\n if (value == null) return defaultValue;\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultValue;\r\n}\r\n\r\nexport interface McpConfig {\n apiToken?: string;\n httpTimeoutMs: number;\n enableAdvancedTools: boolean;\n requireRunConfirm: boolean;\n}\n\nexport function loadMcpConfig(): McpConfig {\n const apiToken = process.env.JIMENG_API_TOKEN?.trim();\n return {\n apiToken: apiToken || undefined,\n httpTimeoutMs: parseNumber(process.env.MCP_HTTP_TIMEOUT_MS, 120000),\n enableAdvancedTools: parseBoolean(process.env.MCP_ENABLE_ADVANCED_TOOLS, true),\r\n requireRunConfirm: parseBoolean(process.env.MCP_REQUIRE_RUN_CONFIRM, true)\r\n };\r\n}\r\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\n\r\nimport environment from \"@/lib/environment.ts\";\r\nimport type { McpConfig } from \"./config.ts\";\r\nimport { JimengApiClient } from \"./client.ts\";\r\nimport { registerMcpTools } from \"./tools/index.ts\";\r\n\r\nexport function createJimengMcpServer(config: McpConfig): McpServer {\r\n const server = new McpServer({\r\n name: \"jimeng-cli-mcp\",\r\n version: environment.package.version || \"1.0.0\"\r\n });\r\n\r\n const client = new JimengApiClient(config);\r\n registerMcpTools({ server, config, client });\r\n\r\n return server;\r\n}\r\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { DEFAULT_IMAGE_MODEL } from \"@/api/consts/common.ts\";\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { generateImageComposition, generateImages } from \"@/api/controllers/images.ts\";\nimport { getLiveModels } from \"@/api/controllers/models.ts\";\nimport { getTaskResponse, waitForTaskResponse } from \"@/api/controllers/tasks.ts\";\nimport { DEFAULT_MODEL as DEFAULT_VIDEO_MODEL, generateVideo } from \"@/api/controllers/videos.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\nimport util from \"@/lib/util.ts\";\n\nimport type { McpConfig } from \"./config.ts\";\nimport type { JsonObject, MultipartUploadFile } from \"./types.ts\";\n\nexport interface McpRequestOptions {\n token?: string;\n}\n\nfunction resolveTaskType(value: unknown): \"image\" | \"video\" {\n return value === \"video\" ? \"video\" : \"image\";\n}\n\nexport class JimengApiClient {\n private readonly defaultToken?: string;\n private tokenPoolReady = false;\n\n constructor(config: McpConfig) {\n this.defaultToken = config.apiToken;\n }\n\n private resolveToken(options?: McpRequestOptions): string | undefined {\n return options?.token || this.defaultToken;\n }\n\n private async ensureTokenPoolReady(): Promise<void> {\n if (this.tokenPoolReady) return;\n await tokenPool.init();\n this.tokenPoolReady = true;\n }\n\n private async pickModelToken(\n requestedModel: string,\n taskType: \"image\" | \"video\",\n options?: McpRequestOptions,\n requiredCapabilityTags: string[] = []\n ): Promise<{ token: string; regionInfo: any }> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n const tokenPick = tokenPool.pickTokenForRequest({\n authorization: token ? `Bearer ${token}` : undefined,\n requestedModel,\n taskType,\n requiredCapabilityTags,\n });\n\n if (!tokenPick.token || !tokenPick.region) {\n throw new Error(tokenPick.reason || \"Missing available token for model request\");\n }\n\n return {\n token: tokenPick.token,\n regionInfo: buildRegionInfo(tokenPick.region),\n };\n }\n\n private async pickTaskToken(\n options?: McpRequestOptions,\n type: \"image\" | \"video\" = \"image\"\n ): Promise<{ token: string; regionInfo: any }> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n if (token) {\n const entry = tokenPool.getTokenEntry(token);\n if (!entry?.region) {\n throw new Error(\"Missing region for token. Register token with region in token-pool.\");\n }\n return { token, regionInfo: buildRegionInfo(entry.region) };\n }\n\n const candidates = tokenPool\n .getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => {\n const modelHint = type === \"video\" ? \"video\" : \"jimeng\";\n return !item.allowedModels?.length || item.allowedModels.some((m) => m.includes(modelHint));\n });\n if (candidates.length === 0) {\n throw new Error(\"No token available for task request. Configure token-pool or pass token.\");\n }\n return { token: candidates[0].token, regionInfo: buildRegionInfo(candidates[0].region as RegionCode) };\n }\n\n async healthCheck(): Promise<any> {\n return \"pong\";\n }\n\n async listModels(options?: McpRequestOptions): Promise<any> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n const authorization = token ? `Bearer ${token}` : undefined;\n const region = token ? tokenPool.getTokenEntry(token)?.region : undefined;\n const result = await getLiveModels(authorization, region);\n return {\n source: result.source,\n data: result.data,\n };\n }\n\n async generateImage(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_IMAGE_MODEL;\n const prompt = String(body.prompt || \"\");\n const tokenCtx = await this.pickModelToken(model, \"image\", options);\n\n const responseFormat = body.response_format === \"b64_json\" ? \"b64_json\" : \"url\";\n const imageResult = await generateImages(\n model,\n prompt,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n sampleStrength: body.sample_strength as number | undefined,\n negativePrompt: body.negative_prompt as string | undefined,\n intelligentRatio: body.intelligent_ratio as boolean | undefined,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (!Array.isArray(imageResult)) {\n return imageResult;\n }\n\n const data = responseFormat === \"b64_json\"\n ? (await Promise.all(imageResult.map((url) => util.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 }))\n : imageResult.map((url) => ({ url }));\n\n return {\n created: util.unixTimestamp(),\n data,\n };\n }\n\n async editImage(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_IMAGE_MODEL;\n const prompt = String(body.prompt || \"\");\n const images = Array.isArray(body.images)\n ? body.images.filter((item): item is string => typeof item === \"string\")\n : [];\n const tokenCtx = await this.pickModelToken(model, \"image\", options);\n\n const responseFormat = body.response_format === \"b64_json\" ? \"b64_json\" : \"url\";\n const compositionResult = await generateImageComposition(\n model,\n prompt,\n images,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n sampleStrength: body.sample_strength as number | undefined,\n negativePrompt: body.negative_prompt as string | undefined,\n intelligentRatio: body.intelligent_ratio as boolean | undefined,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (!Array.isArray(compositionResult)) {\n return compositionResult;\n }\n\n const data = responseFormat === \"b64_json\"\n ? (await Promise.all(compositionResult.map((url) => util.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 }))\n : compositionResult.map((url) => ({ url }));\n\n return {\n created: util.unixTimestamp(),\n data,\n input_images: images.length,\n composition_type: \"multi_image_synthesis\",\n };\n }\n\n async generateVideo(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_VIDEO_MODEL;\n const prompt = String(body.prompt || \"\");\n\n const functionMode = typeof body.functionMode === \"string\" ? body.functionMode : \"first_last_frames\";\n const requiredTags = functionMode === \"omni_reference\" ? [\"omni_reference\"] : [];\n const tokenCtx = await this.pickModelToken(model, \"video\", options, requiredTags);\n\n const videoResult = await generateVideo(\n model,\n prompt,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n duration: body.duration as number | undefined,\n filePaths: (body.filePaths || body.file_paths) as string[] | undefined,\n files: body.files as any,\n httpRequest: { body } as any,\n functionMode,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (typeof videoResult !== \"string\") {\n return videoResult;\n }\n\n if (body.response_format === \"b64_json\") {\n const videoBase64 = await util.fetchFileBASE64(videoResult);\n return {\n created: util.unixTimestamp(),\n data: [{ b64_json: videoBase64, revised_prompt: prompt }],\n };\n }\n\n return {\n created: util.unixTimestamp(),\n data: [{ url: videoResult, revised_prompt: prompt }],\n };\n }\n\n async getTask(\n taskId: string,\n options?: McpRequestOptions,\n query?: { type?: string; response_format?: string }\n ): Promise<any> {\n const type = query?.type === \"video\" ? \"video\" : query?.type === \"image\" ? \"image\" : undefined;\n const tokenCtx = await this.pickTaskToken(options, resolveTaskType(type));\n return getTaskResponse(taskId, tokenCtx.token, tokenCtx.regionInfo, {\n type,\n responseFormat: query?.response_format === \"b64_json\" ? \"b64_json\" : \"url\",\n });\n }\n\n async waitTask(\n taskId: string,\n body: Record<string, unknown>,\n options?: McpRequestOptions\n ): Promise<any> {\n const type = body.type === \"video\" ? \"video\" : body.type === \"image\" ? \"image\" : undefined;\n const tokenCtx = await this.pickTaskToken(options, resolveTaskType(type));\n return waitForTaskResponse(taskId, tokenCtx.token, tokenCtx.regionInfo, {\n type,\n responseFormat: body.response_format === \"b64_json\" ? \"b64_json\" : \"url\",\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n });\n }\n\n async generateVideoOmni(\n body: JsonObject,\n options?: McpRequestOptions,\n uploadFiles: MultipartUploadFile[] = []\n ): Promise<any> {\n const files: Record<string, any> = {};\n for (const file of uploadFiles) {\n files[file.fieldName] = {\n filepath: file.filePath,\n originalFilename: path.basename(file.filePath),\n };\n if (!fs.existsSync(file.filePath)) {\n throw new Error(`Local file not found: ${file.filePath}`);\n }\n }\n\n return this.generateVideo(\n {\n ...body,\n functionMode: \"omni_reference\",\n files,\n },\n options\n );\n }\n}\n","import axios from \"axios\";\r\n\r\nexport type McpToolErrorCode =\r\n | \"CONFIG_ERROR\"\r\n | \"VALIDATION_ERROR\"\r\n | \"AUTH_ERROR\"\r\n | \"NETWORK_ERROR\"\r\n | \"UPSTREAM_ERROR\"\r\n | \"INTERNAL_ERROR\";\r\n\r\nexport class McpToolError extends Error {\r\n code: McpToolErrorCode;\r\n details?: unknown;\r\n\r\n constructor(code: McpToolErrorCode, message: string, details?: unknown) {\r\n super(message);\r\n this.code = code;\r\n this.details = details;\r\n }\r\n}\r\n\r\nexport function normalizeToolError(error: unknown): McpToolError {\r\n if (error instanceof McpToolError) return error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n if (!error.response) {\r\n return new McpToolError(\r\n \"NETWORK_ERROR\",\r\n \"Failed to reach jimeng-cli service\",\r\n error.message\r\n );\r\n }\r\n\r\n const status = error.response.status;\r\n const message =\r\n String(error.response.data?.error?.message || error.response.data?.message || error.message);\r\n\r\n if (status === 401 || status === 403) {\r\n return new McpToolError(\"AUTH_ERROR\", message, error.response.data);\r\n }\r\n if (status >= 400 && status < 500) {\r\n return new McpToolError(\"VALIDATION_ERROR\", message, error.response.data);\r\n }\r\n if (status >= 500) {\r\n return new McpToolError(\"UPSTREAM_ERROR\", message, error.response.data);\r\n }\r\n }\r\n\r\n if (error instanceof Error) {\r\n return new McpToolError(\"INTERNAL_ERROR\", error.message);\r\n }\r\n\r\n return new McpToolError(\"INTERNAL_ERROR\", \"Unknown internal error\");\r\n}\r\n\r\nexport function formatToolError(error: unknown): string {\r\n const normalized = normalizeToolError(error);\r\n return `[${normalized.code}] ${normalized.message}`;\r\n}\r\n","import type { McpConfig } from \"./config.ts\";\r\nimport { McpToolError } from \"./errors.ts\";\r\n\r\nexport function assertRunConfirm(config: McpConfig, confirm?: string): void {\r\n if (!config.requireRunConfirm) return;\r\n if (confirm === \"RUN\") return;\r\n\r\n throw new McpToolError(\r\n \"VALIDATION_ERROR\",\r\n 'This tool requires explicit confirmation: set \"confirm\" to \"RUN\".'\r\n );\r\n}\r\n","import * as z from \"zod\";\r\n\r\nfunction buildIndexedUrlFields(prefix: \"image_file\" | \"video_file\", max: number) {\r\n return Object.fromEntries(\r\n Array.from({ length: max }, (_, index) => [\r\n `${prefix}_${index + 1}`,\r\n z.string().url().optional()\r\n ])\r\n );\r\n}\r\n\r\nfunction normalizeUniqueValues(values: string[]): string[] {\r\n return [...new Set(values.map((item) => item.trim()).filter(Boolean))];\r\n}\r\n\r\nexport const healthCheckInputSchema = z.object({});\r\n\r\nexport const listModelsInputSchema = z.object({\r\n token: z.string().optional()\r\n});\r\n\r\nexport const generateImageInputSchema = z.object({\n prompt: z.string().min(1),\n model: z.string().optional(),\n negative_prompt: z.string().optional(),\n ratio: z.string().optional(),\n resolution: z.string().optional(),\n intelligent_ratio: z.boolean().optional(),\n sample_strength: z.number().optional(),\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\n wait: z.boolean().optional(),\n wait_timeout_seconds: z.number().int().positive().optional(),\n poll_interval_ms: z.number().int().positive().optional(),\n token: z.string().optional(),\n confirm: z.string().optional()\n});\n\r\nexport const editImageInputSchema = z.object({\r\n prompt: z.string().min(1),\r\n images: z.array(z.string().url()).min(1).max(10),\r\n model: z.string().optional(),\r\n negative_prompt: z.string().optional(),\r\n ratio: z.string().optional(),\n resolution: z.string().optional(),\n intelligent_ratio: z.boolean().optional(),\n sample_strength: z.number().optional(),\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\n wait: z.boolean().optional(),\n wait_timeout_seconds: z.number().int().positive().optional(),\n poll_interval_ms: z.number().int().positive().optional(),\n token: z.string().optional(),\n confirm: z.string().optional()\n});\n\r\nexport const generateVideoInputSchema = z.object({\r\n prompt: z.string().min(1),\r\n model: z.string().optional(),\n ratio: z.string().optional(),\n resolution: z.string().optional(),\n duration: z.number().int().min(4).max(15).optional(),\n wait: z.boolean().optional(),\n wait_timeout_seconds: z.number().int().positive().optional(),\n poll_interval_ms: z.number().int().positive().optional(),\n token: z.string().optional(),\n confirm: z.string().optional()\n});\n\r\nexport const generateVideoOmniInputSchema = z\r\n .object({\r\n prompt: z.string().min(1),\r\n model: z.string().optional(),\r\n ratio: z.string().optional(),\n resolution: z.string().optional(),\n duration: z.number().int().min(4).max(15).optional(),\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\n wait: z.boolean().optional(),\n wait_timeout_seconds: z.number().int().positive().optional(),\n poll_interval_ms: z.number().int().positive().optional(),\n file_paths: z.array(z.string().url()).max(9).optional(),\r\n filePaths: z.array(z.string().url()).max(9).optional(),\r\n image_urls: z.array(z.string().url()).max(9).optional(),\r\n video_urls: z.array(z.string().url()).max(3).optional(),\r\n image_files: z.array(z.string()).max(9).optional(),\r\n video_files: z.array(z.string()).max(3).optional(),\r\n ...buildIndexedUrlFields(\"image_file\", 9),\r\n ...buildIndexedUrlFields(\"video_file\", 3),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\n })\n .superRefine((value, ctx) => {\r\n const imageSlotUrls = Array.from({ length: 9 }, (_, index) => value[`image_file_${index + 1}`]);\r\n const videoSlotUrls = Array.from({ length: 3 }, (_, index) => value[`video_file_${index + 1}`]);\r\n\r\n const imageCount =\r\n normalizeUniqueValues(value.image_urls || []).length +\r\n (value.image_files?.length || 0) +\r\n normalizeUniqueValues([...(value.file_paths || []), ...(value.filePaths || [])]).length +\r\n normalizeUniqueValues(imageSlotUrls.filter((item): item is string => typeof item === \"string\")).length;\r\n\r\n const videoCount =\r\n normalizeUniqueValues(value.video_urls || []).length +\r\n (value.video_files?.length || 0) +\r\n normalizeUniqueValues(videoSlotUrls.filter((item): item is string => typeof item === \"string\")).length;\r\n\r\n if (imageCount > 9) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 9 images.\"\r\n });\r\n }\r\n if (videoCount > 3) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 3 videos.\"\r\n });\r\n }\r\n if (imageCount + videoCount > 12) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 12 total materials.\"\r\n });\r\n }\r\n if (imageCount + videoCount === 0) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode requires at least one material.\"\r\n });\r\n }\r\n });\n\nexport const getTaskInputSchema = z.object({\n task_id: z.string().min(1),\n type: z.enum([\"image\", \"video\"]).optional(),\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\n token: z.string().optional()\n});\n\nexport const waitTaskInputSchema = z.object({\n task_id: z.string().min(1),\n type: z.enum([\"image\", \"video\"]).optional(),\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\n wait_timeout_seconds: z.number().int().positive().optional(),\n poll_interval_ms: z.number().int().positive().optional(),\n token: z.string().optional()\n});\n","import { formatToolError } from \"./errors.ts\";\r\nimport type { JsonObject } from \"./types.ts\";\r\n\r\nexport function toStructuredContent(data: unknown): JsonObject {\r\n if (data != null && typeof data === \"object\" && !Array.isArray(data)) {\r\n return data as JsonObject;\r\n }\r\n return { data };\r\n}\r\n\r\nexport function toToolResult(data: unknown) {\r\n return {\r\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\r\n structuredContent: toStructuredContent(data)\r\n };\r\n}\r\n\r\nexport async function withToolError<T>(fn: () => Promise<T>): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n throw new Error(formatToolError(error));\r\n }\r\n}\r\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type * as z from \"zod\";\n\r\nimport { toToolResult, withToolError } from \"./result.ts\";\r\n\r\ninterface RegisterToolOptions<TSchema extends z.ZodTypeAny> {\n title: string;\n description: string;\n inputSchema: TSchema;\n annotations?: Record<string, unknown>;\n}\n\nexport function registerSafeTool<TSchema extends z.ZodTypeAny>(\n server: McpServer,\n name: string,\n options: RegisterToolOptions<TSchema>,\n handler: (args: z.infer<TSchema>) => Promise<unknown>\n): void {\n const { title, description, inputSchema, annotations } = options;\n\r\n server.registerTool(\r\n name,\r\n {\r\n title,\r\n description,\r\n inputSchema,\r\n ...(annotations ? { annotations } : {})\r\n },\r\n (async (args: Record<string, unknown>) =>\n withToolError(async () => {\n const parsedArgs = inputSchema.parse(args) as z.infer<TSchema>;\n const result = await handler(parsedArgs);\n return toToolResult(result);\n })) as any\n );\n}\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { editImageInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerEditImageTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"edit_image\",\r\n {\r\n title: \"Edit Image\",\r\n description: \"Compose image from prompt and image URLs\",\r\n inputSchema: editImageInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.editImage(\r\n {\r\n prompt: args.prompt,\r\n images: args.images,\r\n model: args.model,\r\n negative_prompt: args.negative_prompt,\r\n ratio: args.ratio,\r\n resolution: args.resolution || \"1k\",\n intelligent_ratio: args.intelligent_ratio,\n sample_strength: args.sample_strength,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n );\n }\r\n );\r\n}\r\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateImageInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerGenerateImageTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_image\",\r\n {\r\n title: \"Generate Image\",\r\n description: \"Generate image from prompt\",\r\n inputSchema: generateImageInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.generateImage(\r\n {\r\n prompt: args.prompt,\r\n model: args.model,\r\n negative_prompt: args.negative_prompt,\r\n ratio: args.ratio,\r\n resolution: args.resolution || \"1k\",\n intelligent_ratio: args.intelligent_ratio,\n sample_strength: args.sample_strength,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n );\n }\r\n );\r\n}\r\n","import fs from \"node:fs\";\r\n\r\nimport { McpToolError } from \"../errors.ts\";\r\nimport type { JsonObject, MultipartUploadFile } from \"../types.ts\";\r\n\r\nexport const MAX_IMAGE_SLOTS = 9;\r\nexport const MAX_VIDEO_SLOTS = 3;\r\n\r\nexport type MaterialPrefix = \"image_file\" | \"video_file\";\r\nexport type MaterialLabel = \"image\" | \"video\";\r\n\r\nexport interface BaseVideoPayloadInput {\n prompt: string;\n model?: string;\n ratio?: string;\n resolution?: string;\n duration?: number;\n response_format?: \"url\" | \"b64_json\";\n wait?: boolean;\n wait_timeout_seconds?: number;\n poll_interval_ms?: number;\n}\n\r\nexport function buildBaseVideoPayload(\r\n args: BaseVideoPayloadInput,\r\n functionMode: \"first_last_frames\" | \"omni_reference\"\r\n): JsonObject {\r\n return {\r\n prompt: args.prompt,\r\n model: args.model,\r\n ratio: args.ratio,\r\n resolution: args.resolution,\n duration: args.duration ?? 5,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms,\n functionMode\n };\n}\n\r\nexport function uniqueStrings(values: string[]): string[] {\r\n return [...new Set(values.map((item) => item.trim()).filter(Boolean))];\r\n}\r\n\r\nexport function collectStringArray(values?: string[]): string[] {\r\n if (!Array.isArray(values)) return [];\r\n return values.filter((item): item is string => typeof item === \"string\");\r\n}\r\n\r\nexport function collectIndexedSlotUrls<TArgs extends Record<string, unknown>>(\r\n args: TArgs,\r\n prefix: MaterialPrefix,\r\n max: number\r\n): Map<number, string> {\r\n const values = new Map<number, string>();\r\n for (let i = 1; i <= max; i++) {\r\n const key = `${prefix}_${i}` as keyof TArgs;\r\n const slot = args[key];\r\n if (typeof slot === \"string\" && slot.length > 0) {\r\n values.set(i, slot);\r\n }\r\n }\r\n return values;\r\n}\r\n\r\nexport function assertLocalFilesExist(paths: string[]): void {\r\n for (const filePath of paths) {\r\n if (!fs.existsSync(filePath)) {\r\n throw new McpToolError(\"VALIDATION_ERROR\", `Local file not found: ${filePath}`);\r\n }\r\n }\r\n}\r\n\r\nexport function takeNextAvailableSlot(\r\n occupiedSlots: Set<number>,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): number {\r\n for (let i = 1; i <= maxSlots; i++) {\r\n if (!occupiedSlots.has(i)) {\r\n occupiedSlots.add(i);\r\n return i;\r\n }\r\n }\r\n throw new McpToolError(\r\n \"VALIDATION_ERROR\",\r\n `No available ${materialLabel} slot. Maximum supported: ${maxSlots}.`\r\n );\r\n}\r\n\r\nexport function appendUrlMaterials(\r\n body: JsonObject,\r\n occupiedSlots: Set<number>,\r\n urls: string[],\r\n prefix: MaterialPrefix,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): void {\r\n for (const url of urls) {\r\n const slot = takeNextAvailableSlot(occupiedSlots, maxSlots, materialLabel);\r\n body[`${prefix}_${slot}`] = url;\r\n }\r\n}\r\n\r\nexport function appendFileMaterials(\r\n uploadFiles: MultipartUploadFile[],\r\n occupiedSlots: Set<number>,\r\n filePaths: string[],\r\n prefix: MaterialPrefix,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): void {\r\n for (const filePath of filePaths) {\r\n const slot = takeNextAvailableSlot(occupiedSlots, maxSlots, materialLabel);\r\n uploadFiles.push({\r\n fieldName: `${prefix}_${slot}`,\r\n filePath\r\n });\r\n }\r\n}\r\n","import type { z } from \"zod\";\r\n\r\nimport { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateVideoOmniInputSchema } from \"../schemas.ts\";\r\nimport type { MultipartUploadFile, ToolDeps } from \"../types.ts\";\r\nimport type { JsonObject } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\nimport {\r\n appendFileMaterials,\r\n appendUrlMaterials,\r\n assertLocalFilesExist,\r\n buildBaseVideoPayload,\r\n collectIndexedSlotUrls,\r\n collectStringArray,\r\n MAX_IMAGE_SLOTS,\r\n MAX_VIDEO_SLOTS,\r\n uniqueStrings\r\n} from \"./video-utils.ts\";\r\n\r\ntype GenerateVideoOmniArgs = z.infer<typeof generateVideoOmniInputSchema>;\r\n\r\nfunction normalizeOmniPayload(args: GenerateVideoOmniArgs): {\r\n body: JsonObject;\r\n uploadFiles: MultipartUploadFile[];\r\n} {\r\n const imageSlotUrls = collectIndexedSlotUrls(args, \"image_file\", MAX_IMAGE_SLOTS);\r\n const videoSlotUrls = collectIndexedSlotUrls(args, \"video_file\", MAX_VIDEO_SLOTS);\r\n const imageUrls = uniqueStrings([\r\n ...collectStringArray(args.image_urls),\r\n ...collectStringArray(args.file_paths),\r\n ...collectStringArray(args.filePaths)\r\n ]);\r\n const videoUrls = uniqueStrings(collectStringArray(args.video_urls));\r\n const imageFiles = uniqueStrings(collectStringArray(args.image_files));\r\n const videoFiles = uniqueStrings(collectStringArray(args.video_files));\r\n\r\n assertLocalFilesExist(imageFiles);\r\n assertLocalFilesExist(videoFiles);\r\n\r\n const body: JsonObject = buildBaseVideoPayload(args, \"omni_reference\");\r\n\r\n for (const [slot, url] of imageSlotUrls) {\r\n body[`image_file_${slot}`] = url;\r\n }\r\n for (const [slot, url] of videoSlotUrls) {\r\n body[`video_file_${slot}`] = url;\r\n }\r\n\r\n const occupiedImageSlots = new Set<number>(imageSlotUrls.keys());\r\n const occupiedVideoSlots = new Set<number>(videoSlotUrls.keys());\r\n\r\n appendUrlMaterials(body, occupiedImageSlots, imageUrls, \"image_file\", MAX_IMAGE_SLOTS, \"image\");\r\n appendUrlMaterials(body, occupiedVideoSlots, videoUrls, \"video_file\", MAX_VIDEO_SLOTS, \"video\");\r\n\r\n const uploadFiles: MultipartUploadFile[] = [];\r\n appendFileMaterials(\r\n uploadFiles,\r\n occupiedImageSlots,\r\n imageFiles,\r\n \"image_file\",\r\n MAX_IMAGE_SLOTS,\r\n \"image\"\r\n );\r\n appendFileMaterials(\r\n uploadFiles,\r\n occupiedVideoSlots,\r\n videoFiles,\r\n \"video_file\",\r\n MAX_VIDEO_SLOTS,\r\n \"video\"\r\n );\r\n\r\n return { body, uploadFiles };\r\n}\r\n\r\nexport function registerGenerateVideoOmniTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_video_omni\",\r\n {\r\n title: \"Generate Video Omni\",\r\n description: \"Generate omni_reference video with URL and local-file materials\",\r\n inputSchema: generateVideoOmniInputSchema\r\n },\r\n async (args: GenerateVideoOmniArgs) => {\r\n assertRunConfirm(config, args.confirm);\r\n const { body, uploadFiles } = normalizeOmniPayload(args);\r\n return client.generateVideoOmni(body, { token: args.token }, uploadFiles);\r\n }\r\n );\r\n}\r\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateVideoInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\nimport { buildBaseVideoPayload } from \"./video-utils.ts\";\r\n\r\nexport function registerGenerateVideoTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_video_flf\",\r\n {\r\n title: \"Generate Video FLF\",\r\n description: \"Generate video for first_last_frames workflow only\",\r\n inputSchema: generateVideoInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.generateVideo(\r\n buildBaseVideoPayload(args, \"first_last_frames\"),\r\n { token: args.token }\r\n );\r\n }\r\n );\r\n}\r\n","import { getTaskInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerGetTaskTool({ server, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"get_task\",\n {\n title: \"Get Task\",\n description: \"Get image/video task status by task_id\",\n inputSchema: getTaskInputSchema,\n annotations: { readOnlyHint: true }\n },\n async (args) => client.getTask(\n args.task_id,\n { token: args.token },\n {\n type: args.type,\n response_format: args.response_format\n }\n )\n );\n}\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { healthCheckInputSchema } from \"../schemas.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerHealthCheckTool({ server, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"health_check\",\r\n {\r\n title: \"Health Check\",\r\n description: \"Check jimeng-cli health endpoint\",\r\n inputSchema: healthCheckInputSchema\r\n },\r\n async () => {\r\n const startedAt = Date.now();\r\n const raw = await client.healthCheck();\r\n return {\r\n ok: true,\r\n latencyMs: Date.now() - startedAt,\r\n raw\r\n };\r\n }\r\n );\r\n}\r\n","import { listModelsInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerListModelsTool({ server, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"list_models\",\r\n {\r\n title: \"List Models\",\r\n description: \"Get available models from jimeng-cli\",\r\n inputSchema: listModelsInputSchema,\r\n annotations: { readOnlyHint: true }\r\n },\r\n async ({ token }) => client.listModels({ token })\r\n );\r\n}\r\n","import { waitTaskInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerWaitTaskTool({ server, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"wait_task\",\n {\n title: \"Wait Task\",\n description: \"Wait for image/video task completion by task_id\",\n inputSchema: waitTaskInputSchema\n },\n async (args) => client.waitTask(\n args.task_id,\n {\n type: args.type,\n response_format: args.response_format,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n )\n );\n}\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { registerEditImageTool } from \"./edit-image.ts\";\r\nimport { registerGenerateImageTool } from \"./generate-image.ts\";\r\nimport { registerGenerateVideoOmniTool } from \"./generate-video-omni.ts\";\nimport { registerGenerateVideoTool } from \"./generate-video.ts\";\nimport { registerGetTaskTool } from \"./get-task.ts\";\nimport { registerHealthCheckTool } from \"./health-check.ts\";\nimport { registerListModelsTool } from \"./list-models.ts\";\nimport { registerWaitTaskTool } from \"./wait-task.ts\";\n\r\nexport interface McpToolManifestItem {\r\n id: string;\r\n isAdvanced?: boolean;\r\n register: (deps: ToolDeps) => void;\r\n}\r\n\r\nexport const MCP_TOOL_MANIFEST: McpToolManifestItem[] = [\r\n { id: \"health_check\", register: registerHealthCheckTool },\r\n { id: \"list_models\", register: registerListModelsTool },\n { id: \"get_task\", register: registerGetTaskTool },\n { id: \"wait_task\", register: registerWaitTaskTool },\n { id: \"generate_image\", register: registerGenerateImageTool },\n { id: \"edit_image\", isAdvanced: true, register: registerEditImageTool },\r\n { id: \"generate_video_flf\", isAdvanced: true, register: registerGenerateVideoTool },\r\n { id: \"generate_video_omni\", isAdvanced: true, register: registerGenerateVideoOmniTool }\r\n];\r\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { MCP_TOOL_MANIFEST } from \"./manifest.ts\";\r\n\r\nexport function registerMcpTools(deps: ToolDeps): void {\r\n for (const item of MCP_TOOL_MANIFEST) {\r\n if (item.isAdvanced && !deps.config.enableAdvancedTools) continue;\r\n item.register(deps);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,4BAA4B;;;ACArC,SAAS,aAAa,OAA2B,cAAgC;AAC/E,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,UAAU,EAAG,QAAO;AAC5D,MAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAC7D,SAAO;AACT;AAEA,SAAS,YAAY,OAA2B,cAA8B;AAC5E,MAAI,SAAS,KAAM,QAAO;AAC1B,QAAM,SAAS,OAAO,KAAK;AAC3B,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AASO,SAAS,gBAA2B;AArB3C;AAsBE,QAAM,YAAW,aAAQ,IAAI,qBAAZ,mBAA8B;AAC/C,SAAO;AAAA,IACL,UAAU,YAAY;AAAA,IACtB,eAAe,YAAY,QAAQ,IAAI,qBAAqB,IAAM;AAAA,IAClE,qBAAqB,aAAa,QAAQ,IAAI,2BAA2B,IAAI;AAAA,IAC7E,mBAAmB,aAAa,QAAQ,IAAI,yBAAyB,IAAI;AAAA,EAC3E;AACF;;;AC7BA,SAAS,iBAAiB;;;ACA1B,OAAO,QAAQ;AACf,OAAO,UAAU;AAkBjB,SAAS,gBAAgB,OAAmC;AAC1D,SAAO,UAAU,UAAU,UAAU;AACvC;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACT,iBAAiB;AAAA,EAEzB,YAAY,QAAmB;AAC7B,SAAK,eAAe,OAAO;AAAA,EAC7B;AAAA,EAEQ,aAAa,SAAiD;AACpE,YAAO,mCAAS,UAAS,KAAK;AAAA,EAChC;AAAA,EAEA,MAAc,uBAAsC;AAClD,QAAI,KAAK,eAAgB;AACzB,UAAM,qBAAU,KAAK;AACrB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAc,eACZ,gBACA,UACA,SACA,yBAAmC,CAAC,GACS;AAC7C,UAAM,KAAK,qBAAqB;AAChC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,UAAM,YAAY,qBAAU,oBAAoB;AAAA,MAC9C,eAAe,QAAQ,UAAU,KAAK,KAAK;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU,SAAS,CAAC,UAAU,QAAQ;AACzC,YAAM,IAAI,MAAM,UAAU,UAAU,2CAA2C;AAAA,IACjF;AAEA,WAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,YAAY,gBAAgB,UAAU,MAAM;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAc,cACZ,SACA,OAA0B,SACmB;AAC7C,UAAM,KAAK,qBAAqB;AAChC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,OAAO;AACT,YAAM,QAAQ,qBAAU,cAAc,KAAK;AAC3C,UAAI,EAAC,+BAAO,SAAQ;AAClB,cAAM,IAAI,MAAM,qEAAqE;AAAA,MACvF;AACA,aAAO,EAAE,OAAO,YAAY,gBAAgB,MAAM,MAAM,EAAE;AAAA,IAC5D;AAEA,UAAM,aAAa,qBAChB,WAAW,KAAK,EAChB,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK,SAAS,SAAS,KAAK,MAAM,EACnE,OAAO,CAAC,SAAS;AAnFxB;AAoFQ,YAAM,YAAY,SAAS,UAAU,UAAU;AAC/C,aAAO,GAAC,UAAK,kBAAL,mBAAoB,WAAU,KAAK,cAAc,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS,CAAC;AAAA,IAC5F,CAAC;AACH,QAAI,WAAW,WAAW,GAAG;AAC3B,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AACA,WAAO,EAAE,OAAO,WAAW,CAAC,EAAE,OAAO,YAAY,gBAAgB,WAAW,CAAC,EAAE,MAAoB,EAAE;AAAA,EACvG;AAAA,EAEA,MAAM,cAA4B;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,SAA2C;AAjG9D;AAkGI,UAAM,KAAK,qBAAqB;AAChC,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,UAAM,gBAAgB,QAAQ,UAAU,KAAK,KAAK;AAClD,UAAM,SAAS,SAAQ,0BAAU,cAAc,KAAK,MAA7B,mBAAgC,SAAS;AAChE,UAAM,SAAS,MAAM,cAAc,eAAe,MAAM;AACxD,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAA+B,SAA2C;AAC5F,UAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,IACvE,KAAK,QACL;AACJ,UAAM,SAAS,OAAO,KAAK,UAAU,EAAE;AACvC,UAAM,WAAW,MAAM,KAAK,eAAe,OAAO,SAAS,OAAO;AAElE,UAAM,iBAAiB,KAAK,oBAAoB,aAAa,aAAa;AAC1E,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,gBAAgB,KAAK;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,kBAAkB,KAAK;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,oBAAoB,KAAK;AAAA,QACzB,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAEA,QAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,mBAAmB,cAC3B,MAAM,QAAQ,IAAI,YAAY,IAAI,CAAC,QAAQ,aAAK,gBAAgB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,IACzG,YAAY,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;AAEtC,WAAO;AAAA,MACL,SAAS,aAAK,cAAc;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,MAA+B,SAA2C;AACxF,UAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,IACvE,KAAK,QACL;AACJ,UAAM,SAAS,OAAO,KAAK,UAAU,EAAE;AACvC,UAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IACpC,KAAK,OAAO,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,IACrE,CAAC;AACL,UAAM,WAAW,MAAM,KAAK,eAAe,OAAO,SAAS,OAAO;AAElE,UAAM,iBAAiB,KAAK,oBAAoB,aAAa,aAAa;AAC1E,UAAM,oBAAoB,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,gBAAgB,KAAK;AAAA,QACrB,gBAAgB,KAAK;AAAA,QACrB,kBAAkB,KAAK;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,oBAAoB,KAAK;AAAA,QACzB,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAEA,QAAI,CAAC,MAAM,QAAQ,iBAAiB,GAAG;AACrC,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,mBAAmB,cAC3B,MAAM,QAAQ,IAAI,kBAAkB,IAAI,CAAC,QAAQ,aAAK,gBAAgB,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,IAC/G,kBAAkB,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;AAE5C,WAAO;AAAA,MACL,SAAS,aAAK,cAAc;AAAA,MAC5B;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,MAA+B,SAA2C;AAC5F,UAAM,QAAQ,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,KAAK,EAAE,SAAS,IACvE,KAAK,QACL;AACJ,UAAM,SAAS,OAAO,KAAK,UAAU,EAAE;AAEvC,UAAM,eAAe,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;AACjF,UAAM,eAAe,iBAAiB,mBAAmB,CAAC,gBAAgB,IAAI,CAAC;AAC/E,UAAM,WAAW,MAAM,KAAK,eAAe,OAAO,SAAS,SAAS,YAAY;AAEhF,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,UAAU,KAAK;AAAA,QACf,WAAY,KAAK,aAAa,KAAK;AAAA,QACnC,OAAO,KAAK;AAAA,QACZ,aAAa,EAAE,KAAK;AAAA,QACpB;AAAA,QACA,MAAM,KAAK;AAAA,QACX,oBAAoB,KAAK;AAAA,QACzB,gBAAgB,KAAK;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAEA,QAAI,OAAO,gBAAgB,UAAU;AACnC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,oBAAoB,YAAY;AACvC,YAAM,cAAc,MAAM,aAAK,gBAAgB,WAAW;AAC1D,aAAO;AAAA,QACL,SAAS,aAAK,cAAc;AAAA,QAC5B,MAAM,CAAC,EAAE,UAAU,aAAa,gBAAgB,OAAO,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,aAAK,cAAc;AAAA,MAC5B,MAAM,CAAC,EAAE,KAAK,aAAa,gBAAgB,OAAO,CAAC;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,QACA,SACA,OACc;AACd,UAAM,QAAO,+BAAO,UAAS,UAAU,WAAU,+BAAO,UAAS,UAAU,UAAU;AACrF,UAAM,WAAW,MAAM,KAAK,cAAc,SAAS,gBAAgB,IAAI,CAAC;AACxE,WAAO,gBAAgB,QAAQ,SAAS,OAAO,SAAS,YAAY;AAAA,MAClE;AAAA,MACA,iBAAgB,+BAAO,qBAAoB,aAAa,aAAa;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,SACJ,QACA,MACA,SACc;AACd,UAAM,OAAO,KAAK,SAAS,UAAU,UAAU,KAAK,SAAS,UAAU,UAAU;AACjF,UAAM,WAAW,MAAM,KAAK,cAAc,SAAS,gBAAgB,IAAI,CAAC;AACxE,WAAO,oBAAoB,QAAQ,SAAS,OAAO,SAAS,YAAY;AAAA,MACtE;AAAA,MACA,gBAAgB,KAAK,oBAAoB,aAAa,aAAa;AAAA,MACnE,oBAAoB,KAAK;AAAA,MACzB,gBAAgB,KAAK;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,kBACJ,MACA,SACA,cAAqC,CAAC,GACxB;AACd,UAAM,QAA6B,CAAC;AACpC,eAAW,QAAQ,aAAa;AAC9B,YAAM,KAAK,SAAS,IAAI;AAAA,QACtB,UAAU,KAAK;AAAA,QACf,kBAAkB,KAAK,SAAS,KAAK,QAAQ;AAAA,MAC/C;AACA,UAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,GAAG;AACjC,cAAM,IAAI,MAAM,yBAAyB,KAAK,QAAQ,EAAE;AAAA,MAC1D;AAAA,IACF;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,QACE,GAAG;AAAA,QACH,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACrSA,OAAO,WAAW;AAUX,IAAM,eAAN,cAA2B,MAAM;AAAA,EACtC;AAAA,EACA;AAAA,EAEA,YAAY,MAAwB,SAAiB,SAAmB;AACtE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB,OAA8B;AArBjE;AAsBE,MAAI,iBAAiB,aAAc,QAAO;AAE1C,MAAI,MAAM,aAAa,KAAK,GAAG;AAC7B,QAAI,CAAC,MAAM,UAAU;AACnB,aAAO,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,SAAS;AAC9B,UAAM,UACJ,SAAO,iBAAM,SAAS,SAAf,mBAAqB,UAArB,mBAA4B,cAAW,WAAM,SAAS,SAAf,mBAAqB,YAAW,MAAM,OAAO;AAE7F,QAAI,WAAW,OAAO,WAAW,KAAK;AACpC,aAAO,IAAI,aAAa,cAAc,SAAS,MAAM,SAAS,IAAI;AAAA,IACpE;AACA,QAAI,UAAU,OAAO,SAAS,KAAK;AACjC,aAAO,IAAI,aAAa,oBAAoB,SAAS,MAAM,SAAS,IAAI;AAAA,IAC1E;AACA,QAAI,UAAU,KAAK;AACjB,aAAO,IAAI,aAAa,kBAAkB,SAAS,MAAM,SAAS,IAAI;AAAA,IACxE;AAAA,EACF;AAEA,MAAI,iBAAiB,OAAO;AAC1B,WAAO,IAAI,aAAa,kBAAkB,MAAM,OAAO;AAAA,EACzD;AAEA,SAAO,IAAI,aAAa,kBAAkB,wBAAwB;AACpE;AAEO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,aAAa,mBAAmB,KAAK;AAC3C,SAAO,IAAI,WAAW,IAAI,KAAK,WAAW,OAAO;AACnD;;;ACvDO,SAAS,iBAAiB,QAAmB,SAAwB;AAC1E,MAAI,CAAC,OAAO,kBAAmB;AAC/B,MAAI,YAAY,MAAO;AAEvB,QAAM,IAAI;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;ACXA,YAAY,OAAO;AAEnB,SAAS,sBAAsB,QAAqC,KAAa;AAC/E,SAAO,OAAO;AAAA,IACZ,MAAM,KAAK,EAAE,QAAQ,IAAI,GAAG,CAAC,GAAG,UAAU;AAAA,MACxC,GAAG,MAAM,IAAI,QAAQ,CAAC;AAAA,MACpB,SAAO,EAAE,IAAI,EAAE,SAAS;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;AAEA,SAAS,sBAAsB,QAA4B;AACzD,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACvE;AAEO,IAAM,yBAA2B,SAAO,CAAC,CAAC;AAE1C,IAAM,wBAA0B,SAAO;AAAA,EAC5C,OAAS,SAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,2BAA6B,SAAO;AAAA,EAC/C,QAAU,SAAO,EAAE,IAAI,CAAC;AAAA,EACxB,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,iBAAmB,SAAO,EAAE,SAAS;AAAA,EACrC,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,YAAc,SAAO,EAAE,SAAS;AAAA,EAChC,mBAAqB,UAAQ,EAAE,SAAS;AAAA,EACxC,iBAAmB,SAAO,EAAE,SAAS;AAAA,EACrC,iBAAmB,OAAK,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,MAAQ,UAAQ,EAAE,SAAS;AAAA,EAC3B,sBAAwB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,kBAAoB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,SAAW,SAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,uBAAyB,SAAO;AAAA,EAC3C,QAAU,SAAO,EAAE,IAAI,CAAC;AAAA,EACxB,QAAU,QAAQ,SAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE;AAAA,EAC/C,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,iBAAmB,SAAO,EAAE,SAAS;AAAA,EACrC,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,YAAc,SAAO,EAAE,SAAS;AAAA,EAChC,mBAAqB,UAAQ,EAAE,SAAS;AAAA,EACxC,iBAAmB,SAAO,EAAE,SAAS;AAAA,EACrC,iBAAmB,OAAK,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,MAAQ,UAAQ,EAAE,SAAS;AAAA,EAC3B,sBAAwB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,kBAAoB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,SAAW,SAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,2BAA6B,SAAO;AAAA,EAC/C,QAAU,SAAO,EAAE,IAAI,CAAC;AAAA,EACxB,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,YAAc,SAAO,EAAE,SAAS;AAAA,EAChC,UAAY,SAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACnD,MAAQ,UAAQ,EAAE,SAAS;AAAA,EAC3B,sBAAwB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,kBAAoB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,SAAW,SAAO,EAAE,SAAS;AAC/B,CAAC;AAEM,IAAM,+BACV,SAAO;AAAA,EACN,QAAU,SAAO,EAAE,IAAI,CAAC;AAAA,EACxB,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,YAAc,SAAO,EAAE,SAAS;AAAA,EAChC,UAAY,SAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,EACnD,iBAAmB,OAAK,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,MAAQ,UAAQ,EAAE,SAAS;AAAA,EAC3B,sBAAwB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,kBAAoB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,YAAc,QAAQ,SAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACtD,WAAa,QAAQ,SAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACrD,YAAc,QAAQ,SAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACtD,YAAc,QAAQ,SAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACtD,aAAe,QAAQ,SAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjD,aAAe,QAAQ,SAAO,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjD,GAAG,sBAAsB,cAAc,CAAC;AAAA,EACxC,GAAG,sBAAsB,cAAc,CAAC;AAAA,EACxC,OAAS,SAAO,EAAE,SAAS;AAAA,EAC3B,SAAW,SAAO,EAAE,SAAS;AAC/B,CAAC,EACA,YAAY,CAAC,OAAO,QAAQ;AAzF/B;AA0FI,QAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,UAAU,MAAM,cAAc,QAAQ,CAAC,EAAE,CAAC;AAC9F,QAAM,gBAAgB,MAAM,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,GAAG,UAAU,MAAM,cAAc,QAAQ,CAAC,EAAE,CAAC;AAE9F,QAAM,aACJ,sBAAsB,MAAM,cAAc,CAAC,CAAC,EAAE,YAC7C,WAAM,gBAAN,mBAAmB,WAAU,KAC9B,sBAAsB,CAAC,GAAI,MAAM,cAAc,CAAC,GAAI,GAAI,MAAM,aAAa,CAAC,CAAE,CAAC,EAAE,SACjF,sBAAsB,cAAc,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,CAAC,EAAE;AAElG,QAAM,aACJ,sBAAsB,MAAM,cAAc,CAAC,CAAC,EAAE,YAC7C,WAAM,gBAAN,mBAAmB,WAAU,KAC9B,sBAAsB,cAAc,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,CAAC,EAAE;AAElG,MAAI,aAAa,GAAG;AAClB,QAAI,SAAS;AAAA,MACX,MAAQ,eAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,aAAa,GAAG;AAClB,QAAI,SAAS;AAAA,MACX,MAAQ,eAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,aAAa,aAAa,IAAI;AAChC,QAAI,SAAS;AAAA,MACX,MAAQ,eAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,aAAa,eAAe,GAAG;AACjC,QAAI,SAAS;AAAA,MACX,MAAQ,eAAa;AAAA,MACrB,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF,CAAC;AAEI,IAAM,qBAAuB,SAAO;AAAA,EACzC,SAAW,SAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAQ,OAAK,CAAC,SAAS,OAAO,CAAC,EAAE,SAAS;AAAA,EAC1C,iBAAmB,OAAK,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,OAAS,SAAO,EAAE,SAAS;AAC7B,CAAC;AAEM,IAAM,sBAAwB,SAAO;AAAA,EAC1C,SAAW,SAAO,EAAE,IAAI,CAAC;AAAA,EACzB,MAAQ,OAAK,CAAC,SAAS,OAAO,CAAC,EAAE,SAAS;AAAA,EAC1C,iBAAmB,OAAK,CAAC,OAAO,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,sBAAwB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3D,kBAAoB,SAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACvD,OAAS,SAAO,EAAE,SAAS;AAC7B,CAAC;;;AC7IM,SAAS,oBAAoB,MAA2B;AAC7D,MAAI,QAAQ,QAAQ,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,GAAG;AACpE,WAAO;AAAA,EACT;AACA,SAAO,EAAE,KAAK;AAChB;AAEO,SAAS,aAAa,MAAe;AAC1C,SAAO;AAAA,IACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,IACxE,mBAAmB,oBAAoB,IAAI;AAAA,EAC7C;AACF;AAEA,eAAsB,cAAiB,IAAkC;AACvE,MAAI;AACF,WAAO,MAAM,GAAG;AAAA,EAClB,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,gBAAgB,KAAK,CAAC;AAAA,EACxC;AACF;;;ACXO,SAAS,iBACd,QACA,MACA,SACA,SACM;AACN,QAAM,EAAE,OAAO,aAAa,aAAa,YAAY,IAAI;AAEzD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,IACvC;AAAA,KACC,OAAO,SACN,cAAc,YAAY;AACxB,YAAM,aAAa,YAAY,MAAM,IAAI;AACzC,YAAM,SAAS,MAAM,QAAQ,UAAU;AACvC,aAAO,aAAa,MAAM;AAAA,IAC5B,CAAC;AAAA,EACL;AACF;;;AC9BO,SAAS,sBAAsB,EAAE,QAAQ,QAAQ,OAAO,GAAmB;AAChF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,uBAAiB,QAAQ,KAAK,OAAO;AAErC,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,QAAQ,KAAK;AAAA,UACb,QAAQ,KAAK;AAAA,UACb,OAAO,KAAK;AAAA,UACZ,iBAAiB,KAAK;AAAA,UACtB,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK,cAAc;AAAA,UAC/B,mBAAmB,KAAK;AAAA,UACxB,iBAAiB,KAAK;AAAA,UACtB,iBAAiB,KAAK;AAAA,UACtB,MAAM,KAAK;AAAA,UACX,sBAAsB,KAAK;AAAA,UAC3B,kBAAkB,KAAK;AAAA,QACzB;AAAA,QACA,EAAE,OAAO,KAAK,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;AC/BO,SAAS,0BAA0B,EAAE,QAAQ,QAAQ,OAAO,GAAmB;AACpF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,uBAAiB,QAAQ,KAAK,OAAO;AAErC,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,QAAQ,KAAK;AAAA,UACb,OAAO,KAAK;AAAA,UACZ,iBAAiB,KAAK;AAAA,UACtB,OAAO,KAAK;AAAA,UACZ,YAAY,KAAK,cAAc;AAAA,UAC/B,mBAAmB,KAAK;AAAA,UACxB,iBAAiB,KAAK;AAAA,UACtB,iBAAiB,KAAK;AAAA,UACtB,MAAM,KAAK;AAAA,UACX,sBAAsB,KAAK;AAAA,UAC3B,kBAAkB,KAAK;AAAA,QACzB;AAAA,QACA,EAAE,OAAO,KAAK,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACnCA,OAAOA,SAAQ;AAKR,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AAiBxB,SAAS,sBACd,MACA,cACY;AACZ,SAAO;AAAA,IACL,QAAQ,KAAK;AAAA,IACb,OAAO,KAAK;AAAA,IACZ,OAAO,KAAK;AAAA,IACZ,YAAY,KAAK;AAAA,IACjB,UAAU,KAAK,YAAY;AAAA,IAC3B,iBAAiB,KAAK;AAAA,IACtB,MAAM,KAAK;AAAA,IACX,sBAAsB,KAAK;AAAA,IAC3B,kBAAkB,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAEO,SAAS,cAAc,QAA4B;AACxD,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AACvE;AAEO,SAAS,mBAAmB,QAA6B;AAC9D,MAAI,CAAC,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AACpC,SAAO,OAAO,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ;AACzE;AAEO,SAAS,uBACd,MACA,QACA,KACqB;AACrB,QAAM,SAAS,oBAAI,IAAoB;AACvC,WAAS,IAAI,GAAG,KAAK,KAAK,KAAK;AAC7B,UAAM,MAAM,GAAG,MAAM,IAAI,CAAC;AAC1B,UAAM,OAAO,KAAK,GAAG;AACrB,QAAI,OAAO,SAAS,YAAY,KAAK,SAAS,GAAG;AAC/C,aAAO,IAAI,GAAG,IAAI;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAuB;AAC3D,aAAW,YAAY,OAAO;AAC5B,QAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,YAAM,IAAI,aAAa,oBAAoB,yBAAyB,QAAQ,EAAE;AAAA,IAChF;AAAA,EACF;AACF;AAEO,SAAS,sBACd,eACA,UACA,eACQ;AACR,WAAS,IAAI,GAAG,KAAK,UAAU,KAAK;AAClC,QAAI,CAAC,cAAc,IAAI,CAAC,GAAG;AACzB,oBAAc,IAAI,CAAC;AACnB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR;AAAA,IACA,gBAAgB,aAAa,6BAA6B,QAAQ;AAAA,EACpE;AACF;AAEO,SAAS,mBACd,MACA,eACA,MACA,QACA,UACA,eACM;AACN,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,sBAAsB,eAAe,UAAU,aAAa;AACzE,SAAK,GAAG,MAAM,IAAI,IAAI,EAAE,IAAI;AAAA,EAC9B;AACF;AAEO,SAAS,oBACd,aACA,eACA,WACA,QACA,UACA,eACM;AACN,aAAW,YAAY,WAAW;AAChC,UAAM,OAAO,sBAAsB,eAAe,UAAU,aAAa;AACzE,gBAAY,KAAK;AAAA,MACf,WAAW,GAAG,MAAM,IAAI,IAAI;AAAA,MAC5B;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACnGA,SAAS,qBAAqB,MAG5B;AACA,QAAM,gBAAgB,uBAAuB,MAAM,cAAc,eAAe;AAChF,QAAM,gBAAgB,uBAAuB,MAAM,cAAc,eAAe;AAChF,QAAM,YAAY,cAAc;AAAA,IAC9B,GAAG,mBAAmB,KAAK,UAAU;AAAA,IACrC,GAAG,mBAAmB,KAAK,UAAU;AAAA,IACrC,GAAG,mBAAmB,KAAK,SAAS;AAAA,EACtC,CAAC;AACD,QAAM,YAAY,cAAc,mBAAmB,KAAK,UAAU,CAAC;AACnE,QAAM,aAAa,cAAc,mBAAmB,KAAK,WAAW,CAAC;AACrE,QAAM,aAAa,cAAc,mBAAmB,KAAK,WAAW,CAAC;AAErE,wBAAsB,UAAU;AAChC,wBAAsB,UAAU;AAEhC,QAAM,OAAmB,sBAAsB,MAAM,gBAAgB;AAErE,aAAW,CAAC,MAAM,GAAG,KAAK,eAAe;AACvC,SAAK,cAAc,IAAI,EAAE,IAAI;AAAA,EAC/B;AACA,aAAW,CAAC,MAAM,GAAG,KAAK,eAAe;AACvC,SAAK,cAAc,IAAI,EAAE,IAAI;AAAA,EAC/B;AAEA,QAAM,qBAAqB,IAAI,IAAY,cAAc,KAAK,CAAC;AAC/D,QAAM,qBAAqB,IAAI,IAAY,cAAc,KAAK,CAAC;AAE/D,qBAAmB,MAAM,oBAAoB,WAAW,cAAc,iBAAiB,OAAO;AAC9F,qBAAmB,MAAM,oBAAoB,WAAW,cAAc,iBAAiB,OAAO;AAE9F,QAAM,cAAqC,CAAC;AAC5C;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,YAAY;AAC7B;AAEO,SAAS,8BAA8B,EAAE,QAAQ,QAAQ,OAAO,GAAmB;AACxF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAgC;AACrC,uBAAiB,QAAQ,KAAK,OAAO;AACrC,YAAM,EAAE,MAAM,YAAY,IAAI,qBAAqB,IAAI;AACvD,aAAO,OAAO,kBAAkB,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,WAAW;AAAA,IAC1E;AAAA,EACF;AACF;;;ACpFO,SAAS,0BAA0B,EAAE,QAAQ,QAAQ,OAAO,GAAmB;AACpF;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS;AACd,uBAAiB,QAAQ,KAAK,OAAO;AAErC,aAAO,OAAO;AAAA,QACZ,sBAAsB,MAAM,mBAAmB;AAAA,QAC/C,EAAE,OAAO,KAAK,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACpBO,SAAS,oBAAoB,EAAE,QAAQ,OAAO,GAAmB;AACtE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,SAAS,OAAO;AAAA,MACrB,KAAK;AAAA,MACL,EAAE,OAAO,KAAK,MAAM;AAAA,MACpB;AAAA,QACE,MAAM,KAAK;AAAA,QACX,iBAAiB,KAAK;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AACF;;;ACnBO,SAAS,wBAAwB,EAAE,QAAQ,OAAO,GAAmB;AAC1E;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,YAAY;AACV,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,MAAM,MAAM,OAAO,YAAY;AACrC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACnBO,SAAS,uBAAuB,EAAE,QAAQ,OAAO,GAAmB;AACzE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,MAAM,MAAM,OAAO,WAAW,EAAE,MAAM,CAAC;AAAA,EAClD;AACF;;;ACZO,SAAS,qBAAqB,EAAE,QAAQ,OAAO,GAAmB;AACvE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,IACA,OAAO,SAAS,OAAO;AAAA,MACrB,KAAK;AAAA,MACL;AAAA,QACE,MAAM,KAAK;AAAA,QACX,iBAAiB,KAAK;AAAA,QACtB,sBAAsB,KAAK;AAAA,QAC3B,kBAAkB,KAAK;AAAA,MACzB;AAAA,MACA,EAAE,OAAO,KAAK,MAAM;AAAA,IACtB;AAAA,EACF;AACF;;;ACRO,IAAM,oBAA2C;AAAA,EACtD,EAAE,IAAI,gBAAgB,UAAU,wBAAwB;AAAA,EACxD,EAAE,IAAI,eAAe,UAAU,uBAAuB;AAAA,EACtD,EAAE,IAAI,YAAY,UAAU,oBAAoB;AAAA,EAChD,EAAE,IAAI,aAAa,UAAU,qBAAqB;AAAA,EAClD,EAAE,IAAI,kBAAkB,UAAU,0BAA0B;AAAA,EAC5D,EAAE,IAAI,cAAc,YAAY,MAAM,UAAU,sBAAsB;AAAA,EACtE,EAAE,IAAI,sBAAsB,YAAY,MAAM,UAAU,0BAA0B;AAAA,EAClF,EAAE,IAAI,uBAAuB,YAAY,MAAM,UAAU,8BAA8B;AACzF;;;ACtBO,SAAS,iBAAiB,MAAsB;AACrD,aAAW,QAAQ,mBAAmB;AACpC,QAAI,KAAK,cAAc,CAAC,KAAK,OAAO,oBAAqB;AACzD,SAAK,SAAS,IAAI;AAAA,EACpB;AACF;;;AjBDO,SAAS,sBAAsB,QAA8B;AAClE,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS,oBAAY,QAAQ,WAAW;AAAA,EAC1C,CAAC;AAED,QAAM,SAAS,IAAI,gBAAgB,MAAM;AACzC,mBAAiB,EAAE,QAAQ,QAAQ,OAAO,CAAC;AAE3C,SAAO;AACT;;;AFZA,eAAe,OAAO;AACpB,QAAM,SAAS,cAAc;AAC7B,QAAM,SAAS,sBAAsB,MAAM;AAC3C,QAAM,YAAY,IAAI,qBAAqB;AAE3C,UAAQ,GAAG,UAAU,YAAY;AAC/B,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,UAAQ,GAAG,WAAW,YAAY;AAChC,UAAM,OAAO,MAAM;AACnB,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AAED,QAAM,OAAO,QAAQ,SAAS;AAC9B,UAAQ,MAAM,oDAAoD;AACpE;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,gDAAgD,KAAK;AACnE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["fs","fs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/mcp/index.ts","../../src/mcp/config.ts","../../src/mcp/server.ts","../../src/mcp/client.ts","../../src/mcp/errors.ts","../../src/mcp/guards.ts","../../src/mcp/schemas.ts","../../src/mcp/result.ts","../../src/mcp/tool-factory.ts","../../src/mcp/tools/edit-image.ts","../../src/mcp/tools/generate-image.ts","../../src/mcp/tools/video-utils.ts","../../src/mcp/tools/generate-video-omni.ts","../../src/mcp/tools/generate-video.ts","../../src/mcp/tools/get-task.ts","../../src/mcp/tools/health-check.ts","../../src/mcp/tools/list-models.ts","../../src/mcp/tools/list-tasks.ts","../../src/mcp/tools/upscale-image.ts","../../src/mcp/tools/wait-task.ts","../../src/mcp/tools/manifest.ts","../../src/mcp/tools/index.ts"],"sourcesContent":["import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\r\n\r\nimport { loadMcpConfig } from \"./config.ts\";\r\nimport { createJimengMcpServer } from \"./server.ts\";\r\n\r\nasync function main() {\r\n const config = loadMcpConfig();\r\n const server = createJimengMcpServer(config);\r\n const transport = new StdioServerTransport();\r\n\r\n process.on(\"SIGINT\", async () => {\r\n await server.close();\r\n process.exit(0);\r\n });\r\n\r\n process.on(\"SIGTERM\", async () => {\r\n await server.close();\r\n process.exit(0);\r\n });\r\n\r\n await server.connect(transport);\r\n console.error(\"[jimeng-cli-mcp] Server started on stdio transport\");\r\n}\r\n\r\nmain().catch((error) => {\r\n console.error(\"[jimeng-cli-mcp] Failed to start MCP server:\", error);\r\n process.exit(1);\r\n});\r\n","function parseBoolean(value: string | undefined, defaultValue: boolean): boolean {\r\n if (value == null) return defaultValue;\r\n const normalized = value.trim().toLowerCase();\r\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) return true;\r\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) return false;\r\n return defaultValue;\r\n}\r\n\r\nfunction parseNumber(value: string | undefined, defaultValue: number): number {\r\n if (value == null) return defaultValue;\r\n const parsed = Number(value);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : defaultValue;\r\n}\r\n\r\nexport interface McpConfig {\n apiToken?: string;\n httpTimeoutMs: number;\n enableAdvancedTools: boolean;\n requireRunConfirm: boolean;\n}\n\nexport function loadMcpConfig(): McpConfig {\n const apiToken = process.env.JIMENG_API_TOKEN?.trim();\n return {\n apiToken: apiToken || undefined,\n httpTimeoutMs: parseNumber(process.env.MCP_HTTP_TIMEOUT_MS, 120000),\n enableAdvancedTools: parseBoolean(process.env.MCP_ENABLE_ADVANCED_TOOLS, true),\r\n requireRunConfirm: parseBoolean(process.env.MCP_REQUIRE_RUN_CONFIRM, true)\r\n };\r\n}\r\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\r\n\r\nimport environment from \"@/lib/environment.ts\";\r\nimport type { McpConfig } from \"./config.ts\";\r\nimport { JimengApiClient } from \"./client.ts\";\r\nimport { registerMcpTools } from \"./tools/index.ts\";\r\n\r\nexport function createJimengMcpServer(config: McpConfig): McpServer {\r\n const server = new McpServer({\r\n name: \"jimeng-cli-mcp\",\r\n version: environment.package.version || \"1.0.0\"\r\n });\r\n\r\n const client = new JimengApiClient(config);\r\n registerMcpTools({ server, config, client });\r\n\r\n return server;\r\n}\r\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { DEFAULT_IMAGE_MODEL } from \"@/api/consts/common.ts\";\nimport { buildRegionInfo, type RegionCode } from \"@/api/controllers/core.ts\";\nimport { generateImageComposition, generateImages, upscaleImage } from \"@/api/controllers/images.ts\";\nimport { getLiveModels } from \"@/api/controllers/models.ts\";\nimport { getTaskResponse, waitForTaskResponse, getAssetList } from \"@/api/controllers/tasks.ts\";\nimport { DEFAULT_MODEL as DEFAULT_VIDEO_MODEL, generateVideo } from \"@/api/controllers/videos.ts\";\nimport tokenPool from \"@/lib/session-pool.ts\";\nimport util from \"@/lib/util.ts\";\n\nimport type { McpConfig } from \"./config.ts\";\nimport type { JsonObject, MultipartUploadFile } from \"./types.ts\";\n\nexport interface McpRequestOptions {\n token?: string;\n}\n\nfunction resolveTaskType(value: unknown): \"image\" | \"video\" {\n return value === \"video\" ? \"video\" : \"image\";\n}\n\nexport class JimengApiClient {\n private readonly defaultToken?: string;\n private tokenPoolReady = false;\n\n constructor(config: McpConfig) {\n this.defaultToken = config.apiToken;\n }\n\n private resolveToken(options?: McpRequestOptions): string | undefined {\n return options?.token || this.defaultToken;\n }\n\n private async ensureTokenPoolReady(): Promise<void> {\n if (this.tokenPoolReady) return;\n await tokenPool.init();\n this.tokenPoolReady = true;\n }\n\n private async pickModelToken(\n requestedModel: string,\n taskType: \"image\" | \"video\",\n options?: McpRequestOptions,\n requiredCapabilityTags: string[] = []\n ): Promise<{ token: string; regionInfo: any }> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n const tokenPick = tokenPool.pickTokenForRequest({\n authorization: token ? `Bearer ${token}` : undefined,\n requestedModel,\n taskType,\n requiredCapabilityTags,\n });\n\n if (!tokenPick.token || !tokenPick.region) {\n throw new Error(tokenPick.reason || \"Missing available token for model request\");\n }\n\n return {\n token: tokenPick.token,\n regionInfo: buildRegionInfo(tokenPick.region),\n };\n }\n\n private async pickTaskToken(\n options?: McpRequestOptions,\n type: \"image\" | \"video\" = \"image\"\n ): Promise<{ token: string; regionInfo: any }> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n if (token) {\n const entry = tokenPool.getTokenEntry(token);\n if (!entry?.region) {\n throw new Error(\"Missing region for token. Register token with region in token-pool.\");\n }\n return { token, regionInfo: buildRegionInfo(entry.region) };\n }\n\n const candidates = tokenPool\n .getEntries(false)\n .filter((item) => item.enabled && item.live !== false && item.region)\n .filter((item) => {\n const modelHint = type === \"video\" ? \"video\" : \"jimeng\";\n return !item.allowedModels?.length || item.allowedModels.some((m) => m.includes(modelHint));\n });\n if (candidates.length === 0) {\n throw new Error(\"No token available for task request. Configure token-pool or pass token.\");\n }\n return { token: candidates[0].token, regionInfo: buildRegionInfo(candidates[0].region as RegionCode) };\n }\n\n async healthCheck(): Promise<any> {\n return \"pong\";\n }\n\n async listModels(options?: McpRequestOptions): Promise<any> {\n await this.ensureTokenPoolReady();\n const token = this.resolveToken(options);\n const authorization = token ? `Bearer ${token}` : undefined;\n const region = token ? tokenPool.getTokenEntry(token)?.region : undefined;\n const result = await getLiveModels(authorization, region);\n return {\n source: result.source,\n data: result.data,\n };\n }\n\n async generateImage(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_IMAGE_MODEL;\n const prompt = String(body.prompt || \"\");\n const tokenCtx = await this.pickModelToken(model, \"image\", options);\n\n const responseFormat = body.response_format === \"b64_json\" ? \"b64_json\" : \"url\";\n const imageResult = await generateImages(\n model,\n prompt,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n sampleStrength: body.sample_strength as number | undefined,\n negativePrompt: body.negative_prompt as string | undefined,\n intelligentRatio: body.intelligent_ratio as boolean | undefined,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (!Array.isArray(imageResult)) {\n return imageResult;\n }\n\n const data = responseFormat === \"b64_json\"\n ? (await Promise.all(imageResult.map((url) => util.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 }))\n : imageResult.map((url) => ({ url }));\n\n return {\n created: util.unixTimestamp(),\n data,\n };\n }\n\n async editImage(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_IMAGE_MODEL;\n const prompt = String(body.prompt || \"\");\n const images = Array.isArray(body.images)\n ? body.images.filter((item): item is string => typeof item === \"string\")\n : [];\n const tokenCtx = await this.pickModelToken(model, \"image\", options);\n\n const responseFormat = body.response_format === \"b64_json\" ? \"b64_json\" : \"url\";\n const compositionResult = await generateImageComposition(\n model,\n prompt,\n images,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n sampleStrength: body.sample_strength as number | undefined,\n negativePrompt: body.negative_prompt as string | undefined,\n intelligentRatio: body.intelligent_ratio as boolean | undefined,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (!Array.isArray(compositionResult)) {\n return compositionResult;\n }\n\n const data = responseFormat === \"b64_json\"\n ? (await Promise.all(compositionResult.map((url) => util.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 }))\n : compositionResult.map((url) => ({ url }));\n\n return {\n created: util.unixTimestamp(),\n data,\n input_images: images.length,\n composition_type: \"multi_image_synthesis\",\n };\n }\n\n async generateVideo(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_VIDEO_MODEL;\n const prompt = String(body.prompt || \"\");\n\n const functionMode = typeof body.functionMode === \"string\" ? body.functionMode : \"first_last_frames\";\n const requiredTags = functionMode === \"omni_reference\" ? [\"omni_reference\"] : [];\n const tokenCtx = await this.pickModelToken(model, \"video\", options, requiredTags);\n\n const videoResult = await generateVideo(\n model,\n prompt,\n {\n ratio: body.ratio as string | undefined,\n resolution: body.resolution as string | undefined,\n duration: body.duration as number | undefined,\n filePaths: (body.filePaths || body.file_paths) as string[] | undefined,\n files: body.files as any,\n httpRequest: { body } as any,\n functionMode,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (typeof videoResult !== \"string\") {\n return videoResult;\n }\n\n if (body.response_format === \"b64_json\") {\n const videoBase64 = await util.fetchFileBASE64(videoResult);\n return {\n created: util.unixTimestamp(),\n data: [{ b64_json: videoBase64, revised_prompt: prompt }],\n };\n }\n\n return {\n created: util.unixTimestamp(),\n data: [{ url: videoResult, revised_prompt: prompt }],\n };\n }\n\n async getTask(\n taskId: string,\n options?: McpRequestOptions,\n query?: { type?: string; response_format?: string }\n ): Promise<any> {\n const type = query?.type === \"video\" ? \"video\" : query?.type === \"image\" ? \"image\" : undefined;\n const tokenCtx = await this.pickTaskToken(options, resolveTaskType(type));\n return getTaskResponse(taskId, tokenCtx.token, tokenCtx.regionInfo, {\n type,\n responseFormat: query?.response_format === \"b64_json\" ? \"b64_json\" : \"url\",\n });\n }\n\n async waitTask(\n taskId: string,\n body: Record<string, unknown>,\n options?: McpRequestOptions\n ): Promise<any> {\n const type = body.type === \"video\" ? \"video\" : body.type === \"image\" ? \"image\" : undefined;\n const tokenCtx = await this.pickTaskToken(options, resolveTaskType(type));\n return waitForTaskResponse(taskId, tokenCtx.token, tokenCtx.regionInfo, {\n type,\n responseFormat: body.response_format === \"b64_json\" ? \"b64_json\" : \"url\",\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n });\n }\n\n async generateVideoOmni(\n body: JsonObject,\n options?: McpRequestOptions,\n uploadFiles: MultipartUploadFile[] = []\n ): Promise<any> {\n const files: Record<string, any> = {};\n for (const file of uploadFiles) {\n files[file.fieldName] = {\n filepath: file.filePath,\n originalFilename: path.basename(file.filePath),\n };\n if (!fs.existsSync(file.filePath)) {\n throw new Error(`Local file not found: ${file.filePath}`);\n }\n }\n\n return this.generateVideo(\n {\n ...body,\n functionMode: \"omni_reference\",\n files,\n },\n options\n );\n }\n\n async upscaleImage(body: Record<string, unknown>, options?: McpRequestOptions): Promise<any> {\n const model = typeof body.model === \"string\" && body.model.trim().length > 0\n ? body.model\n : DEFAULT_IMAGE_MODEL;\n const imageUrl = typeof body.image === \"string\" ? body.image : \"\";\n if (!imageUrl) throw new Error(\"Missing required 'image' field (URL or base64)\");\n\n const tokenCtx = await this.pickModelToken(model, \"image\", options);\n\n const responseFormat = body.response_format === \"b64_json\" ? \"b64_json\" : \"url\";\n const upscaleResult = await upscaleImage(\n model,\n imageUrl,\n {\n resolution: body.resolution as string | undefined,\n wait: body.wait as boolean | undefined,\n waitTimeoutSeconds: body.wait_timeout_seconds as number | undefined,\n pollIntervalMs: body.poll_interval_ms as number | undefined,\n },\n tokenCtx.token,\n tokenCtx.regionInfo\n );\n\n if (!Array.isArray(upscaleResult)) {\n return upscaleResult;\n }\n\n const data = responseFormat === \"b64_json\"\n ? (await Promise.all(upscaleResult.map((url) => util.fetchFileBASE64(url)))).map((b64) => ({ b64_json: b64 }))\n : upscaleResult.map((url) => ({ url }));\n\n return {\n created: util.unixTimestamp(),\n data,\n resolution: body.resolution || \"4k\",\n };\n }\n\n async listTasks(options?: McpRequestOptions, query?: { type?: string; count?: number }): Promise<any> {\n const tokenCtx = await this.pickTaskToken(options);\n const result = await getAssetList(tokenCtx.token, tokenCtx.regionInfo, {\n count: query?.count || 20,\n type: (query?.type as \"image\" | \"video\" | \"all\") || \"all\",\n });\n\n return {\n has_more: result.hasMore,\n next_offset: result.nextOffset,\n total: result.items.length,\n items: result.items,\n };\n }\n}\n","import axios from \"axios\";\r\n\r\nexport type McpToolErrorCode =\r\n | \"CONFIG_ERROR\"\r\n | \"VALIDATION_ERROR\"\r\n | \"AUTH_ERROR\"\r\n | \"NETWORK_ERROR\"\r\n | \"UPSTREAM_ERROR\"\r\n | \"INTERNAL_ERROR\";\r\n\r\nexport class McpToolError extends Error {\r\n code: McpToolErrorCode;\r\n details?: unknown;\r\n\r\n constructor(code: McpToolErrorCode, message: string, details?: unknown) {\r\n super(message);\r\n this.code = code;\r\n this.details = details;\r\n }\r\n}\r\n\r\nexport function normalizeToolError(error: unknown): McpToolError {\r\n if (error instanceof McpToolError) return error;\r\n\r\n if (axios.isAxiosError(error)) {\r\n if (!error.response) {\r\n return new McpToolError(\r\n \"NETWORK_ERROR\",\r\n \"Failed to reach jimeng-cli service\",\r\n error.message\r\n );\r\n }\r\n\r\n const status = error.response.status;\r\n const message =\r\n String(error.response.data?.error?.message || error.response.data?.message || error.message);\r\n\r\n if (status === 401 || status === 403) {\r\n return new McpToolError(\"AUTH_ERROR\", message, error.response.data);\r\n }\r\n if (status >= 400 && status < 500) {\r\n return new McpToolError(\"VALIDATION_ERROR\", message, error.response.data);\r\n }\r\n if (status >= 500) {\r\n return new McpToolError(\"UPSTREAM_ERROR\", message, error.response.data);\r\n }\r\n }\r\n\r\n if (error instanceof Error) {\r\n return new McpToolError(\"INTERNAL_ERROR\", error.message);\r\n }\r\n\r\n return new McpToolError(\"INTERNAL_ERROR\", \"Unknown internal error\");\r\n}\r\n\r\nexport function formatToolError(error: unknown): string {\r\n const normalized = normalizeToolError(error);\r\n return `[${normalized.code}] ${normalized.message}`;\r\n}\r\n","import type { McpConfig } from \"./config.ts\";\r\nimport { McpToolError } from \"./errors.ts\";\r\n\r\nexport function assertRunConfirm(config: McpConfig, confirm?: string): void {\r\n if (!config.requireRunConfirm) return;\r\n if (confirm === \"RUN\") return;\r\n\r\n throw new McpToolError(\r\n \"VALIDATION_ERROR\",\r\n 'This tool requires explicit confirmation: set \"confirm\" to \"RUN\".'\r\n );\r\n}\r\n","import * as z from \"zod\";\r\n\r\nfunction buildIndexedUrlFields(prefix: \"image_file\" | \"video_file\", max: number) {\r\n return Object.fromEntries(\r\n Array.from({ length: max }, (_, index) => [\r\n `${prefix}_${index + 1}`,\r\n z.string().url().optional()\r\n ])\r\n );\r\n}\r\n\r\nfunction normalizeUniqueValues(values: string[]): string[] {\r\n return [...new Set(values.map((item) => item.trim()).filter(Boolean))];\r\n}\r\n\r\nexport const healthCheckInputSchema = z.object({});\r\n\r\nexport const listModelsInputSchema = z.object({\r\n token: z.string().optional()\r\n});\r\n\r\nexport const generateImageInputSchema = z.object({\r\n prompt: z.string().min(1),\r\n model: z.string().optional(),\r\n negative_prompt: z.string().optional(),\r\n ratio: z.string().optional(),\r\n resolution: z.string().optional(),\r\n intelligent_ratio: z.boolean().optional(),\r\n sample_strength: z.number().optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n wait: z.boolean().optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\r\n});\r\n\r\nexport const editImageInputSchema = z.object({\r\n prompt: z.string().min(1),\r\n images: z.array(z.string().url()).min(1).max(10),\r\n model: z.string().optional(),\r\n negative_prompt: z.string().optional(),\r\n ratio: z.string().optional(),\r\n resolution: z.string().optional(),\r\n intelligent_ratio: z.boolean().optional(),\r\n sample_strength: z.number().optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n wait: z.boolean().optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\r\n});\r\n\r\nexport const generateVideoInputSchema = z.object({\r\n prompt: z.string().min(1),\r\n model: z.string().optional(),\r\n ratio: z.string().optional(),\r\n resolution: z.string().optional(),\r\n duration: z.number().int().min(4).max(15).optional(),\r\n wait: z.boolean().optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\r\n});\r\n\r\nexport const generateVideoOmniInputSchema = z\r\n .object({\r\n prompt: z.string().min(1),\r\n model: z.string().optional(),\r\n ratio: z.string().optional(),\r\n resolution: z.string().optional(),\r\n duration: z.number().int().min(4).max(15).optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n wait: z.boolean().optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n file_paths: z.array(z.string().url()).max(9).optional(),\r\n filePaths: z.array(z.string().url()).max(9).optional(),\r\n image_urls: z.array(z.string().url()).max(9).optional(),\r\n video_urls: z.array(z.string().url()).max(3).optional(),\r\n image_files: z.array(z.string()).max(9).optional(),\r\n video_files: z.array(z.string()).max(3).optional(),\r\n ...buildIndexedUrlFields(\"image_file\", 9),\r\n ...buildIndexedUrlFields(\"video_file\", 3),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\r\n })\r\n .superRefine((value, ctx) => {\r\n const imageSlotUrls = Array.from({ length: 9 }, (_, index) => value[`image_file_${index + 1}`]);\r\n const videoSlotUrls = Array.from({ length: 3 }, (_, index) => value[`video_file_${index + 1}`]);\r\n\r\n const imageCount =\r\n normalizeUniqueValues(value.image_urls || []).length +\r\n (value.image_files?.length || 0) +\r\n normalizeUniqueValues([...(value.file_paths || []), ...(value.filePaths || [])]).length +\r\n normalizeUniqueValues(imageSlotUrls.filter((item): item is string => typeof item === \"string\")).length;\r\n\r\n const videoCount =\r\n normalizeUniqueValues(value.video_urls || []).length +\r\n (value.video_files?.length || 0) +\r\n normalizeUniqueValues(videoSlotUrls.filter((item): item is string => typeof item === \"string\")).length;\r\n\r\n if (imageCount > 9) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 9 images.\"\r\n });\r\n }\r\n if (videoCount > 3) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 3 videos.\"\r\n });\r\n }\r\n if (imageCount + videoCount > 12) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode supports at most 12 total materials.\"\r\n });\r\n }\r\n if (imageCount + videoCount === 0) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Omni mode requires at least one material.\"\r\n });\r\n }\r\n });\r\n\r\nexport const getTaskInputSchema = z.object({\r\n task_id: z.string().min(1),\r\n type: z.enum([\"image\", \"video\"]).optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n token: z.string().optional()\r\n});\r\n\r\nexport const waitTaskInputSchema = z.object({\r\n task_id: z.string().min(1),\r\n type: z.enum([\"image\", \"video\"]).optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n token: z.string().optional()\r\n});\r\n\r\nexport const upscaleImageInputSchema = z.object({\r\n image: z.string().min(1).describe(\"Image URL or local file path to upscale\"),\r\n model: z.string().optional(),\r\n resolution: z.enum([\"2k\", \"4k\"]).optional(),\r\n response_format: z.enum([\"url\", \"b64_json\"]).optional(),\r\n wait: z.boolean().optional(),\r\n wait_timeout_seconds: z.number().int().positive().optional(),\r\n poll_interval_ms: z.number().int().positive().optional(),\r\n token: z.string().optional(),\r\n confirm: z.string().optional()\r\n});\r\n\r\nexport const listTasksInputSchema = z.object({\r\n type: z.enum([\"image\", \"video\", \"all\"]).optional(),\r\n count: z.number().int().positive().max(100).optional(),\r\n token: z.string().optional()\r\n});\r\n","import { formatToolError } from \"./errors.ts\";\r\nimport type { JsonObject } from \"./types.ts\";\r\n\r\nexport function toStructuredContent(data: unknown): JsonObject {\r\n if (data != null && typeof data === \"object\" && !Array.isArray(data)) {\r\n return data as JsonObject;\r\n }\r\n return { data };\r\n}\r\n\r\nexport function toToolResult(data: unknown) {\r\n return {\r\n content: [{ type: \"text\" as const, text: JSON.stringify(data, null, 2) }],\r\n structuredContent: toStructuredContent(data)\r\n };\r\n}\r\n\r\nexport async function withToolError<T>(fn: () => Promise<T>): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n throw new Error(formatToolError(error));\r\n }\r\n}\r\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type * as z from \"zod\";\n\r\nimport { toToolResult, withToolError } from \"./result.ts\";\r\n\r\ninterface RegisterToolOptions<TSchema extends z.ZodTypeAny> {\n title: string;\n description: string;\n inputSchema: TSchema;\n annotations?: Record<string, unknown>;\n}\n\nexport function registerSafeTool<TSchema extends z.ZodTypeAny>(\n server: McpServer,\n name: string,\n options: RegisterToolOptions<TSchema>,\n handler: (args: z.infer<TSchema>) => Promise<unknown>\n): void {\n const { title, description, inputSchema, annotations } = options;\n\r\n server.registerTool(\r\n name,\r\n {\r\n title,\r\n description,\r\n inputSchema,\r\n ...(annotations ? { annotations } : {})\r\n },\r\n (async (args: Record<string, unknown>) =>\n withToolError(async () => {\n const parsedArgs = inputSchema.parse(args) as z.infer<TSchema>;\n const result = await handler(parsedArgs);\n return toToolResult(result);\n })) as any\n );\n}\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { editImageInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerEditImageTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"edit_image\",\r\n {\r\n title: \"Edit Image\",\r\n description: \"Compose image from prompt and image URLs\",\r\n inputSchema: editImageInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.editImage(\r\n {\r\n prompt: args.prompt,\r\n images: args.images,\r\n model: args.model,\r\n negative_prompt: args.negative_prompt,\r\n ratio: args.ratio,\r\n resolution: args.resolution || \"1k\",\n intelligent_ratio: args.intelligent_ratio,\n sample_strength: args.sample_strength,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n );\n }\r\n );\r\n}\r\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateImageInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerGenerateImageTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_image\",\r\n {\r\n title: \"Generate Image\",\r\n description: \"Generate image from prompt\",\r\n inputSchema: generateImageInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.generateImage(\r\n {\r\n prompt: args.prompt,\r\n model: args.model,\r\n negative_prompt: args.negative_prompt,\r\n ratio: args.ratio,\r\n resolution: args.resolution || \"1k\",\n intelligent_ratio: args.intelligent_ratio,\n sample_strength: args.sample_strength,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n );\n }\r\n );\r\n}\r\n","import fs from \"node:fs\";\r\n\r\nimport { McpToolError } from \"../errors.ts\";\r\nimport type { JsonObject, MultipartUploadFile } from \"../types.ts\";\r\n\r\nexport const MAX_IMAGE_SLOTS = 9;\r\nexport const MAX_VIDEO_SLOTS = 3;\r\n\r\nexport type MaterialPrefix = \"image_file\" | \"video_file\";\r\nexport type MaterialLabel = \"image\" | \"video\";\r\n\r\nexport interface BaseVideoPayloadInput {\n prompt: string;\n model?: string;\n ratio?: string;\n resolution?: string;\n duration?: number;\n response_format?: \"url\" | \"b64_json\";\n wait?: boolean;\n wait_timeout_seconds?: number;\n poll_interval_ms?: number;\n}\n\r\nexport function buildBaseVideoPayload(\r\n args: BaseVideoPayloadInput,\r\n functionMode: \"first_last_frames\" | \"omni_reference\"\r\n): JsonObject {\r\n return {\r\n prompt: args.prompt,\r\n model: args.model,\r\n ratio: args.ratio,\r\n resolution: args.resolution,\n duration: args.duration ?? 5,\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms,\n functionMode\n };\n}\n\r\nexport function uniqueStrings(values: string[]): string[] {\r\n return [...new Set(values.map((item) => item.trim()).filter(Boolean))];\r\n}\r\n\r\nexport function collectStringArray(values?: string[]): string[] {\r\n if (!Array.isArray(values)) return [];\r\n return values.filter((item): item is string => typeof item === \"string\");\r\n}\r\n\r\nexport function collectIndexedSlotUrls<TArgs extends Record<string, unknown>>(\r\n args: TArgs,\r\n prefix: MaterialPrefix,\r\n max: number\r\n): Map<number, string> {\r\n const values = new Map<number, string>();\r\n for (let i = 1; i <= max; i++) {\r\n const key = `${prefix}_${i}` as keyof TArgs;\r\n const slot = args[key];\r\n if (typeof slot === \"string\" && slot.length > 0) {\r\n values.set(i, slot);\r\n }\r\n }\r\n return values;\r\n}\r\n\r\nexport function assertLocalFilesExist(paths: string[]): void {\r\n for (const filePath of paths) {\r\n if (!fs.existsSync(filePath)) {\r\n throw new McpToolError(\"VALIDATION_ERROR\", `Local file not found: ${filePath}`);\r\n }\r\n }\r\n}\r\n\r\nexport function takeNextAvailableSlot(\r\n occupiedSlots: Set<number>,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): number {\r\n for (let i = 1; i <= maxSlots; i++) {\r\n if (!occupiedSlots.has(i)) {\r\n occupiedSlots.add(i);\r\n return i;\r\n }\r\n }\r\n throw new McpToolError(\r\n \"VALIDATION_ERROR\",\r\n `No available ${materialLabel} slot. Maximum supported: ${maxSlots}.`\r\n );\r\n}\r\n\r\nexport function appendUrlMaterials(\r\n body: JsonObject,\r\n occupiedSlots: Set<number>,\r\n urls: string[],\r\n prefix: MaterialPrefix,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): void {\r\n for (const url of urls) {\r\n const slot = takeNextAvailableSlot(occupiedSlots, maxSlots, materialLabel);\r\n body[`${prefix}_${slot}`] = url;\r\n }\r\n}\r\n\r\nexport function appendFileMaterials(\r\n uploadFiles: MultipartUploadFile[],\r\n occupiedSlots: Set<number>,\r\n filePaths: string[],\r\n prefix: MaterialPrefix,\r\n maxSlots: number,\r\n materialLabel: MaterialLabel\r\n): void {\r\n for (const filePath of filePaths) {\r\n const slot = takeNextAvailableSlot(occupiedSlots, maxSlots, materialLabel);\r\n uploadFiles.push({\r\n fieldName: `${prefix}_${slot}`,\r\n filePath\r\n });\r\n }\r\n}\r\n","import type { z } from \"zod\";\r\n\r\nimport { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateVideoOmniInputSchema } from \"../schemas.ts\";\r\nimport type { MultipartUploadFile, ToolDeps } from \"../types.ts\";\r\nimport type { JsonObject } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\nimport {\r\n appendFileMaterials,\r\n appendUrlMaterials,\r\n assertLocalFilesExist,\r\n buildBaseVideoPayload,\r\n collectIndexedSlotUrls,\r\n collectStringArray,\r\n MAX_IMAGE_SLOTS,\r\n MAX_VIDEO_SLOTS,\r\n uniqueStrings\r\n} from \"./video-utils.ts\";\r\n\r\ntype GenerateVideoOmniArgs = z.infer<typeof generateVideoOmniInputSchema>;\r\n\r\nfunction normalizeOmniPayload(args: GenerateVideoOmniArgs): {\r\n body: JsonObject;\r\n uploadFiles: MultipartUploadFile[];\r\n} {\r\n const imageSlotUrls = collectIndexedSlotUrls(args, \"image_file\", MAX_IMAGE_SLOTS);\r\n const videoSlotUrls = collectIndexedSlotUrls(args, \"video_file\", MAX_VIDEO_SLOTS);\r\n const imageUrls = uniqueStrings([\r\n ...collectStringArray(args.image_urls),\r\n ...collectStringArray(args.file_paths),\r\n ...collectStringArray(args.filePaths)\r\n ]);\r\n const videoUrls = uniqueStrings(collectStringArray(args.video_urls));\r\n const imageFiles = uniqueStrings(collectStringArray(args.image_files));\r\n const videoFiles = uniqueStrings(collectStringArray(args.video_files));\r\n\r\n assertLocalFilesExist(imageFiles);\r\n assertLocalFilesExist(videoFiles);\r\n\r\n const body: JsonObject = buildBaseVideoPayload(args, \"omni_reference\");\r\n\r\n for (const [slot, url] of imageSlotUrls) {\r\n body[`image_file_${slot}`] = url;\r\n }\r\n for (const [slot, url] of videoSlotUrls) {\r\n body[`video_file_${slot}`] = url;\r\n }\r\n\r\n const occupiedImageSlots = new Set<number>(imageSlotUrls.keys());\r\n const occupiedVideoSlots = new Set<number>(videoSlotUrls.keys());\r\n\r\n appendUrlMaterials(body, occupiedImageSlots, imageUrls, \"image_file\", MAX_IMAGE_SLOTS, \"image\");\r\n appendUrlMaterials(body, occupiedVideoSlots, videoUrls, \"video_file\", MAX_VIDEO_SLOTS, \"video\");\r\n\r\n const uploadFiles: MultipartUploadFile[] = [];\r\n appendFileMaterials(\r\n uploadFiles,\r\n occupiedImageSlots,\r\n imageFiles,\r\n \"image_file\",\r\n MAX_IMAGE_SLOTS,\r\n \"image\"\r\n );\r\n appendFileMaterials(\r\n uploadFiles,\r\n occupiedVideoSlots,\r\n videoFiles,\r\n \"video_file\",\r\n MAX_VIDEO_SLOTS,\r\n \"video\"\r\n );\r\n\r\n return { body, uploadFiles };\r\n}\r\n\r\nexport function registerGenerateVideoOmniTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_video_omni\",\r\n {\r\n title: \"Generate Video Omni\",\r\n description: \"Generate omni_reference video with URL and local-file materials\",\r\n inputSchema: generateVideoOmniInputSchema\r\n },\r\n async (args: GenerateVideoOmniArgs) => {\r\n assertRunConfirm(config, args.confirm);\r\n const { body, uploadFiles } = normalizeOmniPayload(args);\r\n return client.generateVideoOmni(body, { token: args.token }, uploadFiles);\r\n }\r\n );\r\n}\r\n","import { assertRunConfirm } from \"../guards.ts\";\r\nimport { generateVideoInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\nimport { buildBaseVideoPayload } from \"./video-utils.ts\";\r\n\r\nexport function registerGenerateVideoTool({ server, config, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"generate_video_flf\",\r\n {\r\n title: \"Generate Video FLF\",\r\n description: \"Generate video for first_last_frames workflow only\",\r\n inputSchema: generateVideoInputSchema\r\n },\r\n async (args) => {\r\n assertRunConfirm(config, args.confirm);\r\n\r\n return client.generateVideo(\r\n buildBaseVideoPayload(args, \"first_last_frames\"),\r\n { token: args.token }\r\n );\r\n }\r\n );\r\n}\r\n","import { getTaskInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerGetTaskTool({ server, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"get_task\",\n {\n title: \"Get Task\",\n description: \"Get image/video task status by task_id\",\n inputSchema: getTaskInputSchema,\n annotations: { readOnlyHint: true }\n },\n async (args) => client.getTask(\n args.task_id,\n { token: args.token },\n {\n type: args.type,\n response_format: args.response_format\n }\n )\n );\n}\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { healthCheckInputSchema } from \"../schemas.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerHealthCheckTool({ server, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"health_check\",\r\n {\r\n title: \"Health Check\",\r\n description: \"Check jimeng-cli health endpoint\",\r\n inputSchema: healthCheckInputSchema\r\n },\r\n async () => {\r\n const startedAt = Date.now();\r\n const raw = await client.healthCheck();\r\n return {\r\n ok: true,\r\n latencyMs: Date.now() - startedAt,\r\n raw\r\n };\r\n }\r\n );\r\n}\r\n","import { listModelsInputSchema } from \"../schemas.ts\";\r\nimport type { ToolDeps } from \"../types.ts\";\r\nimport { registerSafeTool } from \"../tool-factory.ts\";\r\n\r\nexport function registerListModelsTool({ server, client }: ToolDeps): void {\r\n registerSafeTool(\r\n server,\r\n \"list_models\",\r\n {\r\n title: \"List Models\",\r\n description: \"Get available models from jimeng-cli\",\r\n inputSchema: listModelsInputSchema,\r\n annotations: { readOnlyHint: true }\r\n },\r\n async ({ token }) => client.listModels({ token })\r\n );\r\n}\r\n","import { listTasksInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerListTasksTool({ server, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"list_tasks\",\n {\n title: \"List Tasks\",\n description: \"List generation task history with optional type filter\",\n inputSchema: listTasksInputSchema,\n annotations: { readOnlyHint: true }\n },\n async (args) => client.listTasks(\n { token: args.token },\n {\n type: args.type,\n count: args.count\n }\n )\n );\n}\n","import { assertRunConfirm } from \"../guards.ts\";\nimport { upscaleImageInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerUpscaleImageTool({ server, config, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"upscale_image\",\n {\n title: \"Upscale Image\",\n description: \"Upscale an existing image to higher resolution (2k or 4k) using super_resolution\",\n inputSchema: upscaleImageInputSchema\n },\n async (args) => {\n assertRunConfirm(config, args.confirm);\n\n return client.upscaleImage(\n {\n image: args.image,\n model: args.model,\n resolution: args.resolution || \"4k\",\n response_format: args.response_format,\n wait: args.wait,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n );\n }\n );\n}\n","import { waitTaskInputSchema } from \"../schemas.ts\";\nimport type { ToolDeps } from \"../types.ts\";\nimport { registerSafeTool } from \"../tool-factory.ts\";\n\nexport function registerWaitTaskTool({ server, client }: ToolDeps): void {\n registerSafeTool(\n server,\n \"wait_task\",\n {\n title: \"Wait Task\",\n description: \"Wait for image/video task completion by task_id\",\n inputSchema: waitTaskInputSchema\n },\n async (args) => client.waitTask(\n args.task_id,\n {\n type: args.type,\n response_format: args.response_format,\n wait_timeout_seconds: args.wait_timeout_seconds,\n poll_interval_ms: args.poll_interval_ms\n },\n { token: args.token }\n )\n );\n}\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { registerEditImageTool } from \"./edit-image.ts\";\r\nimport { registerGenerateImageTool } from \"./generate-image.ts\";\r\nimport { registerGenerateVideoOmniTool } from \"./generate-video-omni.ts\";\r\nimport { registerGenerateVideoTool } from \"./generate-video.ts\";\r\nimport { registerGetTaskTool } from \"./get-task.ts\";\r\nimport { registerHealthCheckTool } from \"./health-check.ts\";\r\nimport { registerListModelsTool } from \"./list-models.ts\";\r\nimport { registerListTasksTool } from \"./list-tasks.ts\";\r\nimport { registerUpscaleImageTool } from \"./upscale-image.ts\";\r\nimport { registerWaitTaskTool } from \"./wait-task.ts\";\r\n\r\nexport interface McpToolManifestItem {\r\n id: string;\r\n isAdvanced?: boolean;\r\n register: (deps: ToolDeps) => void;\r\n}\r\n\r\nexport const MCP_TOOL_MANIFEST: McpToolManifestItem[] = [\r\n { id: \"health_check\", register: registerHealthCheckTool },\r\n { id: \"list_models\", register: registerListModelsTool },\r\n { id: \"get_task\", register: registerGetTaskTool },\r\n { id: \"wait_task\", register: registerWaitTaskTool },\r\n { id: \"list_tasks\", register: registerListTasksTool },\r\n { id: \"generate_image\", register: registerGenerateImageTool },\r\n { id: \"upscale_image\", isAdvanced: true, register: registerUpscaleImageTool },\r\n { id: \"edit_image\", isAdvanced: true, register: registerEditImageTool },\r\n { id: \"generate_video_flf\", isAdvanced: true, register: registerGenerateVideoTool },\r\n { id: \"generate_video_omni\", isAdvanced: true, register: registerGenerateVideoOmniTool }\r\n];\r\n","import type { ToolDeps } from \"../types.ts\";\r\nimport { MCP_TOOL_MANIFEST } from \"./manifest.ts\";\r\n\r\nexport function registerMcpTools(deps: ToolDeps): void {\r\n for (const item of MCP_TOOL_MANIFEST) {\r\n if (item.isAdvanced && !deps.config.enableAdvancedTools) continue;\r\n item.register(deps);\r\n }\r\n}\r\n"],"mappings":"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","names":["fs","fs"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "jimeng-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "即梦/CapCut 图像与视频生成 CLI 与 MCP 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs",
|
|
@@ -19,20 +19,17 @@
|
|
|
19
19
|
},
|
|
20
20
|
"./package.json": "./package.json"
|
|
21
21
|
},
|
|
22
|
-
"directories": {
|
|
23
|
-
"dist": "dist"
|
|
24
|
-
},
|
|
25
22
|
"files": [
|
|
26
23
|
"dist/"
|
|
27
24
|
],
|
|
28
25
|
"scripts": {
|
|
29
|
-
"dev": "tsup src/index.ts src/cli/index.ts src/mcp/index.ts --format cjs,esm --sourcemap --dts --watch
|
|
26
|
+
"dev": "tsup src/index.ts src/cli/index.ts src/mcp/index.ts --format cjs,esm --sourcemap --dts --watch",
|
|
30
27
|
"start": "node --enable-source-maps --no-node-snapshot dist/index.js",
|
|
31
28
|
"build": "tsup src/index.ts src/cli/index.ts src/mcp/index.ts --format cjs,esm --sourcemap --dts --clean",
|
|
32
29
|
"mcp:dev": "tsup src/mcp/index.ts --format cjs,esm --sourcemap --dts --watch --onSuccess \"node --enable-source-maps --no-node-snapshot dist/mcp/index.js\"",
|
|
33
30
|
"mcp:start": "node --enable-source-maps --no-node-snapshot dist/mcp/index.js",
|
|
34
31
|
"mcp:smoke": "npm run build && node scripts/mcp-smoke.mjs",
|
|
35
|
-
"test": "
|
|
32
|
+
"test": "npm run mcp:smoke && npm run cli:smoke",
|
|
36
33
|
"format": "prettier --write \"src/**/*.{ts,js,json}\"",
|
|
37
34
|
"type-check": "tsc --noEmit",
|
|
38
35
|
"token:check": "node --enable-source-maps --no-node-snapshot dist/cli/index.js token check",
|
|
@@ -56,30 +53,28 @@
|
|
|
56
53
|
"url": "https://github.com/Algovate/jimeng-cli/issues"
|
|
57
54
|
},
|
|
58
55
|
"homepage": "https://github.com/Algovate/jimeng-cli",
|
|
56
|
+
"engines": {
|
|
57
|
+
"node": ">=18.0.0"
|
|
58
|
+
},
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@modelcontextprotocol/sdk": "^1.27.0",
|
|
61
61
|
"axios": "^1.6.7",
|
|
62
|
-
"colors": "^1.4.0",
|
|
63
|
-
"crc-32": "^1.2.2",
|
|
64
|
-
"cron": "^3.1.6",
|
|
65
62
|
"date-fns": "^3.3.1",
|
|
66
|
-
"eventsource-parser": "^1.1.2",
|
|
67
|
-
"form-data": "^4.0.0",
|
|
68
63
|
"fs-extra": "^11.2.0",
|
|
69
64
|
"https-proxy-agent": "^7.0.6",
|
|
70
|
-
"lodash": "^4.17.21",
|
|
71
65
|
"mime": "^4.0.1",
|
|
72
66
|
"minimist": "^1.2.8",
|
|
73
|
-
"
|
|
74
|
-
"semver": "^7.7.2",
|
|
67
|
+
"picocolors": "^1.1.1",
|
|
75
68
|
"socks-proxy-agent": "^8.0.5",
|
|
76
69
|
"uuid": "^9.0.1",
|
|
77
70
|
"yaml": "^2.3.4",
|
|
78
71
|
"zod": "^4.3.6"
|
|
79
72
|
},
|
|
80
73
|
"devDependencies": {
|
|
81
|
-
"@types/
|
|
82
|
-
"@types/
|
|
74
|
+
"@types/fs-extra": "^11.0.4",
|
|
75
|
+
"@types/minimist": "^1.2.5",
|
|
76
|
+
"@types/node": "^20.11.0",
|
|
77
|
+
"@types/uuid": "^9.0.7",
|
|
83
78
|
"prettier": "^3.6.2",
|
|
84
79
|
"tsup": "^8.0.2",
|
|
85
80
|
"typescript": "^5.3.3"
|