@evolinkai/mcp 0.0.0-stage → 1.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.
- package/LICENSE +178 -0
- package/README.md +67 -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 +19 -0
- package/dist/core/src/config.d.ts.map +1 -0
- package/dist/core/src/config.js +90 -0
- package/dist/core/src/config.js.map +1 -0
- package/dist/core/src/data/model-params.d.ts +49 -0
- package/dist/core/src/data/model-params.d.ts.map +1 -0
- package/dist/core/src/data/model-params.generated.d.ts +2 -0
- package/dist/core/src/data/model-params.generated.d.ts.map +1 -0
- package/dist/core/src/data/model-params.generated.js +3 -0
- package/dist/core/src/data/model-params.generated.js.map +1 -0
- package/dist/core/src/data/model-params.js +22 -0
- package/dist/core/src/data/model-params.js.map +1 -0
- package/dist/core/src/request-context.d.ts +79 -0
- package/dist/core/src/request-context.d.ts.map +1 -0
- package/dist/core/src/request-context.js +52 -0
- package/dist/core/src/request-context.js.map +1 -0
- package/dist/core/src/server.d.ts +36 -0
- package/dist/core/src/server.d.ts.map +1 -0
- package/dist/core/src/server.js +123 -0
- package/dist/core/src/server.js.map +1 -0
- package/dist/core/src/services/api-client.d.ts +142 -0
- package/dist/core/src/services/api-client.d.ts.map +1 -0
- package/dist/core/src/services/api-client.js +179 -0
- package/dist/core/src/services/api-client.js.map +1 -0
- package/dist/core/src/services/error-handler.d.ts +51 -0
- package/dist/core/src/services/error-handler.d.ts.map +1 -0
- package/dist/core/src/services/error-handler.js +403 -0
- package/dist/core/src/services/error-handler.js.map +1 -0
- package/dist/core/src/services/file-client.d.ts +54 -0
- package/dist/core/src/services/file-client.d.ts.map +1 -0
- package/dist/core/src/services/file-client.js +131 -0
- package/dist/core/src/services/file-client.js.map +1 -0
- package/dist/core/src/services/http-policy.d.ts +40 -0
- package/dist/core/src/services/http-policy.d.ts.map +1 -0
- package/dist/core/src/services/http-policy.js +120 -0
- package/dist/core/src/services/http-policy.js.map +1 -0
- 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 +155 -0
- package/dist/core/src/services/media-preview.js.map +1 -0
- package/dist/core/src/services/model-catalog.d.ts +24 -0
- package/dist/core/src/services/model-catalog.d.ts.map +1 -0
- package/dist/core/src/services/model-catalog.js +45 -0
- package/dist/core/src/services/model-catalog.js.map +1 -0
- package/dist/core/src/services/param-validator.d.ts +21 -0
- package/dist/core/src/services/param-validator.d.ts.map +1 -0
- package/dist/core/src/services/param-validator.js +164 -0
- package/dist/core/src/services/param-validator.js.map +1 -0
- 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 +95 -0
- package/dist/core/src/services/pricing-client.d.ts.map +1 -0
- package/dist/core/src/services/pricing-client.js +396 -0
- package/dist/core/src/services/pricing-client.js.map +1 -0
- package/dist/core/src/services/upload-policy.d.ts +19 -0
- package/dist/core/src/services/upload-policy.d.ts.map +1 -0
- package/dist/core/src/services/upload-policy.js +168 -0
- package/dist/core/src/services/upload-policy.js.map +1 -0
- 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 +4 -0
- package/dist/core/src/tools/check-balance.d.ts.map +1 -0
- package/dist/core/src/tools/check-balance.js +82 -0
- package/dist/core/src/tools/check-balance.js.map +1 -0
- package/dist/core/src/tools/estimate-cost.d.ts +4 -0
- package/dist/core/src/tools/estimate-cost.d.ts.map +1 -0
- package/dist/core/src/tools/estimate-cost.js +131 -0
- package/dist/core/src/tools/estimate-cost.js.map +1 -0
- package/dist/core/src/tools/generate.d.ts +4 -0
- package/dist/core/src/tools/generate.d.ts.map +1 -0
- package/dist/core/src/tools/generate.js +221 -0
- package/dist/core/src/tools/generate.js.map +1 -0
- package/dist/core/src/tools/get-model.d.ts +5 -0
- package/dist/core/src/tools/get-model.d.ts.map +1 -0
- package/dist/core/src/tools/get-model.js +117 -0
- package/dist/core/src/tools/get-model.js.map +1 -0
- package/dist/core/src/tools/get-task.d.ts +7 -0
- package/dist/core/src/tools/get-task.d.ts.map +1 -0
- package/dist/core/src/tools/get-task.js +56 -0
- package/dist/core/src/tools/get-task.js.map +1 -0
- package/dist/core/src/tools/list-tasks.d.ts +6 -0
- package/dist/core/src/tools/list-tasks.d.ts.map +1 -0
- package/dist/core/src/tools/list-tasks.js +149 -0
- package/dist/core/src/tools/list-tasks.js.map +1 -0
- 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 +5 -0
- package/dist/core/src/tools/search-models.d.ts.map +1 -0
- package/dist/core/src/tools/search-models.js +97 -0
- package/dist/core/src/tools/search-models.js.map +1 -0
- package/dist/core/src/tools/shared.d.ts +55 -0
- package/dist/core/src/tools/shared.d.ts.map +1 -0
- package/dist/core/src/tools/shared.js +137 -0
- package/dist/core/src/tools/shared.js.map +1 -0
- package/dist/core/src/tools/task-format.d.ts +48 -0
- package/dist/core/src/tools/task-format.d.ts.map +1 -0
- package/dist/core/src/tools/task-format.js +212 -0
- package/dist/core/src/tools/task-format.js.map +1 -0
- package/dist/core/src/tools/upload-file.d.ts +17 -0
- package/dist/core/src/tools/upload-file.d.ts.map +1 -0
- package/dist/core/src/tools/upload-file.js +134 -0
- package/dist/core/src/tools/upload-file.js.map +1 -0
- package/dist/core/src/version.d.ts +3 -0
- package/dist/core/src/version.d.ts.map +1 -0
- package/dist/core/src/version.js +3 -0
- package/dist/core/src/version.js.map +1 -0
- package/dist/evolink-media/src/index.d.ts +3 -0
- package/dist/evolink-media/src/index.d.ts.map +1 -0
- package/dist/evolink-media/src/index.js +18 -0
- package/dist/evolink-media/src/index.js.map +1 -0
- package/package.json +46 -4
|
@@ -0,0 +1 @@
|
|
|
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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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { type CatalogEntry } from '../services/model-catalog.js';
|
|
3
|
+
export declare function modelTitle(entry: CatalogEntry): string | undefined;
|
|
4
|
+
export declare function registerSearchModels(server: McpServer): void;
|
|
5
|
+
//# sourceMappingURL=search-models.d.ts.map
|
|
@@ -0,0 +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;AAK9E,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAGlE;AAqBD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyD5D"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { loadCatalog } from '../services/model-catalog.js';
|
|
3
|
+
import { formatPrice, startingPrice } from '../services/pricing-client.js';
|
|
4
|
+
import { trackedLink } from '../services/utm.js';
|
|
5
|
+
import { READ_ONLY, errorResult, ok } from './shared.js';
|
|
6
|
+
export function modelTitle(entry) {
|
|
7
|
+
const title = entry.spec?.title?.replace(/\s+(interface|api)$/i, '').trim();
|
|
8
|
+
return title || entry.priced?.description?.slice(0, 120) || undefined;
|
|
9
|
+
}
|
|
10
|
+
/** Every term must appear somewhere; matches in the model ID count most. */
|
|
11
|
+
function score(entry, terms) {
|
|
12
|
+
if (terms.length === 0)
|
|
13
|
+
return 0;
|
|
14
|
+
const id = entry.id.toLowerCase();
|
|
15
|
+
const haystack = [id, modelTitle(entry), entry.priced?.description, entry.priced?.vendor, entry.kind]
|
|
16
|
+
.filter(Boolean)
|
|
17
|
+
.join(' ')
|
|
18
|
+
.toLowerCase();
|
|
19
|
+
let total = 0;
|
|
20
|
+
for (const term of terms) {
|
|
21
|
+
if (id === term)
|
|
22
|
+
total += 10;
|
|
23
|
+
else if (id.startsWith(term))
|
|
24
|
+
total += 6;
|
|
25
|
+
else if (id.includes(term))
|
|
26
|
+
total += 4;
|
|
27
|
+
else if (haystack.includes(term))
|
|
28
|
+
total += 1;
|
|
29
|
+
else
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
return total;
|
|
33
|
+
}
|
|
34
|
+
export function registerSearchModels(server) {
|
|
35
|
+
server.registerTool('search_models', {
|
|
36
|
+
title: 'Search models',
|
|
37
|
+
description: [
|
|
38
|
+
'Find EvoLink image, video and audio models by type and keywords. Free.',
|
|
39
|
+
'Returns model IDs with a starting price; call get_model for a model\'s parameters and full pricing before generating.',
|
|
40
|
+
'Prices are in USD (68 credits ≈ $1).',
|
|
41
|
+
].join(' '),
|
|
42
|
+
inputSchema: {
|
|
43
|
+
type: z.enum(['image', 'video', 'audio', 'all']).default('all').describe('Kind of output to look for.'),
|
|
44
|
+
query: z.string().max(100).optional().describe('Keywords, e.g. "seedance", "image-to-video", "kling", "music".'),
|
|
45
|
+
limit: z.number().int().min(1).max(50).default(20).describe('Maximum number of models to return (1–50, default 20).'),
|
|
46
|
+
},
|
|
47
|
+
annotations: { title: 'Search models', ...READ_ONLY },
|
|
48
|
+
}, async ({ type, query, limit }) => {
|
|
49
|
+
try {
|
|
50
|
+
const catalog = await loadCatalog();
|
|
51
|
+
const terms = (query ?? '').toLowerCase().split(/[\s,]+/).filter(Boolean);
|
|
52
|
+
const matches = catalog.entries
|
|
53
|
+
.filter(entry => type === 'all' || entry.kind === type)
|
|
54
|
+
.map(entry => ({ entry, score: score(entry, terms), start: entry.priced ? startingPrice(entry.priced) : undefined }))
|
|
55
|
+
.filter((item) => item.score !== undefined)
|
|
56
|
+
.sort((a, b) => b.score - a.score || Number(!!b.start) - Number(!!a.start) || a.entry.id.localeCompare(b.entry.id));
|
|
57
|
+
const shown = matches.slice(0, limit ?? 20);
|
|
58
|
+
const models = shown.map(({ entry, start }) => ({
|
|
59
|
+
id: entry.id,
|
|
60
|
+
type: entry.kind,
|
|
61
|
+
title: modelTitle(entry),
|
|
62
|
+
from_usd: start?.min_usd,
|
|
63
|
+
from_unit: start?.unit,
|
|
64
|
+
parameters_documented: !!entry.spec,
|
|
65
|
+
docs: entry.spec ? trackedLink(entry.spec.docs, 'model_docs') : undefined,
|
|
66
|
+
}));
|
|
67
|
+
const lines = [
|
|
68
|
+
`${matches.length} model${matches.length === 1 ? '' : 's'} match${terms.length ? ` "${query}"` : ''}${type !== 'all' ? ` (${type})` : ''}${matches.length > shown.length ? `; showing ${shown.length}` : ''}:`,
|
|
69
|
+
...shown.map(({ entry, start }) => {
|
|
70
|
+
const parts = [`- ${entry.id} [${entry.kind}]`];
|
|
71
|
+
const title = modelTitle(entry);
|
|
72
|
+
if (title)
|
|
73
|
+
parts.push(title);
|
|
74
|
+
parts.push(start ? `from ${formatPrice(start)}` : 'price not published');
|
|
75
|
+
if (!entry.spec)
|
|
76
|
+
parts.push('parameters not documented');
|
|
77
|
+
return parts.join(' · ');
|
|
78
|
+
}),
|
|
79
|
+
];
|
|
80
|
+
if (matches.length === 0)
|
|
81
|
+
lines.push('No model matched. Try fewer or broader keywords, or type "all".');
|
|
82
|
+
else
|
|
83
|
+
lines.push('', 'Next: get_model with one of these IDs for its parameters and pricing.');
|
|
84
|
+
if (catalog.pricingWarning)
|
|
85
|
+
lines.push(`Note: ${catalog.pricingWarning}`);
|
|
86
|
+
return ok(lines.join('\n'), {
|
|
87
|
+
models,
|
|
88
|
+
total_matches: matches.length,
|
|
89
|
+
...(catalog.pricingWarning ? { pricing_warning: catalog.pricingWarning } : {}),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return errorResult(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=search-models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-models.js","sourceRoot":"","sources":["../../../../../core/src/tools/search-models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
|
|
2
|
+
import type { CallToolResult, ResourceLink, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { type CreditsResponse } from '../services/api-client.js';
|
|
4
|
+
export type ToolExtra = RequestHandlerExtra<ServerRequest, ServerNotification>;
|
|
5
|
+
/** Free lookups: clients can run them without asking. */
|
|
6
|
+
export declare const READ_ONLY: {
|
|
7
|
+
readonly readOnlyHint: true;
|
|
8
|
+
readonly destructiveHint: false;
|
|
9
|
+
readonly idempotentHint: true;
|
|
10
|
+
readonly openWorldHint: false;
|
|
11
|
+
};
|
|
12
|
+
/** Spends the user's balance and cannot be undone: clients ask before running it. */
|
|
13
|
+
export declare const PAID: {
|
|
14
|
+
readonly readOnlyHint: false;
|
|
15
|
+
readonly destructiveHint: true;
|
|
16
|
+
readonly idempotentHint: false;
|
|
17
|
+
readonly openWorldHint: false;
|
|
18
|
+
};
|
|
19
|
+
/** Changes stored state without spending money (uploads). */
|
|
20
|
+
export declare const WRITES: {
|
|
21
|
+
readonly readOnlyHint: false;
|
|
22
|
+
readonly destructiveHint: false;
|
|
23
|
+
readonly idempotentHint: false;
|
|
24
|
+
readonly openWorldHint: false;
|
|
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 (upscaling, video editing, motion control, lip sync and similar; get_model says so): the length in seconds the charge is based on, usually that of the input video or audio. Used only for the cost estimate and the max_cost_usd check; it is not sent to the model, and EvoLink charges by what it measures itself. It cannot enable a cap for per-second video requests with video_urls, video_url or source_task_id because their billing is not fully covered by published prices.";
|
|
29
|
+
/** Text and structured content carry the same facts: some clients show the model only one of them. */
|
|
30
|
+
export declare function ok(text: string, structured: Record<string, unknown>, resources?: ResourceLink[]): CallToolResult;
|
|
31
|
+
export declare function failure(text: string, structured: Record<string, unknown>): CallToolResult;
|
|
32
|
+
export declare function money(credits: number | undefined): string | undefined;
|
|
33
|
+
export interface DailyLimit {
|
|
34
|
+
used: number;
|
|
35
|
+
limit: number;
|
|
36
|
+
left: number;
|
|
37
|
+
zone?: string;
|
|
38
|
+
}
|
|
39
|
+
/** The calling key's daily limit, when the gateway reports one (none means no daily limit is set). */
|
|
40
|
+
export declare function dailyLimitOf(token: CreditsResponse['token']): DailyLimit | undefined;
|
|
41
|
+
export declare function usdOf(credits: number | undefined): number | undefined;
|
|
42
|
+
export interface ErrorContext {
|
|
43
|
+
/** The call may have created a paid task. */
|
|
44
|
+
paid?: boolean;
|
|
45
|
+
/** Idempotency key the paid call used; repeating it cannot create a second task once the gateway ledger is live. */
|
|
46
|
+
clientRequestId?: string;
|
|
47
|
+
/** The call was an upload, which may still finish after a timeout and is safe to repeat. */
|
|
48
|
+
upload?: boolean;
|
|
49
|
+
}
|
|
50
|
+
/** Converts a thrown error into a tool error with a category and a concrete next step. */
|
|
51
|
+
export declare function errorResult(error: unknown, context?: ErrorContext): CallToolResult;
|
|
52
|
+
/** Sends a progress notification when the client asked for them; failures are ignored. */
|
|
53
|
+
export declare function progressReporter(extra: ToolExtra | undefined, totalSeconds: number): (elapsedSeconds: number, message: string) => Promise<void>;
|
|
54
|
+
export declare function sleep(ms: number, signal?: AbortSignal): Promise<void>;
|
|
55
|
+
//# sourceMappingURL=shared.d.ts.map
|
|
@@ -0,0 +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,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,8hBAA8hB,CAAC;AAErkB,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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { processCredentialsAllowed } from '../request-context.js';
|
|
2
|
+
import { ApiHttpError } from '../services/api-client.js';
|
|
3
|
+
import { CREDITS_PER_USD, formatCredits, formatUsd } from '../services/error-handler.js';
|
|
4
|
+
import { API_KEYS_URL, PaidRequestOutcomeUnknownError, RequestTimeoutError } from '../services/http-policy.js';
|
|
5
|
+
import { trackedLink } from '../services/utm.js';
|
|
6
|
+
/** Free lookups: clients can run them without asking. */
|
|
7
|
+
export const READ_ONLY = { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false };
|
|
8
|
+
/** Spends the user's balance and cannot be undone: clients ask before running it. */
|
|
9
|
+
export const PAID = { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: false };
|
|
10
|
+
/** Changes stored state without spending money (uploads). */
|
|
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 (upscaling, video editing, motion control, lip sync and similar; get_model says so): the length in seconds the charge is based on, usually that of the input video or audio. Used only for the cost estimate and the max_cost_usd check; it is not sent to the model, and EvoLink charges by what it measures itself. It cannot enable a cap for per-second video requests with video_urls, video_url or source_task_id because their billing is not fully covered by published prices.';
|
|
15
|
+
/** Text and structured content carry the same facts: some clients show the model only one of them. */
|
|
16
|
+
export function ok(text, structured, resources = []) {
|
|
17
|
+
return { content: [{ type: 'text', text }, ...resources], structuredContent: { ok: true, ...structured } };
|
|
18
|
+
}
|
|
19
|
+
export function failure(text, structured) {
|
|
20
|
+
return { content: [{ type: 'text', text }], structuredContent: { ok: false, ...structured }, isError: true };
|
|
21
|
+
}
|
|
22
|
+
export function money(credits) {
|
|
23
|
+
if (typeof credits !== 'number' || !Number.isFinite(credits))
|
|
24
|
+
return undefined;
|
|
25
|
+
return `${formatCredits(credits)} credits (≈$${formatUsd(credits / CREDITS_PER_USD)})`;
|
|
26
|
+
}
|
|
27
|
+
/** The calling key's daily limit, when the gateway reports one (none means no daily limit is set). */
|
|
28
|
+
export function dailyLimitOf(token) {
|
|
29
|
+
const limit = token.daily_limit_credits;
|
|
30
|
+
if (typeof limit !== 'number' || !Number.isFinite(limit) || limit <= 0)
|
|
31
|
+
return undefined;
|
|
32
|
+
const raw = token.daily_used_credits;
|
|
33
|
+
const used = typeof raw === 'number' && Number.isFinite(raw) ? Math.max(0, raw) : 0;
|
|
34
|
+
const zone = typeof token.reset_timezone === 'string' && token.reset_timezone.trim() ? token.reset_timezone.trim() : undefined;
|
|
35
|
+
return { used, limit, left: Math.max(0, limit - used), zone };
|
|
36
|
+
}
|
|
37
|
+
export function usdOf(credits) {
|
|
38
|
+
if (typeof credits !== 'number' || !Number.isFinite(credits))
|
|
39
|
+
return undefined;
|
|
40
|
+
return Number((credits / CREDITS_PER_USD).toFixed(6));
|
|
41
|
+
}
|
|
42
|
+
function infoFor(error) {
|
|
43
|
+
if (error instanceof ApiHttpError && error.info)
|
|
44
|
+
return error.info;
|
|
45
|
+
if (error instanceof ApiHttpError) {
|
|
46
|
+
return { status: error.status, category: 'server_error', message: error.message, next_step: 'Retry in a minute.', retryable: true, request_id: error.requestId };
|
|
47
|
+
}
|
|
48
|
+
if (error instanceof PaidRequestOutcomeUnknownError) {
|
|
49
|
+
return {
|
|
50
|
+
status: 0,
|
|
51
|
+
category: 'outcome_unknown',
|
|
52
|
+
message: 'The submission timed out or the connection dropped, so it is unknown whether a task was created.',
|
|
53
|
+
next_step: 'Do not submit again with a new client_request_id. Look for the task with list_tasks (status processing), or retry with the same client_request_id.',
|
|
54
|
+
retryable: true,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (error instanceof RequestTimeoutError || error instanceof TypeError) {
|
|
58
|
+
return { status: 0, category: 'server_error', message: 'EvoLink did not respond in time.', next_step: 'Retry in a minute.', retryable: true };
|
|
59
|
+
}
|
|
60
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
61
|
+
// Credential problems surface as plain errors from getApiKey(): no key in this scope, or a
|
|
62
|
+
// signed-in connection that cannot use the hosted service channel.
|
|
63
|
+
return {
|
|
64
|
+
status: 0,
|
|
65
|
+
category: 'unauthorized',
|
|
66
|
+
message,
|
|
67
|
+
next_step: processCredentialsAllowed()
|
|
68
|
+
? `Set EVOLINK_API_KEY (create a key at ${trackedLink(API_KEYS_URL, 'api_keys')}), or run \`evolink login\`.`
|
|
69
|
+
: 'Ask the user to reconnect EvoLink in this client. If it keeps failing, retry in a few minutes.',
|
|
70
|
+
retryable: false,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/** Converts a thrown error into a tool error with a category and a concrete next step. */
|
|
74
|
+
export function errorResult(error, context = {}) {
|
|
75
|
+
const info = infoFor(error);
|
|
76
|
+
const label = `${info.category}${info.code ? `, ${info.code}` : ''}${info.status ? `, HTTP ${info.status}` : ''}`;
|
|
77
|
+
// A headline names the limit in plain words first, so every client shows the user which one stopped the call.
|
|
78
|
+
const lines = info.headline ? [info.headline] : [`Error (${label}): ${info.message}`];
|
|
79
|
+
lines.push(`Next step: ${info.next_step}`);
|
|
80
|
+
let charged;
|
|
81
|
+
if (context.paid) {
|
|
82
|
+
if (info.category === 'outcome_unknown' || info.category === 'server_error') {
|
|
83
|
+
charged = 'unknown';
|
|
84
|
+
lines.push(context.clientRequestId
|
|
85
|
+
? `It is unclear whether a task was created. To retry this exact request safely, pass client_request_id "${context.clientRequestId}".`
|
|
86
|
+
: 'It is unclear whether a task was created; check list_tasks before submitting again.');
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
charged = 'no';
|
|
90
|
+
lines.push('Nothing was submitted or charged.');
|
|
91
|
+
}
|
|
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
|
+
}
|
|
97
|
+
if (info.headline)
|
|
98
|
+
lines.push(`Error: ${label}`);
|
|
99
|
+
if (info.request_id)
|
|
100
|
+
lines.push(`Request ID: ${info.request_id}`);
|
|
101
|
+
return failure(lines.join('\n'), {
|
|
102
|
+
error: info,
|
|
103
|
+
...(charged ? { charged } : {}),
|
|
104
|
+
...(context.clientRequestId && charged === 'unknown' ? { client_request_id: context.clientRequestId } : {}),
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
/** Sends a progress notification when the client asked for them; failures are ignored. */
|
|
108
|
+
export function progressReporter(extra, totalSeconds) {
|
|
109
|
+
const token = extra?._meta?.progressToken;
|
|
110
|
+
let last = -1;
|
|
111
|
+
return async (elapsedSeconds, message) => {
|
|
112
|
+
if (token === undefined || !extra)
|
|
113
|
+
return;
|
|
114
|
+
const progress = Math.max(last + 1, Math.round(elapsedSeconds));
|
|
115
|
+
last = progress;
|
|
116
|
+
await extra.sendNotification({
|
|
117
|
+
method: 'notifications/progress',
|
|
118
|
+
params: { progressToken: token, progress, total: Math.max(totalSeconds, progress), message },
|
|
119
|
+
}).catch(() => undefined);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export function sleep(ms, signal) {
|
|
123
|
+
return new Promise(resolve => {
|
|
124
|
+
if (signal?.aborted) {
|
|
125
|
+
resolve();
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
const timer = setTimeout(done, ms);
|
|
129
|
+
function done() {
|
|
130
|
+
clearTimeout(timer);
|
|
131
|
+
signal?.removeEventListener('abort', done);
|
|
132
|
+
resolve();
|
|
133
|
+
}
|
|
134
|
+
signal?.addEventListener('abort', done, { once: true });
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../../../core/src/tools/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ResourceLink } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import type { ServerConfig } from '../config.js';
|
|
3
|
+
import { type TaskResponse } from '../services/api-client.js';
|
|
4
|
+
/** Result links from the gateway stay downloadable for this long. */
|
|
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.";
|
|
10
|
+
export declare const TERMINAL_STATUSES: Set<string>;
|
|
11
|
+
export interface TaskResultLink {
|
|
12
|
+
url: string;
|
|
13
|
+
kind: 'image' | 'video' | 'audio' | 'file';
|
|
14
|
+
}
|
|
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;
|
|
26
|
+
export interface TaskView {
|
|
27
|
+
lines: string[];
|
|
28
|
+
structured: Record<string, unknown>;
|
|
29
|
+
resources: ResourceLink[];
|
|
30
|
+
}
|
|
31
|
+
/** One task as text lines and the same facts as structured content. */
|
|
32
|
+
export declare function describeTask(task: TaskResponse): TaskView;
|
|
33
|
+
/** Tests only: shorten the pause between task reads. */
|
|
34
|
+
export declare function setPollIntervalForTests(ms: number | undefined): void;
|
|
35
|
+
/** Pause between task reads: each read of an unfinished task makes the gateway ask the provider. */
|
|
36
|
+
export declare function pollIntervalMs(type: string | undefined): number;
|
|
37
|
+
export interface WaitOptions {
|
|
38
|
+
/** Absolute time (ms) by which to return, finished or not. */
|
|
39
|
+
deadline: number;
|
|
40
|
+
tool: string;
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
onPoll?: (task: TaskResponse) => Promise<void>;
|
|
43
|
+
/** A task already read by the caller; the first read is skipped when given. */
|
|
44
|
+
initial?: TaskResponse;
|
|
45
|
+
}
|
|
46
|
+
/** Reads a task until it finishes or the deadline passes, pacing reads by task type. */
|
|
47
|
+
export declare function waitForTask(config: ServerConfig, taskId: string, options: WaitOptions): Promise<TaskResponse>;
|
|
48
|
+
//# sourceMappingURL=task-format.d.ts.map
|
|
@@ -0,0 +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,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"}
|