@avclabs.ai/media-mcp 0.3.0 → 0.4.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.
Files changed (43) hide show
  1. package/README.md +15 -14
  2. package/README_CN.md +13 -12
  3. package/dist/config.d.ts +36 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +25 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +5 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/server.d.ts +5 -1
  12. package/dist/server.d.ts.map +1 -1
  13. package/dist/server.js +32 -104
  14. package/dist/server.js.map +1 -1
  15. package/package.json +20 -28
  16. package/dist/image-enhancement.d.ts +0 -3
  17. package/dist/image-enhancement.d.ts.map +0 -1
  18. package/dist/image-enhancement.js +0 -185
  19. package/dist/image-enhancement.js.map +0 -1
  20. package/dist/sam3.d.ts +0 -10
  21. package/dist/sam3.d.ts.map +0 -1
  22. package/dist/sam3.js +0 -211
  23. package/dist/sam3.js.map +0 -1
  24. package/dist/service-config.d.ts +0 -62
  25. package/dist/service-config.d.ts.map +0 -1
  26. package/dist/service-config.js +0 -58
  27. package/dist/service-config.js.map +0 -1
  28. package/dist/tooling.d.ts +0 -42
  29. package/dist/tooling.d.ts.map +0 -1
  30. package/dist/tooling.js +0 -153
  31. package/dist/tooling.js.map +0 -1
  32. package/dist/tos.d.ts +0 -35
  33. package/dist/tos.d.ts.map +0 -1
  34. package/dist/tos.js +0 -281
  35. package/dist/tos.js.map +0 -1
  36. package/dist/upload.d.ts +0 -79
  37. package/dist/upload.d.ts.map +0 -1
  38. package/dist/upload.js +0 -190
  39. package/dist/upload.js.map +0 -1
  40. package/dist/video-enhancement.d.ts +0 -3
  41. package/dist/video-enhancement.d.ts.map +0 -1
  42. package/dist/video-enhancement.js +0 -156
  43. package/dist/video-enhancement.js.map +0 -1
