@evolinkai/mcp 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/core/src/branding.d.ts +3 -0
- package/dist/core/src/branding.d.ts.map +1 -0
- package/dist/core/src/branding.js +8 -0
- package/dist/core/src/branding.js.map +1 -0
- package/dist/core/src/config.d.ts +1 -1
- package/dist/core/src/config.d.ts.map +1 -1
- package/dist/core/src/config.js +3 -1
- package/dist/core/src/config.js.map +1 -1
- package/dist/core/src/data/model-constraints.d.ts +8 -0
- package/dist/core/src/data/model-constraints.d.ts.map +1 -0
- package/dist/core/src/data/model-constraints.js +25 -0
- package/dist/core/src/data/model-constraints.js.map +1 -0
- package/dist/core/src/data/model-params.d.ts +17 -0
- package/dist/core/src/data/model-params.d.ts.map +1 -1
- package/dist/core/src/data/model-params.generated.d.ts.map +1 -1
- package/dist/core/src/data/model-params.generated.js +1 -1
- package/dist/core/src/data/model-params.generated.js.map +1 -1
- package/dist/core/src/data/model-params.js +6 -1
- package/dist/core/src/data/model-params.js.map +1 -1
- package/dist/core/src/request-context.d.ts +19 -0
- package/dist/core/src/request-context.d.ts.map +1 -1
- package/dist/core/src/request-context.js +13 -0
- package/dist/core/src/request-context.js.map +1 -1
- package/dist/core/src/server.d.ts +21 -3
- package/dist/core/src/server.d.ts.map +1 -1
- package/dist/core/src/server.js +52 -13
- package/dist/core/src/server.js.map +1 -1
- package/dist/core/src/services/api-client.d.ts +15 -0
- package/dist/core/src/services/api-client.d.ts.map +1 -1
- package/dist/core/src/services/api-client.js +26 -0
- package/dist/core/src/services/api-client.js.map +1 -1
- package/dist/core/src/services/catalog-client.d.ts +14 -0
- package/dist/core/src/services/catalog-client.d.ts.map +1 -0
- package/dist/core/src/services/catalog-client.js +42 -0
- package/dist/core/src/services/catalog-client.js.map +1 -0
- package/dist/core/src/services/error-handler.d.ts.map +1 -1
- package/dist/core/src/services/error-handler.js +27 -14
- package/dist/core/src/services/error-handler.js.map +1 -1
- package/dist/core/src/services/file-client.d.ts +33 -3
- package/dist/core/src/services/file-client.d.ts.map +1 -1
- package/dist/core/src/services/file-client.js +50 -19
- package/dist/core/src/services/file-client.js.map +1 -1
- package/dist/core/src/services/media-preview.d.ts +24 -0
- package/dist/core/src/services/media-preview.d.ts.map +1 -0
- package/dist/core/src/services/media-preview.js +156 -0
- package/dist/core/src/services/media-preview.js.map +1 -0
- package/dist/core/src/services/model-catalog.d.ts +6 -3
- package/dist/core/src/services/model-catalog.d.ts.map +1 -1
- package/dist/core/src/services/model-catalog.js +38 -16
- package/dist/core/src/services/model-catalog.js.map +1 -1
- package/dist/core/src/services/param-validator.d.ts.map +1 -1
- package/dist/core/src/services/param-validator.js +36 -0
- package/dist/core/src/services/param-validator.js.map +1 -1
- package/dist/core/src/services/preview-download.d.ts +11 -0
- package/dist/core/src/services/preview-download.d.ts.map +1 -0
- package/dist/core/src/services/preview-download.js +106 -0
- package/dist/core/src/services/preview-download.js.map +1 -0
- package/dist/core/src/services/pricing-client.d.ts +21 -3
- package/dist/core/src/services/pricing-client.d.ts.map +1 -1
- package/dist/core/src/services/pricing-client.js +86 -4
- package/dist/core/src/services/pricing-client.js.map +1 -1
- package/dist/core/src/services/upload-policy.d.ts +2 -0
- package/dist/core/src/services/upload-policy.d.ts.map +1 -1
- package/dist/core/src/services/upload-policy.js +8 -0
- package/dist/core/src/services/upload-policy.js.map +1 -1
- package/dist/core/src/services/upload-slots.d.ts +63 -0
- package/dist/core/src/services/upload-slots.d.ts.map +1 -0
- package/dist/core/src/services/upload-slots.js +24 -0
- package/dist/core/src/services/upload-slots.js.map +1 -0
- package/dist/core/src/services/utm.d.ts +29 -0
- package/dist/core/src/services/utm.d.ts.map +1 -0
- package/dist/core/src/services/utm.js +64 -0
- package/dist/core/src/services/utm.js.map +1 -0
- package/dist/core/src/tool-guidance.d.ts +6 -0
- package/dist/core/src/tool-guidance.d.ts.map +1 -0
- package/dist/core/src/tool-guidance.js +49 -0
- package/dist/core/src/tool-guidance.js.map +1 -0
- package/dist/core/src/tools/check-balance.d.ts.map +1 -1
- package/dist/core/src/tools/check-balance.js +13 -9
- package/dist/core/src/tools/check-balance.js.map +1 -1
- package/dist/core/src/tools/estimate-cost.d.ts.map +1 -1
- package/dist/core/src/tools/estimate-cost.js +18 -12
- package/dist/core/src/tools/estimate-cost.js.map +1 -1
- package/dist/core/src/tools/generate.d.ts.map +1 -1
- package/dist/core/src/tools/generate.js +67 -14
- package/dist/core/src/tools/generate.js.map +1 -1
- package/dist/core/src/tools/get-model.d.ts +2 -1
- package/dist/core/src/tools/get-model.d.ts.map +1 -1
- package/dist/core/src/tools/get-model.js +27 -7
- package/dist/core/src/tools/get-model.js.map +1 -1
- package/dist/core/src/tools/get-task.d.ts.map +1 -1
- package/dist/core/src/tools/get-task.js +3 -2
- package/dist/core/src/tools/get-task.js.map +1 -1
- package/dist/core/src/tools/list-tasks.d.ts.map +1 -1
- package/dist/core/src/tools/list-tasks.js +10 -3
- package/dist/core/src/tools/list-tasks.js.map +1 -1
- package/dist/core/src/tools/prepare-upload.d.ts +6 -0
- package/dist/core/src/tools/prepare-upload.d.ts.map +1 -0
- package/dist/core/src/tools/prepare-upload.js +134 -0
- package/dist/core/src/tools/prepare-upload.js.map +1 -0
- package/dist/core/src/tools/search-models.d.ts +2 -1
- package/dist/core/src/tools/search-models.d.ts.map +1 -1
- package/dist/core/src/tools/search-models.js +11 -5
- package/dist/core/src/tools/search-models.js.map +1 -1
- package/dist/core/src/tools/shared.d.ts +7 -2
- package/dist/core/src/tools/shared.d.ts.map +1 -1
- package/dist/core/src/tools/shared.js +12 -4
- package/dist/core/src/tools/shared.js.map +1 -1
- package/dist/core/src/tools/task-format.d.ts +16 -0
- package/dist/core/src/tools/task-format.d.ts.map +1 -1
- package/dist/core/src/tools/task-format.js +85 -11
- package/dist/core/src/tools/task-format.js.map +1 -1
- package/dist/core/src/tools/upload-file.d.ts +10 -0
- package/dist/core/src/tools/upload-file.d.ts.map +1 -1
- package/dist/core/src/tools/upload-file.js +36 -6
- package/dist/core/src/tools/upload-file.js.map +1 -1
- package/dist/core/src/version.d.ts +1 -1
- package/dist/core/src/version.js +1 -1
- package/dist/evolink-media/src/index.js +2 -0
- package/dist/evolink-media/src/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tasks.js","sourceRoot":"","sources":["../../../../../core/src/tools/list-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"list-tasks.js","sourceRoot":"","sources":["../../../../../core/src/tools/list-tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ServerConfig } from '../config.js';
|
|
3
|
+
import { type UploadSlots } from '../services/upload-slots.js';
|
|
4
|
+
/** prepare_upload and get_upload: signed-in hosted connections only (the service passes its slots). */
|
|
5
|
+
export declare function registerPrepareUpload(server: McpServer, config: ServerConfig, slots: UploadSlots): void;
|
|
6
|
+
//# sourceMappingURL=prepare-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-upload.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/prepare-upload.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAIjD,OAAO,EAAmD,KAAK,WAAW,EAAqB,MAAM,6BAA6B,CAAC;AAoBnI,uGAAuG;AACvG,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CA2EvG"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { currentRequestCredentials } from '../request-context.js';
|
|
3
|
+
import { requestUploadToken } from '../services/api-client.js';
|
|
4
|
+
import { mimeTypeForFileName, validateUploadDestination } from '../services/upload-policy.js';
|
|
5
|
+
import { ONE_TIME_UPLOAD_MAX_BYTES, UploadSlotsFullError } from '../services/upload-slots.js';
|
|
6
|
+
import { READ_ONLY, WRITES, errorResult, failure, ok } from './shared.js';
|
|
7
|
+
const SIGNED_IN_ONLY = 'One-time uploads are available only on signed-in EvoLink connections.';
|
|
8
|
+
const MAX_MB = Math.round(ONE_TIME_UPLOAD_MAX_BYTES / (1024 * 1024));
|
|
9
|
+
function iso(ms) {
|
|
10
|
+
return new Date(ms).toISOString();
|
|
11
|
+
}
|
|
12
|
+
function curlCommand(fileName, url) {
|
|
13
|
+
return `curl -sS -T '<path to ${fileName.replaceAll("'", '')}>' '${url}'`;
|
|
14
|
+
}
|
|
15
|
+
function slotsFull(error) {
|
|
16
|
+
return failure(`Upload refused: ${error.message}`, {
|
|
17
|
+
error: { category: 'rate_limited', message: error.message, retry_after_seconds: error.retryAfterSeconds },
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** prepare_upload and get_upload: signed-in hosted connections only (the service passes its slots). */
|
|
21
|
+
export function registerPrepareUpload(server, config, slots) {
|
|
22
|
+
server.registerTool('prepare_upload', {
|
|
23
|
+
title: 'Get a one-time upload address',
|
|
24
|
+
description: [
|
|
25
|
+
`For a file on the user's computer larger than 1 MB (up to ${MAX_MB} MB): returns a one-time upload address and a curl command that sends the file there.`,
|
|
26
|
+
'This service cannot read local paths itself. Run the command on the user\'s computer (Claude Code, Codex and Cursor can; web or desktop Claude and ChatGPT usually cannot, so ask for a public link instead),',
|
|
27
|
+
'then pass the file_url it prints to generate_*, or call get_upload with the upload_id.',
|
|
28
|
+
'The address works once and expires after 15 minutes. Free; files are deleted after 72 hours.',
|
|
29
|
+
'Formats: images JPEG, PNG, GIF, WebP; audio MP3, WAV, M4A, AAC, FLAC, OGG/Opus; video MP4, MOV, WebM.',
|
|
30
|
+
].join(' '),
|
|
31
|
+
inputSchema: {
|
|
32
|
+
file_name: z.string().describe('Name of the local file with its extension, e.g. photo.png; the extension decides the file type.'),
|
|
33
|
+
upload_path: z.string().optional().describe('Optional relative folder in EvoLink storage (no ..).'),
|
|
34
|
+
},
|
|
35
|
+
annotations: { title: 'Get a one-time upload address', ...WRITES },
|
|
36
|
+
}, async ({ file_name, upload_path }) => {
|
|
37
|
+
const owner = currentRequestCredentials()?.uploadOwner;
|
|
38
|
+
if (!owner)
|
|
39
|
+
return failure(SIGNED_IN_ONLY, { error: { category: 'invalid_request', message: SIGNED_IN_ONLY } });
|
|
40
|
+
let mimeType;
|
|
41
|
+
try {
|
|
42
|
+
validateUploadDestination(upload_path, file_name);
|
|
43
|
+
mimeType = mimeTypeForFileName(file_name);
|
|
44
|
+
// Checked before asking the gateway, so a refused request costs no upload token.
|
|
45
|
+
slots.ensureCapacity(owner);
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error instanceof UploadSlotsFullError)
|
|
49
|
+
return slotsFull(error);
|
|
50
|
+
const message = error instanceof Error ? error.message : 'the file was refused';
|
|
51
|
+
return failure(`Upload refused: ${message}`, { error: { category: 'invalid_request', message } });
|
|
52
|
+
}
|
|
53
|
+
let prepared;
|
|
54
|
+
try {
|
|
55
|
+
const token = await requestUploadToken(config, 'prepare_upload');
|
|
56
|
+
prepared = slots.create(owner, { fileName: file_name, mimeType, uploadPath: upload_path, token: token.token });
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof UploadSlotsFullError)
|
|
60
|
+
return slotsFull(error);
|
|
61
|
+
return errorResult(error);
|
|
62
|
+
}
|
|
63
|
+
const command = curlCommand(file_name, prepared.url);
|
|
64
|
+
return ok([
|
|
65
|
+
`One-time upload address ready: it works once, expires at ${iso(prepared.expiresAt)} (15 minutes), up to ${MAX_MB} MB.`,
|
|
66
|
+
`Run on the user's computer, with the real path of ${file_name}:`,
|
|
67
|
+
` ${command}`,
|
|
68
|
+
'When it finishes it prints the file_url; pass that to a generate tool.',
|
|
69
|
+
`If the output is lost, call get_upload with upload_id "${prepared.id}".`,
|
|
70
|
+
].join('\n'), {
|
|
71
|
+
upload_id: prepared.id,
|
|
72
|
+
upload_url: prepared.url,
|
|
73
|
+
method: 'PUT',
|
|
74
|
+
command,
|
|
75
|
+
file_name,
|
|
76
|
+
max_bytes: prepared.maxBytes,
|
|
77
|
+
expires_at: iso(prepared.expiresAt),
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
server.registerTool('get_upload', {
|
|
81
|
+
title: 'Check a one-time upload',
|
|
82
|
+
description: 'Shows whether the file sent to a prepare_upload address has arrived and returns its file_url for generate_*. Free.',
|
|
83
|
+
inputSchema: {
|
|
84
|
+
upload_id: z.string().describe('upload_id returned by prepare_upload.'),
|
|
85
|
+
},
|
|
86
|
+
annotations: { title: 'Check a one-time upload', ...READ_ONLY },
|
|
87
|
+
}, async ({ upload_id }) => {
|
|
88
|
+
const owner = currentRequestCredentials()?.uploadOwner;
|
|
89
|
+
if (!owner)
|
|
90
|
+
return failure(SIGNED_IN_ONLY, { error: { category: 'invalid_request', message: SIGNED_IN_ONLY } });
|
|
91
|
+
const status = slots.status(owner, upload_id.trim());
|
|
92
|
+
if (!status) {
|
|
93
|
+
const message = 'No upload with this upload_id (addresses expire after 15 minutes and results are kept for an hour).';
|
|
94
|
+
return failure(`${message} Call prepare_upload for a new address.`, { error: { category: 'not_found', message } });
|
|
95
|
+
}
|
|
96
|
+
return describeStatus(status);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
function describeStatus(status) {
|
|
100
|
+
const base = { upload_id: status.id, state: status.state, file_name: status.fileName };
|
|
101
|
+
switch (status.state) {
|
|
102
|
+
case 'waiting':
|
|
103
|
+
return ok([
|
|
104
|
+
`The file has not arrived yet; the address works until ${iso(status.expiresAt)}.`,
|
|
105
|
+
`Run on the user's computer: ${curlCommand(status.fileName, status.url ?? '')}`,
|
|
106
|
+
'Then call get_upload again.',
|
|
107
|
+
].join('\n'), { ...base, upload_url: status.url, expires_at: iso(status.expiresAt) });
|
|
108
|
+
case 'uploading':
|
|
109
|
+
return ok('The file is arriving. Call get_upload again in a few seconds.', base);
|
|
110
|
+
case 'done': {
|
|
111
|
+
const file = status.file;
|
|
112
|
+
const lines = ['File uploaded.', `File URL: ${file.file_url}`];
|
|
113
|
+
if (file.size_bytes !== undefined)
|
|
114
|
+
lines.push(`Size: ${(file.size_bytes / 1024).toFixed(1)} KB${file.mime_type ? ` · ${file.mime_type}` : ''}`);
|
|
115
|
+
if (file.expires_at)
|
|
116
|
+
lines.push(`Expires: ${file.expires_at}`);
|
|
117
|
+
lines.push('Next step: pass the File URL to a generate tool as input.');
|
|
118
|
+
return ok(lines.join('\n'), { ...base, ...file });
|
|
119
|
+
}
|
|
120
|
+
case 'failed': {
|
|
121
|
+
const message = status.error ?? 'the upload failed';
|
|
122
|
+
return failure(`The upload failed: ${message}\nNext step: call prepare_upload for a new address and run the command again.`, {
|
|
123
|
+
...base,
|
|
124
|
+
error: { category: 'invalid_request', message },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
case 'expired':
|
|
128
|
+
return failure('The address expired before a file arrived.\nNext step: call prepare_upload for a new address.', {
|
|
129
|
+
...base,
|
|
130
|
+
error: { category: 'not_found', message: 'The upload address expired.' },
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=prepare-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-upload.js","sourceRoot":"","sources":["../../../../../core/src/tools/prepare-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { ServerConfig } from '../config.js';
|
|
2
3
|
import { type CatalogEntry } from '../services/model-catalog.js';
|
|
3
4
|
export declare function modelTitle(entry: CatalogEntry): string | undefined;
|
|
4
|
-
export declare function registerSearchModels(server: McpServer): void;
|
|
5
|
+
export declare function registerSearchModels(server: McpServer, config: ServerConfig): void;
|
|
5
6
|
//# sourceMappingURL=search-models.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-models.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/search-models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-models.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/search-models.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAK9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAGlE;AAwBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CA0DlF"}
|
|
@@ -1,28 +1,33 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { loadCatalog } from '../services/model-catalog.js';
|
|
3
3
|
import { formatPrice, startingPrice } from '../services/pricing-client.js';
|
|
4
|
+
import { trackedLink } from '../services/utm.js';
|
|
4
5
|
import { READ_ONLY, errorResult, ok } from './shared.js';
|
|
5
6
|
export function modelTitle(entry) {
|
|
6
7
|
const title = entry.spec?.title?.replace(/\s+(interface|api)$/i, '').trim();
|
|
7
|
-
return title || entry.priced?.description?.slice(0, 120) || undefined;
|
|
8
|
+
return title || entry.title || entry.priced?.description?.slice(0, 120) || undefined;
|
|
8
9
|
}
|
|
9
10
|
/** Every term must appear somewhere; matches in the model ID count most. */
|
|
10
11
|
function score(entry, terms) {
|
|
11
12
|
if (terms.length === 0)
|
|
12
13
|
return 0;
|
|
13
14
|
const id = entry.id.toLowerCase();
|
|
15
|
+
const normalizedId = [id, ...(entry.aliases ?? [])].map(value => value.toLowerCase().replace(/[.\-_\s]/g, ''));
|
|
14
16
|
const haystack = [id, modelTitle(entry), entry.priced?.description, entry.priced?.vendor, entry.kind]
|
|
15
17
|
.filter(Boolean)
|
|
16
18
|
.join(' ')
|
|
17
19
|
.toLowerCase();
|
|
18
20
|
let total = 0;
|
|
19
21
|
for (const term of terms) {
|
|
22
|
+
const normalized = term.replace(/[.\-_]/g, '');
|
|
20
23
|
if (id === term)
|
|
21
24
|
total += 10;
|
|
22
25
|
else if (id.startsWith(term))
|
|
23
26
|
total += 6;
|
|
24
27
|
else if (id.includes(term))
|
|
25
28
|
total += 4;
|
|
29
|
+
else if (normalized && normalizedId.some(value => value.includes(normalized)))
|
|
30
|
+
total += 3;
|
|
26
31
|
else if (haystack.includes(term))
|
|
27
32
|
total += 1;
|
|
28
33
|
else
|
|
@@ -30,7 +35,7 @@ function score(entry, terms) {
|
|
|
30
35
|
}
|
|
31
36
|
return total;
|
|
32
37
|
}
|
|
33
|
-
export function registerSearchModels(server) {
|
|
38
|
+
export function registerSearchModels(server, config) {
|
|
34
39
|
server.registerTool('search_models', {
|
|
35
40
|
title: 'Search models',
|
|
36
41
|
description: [
|
|
@@ -46,7 +51,7 @@ export function registerSearchModels(server) {
|
|
|
46
51
|
annotations: { title: 'Search models', ...READ_ONLY },
|
|
47
52
|
}, async ({ type, query, limit }) => {
|
|
48
53
|
try {
|
|
49
|
-
const catalog = await loadCatalog();
|
|
54
|
+
const catalog = await loadCatalog(config);
|
|
50
55
|
const terms = (query ?? '').toLowerCase().split(/[\s,]+/).filter(Boolean);
|
|
51
56
|
const matches = catalog.entries
|
|
52
57
|
.filter(entry => type === 'all' || entry.kind === type)
|
|
@@ -56,12 +61,13 @@ export function registerSearchModels(server) {
|
|
|
56
61
|
const shown = matches.slice(0, limit ?? 20);
|
|
57
62
|
const models = shown.map(({ entry, start }) => ({
|
|
58
63
|
id: entry.id,
|
|
64
|
+
aliases: entry.aliases,
|
|
59
65
|
type: entry.kind,
|
|
60
66
|
title: modelTitle(entry),
|
|
61
67
|
from_usd: start?.min_usd,
|
|
62
68
|
from_unit: start?.unit,
|
|
63
69
|
parameters_documented: !!entry.spec,
|
|
64
|
-
docs: entry.spec
|
|
70
|
+
docs: entry.spec ? trackedLink(entry.spec.docs, 'model_docs') : undefined,
|
|
65
71
|
}));
|
|
66
72
|
const lines = [
|
|
67
73
|
`${matches.length} model${matches.length === 1 ? '' : 's'} match${terms.length ? ` "${query}"` : ''}${type !== 'all' ? ` (${type})` : ''}${matches.length > shown.length ? `; showing ${shown.length}` : ''}:`,
|
|
@@ -70,7 +76,7 @@ export function registerSearchModels(server) {
|
|
|
70
76
|
const title = modelTitle(entry);
|
|
71
77
|
if (title)
|
|
72
78
|
parts.push(title);
|
|
73
|
-
parts.push(start ? `from ${formatPrice(start)}` : '
|
|
79
|
+
parts.push(start ? `from ${formatPrice(start)}` : 'pricing data unavailable in this catalog');
|
|
74
80
|
if (!entry.spec)
|
|
75
81
|
parts.push('parameters not documented');
|
|
76
82
|
return parts.join(' · ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-models.js","sourceRoot":"","sources":["../../../../../core/src/tools/search-models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"search-models.js","sourceRoot":"","sources":["../../../../../core/src/tools/search-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
-
import type { CallToolResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { CallToolResult, ResourceLink, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
3
|
import { type CreditsResponse } from '../services/api-client.js';
|
|
4
4
|
export type ToolExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;
|
|
5
5
|
/** Free lookups: clients can run them without asking. */
|
|
@@ -23,8 +23,11 @@ export declare const WRITES: {
|
|
|
23
23
|
readonly idempotentHint: false;
|
|
24
24
|
readonly openWorldHint: false;
|
|
25
25
|
};
|
|
26
|
+
/** The media_seconds argument of estimate_cost and the generate tools. */
|
|
27
|
+
export declare const MEDIA_SECONDS_MAX = 3600;
|
|
28
|
+
export declare const MEDIA_SECONDS_DESCRIPTION = "Only for models billed per second that have no duration parameter (get_model explains which length is billed): usually the input video or audio length; for generated audio with unknown duration, only an expected output length for an illustrative estimate. It is not sent to the model, and EvoLink charges by the measured duration. It cannot establish max_cost_usd for unknown output duration or for per-second video requests with video_urls, video_url or source_task_id, whose billing is not fully covered by published prices.";
|
|
26
29
|
/** Text and structured content carry the same facts: some clients show the model only one of them. */
|
|
27
|
-
export declare function ok(text: string, structured: Record<string, unknown
|
|
30
|
+
export declare function ok(text: string, structured: Record<string, unknown>, resources?: ResourceLink[]): CallToolResult;
|
|
28
31
|
export declare function failure(text: string, structured: Record<string, unknown>): CallToolResult;
|
|
29
32
|
export declare function money(credits: number | undefined): string | undefined;
|
|
30
33
|
export interface DailyLimit {
|
|
@@ -41,6 +44,8 @@ export interface ErrorContext {
|
|
|
41
44
|
paid?: boolean;
|
|
42
45
|
/** Idempotency key the paid call used; repeating it cannot create a second task once the gateway ledger is live. */
|
|
43
46
|
clientRequestId?: string;
|
|
47
|
+
/** The call was an upload, which may still finish after a timeout and is safe to repeat. */
|
|
48
|
+
upload?: boolean;
|
|
44
49
|
}
|
|
45
50
|
/** Converts a thrown error into a tool error with a category and a concrete next step. */
|
|
46
51
|
export declare function errorResult(error: unknown, context?: ErrorContext): CallToolResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAE1H,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAK/E,MAAM,MAAM,SAAS,GAAG,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,CAAC;AAE/E,yDAAyD;AACzD,eAAO,MAAM,SAAS;;;;;CAAsG,CAAC;AAC7H,qFAAqF;AACrF,eAAO,MAAM,IAAI;;;;;CAAuG,CAAC;AACzH,6DAA6D;AAC7D,eAAO,MAAM,MAAM;;;;;CAAwG,CAAC;AAE5H,0EAA0E;AAC1E,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AACvC,eAAO,MAAM,yBAAyB,mhBAAmhB,CAAC;AAE1jB,sGAAsG;AACtG,wBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAE,YAAY,EAAO,GAAG,cAAc,CAEpH;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc,CAEzF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAExF,sGAAsG;AACtG,wBAAgB,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,GAAG,UAAU,GAAG,SAAS,CAOpF;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAGrE;AAED,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oHAAoH;IACpH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAiCD,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,YAAiB,GAAG,cAAc,CA6BtF;AAED,0FAA0F;AAC1F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAY/I;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrE"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { processCredentialsAllowed } from '../request-context.js';
|
|
2
2
|
import { ApiHttpError } from '../services/api-client.js';
|
|
3
3
|
import { CREDITS_PER_USD, formatCredits, formatUsd } from '../services/error-handler.js';
|
|
4
|
-
import { PaidRequestOutcomeUnknownError, RequestTimeoutError } from '../services/http-policy.js';
|
|
4
|
+
import { API_KEYS_URL, PaidRequestOutcomeUnknownError, RequestTimeoutError } from '../services/http-policy.js';
|
|
5
|
+
import { trackedLink } from '../services/utm.js';
|
|
5
6
|
/** Free lookups: clients can run them without asking. */
|
|
6
7
|
export const READ_ONLY = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
7
8
|
/** Spends the user's balance and cannot be undone: clients ask before running it. */
|
|
8
9
|
export const PAID = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false };
|
|
9
10
|
/** Changes stored state without spending money (uploads). */
|
|
10
11
|
export const WRITES = { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false };
|
|
12
|
+
/** The media_seconds argument of estimate_cost and the generate tools. */
|
|
13
|
+
export const MEDIA_SECONDS_MAX = 3_600;
|
|
14
|
+
export const MEDIA_SECONDS_DESCRIPTION = 'Only for models billed per second that have no duration parameter (get_model explains which length is billed): usually the input video or audio length; for generated audio with unknown duration, only an expected output length for an illustrative estimate. It is not sent to the model, and EvoLink charges by the measured duration. It cannot establish max_cost_usd for unknown output duration or for per-second video requests with video_urls, video_url or source_task_id, whose billing is not fully covered by published prices.';
|
|
11
15
|
/** Text and structured content carry the same facts: some clients show the model only one of them. */
|
|
12
|
-
export function ok(text, structured) {
|
|
13
|
-
return { content: [{ type: 'text', text }], structuredContent: { ok: true, ...structured } };
|
|
16
|
+
export function ok(text, structured, resources = []) {
|
|
17
|
+
return { content: [{ type: 'text', text }, ...resources], structuredContent: { ok: true, ...structured } };
|
|
14
18
|
}
|
|
15
19
|
export function failure(text, structured) {
|
|
16
20
|
return { content: [{ type: 'text', text }], structuredContent: { ok: false, ...structured }, isError: true };
|
|
@@ -61,7 +65,7 @@ function infoFor(error) {
|
|
|
61
65
|
category: 'unauthorized',
|
|
62
66
|
message,
|
|
63
67
|
next_step: processCredentialsAllowed()
|
|
64
|
-
?
|
|
68
|
+
? `Set EVOLINK_API_KEY (create a key at ${trackedLink(API_KEYS_URL, 'api_keys')}), or run \`evolink login\`.`
|
|
65
69
|
: 'Ask the user to reconnect EvoLink in this client. If it keeps failing, retry in a few minutes.',
|
|
66
70
|
retryable: false,
|
|
67
71
|
};
|
|
@@ -86,6 +90,10 @@ export function errorResult(error, context = {}) {
|
|
|
86
90
|
lines.push('Nothing was submitted or charged.');
|
|
87
91
|
}
|
|
88
92
|
}
|
|
93
|
+
// No HTTP status: the request timed out or the connection dropped, so the upload's outcome is unknown.
|
|
94
|
+
if (context.upload && info.category === 'server_error' && !info.status) {
|
|
95
|
+
lines.push('The upload may not have finished. Calling upload_file again is safe.');
|
|
96
|
+
}
|
|
89
97
|
if (info.headline)
|
|
90
98
|
lines.push(`Error: ${label}`);
|
|
91
99
|
if (info.request_id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../core/src/tools/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,YAAY,EAAwB,MAAM,2BAA2B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAyB,MAAM,8BAA8B,CAAC;AAChH,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../core/src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,32 @@
|
|
|
1
|
+
import type { ResourceLink } from '@modelcontextprotocol/sdk/types.js';
|
|
1
2
|
import type { ServerConfig } from '../config.js';
|
|
2
3
|
import { type TaskResponse } from '../services/api-client.js';
|
|
3
4
|
/** Result links from the gateway stay downloadable for this long. */
|
|
4
5
|
export declare const RESULT_LINK_HOURS = 24;
|
|
6
|
+
/** Generation permission does not also authorize the assistant to alter the output. */
|
|
7
|
+
export declare const RESULT_DELIVERY_INSTRUCTIONS: string;
|
|
8
|
+
/** Compact tool description; the full contract is sent in server instructions and completed results. */
|
|
9
|
+
export declare const RESULT_DELIVERY_GUIDANCE = "On completion, promptly deliver original links with the 24-hour expiry and delivery_markdown. Edit only when the user explicitly requests or authorizes post-processing. Keep original links alongside optional embedded MCP thumbnails; do not add remote-image Markdown or use image syntax for video/audio.";
|
|
5
10
|
export declare const TERMINAL_STATUSES: Set<string>;
|
|
6
11
|
export interface TaskResultLink {
|
|
7
12
|
url: string;
|
|
8
13
|
kind: 'image' | 'video' | 'audio' | 'file';
|
|
9
14
|
}
|
|
10
15
|
export declare function resultLinks(task: TaskResponse): TaskResultLink[];
|
|
16
|
+
/** Typed links complement the text fallback; they do not guarantee a client preview.
|
|
17
|
+
* Never fetch or transform media here, and never wrap a video URL in ImageContent.
|
|
18
|
+
* Unknown extensions deliberately omit MIME instead of guessing a container.
|
|
19
|
+
*/
|
|
20
|
+
export declare function resultResources(taskId: string, links: TaskResultLink[]): ResourceLink[];
|
|
21
|
+
/** A ready-to-send reply avoids triggering a client's remote-image fallback by default.
|
|
22
|
+
* Angle brackets keep parentheses in signed URLs inside the link destination.
|
|
23
|
+
* Resource URIs remain untouched; encode only characters unsafe in a Markdown destination.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resultDeliveryMarkdown(taskId: string, links: TaskResultLink[]): string;
|
|
11
26
|
export interface TaskView {
|
|
12
27
|
lines: string[];
|
|
13
28
|
structured: Record<string, unknown>;
|
|
29
|
+
resources: ResourceLink[];
|
|
14
30
|
}
|
|
15
31
|
/** One task as text lines and the same facts as structured content. */
|
|
16
32
|
export declare function describeTask(task: TaskResponse): TaskView;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-format.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/task-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9F,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,eAAO,MAAM,iBAAiB,aAAgD,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CAC5C;
|
|
1
|
+
{"version":3,"file":"task-format.d.ts","sourceRoot":"","sources":["../../../../../core/src/tools/task-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAkC,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAI9F,qEAAqE;AACrE,eAAO,MAAM,iBAAiB,KAAK,CAAC;AAEpC,uFAAuF;AACvF,eAAO,MAAM,4BAA4B,QAO9B,CAAC;AAEZ,wGAAwG;AACxG,eAAO,MAAM,wBAAwB,mTAAmT,CAAC;AAEzV,eAAO,MAAM,iBAAiB,aAAgD,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;CAC5C;AAyCD,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,EAAE,CAiBhE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,YAAY,EAAE,CAWvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAStF;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAsEzD;AAID,wDAAwD;AACxD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEpE;AAED,oGAAoG;AACpG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAK/D;AAED,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,+EAA+E;IAC/E,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,wFAAwF;AACxF,wBAAsB,WAAW,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAWnH"}
|
|
@@ -3,15 +3,52 @@ import { getTaskErrorInfo } from '../services/error-handler.js';
|
|
|
3
3
|
import { money, sleep, usdOf } from './shared.js';
|
|
4
4
|
/** Result links from the gateway stay downloadable for this long. */
|
|
5
5
|
export const RESULT_LINK_HOURS = 24;
|
|
6
|
+
/** Generation permission does not also authorize the assistant to alter the output. */
|
|
7
|
+
export const RESULT_DELIVERY_INSTRUCTIONS = [
|
|
8
|
+
'Deliver the original EvoLink result links immediately on completion, with clear view/download labels and the 24-hour expiry notice. Use delivery_markdown as the primary reply when supplied.',
|
|
9
|
+
'Do not delay delivery for inspection or post-processing. A generation request alone does not authorize local editing, compositing, repair or re-encoding; do that only when the user explicitly requests or authorizes post-processing.',
|
|
10
|
+
'Report quality issues and offer options. Keep the original links and label any authorized edited version separately.',
|
|
11
|
+
'Default to ordinary Markdown links for all media, including images; do not automatically add inline remote images or thumbnail placeholders. Only add an image preview when the user requests it and a supported working client preview route is available; otherwise keep the links.',
|
|
12
|
+
'The server may supply small embedded MCP image thumbnails or video cover frames alongside the original links. These optional previews are not edited replacements; let the client display them and keep delivery_markdown and the original download links in the reply. Do not turn preview metadata into remote Markdown images.',
|
|
13
|
+
'Use ordinary Markdown links for video/audio, never image syntax for a video URL. Inline previews depend on the client; do not promise them.',
|
|
14
|
+
].join(' ');
|
|
15
|
+
/** Compact tool description; the full contract is sent in server instructions and completed results. */
|
|
16
|
+
export const RESULT_DELIVERY_GUIDANCE = 'On completion, promptly deliver original links with the 24-hour expiry and delivery_markdown. Edit only when the user explicitly requests or authorizes post-processing. Keep original links alongside optional embedded MCP thumbnails; do not add remote-image Markdown or use image syntax for video/audio.';
|
|
6
17
|
export const TERMINAL_STATUSES = new Set(['completed', 'failed', 'cancelled']);
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
const MEDIA_EXTENSIONS = {
|
|
19
|
+
png: { kind: 'image', mimeType: 'image/png' },
|
|
20
|
+
jpg: { kind: 'image', mimeType: 'image/jpeg' },
|
|
21
|
+
jpeg: { kind: 'image', mimeType: 'image/jpeg' },
|
|
22
|
+
webp: { kind: 'image', mimeType: 'image/webp' },
|
|
23
|
+
gif: { kind: 'image', mimeType: 'image/gif' },
|
|
24
|
+
bmp: { kind: 'image', mimeType: 'image/bmp' },
|
|
25
|
+
mp4: { kind: 'video', mimeType: 'video/mp4' },
|
|
26
|
+
mov: { kind: 'video', mimeType: 'video/quicktime' },
|
|
27
|
+
webm: { kind: 'video', mimeType: 'video/webm' },
|
|
28
|
+
m4v: { kind: 'video', mimeType: 'video/x-m4v' },
|
|
29
|
+
mp3: { kind: 'audio', mimeType: 'audio/mpeg' },
|
|
30
|
+
wav: { kind: 'audio', mimeType: 'audio/wav' },
|
|
31
|
+
m4a: { kind: 'audio', mimeType: 'audio/mp4' },
|
|
32
|
+
flac: { kind: 'audio', mimeType: 'audio/flac' },
|
|
33
|
+
ogg: { kind: 'audio', mimeType: 'audio/ogg' },
|
|
34
|
+
aac: { kind: 'audio', mimeType: 'audio/aac' },
|
|
35
|
+
};
|
|
36
|
+
/** Infer metadata from the path only: a signed query or fragment is not a file extension. */
|
|
37
|
+
function mediaOfUrl(url) {
|
|
38
|
+
try {
|
|
39
|
+
const extension = /\.([a-z0-9]+)$/i.exec(new URL(url).pathname)?.[1].toLowerCase();
|
|
40
|
+
return extension && Object.prototype.hasOwnProperty.call(MEDIA_EXTENSIONS, extension) ? MEDIA_EXTENSIONS[extension] : undefined;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function kindOfUrl(url, taskType, hint) {
|
|
47
|
+
const media = mediaOfUrl(url);
|
|
48
|
+
if (media)
|
|
49
|
+
return media.kind;
|
|
50
|
+
if (hint)
|
|
51
|
+
return hint;
|
|
15
52
|
if (taskType.includes('image'))
|
|
16
53
|
return 'image';
|
|
17
54
|
if (taskType.includes('video'))
|
|
@@ -27,7 +64,7 @@ export function resultLinks(task) {
|
|
|
27
64
|
if (typeof url !== 'string' || !/^https?:\/\//.test(url) || seen.has(url))
|
|
28
65
|
return;
|
|
29
66
|
seen.add(url);
|
|
30
|
-
links.push({ url, kind:
|
|
67
|
+
links.push({ url, kind: kindOfUrl(url, task.type ?? '', kind) });
|
|
31
68
|
};
|
|
32
69
|
for (const url of task.results ?? [])
|
|
33
70
|
add(url);
|
|
@@ -40,6 +77,36 @@ export function resultLinks(task) {
|
|
|
40
77
|
}
|
|
41
78
|
return links;
|
|
42
79
|
}
|
|
80
|
+
/** Typed links complement the text fallback; they do not guarantee a client preview.
|
|
81
|
+
* Never fetch or transform media here, and never wrap a video URL in ImageContent.
|
|
82
|
+
* Unknown extensions deliberately omit MIME instead of guessing a container.
|
|
83
|
+
*/
|
|
84
|
+
export function resultResources(taskId, links) {
|
|
85
|
+
return links.map((link, index) => {
|
|
86
|
+
const media = mediaOfUrl(link.url);
|
|
87
|
+
return {
|
|
88
|
+
type: 'resource_link',
|
|
89
|
+
uri: link.url,
|
|
90
|
+
name: `View/download original ${link.kind} ${index + 1} (${taskId})`,
|
|
91
|
+
description: `Original EvoLink generated ${link.kind}. View or download; result links expire after ${RESULT_LINK_HOURS} hours. Inline preview depends on the client.`,
|
|
92
|
+
...(media ? { mimeType: media.mimeType } : {}),
|
|
93
|
+
};
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** A ready-to-send reply avoids triggering a client's remote-image fallback by default.
|
|
97
|
+
* Angle brackets keep parentheses in signed URLs inside the link destination.
|
|
98
|
+
* Resource URIs remain untouched; encode only characters unsafe in a Markdown destination.
|
|
99
|
+
*/
|
|
100
|
+
export function resultDeliveryMarkdown(taskId, links) {
|
|
101
|
+
return [
|
|
102
|
+
`EvoLink task ${taskId} completed.`,
|
|
103
|
+
...links.map((link, index) => {
|
|
104
|
+
const destination = link.url.replace(/[\u0000-\u0020<>\\]/g, char => encodeURIComponent(char));
|
|
105
|
+
return `[View/download original ${link.kind} ${index + 1}](<${destination}>)`;
|
|
106
|
+
}),
|
|
107
|
+
`Result links expire after ${RESULT_LINK_HOURS} hours; save them promptly.`,
|
|
108
|
+
].join('\n\n');
|
|
109
|
+
}
|
|
43
110
|
/** One task as text lines and the same facts as structured content. */
|
|
44
111
|
export function describeTask(task) {
|
|
45
112
|
const status = task.status ?? 'pending';
|
|
@@ -89,7 +156,14 @@ export function describeTask(task) {
|
|
|
89
156
|
structured.refunded = true;
|
|
90
157
|
}
|
|
91
158
|
else if (status === 'completed') {
|
|
92
|
-
|
|
159
|
+
if (links.length > 0) {
|
|
160
|
+
const delivery = resultDeliveryMarkdown(task.id, links);
|
|
161
|
+
structured.delivery_markdown = delivery;
|
|
162
|
+
lines.push(`Suggested reply (plain links; no automatic inline previews):\n${delivery}`);
|
|
163
|
+
}
|
|
164
|
+
lines.push(links.length > 0
|
|
165
|
+
? `Next step: ${RESULT_DELIVERY_INSTRUCTIONS}`
|
|
166
|
+
: 'Next step: the task completed but returned no result links. Tell the user; use get_task or list_tasks to recover them. Do not generate again automatically.');
|
|
93
167
|
}
|
|
94
168
|
else {
|
|
95
169
|
const eta = task.task_info?.estimated_time;
|
|
@@ -103,7 +177,7 @@ export function describeTask(task) {
|
|
|
103
177
|
lines.push(`Request ID: ${task.request_id}`);
|
|
104
178
|
structured.request_id = task.request_id;
|
|
105
179
|
}
|
|
106
|
-
return { lines, structured };
|
|
180
|
+
return { lines, structured, resources: resultResources(task.id, links) };
|
|
107
181
|
}
|
|
108
182
|
let pollIntervalOverrideMs;
|
|
109
183
|
/** Tests only: shorten the pause between task reads. */
|