@@ -1,185 +0,0 @@
1
- import axios from 'axios';
2
- import * as fs from 'fs';
3
- import { z } from 'zod';
4
- import { checkLocalFile, formatRequestError, parseTosSignature, unwrapEnvelope, uploadToTos, } from './tos.js';
5
- import { classifyStatus, POLL_REQUEST_TIMEOUT_MS, pollUntilTerminal, registerTool } from './tooling.js';
6
- const PollIntervalSchema = z.number().min(0.5).max(30).default(5).describe('Polling interval in seconds (0.5-30), default 5');
7
- const SyncTimeoutSchema = z.number().min(1).max(45).default(45).describe('Synchronous wait timeout in seconds (1-45), default 45. Returns task_id early when exceeded, use get_image_task_status to continue polling');
8
- // Schemas
9
- const EnhanceImageSyncSchema = z.object({
10
- image_source: z.string().describe('Image URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
11
- type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote image, local=local file'),
12
- scale: z.number().int().min(1).max(4).default(2).describe('Enhancement scale multiplier (1-4), default 2. Controls the upscaling factor for image enhancement (e.g. 2=2x, 4=4x)'),
13
- poll_interval: PollIntervalSchema,
14
- timeout: SyncTimeoutSchema,
15
- });
16
- const ColorizeImageSyncSchema = z.object({
17
- image_source: z.string().describe('Image URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
18
- type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote image, local=local file'),
19
- poll_interval: PollIntervalSchema,
20
- timeout: SyncTimeoutSchema,
21
- });
22
- const DenoiseImageSyncSchema = z.object({
23
- image_source: z.string().describe('Image URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
24
- type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote image, local=local file'),
25
- poll_interval: PollIntervalSchema,
26
- timeout: SyncTimeoutSchema,
27
- });
28
- // Schema - status query
29
- const GetImageTaskStatusSchema = z.object({
30
- task_id: z.string().describe('Task ID'),
31
- });
32
- export function setupImageEnhancementTools(server, baseUrl, apiKey) {
33
- const client = axios.create({
34
- baseURL: baseUrl.replace(/\/$/, ''),
35
- headers: {
36
- 'Authorization': `Bearer ${apiKey}`,
37
- 'Content-Type': 'application/json',
38
- },
39
- timeout: 60000,
40
- });
41
- // ========== Sync task tools ==========
42
- registerTool(server, 'enhance_image_sync', `Enhance/upscale an image to improve quality (图片增强/放大/超分辨率). Use this tool ONLY for image enhancement and upscaling tasks.
43
-
44
- Two upload methods are supported:
45
- 1. URL upload: provide an image URL
46
- 2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
47
-
48
- Best for images with estimated processing time < 1 minute. If the task is not completed within the timeout, the tool returns early with a task_id. Use get_image_task_status to continue polling.`, EnhanceImageSyncSchema.shape, async (args) => processImageSync(client, args.image_source, args.type, 'enhance', args.poll_interval, args.timeout, args.scale));
49
- registerTool(server, 'colorize_image_sync', `Colorize a black-and-white photo (黑白照片上色/旧照片上色). Use this tool ONLY for adding color to grayscale or black-and-white images.
50
-
51
- Two upload methods are supported:
52
- 1. URL upload: provide an image URL
53
- 2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
54
-
55
- Best for images with estimated processing time < 1 minute. If the task is not completed within the timeout, the tool returns early with a task_id. Use get_image_task_status to continue polling.`, ColorizeImageSyncSchema.shape, async (args) => processImageSync(client, args.image_source, args.type, 'colorize', args.poll_interval, args.timeout));
56
- registerTool(server, 'denoise_image_sync', `Remove noise from an image (图片降噪/去噪). Use this tool ONLY for denoising noisy or grainy images.
57
-
58
- Two upload methods are supported:
59
- 1. URL upload: provide an image URL
60
- 2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
61
-
62
- Best for images with estimated processing time < 1 minute. If the task is not completed within the timeout, the tool returns early with a task_id. Use get_image_task_status to continue polling.`, DenoiseImageSyncSchema.shape, async (args) => processImageSync(client, args.image_source, args.type, 'denoise', args.poll_interval, args.timeout));
63
- // ========== Status query tool ==========
64
- registerTool(server, 'get_image_task_status', 'Query image processing task status. The status field can be: processing, completed, or failed. If status is processing, wait a few seconds and call this tool again to poll.', GetImageTaskStatusSchema.shape, async (args) => {
65
- const result = await getImageTaskStatus(client, args.task_id);
66
- return {
67
- ...result,
68
- // registerTool marks isError on success===false: a terminal failed
69
- // status is a failed query outcome, not a healthy poll tick.
70
- success: classifyStatus(result.status) !== 'failed',
71
- message: result.status === 'processing' ? 'Task is still processing, please check again later' : undefined,
72
- };
73
- });
74
- }
75
- async function getImageTosSignature(client, fileName) {
76
- const response = await client.post('/api/v3/contents/generations/tos-signature', {
77
- file_type: 'image',
78
- file_name: fileName,
79
- });
80
- const unwrapped = unwrapEnvelope(response);
81
- if (!unwrapped.ok) {
82
- throw new Error(unwrapped.error);
83
- }
84
- return unwrapped.data;
85
- }
86
- function getEndpointByTaskType(taskType) {
87
- switch (taskType) {
88
- case 'enhance':
89
- return '/api/v3/contents/generations/image/enhance';
90
- case 'colorize':
91
- return '/api/v3/contents/generations/image/colorize';
92
- case 'denoise':
93
- return '/api/v3/contents/generations/image/denoise';
94
- }
95
- }
96
- function getModelByTaskType(taskType) {
97
- switch (taskType) {
98
- case 'enhance':
99
- return 'avc-image-enhance';
100
- case 'colorize':
101
- return 'avc-image-colorize';
102
- case 'denoise':
103
- return 'avc-image-denoise';
104
- }
105
- }
106
- async function createImageTask(client, imageSource, sourceType, taskType, scale) {
107
- let contentItem;
108
- if (sourceType === 'local') {
109
- const fileInfo = checkLocalFile(imageSource, 'image');
110
- // Step 1: Get TOS signature
111
- let target;
112
- try {
113
- target = parseTosSignature(await getImageTosSignature(client, fileInfo.fileName));
114
- }
115
- catch (error) {
116
- throw new Error(`[Step 1: TOS signature failed] ${formatRequestError(error)}`);
117
- }
118
- // Step 2: Upload to TOS
119
- try {
120
- await uploadToTos(target, fs.createReadStream(imageSource), fileInfo.fileName);
121
- }
122
- catch (error) {
123
- throw new Error(`[Step 2: TOS upload failed] ${error.message}`);
124
- }
125
- contentItem = { type: 'image_file', file_id: target.fileId, file_name: fileInfo.fileName };
126
- }
127
- else {
128
- contentItem = { type: 'image_url', image_url: { url: imageSource } };
129
- }
130
- // Step 3: Call image API
131
- const endpoint = getEndpointByTaskType(taskType);
132
- const payload = { model: getModelByTaskType(taskType), content: [contentItem] };
133
- if (scale !== undefined) {
134
- payload.scale = scale;
135
- }
136
- let response;
137
- try {
138
- response = await client.post(endpoint, payload);
139
- }
140
- catch (error) {
141
- throw new Error(`[Step 3: API call failed] endpoint=${endpoint} ${formatRequestError(error)}`);
142
- }
143
- const unwrapped = unwrapEnvelope(response);
144
- if (!unwrapped.ok) {
145
- return { success: false, error: unwrapped.error };
146
- }
147
- return { success: true, task_id: unwrapped.data.task_id, status: unwrapped.data.status };
148
- }
149
- async function getImageTaskStatus(client, taskId, signal) {
150
- const response = await client.get(`/api/v3/contents/generations/tasks/${encodeURIComponent(taskId)}`, {
151
- timeout: POLL_REQUEST_TIMEOUT_MS,
152
- signal,
153
- });
154
- const unwrapped = unwrapEnvelope(response);
155
- if (!unwrapped.ok) {
156
- throw new Error(unwrapped.error);
157
- }
158
- const result = unwrapped.data;
159
- return {
160
- task_id: result.task_id,
161
- status: result.status,
162
- progress: result.progress ?? 0,
163
- image_url: result.image_url,
164
- error_message: result.error_message,
165
- created_at: result.created_at,
166
- updated_at: result.updated_at,
167
- };
168
- }
169
- async function processImageSync(client, imageSource, sourceType, taskType, pollInterval, timeout, scale) {
170
- const createResult = await createImageTask(client, imageSource, sourceType, taskType, scale);
171
- if (!createResult.success) {
172
- return createResult;
173
- }
174
- return pollUntilTerminal({
175
- taskId: createResult.task_id,
176
- timeoutSeconds: timeout,
177
- pollIntervalSeconds: pollInterval,
178
- continueHint: 'get_image_task_status',
179
- fetchStatus: async (signal) => {
180
- const { task_id, status, ...payload } = await getImageTaskStatus(client, createResult.task_id, signal);
181
- return { status, payload };
182
- },
183
- });
184
- }
185
- //# sourceMappingURL=image-enhancement.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image-enhancement.js","sourceRoot":"","sources":["../src/image-enhancement.ts"],"names":[],"mappings":"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"}
package/dist/sam3.d.ts DELETED
@@ -1,10 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function setupSam3Tools(server: McpServer, baseUrl: string, apiKey: string, pollInterval: number, pollMaxAttempts: number): void;
3
- /**
4
- * Last-hop fetch for a completed SAM3 task. Never throws: a download failure
5
- * becomes a structured object that keeps task_id and the terminal status, so
6
- * the caller can resume via get_sam3_task_status. A download failure is not
7
- * a truncated wait and never rewrites the remote status to failed/processing.
8
- */
9
- export declare function fetchSam3ResultPayload(taskId: string, resultUrl: unknown): Promise<Record<string, any>>;
10
- //# sourceMappingURL=sam3.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sam3.d.ts","sourceRoot":"","sources":["../src/sam3.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4BpE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,GACtB,IAAI,CA8CN;AAkED;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAwB7G"}
package/dist/sam3.js DELETED
@@ -1,211 +0,0 @@
1
- import axios from 'axios';
2
- import * as fs from 'fs';
3
- import * as path from 'path';
4
- import { z } from 'zod';
5
- import { checkLocalFile, decodeBase64Image, downloadToBuffer, parseTosSignature, unwrapEnvelope, uploadToTos, } from './tos.js';
6
- import { classifyStatus, POLL_REQUEST_TIMEOUT_MS, pollUntilTerminal, registerTool } from './tooling.js';
7
- const SAM3_SUCCESS_CODES = new Set([0]);
8
- const Sam3PredictSchema = z.object({
9
- imagePath: z.string().optional().describe('Absolute path of a local image file (e.g. C:\\\\Users\\\\xxx\\\\photo.png)'),
10
- imageUrl: z.string().url().optional().describe('Publicly accessible URL of the image to process'),
11
- imageBase64: z.string().optional().describe('Base64-encoded image data (a data: URL prefix is also accepted). Use this when the image is provided as an attachment without a local path'),
12
- prompt: z.string().min(1).max(500).describe('Text prompt for mask generation. Must be in English. If the user provides Chinese or other non-English text, translate it to English before calling this tool'),
13
- });
14
- const GetSam3TaskStatusSchema = z.object({
15
- task_id: z.string().describe('SAM3 task ID returned by sam3_predict'),
16
- });
17
- export function setupSam3Tools(server, baseUrl, apiKey, pollInterval, pollMaxAttempts) {
18
- const client = axios.create({
19
- baseURL: baseUrl.replace(/\/$/, ''),
20
- headers: {
21
- 'X-API-Key': apiKey,
22
- 'Content-Type': 'application/json',
23
- },
24
- timeout: 60000,
25
- });
26
- registerTool(server, 'sam3_predict', `Analyze an image using the SAM3 segmentation API to generate inference results (masks, boxes, scores).
27
- The image can be provided in one of three ways:
28
- 1. imagePath: Absolute path of a local image file (e.g. C:\\Users\\xxx\\photo.png). Use this when the user provides a local file path.
29
- 2. imageUrl: Publicly accessible URL of the image (e.g. https://example.com/photo.jpg). Use this when the user provides a web link.
30
- 3. imageBase64: Base64-encoded image data. Use this when the user uploads or drags-and-drops an image as an attachment and no local path is available.
31
- In this case, encode the image content as base64 and pass it via this parameter.
32
- If the user mentions an uploaded image but does not provide a path, URL, or base64 data, ask the user for the local absolute path.
33
- Prompt must be in English. If the user provides Chinese or other non-English text, translate it to English before calling this tool.`, Sam3PredictSchema.shape, async (args) => sam3PredictTool(client, pollInterval, pollMaxAttempts, args));
34
- registerTool(server, 'get_sam3_task_status', 'Query SAM3 image segmentation task status by task_id. Status can be: processing, completed, or failed. If completed, the result URL is returned.', GetSam3TaskStatusSchema.shape, async (args) => {
35
- try {
36
- const data = await getSam3Result(client, args.task_id);
37
- return normalizeSam3Status(args.task_id, data);
38
- }
39
- catch (error) {
40
- // Keep task_id in every failure exit of the status tool, consistent
41
- // with the polling failure shape.
42
- return {
43
- success: false,
44
- task_id: args.task_id,
45
- status: 'unknown',
46
- error: error instanceof Error ? error.message : String(error),
47
- };
48
- }
49
- });
50
- }
51
- function normalizeSam3Status(taskId, data) {
52
- const kind = classifyStatus(data?.status);
53
- if (kind === 'ok') {
54
- return {
55
- success: true,
56
- task_id: taskId,
57
- status: data.status,
58
- result_url: data.result,
59
- };
60
- }
61
- if (kind === 'failed') {
62
- return {
63
- success: false,
64
- task_id: taskId,
65
- status: data.status,
66
- error: data.error_message || 'Task failed',
67
- };
68
- }
69
- if (kind === 'unknown') {
70
- return {
71
- success: false,
72
- task_id: taskId,
73
- status: data?.status ?? 'unknown',
74
- error: `Unrecognized task status: ${JSON.stringify(data?.status ?? null)}`,
75
- };
76
- }
77
- return {
78
- success: true,
79
- task_id: taskId,
80
- status: data.status,
81
- message: 'Task is still processing, please check again later.',
82
- };
83
- }
84
- async function getSam3PostSignature(client, fileName) {
85
- const response = await client.post('/get_postsignature_url', {
86
- file_type: 'image',
87
- file_name: fileName,
88
- });
89
- const unwrapped = unwrapEnvelope(response, SAM3_SUCCESS_CODES);
90
- if (!unwrapped.ok) {
91
- throw new Error(`get_postsignature_url error: ${unwrapped.error}`);
92
- }
93
- return unwrapped.data;
94
- }
95
- async function sam3Predict(client, fileId, prompt) {
96
- const response = await client.post('/predict', { file_id: fileId, prompt });
97
- const body = response.data;
98
- if (!body || typeof body !== 'object' || typeof body.task_id !== 'string' || !body.task_id) {
99
- const preview = typeof body === 'string' ? body.slice(0, 200) : JSON.stringify(body)?.slice(0, 200);
100
- throw new Error(`Unexpected /predict response: ${preview}`);
101
- }
102
- return body.task_id;
103
- }
104
- async function downloadSam3Result(url) {
105
- const response = await axios.get(url, { timeout: 30000 });
106
- return response.data;
107
- }
108
- const SAM3_RESULT_DOWNLOAD_NOTE = 'The task has completed; only the result download failed. Do not resubmit. Use get_sam3_task_status with this task_id to recover the result.';
109
- /**
110
- * Last-hop fetch for a completed SAM3 task. Never throws: a download failure
111
- * becomes a structured object that keeps task_id and the terminal status, so
112
- * the caller can resume via get_sam3_task_status. A download failure is not
113
- * a truncated wait and never rewrites the remote status to failed/processing.
114
- */
115
- export async function fetchSam3ResultPayload(taskId, resultUrl) {
116
- if (typeof resultUrl !== 'string' || resultUrl.trim() === '') {
117
- return {
118
- success: false,
119
- task_id: taskId,
120
- status: 'completed',
121
- error: `Task ${taskId} completed but has no usable result_url; use get_sam3_task_status with this task_id to recover.`,
122
- note: SAM3_RESULT_DOWNLOAD_NOTE,
123
- };
124
- }
125
- try {
126
- const data = await downloadSam3Result(resultUrl);
127
- return { success: true, task_id: taskId, status: 'completed', result_url: resultUrl, result: data };
128
- }
129
- catch (error) {
130
- const message = error instanceof Error ? error.message : String(error);
131
- return {
132
- success: false,
133
- task_id: taskId,
134
- status: 'completed',
135
- result_url: resultUrl,
136
- error: `Failed to download the completed result for task ${taskId}: ${message}`,
137
- note: SAM3_RESULT_DOWNLOAD_NOTE,
138
- };
139
- }
140
- }
141
- async function prepareImageBuffer(args) {
142
- const { imagePath, imageUrl, imageBase64 } = args;
143
- if (imagePath) {
144
- checkLocalFile(imagePath, 'image');
145
- return { buffer: fs.readFileSync(imagePath), fileName: path.basename(imagePath) };
146
- }
147
- if (imageUrl) {
148
- const buffer = await downloadToBuffer(imageUrl);
149
- const fileName = path.basename(new URL(imageUrl).pathname) || 'image.png';
150
- return { buffer, fileName };
151
- }
152
- if (imageBase64) {
153
- return decodeBase64Image(imageBase64);
154
- }
155
- throw new Error('Missing image input: must provide one of imagePath, imageUrl, or imageBase64');
156
- }
157
- async function sam3CreateTask(client, buffer, fileName, prompt) {
158
- const signatureData = await getSam3PostSignature(client, fileName);
159
- const target = parseTosSignature(signatureData);
160
- await uploadToTos(target, buffer, fileName);
161
- return sam3Predict(client, target.fileId, prompt);
162
- }
163
- async function getSam3Result(client, taskId, signal) {
164
- const response = await client.get(`/predict/result/${encodeURIComponent(taskId)}`, {
165
- timeout: POLL_REQUEST_TIMEOUT_MS,
166
- signal,
167
- });
168
- const data = response.data;
169
- if (!data || typeof data !== 'object' || Array.isArray(data)) {
170
- throw new Error(`Unexpected task status response (HTTP ${response.status})`);
171
- }
172
- // The endpoint's success body shape is not confirmed against a live backend
173
- // (envelope {code:0,data:{...}} or bare {status,...}); unwrap only when the
174
- // body is shaped like an envelope, so auth/business errors surface with
175
- // their real message instead of degrading to "Unrecognized task status".
176
- if ('code' in data) {
177
- const unwrapped = unwrapEnvelope(response, SAM3_SUCCESS_CODES);
178
- if (!unwrapped.ok) {
179
- throw new Error(`Task status request failed: ${unwrapped.error}`);
180
- }
181
- return unwrapped.data;
182
- }
183
- return data;
184
- }
185
- async function sam3PredictTool(client, pollInterval, pollMaxAttempts, args) {
186
- const { buffer, fileName } = await prepareImageBuffer(args);
187
- const taskId = await sam3CreateTask(client, buffer, fileName, args.prompt);
188
- const taskResult = await pollUntilTerminal({
189
- taskId,
190
- timeoutSeconds: (pollInterval * pollMaxAttempts) / 1000,
191
- pollIntervalSeconds: pollInterval / 1000,
192
- maxAttempts: pollMaxAttempts,
193
- continueHint: 'get_sam3_task_status',
194
- fetchStatus: async (signal) => {
195
- const data = await getSam3Result(client, taskId, signal);
196
- return {
197
- status: data.status,
198
- payload: { result_url: data.result, error_message: data.error_message },
199
- };
200
- },
201
- });
202
- if (!taskResult.success || taskResult.status === 'processing') {
203
- return taskResult;
204
- }
205
- const outcome = await fetchSam3ResultPayload(taskResult.task_id, taskResult.result_url);
206
- if (!outcome.success) {
207
- return outcome;
208
- }
209
- return JSON.stringify(outcome.result, null, 2);
210
- }
211
- //# sourceMappingURL=sam3.js.map
package/dist/sam3.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"sam3.js","sourceRoot":"","sources":["../src/sam3.ts"],"names":[],"mappings":"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"}
@@ -1,62 +0,0 @@
1
- export declare const SAM3_POLL_INTERVAL_MS_BOUNDS: {
2
- readonly min: 500;
3
- readonly max: 60000;
4
- };
5
- export declare const SAM3_POLL_MAX_ATTEMPTS_BOUNDS: {
6
- readonly min: 1;
7
- readonly max: 1000;
8
- };
9
- export declare class ConfigError extends Error {
10
- }
11
- export interface MediaHostFileConfig {
12
- baseUrl?: string;
13
- imageBaseUrl?: string;
14
- sam3BaseUrl?: string;
15
- }
16
- export interface MediaHostCliOverrides {
17
- baseUrl?: string;
18
- imageBaseUrl?: string;
19
- sam3BaseUrl?: string;
20
- apiKey?: string;
21
- /** Raw argument text; parsed and bounds-checked here. */
22
- sam3PollIntervalMs?: string;
23
- sam3PollMaxAttempts?: string;
24
- }
25
- export interface MediaHostEnv {
26
- API_KEY?: string;
27
- HTTP_API_BASE_URL?: string;
28
- IMAGE_API_BASE_URL?: string;
29
- SAM3_API_BASE_URL?: string;
30
- /** Canonical name. */
31
- SAM3_POLL_INTERVAL_MS?: string;
32
- /** Deprecated alias of SAM3_POLL_INTERVAL_MS. */
33
- SAM3_POLL_INTERVAL?: string;
34
- SAM3_POLL_MAX_ATTEMPTS?: string;
35
- }
36
- export interface MediaHostConfig {
37
- enhancementApiBaseUrl: string;
38
- imageApiBaseUrl: string;
39
- sam3ApiBaseUrl: string;
40
- apiKey: string;
41
- sam3PollIntervalMs: number;
42
- sam3PollMaxAttempts: number;
43
- }
44
- export declare function parseSam3WaitInt(raw: string | undefined, name: string, bounds: {
45
- min: number;
46
- max: number;
47
- }, fallback: number): number;
48
- /**
49
- * Resolves the final Media host configuration.
50
- *
51
- * Precedence per key: CLI override > environment > file config > built-in
52
- * default. The image API base URL is derived only after the merge: an unset
53
- * image base falls back to the resolved enhancement base, no matter which
54
- * layer provided it. All validation happens here, before any tool is created
55
- * or request is made; error messages never echo secret values.
56
- */
57
- export declare function resolveMediaHostConfig(options: {
58
- cli?: MediaHostCliOverrides;
59
- env?: MediaHostEnv;
60
- file?: MediaHostFileConfig;
61
- }): MediaHostConfig;
62
- //# sourceMappingURL=service-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-config.d.ts","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,4BAA4B;;;CAAoC,CAAC;AAC9E,eAAO,MAAM,6BAA6B;;;CAAiC,CAAC;AAO5E,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAWD,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EACpC,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC5B,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B,GAAG,eAAe,CAkClB"}
@@ -1,58 +0,0 @@
1
- // Media host configuration: one deep module owning precedence, validation,
2
- // and derivation for everything the enhancement and SAM3 hosts need. Adapters
3
- // consume the resolved MediaHostConfig; callers never merge layers themselves
4
- // and never need to know variable initialization order.
5
- export const SAM3_POLL_INTERVAL_MS_BOUNDS = { min: 500, max: 60000 };
6
- export const SAM3_POLL_MAX_ATTEMPTS_BOUNDS = { min: 1, max: 1000 };
7
- const DEFAULT_ENHANCEMENT_API_BASE_URL = 'https://mcp.avc.ai/enhance';
8
- const DEFAULT_SAM3_API_BASE_URL = 'https://mcp.avc.ai/sam';
9
- const DEFAULT_SAM3_POLL_INTERVAL_MS = 2000;
10
- const DEFAULT_SAM3_POLL_MAX_ATTEMPTS = 25;
11
- export class ConfigError extends Error {
12
- }
13
- // Blank values are "not provided" at every layer, so a resolved address is
14
- // never empty and a blank override cannot mask a valid lower layer.
15
- function highestPrecedence(...values) {
16
- for (const value of values) {
17
- if (value !== undefined && value.trim() !== '')
18
- return value;
19
- }
20
- return undefined;
21
- }
22
- export function parseSam3WaitInt(raw, name, bounds, fallback) {
23
- if (raw === undefined)
24
- return fallback;
25
- const parsed = Number.parseInt(raw, 10);
26
- if (!Number.isFinite(parsed) || parsed < bounds.min || parsed > bounds.max) {
27
- throw new ConfigError(`Invalid ${name} "${raw}": expected an integer between ${bounds.min} and ${bounds.max}`);
28
- }
29
- return parsed;
30
- }
31
- /**
32
- * Resolves the final Media host configuration.
33
- *
34
- * Precedence per key: CLI override > environment > file config > built-in
35
- * default. The image API base URL is derived only after the merge: an unset
36
- * image base falls back to the resolved enhancement base, no matter which
37
- * layer provided it. All validation happens here, before any tool is created
38
- * or request is made; error messages never echo secret values.
39
- */
40
- export function resolveMediaHostConfig(options) {
41
- const cli = options.cli ?? {};
42
- const env = options.env ?? {};
43
- const file = options.file ?? {};
44
- const enhancementApiBaseUrl = highestPrecedence(cli.baseUrl, env.HTTP_API_BASE_URL, file.baseUrl) ?? DEFAULT_ENHANCEMENT_API_BASE_URL;
45
- const sam3ApiBaseUrl = highestPrecedence(cli.sam3BaseUrl, env.SAM3_API_BASE_URL, file.sam3BaseUrl) ?? DEFAULT_SAM3_API_BASE_URL;
46
- const imageApiBaseUrl = highestPrecedence(cli.imageBaseUrl, env.IMAGE_API_BASE_URL, file.imageBaseUrl) ?? enhancementApiBaseUrl;
47
- const apiKey = highestPrecedence(cli.apiKey, env.API_KEY);
48
- if (!apiKey) {
49
- throw new ConfigError('API key is required: pass --api-key or set the API_KEY environment variable');
50
- }
51
- // SAM3_POLL_INTERVAL_MS is the canonical name; SAM3_POLL_INTERVAL is kept as
52
- // a deprecated alias. Both are milliseconds (unlike the per-tool
53
- // poll_interval argument, which is seconds).
54
- const sam3PollIntervalMs = parseSam3WaitInt(highestPrecedence(cli.sam3PollIntervalMs, env.SAM3_POLL_INTERVAL_MS, env.SAM3_POLL_INTERVAL), 'SAM3_POLL_INTERVAL_MS', SAM3_POLL_INTERVAL_MS_BOUNDS, DEFAULT_SAM3_POLL_INTERVAL_MS);
55
- const sam3PollMaxAttempts = parseSam3WaitInt(highestPrecedence(cli.sam3PollMaxAttempts, env.SAM3_POLL_MAX_ATTEMPTS), 'SAM3_POLL_MAX_ATTEMPTS', SAM3_POLL_MAX_ATTEMPTS_BOUNDS, DEFAULT_SAM3_POLL_MAX_ATTEMPTS);
56
- return { enhancementApiBaseUrl, imageApiBaseUrl, sam3ApiBaseUrl, apiKey, sam3PollIntervalMs, sam3PollMaxAttempts };
57
- }
58
- //# sourceMappingURL=service-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"service-config.js","sourceRoot":"","sources":["../src/service-config.ts"],"names":[],"mappings":"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"}
package/dist/tooling.d.ts DELETED
@@ -1,42 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import { z } from 'zod';
3
- export declare function registerTool(server: McpServer, name: string, description: string, schema: z.ZodRawShape, handler: (args: any) => Promise<unknown>): void;
4
- export declare const POLL_REQUEST_TIMEOUT_MS = 10000;
5
- export declare const MAX_CONSECUTIVE_POLL_FAILURES = 3;
6
- export declare const MAX_UNKNOWN_STATUS_SIGHTINGS = 3;
7
- export declare function sleep(ms: number): Promise<void>;
8
- export declare function clampNumber(value: number, min: number, max: number, fallback: number): number;
9
- export declare function remainingSleepMs(intervalMs: number, deadline: number, now?: number): number;
10
- export declare function requestBudgetMs(deadline: number, now?: number): number;
11
- export type StatusKind = 'ok' | 'failed' | 'processing' | 'unknown';
12
- export declare function classifyStatus(status: unknown): StatusKind;
13
- export interface PollFetchResult {
14
- status: unknown;
15
- payload: Record<string, any>;
16
- }
17
- export interface PollParams {
18
- taskId: string;
19
- timeoutSeconds: number;
20
- pollIntervalSeconds: number;
21
- fetchStatus: (signal: AbortSignal) => Promise<PollFetchResult>;
22
- continueHint: string;
23
- /**
24
- * Independent query-count limit: the first query counts, and the wait is
25
- * truncated as soon as this many queries have been made while the task is
26
- * still processing (no trailing sleep). Time and count limits run in
27
- * parallel; whichever is exhausted first ends the wait.
28
- */
29
- maxAttempts?: number;
30
- /** Injectable clock and delay for deterministic tests; defaults to real time. */
31
- now?: () => number;
32
- delay?: (ms: number) => Promise<void>;
33
- }
34
- /**
35
- * Deadline- and attempt-aware polling: never sleeps past the deadline, aborts
36
- * each status request at the remaining wait budget, tolerates transient
37
- * network failures, treats unknown statuses as errors after a few sightings,
38
- * and always keeps task_id in the response so the task is never lost.
39
- * A cancellation fired at the budget edge is not counted as a query failure.
40
- */
41
- export declare function pollUntilTerminal(params: PollParams): Promise<Record<string, any>>;
42
- //# sourceMappingURL=tooling.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tooling.d.ts","sourceRoot":"","sources":["../src/tooling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,CAAC,WAAW,EACrB,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,IAAI,CAeN;AAMD,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAC7C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAG7F;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAEvG;AAID,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAElF;AAMD,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,QAAQ,GAAG,YAAY,GAAG,SAAS,CAAC;AAEpE,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAM1D;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAQD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CA2FxF"}