@evolinkai/mcp 0.0.0-stage → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +67 -2
  3. package/dist/core/src/config.d.ts +19 -0
  4. package/dist/core/src/config.d.ts.map +1 -0
  5. package/dist/core/src/config.js +88 -0
  6. package/dist/core/src/config.js.map +1 -0
  7. package/dist/core/src/data/model-params.d.ts +49 -0
  8. package/dist/core/src/data/model-params.d.ts.map +1 -0
  9. package/dist/core/src/data/model-params.generated.d.ts +2 -0
  10. package/dist/core/src/data/model-params.generated.d.ts.map +1 -0
  11. package/dist/core/src/data/model-params.generated.js +3 -0
  12. package/dist/core/src/data/model-params.generated.js.map +1 -0
  13. package/dist/core/src/data/model-params.js +22 -0
  14. package/dist/core/src/data/model-params.js.map +1 -0
  15. package/dist/core/src/request-context.d.ts +60 -0
  16. package/dist/core/src/request-context.d.ts.map +1 -0
  17. package/dist/core/src/request-context.js +39 -0
  18. package/dist/core/src/request-context.js.map +1 -0
  19. package/dist/core/src/server.d.ts +18 -0
  20. package/dist/core/src/server.d.ts.map +1 -0
  21. package/dist/core/src/server.js +84 -0
  22. package/dist/core/src/server.js.map +1 -0
  23. package/dist/core/src/services/api-client.d.ts +129 -0
  24. package/dist/core/src/services/api-client.d.ts.map +1 -0
  25. package/dist/core/src/services/api-client.js +163 -0
  26. package/dist/core/src/services/api-client.js.map +1 -0
  27. package/dist/core/src/services/error-handler.d.ts +51 -0
  28. package/dist/core/src/services/error-handler.d.ts.map +1 -0
  29. package/dist/core/src/services/error-handler.js +390 -0
  30. package/dist/core/src/services/error-handler.js.map +1 -0
  31. package/dist/core/src/services/file-client.d.ts +24 -0
  32. package/dist/core/src/services/file-client.d.ts.map +1 -0
  33. package/dist/core/src/services/file-client.js +100 -0
  34. package/dist/core/src/services/file-client.js.map +1 -0
  35. package/dist/core/src/services/http-policy.d.ts +40 -0
  36. package/dist/core/src/services/http-policy.d.ts.map +1 -0
  37. package/dist/core/src/services/http-policy.js +120 -0
  38. package/dist/core/src/services/http-policy.js.map +1 -0
  39. package/dist/core/src/services/model-catalog.d.ts +24 -0
  40. package/dist/core/src/services/model-catalog.d.ts.map +1 -0
  41. package/dist/core/src/services/model-catalog.js +45 -0
  42. package/dist/core/src/services/model-catalog.js.map +1 -0
  43. package/dist/core/src/services/param-validator.d.ts +21 -0
  44. package/dist/core/src/services/param-validator.d.ts.map +1 -0
  45. package/dist/core/src/services/param-validator.js +164 -0
  46. package/dist/core/src/services/param-validator.js.map +1 -0
  47. package/dist/core/src/services/pricing-client.d.ts +77 -0
  48. package/dist/core/src/services/pricing-client.d.ts.map +1 -0
  49. package/dist/core/src/services/pricing-client.js +332 -0
  50. package/dist/core/src/services/pricing-client.js.map +1 -0
  51. package/dist/core/src/services/upload-policy.d.ts +17 -0
  52. package/dist/core/src/services/upload-policy.d.ts.map +1 -0
  53. package/dist/core/src/services/upload-policy.js +160 -0
  54. package/dist/core/src/services/upload-policy.js.map +1 -0
  55. package/dist/core/src/tools/check-balance.d.ts +4 -0
  56. package/dist/core/src/tools/check-balance.d.ts.map +1 -0
  57. package/dist/core/src/tools/check-balance.js +78 -0
  58. package/dist/core/src/tools/check-balance.js.map +1 -0
  59. package/dist/core/src/tools/estimate-cost.d.ts +4 -0
  60. package/dist/core/src/tools/estimate-cost.d.ts.map +1 -0
  61. package/dist/core/src/tools/estimate-cost.js +127 -0
  62. package/dist/core/src/tools/estimate-cost.js.map +1 -0
  63. package/dist/core/src/tools/generate.d.ts +4 -0
  64. package/dist/core/src/tools/generate.d.ts.map +1 -0
  65. package/dist/core/src/tools/generate.js +178 -0
  66. package/dist/core/src/tools/generate.js.map +1 -0
  67. package/dist/core/src/tools/get-model.d.ts +5 -0
  68. package/dist/core/src/tools/get-model.d.ts.map +1 -0
  69. package/dist/core/src/tools/get-model.js +109 -0
  70. package/dist/core/src/tools/get-model.js.map +1 -0
  71. package/dist/core/src/tools/get-task.d.ts +7 -0
  72. package/dist/core/src/tools/get-task.d.ts.map +1 -0
  73. package/dist/core/src/tools/get-task.js +55 -0
  74. package/dist/core/src/tools/get-task.js.map +1 -0
  75. package/dist/core/src/tools/list-tasks.d.ts +6 -0
  76. package/dist/core/src/tools/list-tasks.d.ts.map +1 -0
  77. package/dist/core/src/tools/list-tasks.js +142 -0
  78. package/dist/core/src/tools/list-tasks.js.map +1 -0
  79. package/dist/core/src/tools/search-models.d.ts +5 -0
  80. package/dist/core/src/tools/search-models.d.ts.map +1 -0
  81. package/dist/core/src/tools/search-models.js +96 -0
  82. package/dist/core/src/tools/search-models.js.map +1 -0
  83. package/dist/core/src/tools/shared.d.ts +50 -0
  84. package/dist/core/src/tools/shared.d.ts.map +1 -0
  85. package/dist/core/src/tools/shared.js +129 -0
  86. package/dist/core/src/tools/shared.js.map +1 -0
  87. package/dist/core/src/tools/task-format.d.ts +32 -0
  88. package/dist/core/src/tools/task-format.d.ts.map +1 -0
  89. package/dist/core/src/tools/task-format.js +138 -0
  90. package/dist/core/src/tools/task-format.js.map +1 -0
  91. package/dist/core/src/tools/upload-file.d.ts +7 -0
  92. package/dist/core/src/tools/upload-file.d.ts.map +1 -0
  93. package/dist/core/src/tools/upload-file.js +104 -0
  94. package/dist/core/src/tools/upload-file.js.map +1 -0
  95. package/dist/core/src/version.d.ts +3 -0
  96. package/dist/core/src/version.d.ts.map +1 -0
  97. package/dist/core/src/version.js +3 -0
  98. package/dist/core/src/version.js.map +1 -0
  99. package/dist/evolink-media/src/index.d.ts +3 -0
  100. package/dist/evolink-media/src/index.d.ts.map +1 -0
  101. package/dist/evolink-media/src/index.js +16 -0
  102. package/dist/evolink-media/src/index.js.map +1 -0
  103. package/package.json +46 -4
@@ -0,0 +1,390 @@
1
+ import { currentCredentialMode } from '../request-context.js';
2
+ import { API_KEYS_URL, MCP_CONSOLE_URL, MCP_KEY_NAME, TOP_UP_URL, siteUrl } from './http-policy.js';
3
+ /** Gateway display rate: 1 USD = 6.8 CNY and 1 CNY = 10 credits. */
4
+ export const CREDITS_PER_USD = 68;
5
+ const ACCOUNT_CODES = new Set(['insufficient_quota', 'insufficient_user_quota', 'quota_not_enough', 'account_balance_insufficient']);
6
+ const KEY_QUOTA_CODES = new Set(['insufficient_token_quota', 'key_quota_exhausted']);
7
+ const KEY_DAILY_CODES = new Set(['token_daily_quota_exceeded', 'key_daily_quota_exhausted']);
8
+ const CONTENT_CODES = new Set(['content_policy_violation', 'content_filter', 'sensitive_content', 'moderation_blocked', 'input_moderation_failed']);
9
+ const UNAVAILABLE_CODES = new Set(['no_available_channel', 'model_unavailable', 'channel_selection_failed', 'service_unavailable']);
10
+ /** Hosted service channel (key custody A): the connection itself is gone and needs a new sign-in. */
11
+ const CONNECTION_ENDED_CODES = new Set(['connection_not_found', 'connection_revoked', 'session_inactive', 'session_expired', 'mcp_scope_missing']);
12
+ /** The hosted service, not the user's connection, was refused or sent a request the channel does not serve. */
13
+ const SERVICE_CODES = new Set(['mcp_service_unauthorized', 'mcp_connection_required', 'mcp_route_not_allowed']);
14
+ const DETAIL_FIELDS = [
15
+ 'key_name',
16
+ 'estimated_credits',
17
+ 'account_balance_credits',
18
+ 'total_limit_credits',
19
+ 'used_credits',
20
+ 'remaining_credits',
21
+ 'daily_limit_credits',
22
+ 'daily_used_credits',
23
+ 'reset_timezone',
24
+ 'allowed_models',
25
+ 'expired_at',
26
+ ];
27
+ function envelope(body) {
28
+ if (!body || typeof body !== 'object')
29
+ return {};
30
+ const record = body;
31
+ if (record.error && typeof record.error === 'object')
32
+ return record.error;
33
+ // files-api: { success: false, code, msg }; OAuth-style: { error: "x", error_description: "…" }
34
+ return {
35
+ code: typeof record.error === 'string' ? record.error : record.code,
36
+ message: record.msg ?? record.error_description ?? record.message,
37
+ };
38
+ }
39
+ function text(value) {
40
+ if (typeof value === 'string' && value.trim())
41
+ return value.trim();
42
+ if (typeof value === 'number' && Number.isFinite(value))
43
+ return String(value);
44
+ return undefined;
45
+ }
46
+ /**
47
+ * @param mcpLimits the key limits are the account's EvoLink MCP limit: a
48
+ * signed-in connection, or the gateway said so with limit_scope "mcp".
49
+ */
50
+ function categorize(status, code, mode, mcpLimits) {
51
+ const lower = code.toLowerCase();
52
+ if (ACCOUNT_CODES.has(lower))
53
+ return 'account_balance_insufficient';
54
+ if (KEY_QUOTA_CODES.has(lower))
55
+ return mcpLimits ? 'mcp_limit_reached' : 'key_quota_exhausted';
56
+ if (KEY_DAILY_CODES.has(lower))
57
+ return mcpLimits ? 'mcp_daily_limit_reached' : 'key_daily_quota_exhausted';
58
+ if (lower === 'mcp_paused')
59
+ return 'mcp_paused';
60
+ if (lower === 'mcp_key_expired')
61
+ return 'mcp_key_expired';
62
+ // EvoLink turned the MCP channel off (the gateway's MCPChannelEnabled switch): a 503, but not a model problem.
63
+ if (lower === 'mcp_channel_disabled')
64
+ return 'mcp_channel_disabled';
65
+ // The account's MCP key is only ever disabled by "pause all" in the console.
66
+ if (lower === 'key_disabled')
67
+ return mode === 'signed_in' ? 'mcp_paused' : 'key_disabled';
68
+ // A signed-in connection spends the account's MCP key, so an expired key is that key's expiry date, not the connection.
69
+ if (lower === 'key_expired')
70
+ return mode === 'signed_in' ? 'mcp_key_expired' : 'key_expired';
71
+ if (lower === 'key_model_not_allowed')
72
+ return 'model_not_allowed';
73
+ if (lower === 'idempotency_conflict')
74
+ return 'idempotency_conflict';
75
+ if (lower === 'paid_outcome_unknown')
76
+ return 'outcome_unknown';
77
+ if (CONTENT_CODES.has(lower))
78
+ return 'content_policy';
79
+ if (UNAVAILABLE_CODES.has(lower) || lower.startsWith('channel:'))
80
+ return 'model_unavailable';
81
+ if (CONNECTION_ENDED_CODES.has(lower))
82
+ return 'connection_ended';
83
+ if (lower === 'agent_session_unavailable')
84
+ return 'session_check_unavailable';
85
+ if (lower === 'mcp_connection_create_failed')
86
+ return 'connection_setup_failed';
87
+ if (SERVICE_CODES.has(lower))
88
+ return 'service_misconfigured';
89
+ // The gateway did not take the forwarded sign-in token, most likely because it expired during the call.
90
+ if (lower === 'mcp_token_invalid')
91
+ return 'sign_in_token_rejected';
92
+ if (lower === 'user_disabled')
93
+ return 'account_disabled';
94
+ switch (status) {
95
+ case 401: return 'unauthorized';
96
+ case 402: return 'account_balance_insufficient';
97
+ case 403: return 'forbidden';
98
+ case 404: return 'not_found';
99
+ case 413: return 'request_too_large';
100
+ case 429: return 'rate_limited';
101
+ case 503: return 'model_unavailable';
102
+ }
103
+ if (status >= 500)
104
+ return 'server_error';
105
+ return 'invalid_request';
106
+ }
107
+ const RETRYABLE = new Set([
108
+ 'key_daily_quota_exhausted',
109
+ 'mcp_daily_limit_reached',
110
+ 'rate_limited',
111
+ 'model_unavailable',
112
+ 'outcome_unknown',
113
+ 'server_error',
114
+ 'session_check_unavailable',
115
+ 'connection_setup_failed',
116
+ 'sign_in_token_rejected',
117
+ ]);
118
+ /** Answers about the account's EvoLink MCP limit; their console link is the MCP settings, not API Keys. */
119
+ const MCP_LIMIT_CATEGORIES = new Set(['mcp_limit_reached', 'mcp_daily_limit_reached', 'mcp_paused', 'mcp_key_expired']);
120
+ const KEY_CATEGORIES = new Set([
121
+ 'key_quota_exhausted', 'key_daily_quota_exhausted', 'key_disabled', 'key_expired', 'model_not_allowed',
122
+ ]);
123
+ function credits(value) {
124
+ if (typeof value !== 'number' || !Number.isFinite(value))
125
+ return undefined;
126
+ return `${formatCredits(value)} credits (≈$${formatUsd(value / CREDITS_PER_USD)})`;
127
+ }
128
+ export function formatCredits(value) {
129
+ return Number(value.toFixed(4)).toString();
130
+ }
131
+ export function formatUsd(value) {
132
+ if (value === 0)
133
+ return '0';
134
+ if (Math.abs(value) >= 1)
135
+ return value.toFixed(2);
136
+ if (Math.abs(value) >= 0.01)
137
+ return value.toFixed(3);
138
+ return Number(value.toPrecision(2)).toString();
139
+ }
140
+ /** Sentences naming which limit stopped the request; the same words in every client. */
141
+ function headlineFor(category) {
142
+ switch (category) {
143
+ case 'mcp_limit_reached':
144
+ return 'EvoLink MCP spending limit reached. This is the limit set for MCP, not your account balance.';
145
+ case 'mcp_daily_limit_reached':
146
+ return 'EvoLink MCP daily limit reached. It resets at midnight; this is not your account balance.';
147
+ case 'mcp_paused':
148
+ return 'EvoLink MCP is paused for this account. Resume it in the console; you do not need to reconnect.';
149
+ case 'mcp_key_expired':
150
+ return 'EvoLink MCP key has expired. Extend or clear its expiry date in the console; you do not need to reconnect.';
151
+ case 'account_balance_insufficient':
152
+ return 'Your EvoLink account balance is too low for this request. The balance is shared by API, web and MCP.';
153
+ case 'key_quota_exhausted':
154
+ return 'This API key\'s spending limit is used up. This is the key\'s own limit, not your account balance.';
155
+ case 'key_daily_quota_exhausted':
156
+ return 'This API key\'s daily limit is used up. It resets at midnight; this is not your account balance.';
157
+ case 'connection_ended':
158
+ return 'This EvoLink connection was disconnected. Reconnect EvoLink in this client.';
159
+ default:
160
+ return undefined;
161
+ }
162
+ }
163
+ /**
164
+ * Where the EvoLink MCP limit lives: while it is a key in API Keys, name the key
165
+ * so the user finds it; a dedicated MCP page needs no key name.
166
+ */
167
+ function mcpLimitPlace(url, details) {
168
+ return /\/dashboard\/keys(?:[?#]|$)/.test(url)
169
+ ? `${url} (the key named "${text(details.key_name) ?? MCP_KEY_NAME}")`
170
+ : url;
171
+ }
172
+ /** "Limit: …; used: …; left: …." from whatever figures the gateway attached. */
173
+ function limitFigures(details, label) {
174
+ const parts = [
175
+ credits(details.total_limit_credits) && `${label}: ${credits(details.total_limit_credits)}`,
176
+ credits(details.used_credits) && `used: ${credits(details.used_credits)}`,
177
+ credits(details.remaining_credits) && `left: ${credits(details.remaining_credits)}`,
178
+ ].filter(Boolean);
179
+ return parts.length ? `${parts.join('; ')}.` : '';
180
+ }
181
+ function sentences(...parts) {
182
+ return parts.filter(Boolean).join(' ');
183
+ }
184
+ function nextStep(category, info, mode) {
185
+ const details = info.details ?? {};
186
+ const action = info.action_url;
187
+ const needed = credits(details.estimated_credits);
188
+ const balance = credits(details.account_balance_credits);
189
+ const zone = text(details.reset_timezone);
190
+ switch (category) {
191
+ case 'account_balance_insufficient':
192
+ return sentences(balance && `Balance: ${balance}.`, needed && `This request needs about ${needed}.`, `Ask the user to top up at ${action ?? TOP_UP_URL}, then retry.`);
193
+ case 'mcp_limit_reached':
194
+ return sentences(limitFigures(details, 'EvoLink MCP limit'), needed && `This request needs about ${needed}.`, balance && `Account balance: ${balance} (not the problem).`, `Ask the user to raise or remove the EvoLink MCP limit at ${mcpLimitPlace(action ?? MCP_CONSOLE_URL, details)}; it is shared by every assistant connected to their EvoLink account.`, 'Do not retry until they have changed it.');
195
+ case 'mcp_daily_limit_reached': {
196
+ const used = credits(details.daily_used_credits);
197
+ const limit = credits(details.daily_limit_credits);
198
+ return sentences(used && limit && `Today's EvoLink MCP spending: ${used} of the ${limit} daily limit.`, `It resets automatically at midnight${zone ? ` (${zone})` : ''}.`, balance && `Account balance: ${balance} (not the problem).`, `To continue today, ask the user to raise the EvoLink MCP daily limit at ${mcpLimitPlace(action ?? MCP_CONSOLE_URL, details)}.`);
199
+ }
200
+ case 'mcp_paused':
201
+ return `Ask the user to resume EvoLink MCP at ${mcpLimitPlace(action ?? MCP_CONSOLE_URL, details)} (switch it back on). Do not ask them to reconnect, and do not retry until it is resumed.`;
202
+ case 'mcp_key_expired': {
203
+ const expiredAt = typeof details.expired_at === 'number' && Number.isFinite(details.expired_at) && details.expired_at > 0
204
+ ? new Date(details.expired_at * 1000).toISOString().slice(0, 10)
205
+ : undefined;
206
+ return sentences(expiredAt && `The EvoLink MCP key expired on ${expiredAt} (UTC).`, `Ask the user to extend or clear the expiry date of the EvoLink MCP key at ${mcpLimitPlace(action ?? MCP_CONSOLE_URL, details)}.`, 'Do not ask them to reconnect, and do not retry until it is changed.');
207
+ }
208
+ case 'key_quota_exhausted': {
209
+ const name = text(details.key_name);
210
+ return sentences(limitFigures(details, name ? `Limit of API key "${name}"` : 'API key limit'), needed && `This request needs about ${needed}.`, balance && `Account balance: ${balance} (not the problem).`, `Raise this API key's limit at ${action ?? API_KEYS_URL}, or use another key.`);
211
+ }
212
+ case 'key_daily_quota_exhausted':
213
+ return `It resets automatically at midnight${zone ? ` (${zone})` : ''}; to continue today, raise this API key's daily limit at ${action ?? API_KEYS_URL}.`;
214
+ case 'key_disabled':
215
+ return `This API key is disabled. Enable it at ${action ?? API_KEYS_URL} or use another key.`;
216
+ case 'key_expired':
217
+ return `This API key has expired. Extend it at ${action ?? API_KEYS_URL} or use another key.`;
218
+ case 'model_not_allowed': {
219
+ const allowed = Array.isArray(details.allowed_models) ? details.allowed_models.slice(0, 20).join(', ') : '';
220
+ return `This key may not use this model.${allowed ? ` Allowed models: ${allowed}.` : ''} Pick an allowed model, or change the key's model list at ${action ?? API_KEYS_URL}.`;
221
+ }
222
+ case 'unauthorized':
223
+ if (mode === 'signed_in')
224
+ return 'The EvoLink connection was rejected. Ask the user to reconnect EvoLink in this client.';
225
+ return mode === 'api_key'
226
+ ? 'The API key was rejected. Ask the user to check the EvoLink API key configured in this client.'
227
+ : 'The API key was rejected. Check EVOLINK_API_KEY, or run `evolink login` again.';
228
+ case 'forbidden':
229
+ return 'Access to this resource is denied for this account.';
230
+ case 'rate_limited':
231
+ return `Too many requests. Wait ${info.retry_after_seconds ?? 30} seconds before retrying; do not loop paid submissions.`;
232
+ case 'invalid_request':
233
+ return 'Fix the parameter named in the message and retry. get_model lists every parameter with its allowed values.';
234
+ case 'not_found':
235
+ return 'Nothing matches this ID. Check it, or use list_tasks to find recent tasks.';
236
+ case 'content_policy':
237
+ return 'The prompt or input was blocked by content review. Rephrase it (no real people, brands, explicit or violent content) and retry.';
238
+ case 'model_unavailable':
239
+ return 'The model is temporarily unavailable. Retry in a minute, or pick another model with search_models.';
240
+ case 'idempotency_conflict':
241
+ return 'This client_request_id was already used for a different request. Use a new client_request_id for a new generation.';
242
+ case 'outcome_unknown':
243
+ return 'The earlier submission with this client_request_id is still being processed or its outcome is unknown. Do not submit it again with a new id: wait a minute and retry with the same client_request_id, or look it up with list_tasks.';
244
+ case 'request_too_large':
245
+ return 'The request is too large. Pass big files as links (a public URL, or one from upload_file where it is available) instead of inline data.';
246
+ case 'server_error':
247
+ return 'EvoLink had a temporary error. Retry in a minute; for paid generations check list_tasks first so the task is not submitted twice.';
248
+ case 'connection_ended':
249
+ return 'This EvoLink connection is no longer active (it was revoked, expired, or signed out). Ask the user to reconnect the existing EvoLink connection in this client instead of adding a new one.';
250
+ case 'session_check_unavailable':
251
+ return 'EvoLink sign-in verification is temporarily unavailable. Retry in a minute; do not reconnect.';
252
+ case 'connection_setup_failed':
253
+ return 'EvoLink could not set up this connection yet. Retry in a minute.';
254
+ case 'service_misconfigured':
255
+ return 'The EvoLink MCP service could not authenticate this request. This is a server-side problem, not the user\'s connection: do not reconnect, and try again later.';
256
+ case 'mcp_channel_disabled':
257
+ return 'EvoLink has temporarily turned off MCP access. Try again later; switching models, retrying right away or reconnecting will not help.';
258
+ case 'sign_in_token_rejected':
259
+ return 'EvoLink did not accept this connection\'s sign-in token; it may have just expired. Retry the call, which carries a refreshed token; if it keeps failing, ask the user to reconnect the existing EvoLink connection in this client.';
260
+ case 'account_disabled':
261
+ return 'This EvoLink account is disabled. Ask the user to contact EvoLink support.';
262
+ }
263
+ }
264
+ /** Classifies one non-2xx gateway or files-api response. */
265
+ export function classifyGatewayError(status, body, retryAfterMs, headerRequestId) {
266
+ const error = envelope(body);
267
+ const code = text(error.code);
268
+ const mode = currentCredentialMode();
269
+ const mcpScope = text(error.limit_scope)?.toLowerCase() === 'mcp';
270
+ const category = categorize(status, code ?? '', mode, mcpScope || mode === 'signed_in');
271
+ const requestId = text(error.request_id) ?? headerRequestId;
272
+ const rawMessage = text(error.message) ?? `HTTP ${status}`;
273
+ const message = rawMessage.replace(/\s*\(request id: [^)]*\)\s*$/i, '').slice(0, 600);
274
+ const details = {};
275
+ for (const field of DETAIL_FIELDS) {
276
+ if (error[field] !== undefined && error[field] !== null && error[field] !== '')
277
+ details[field] = error[field];
278
+ }
279
+ let actionUrl;
280
+ if (category === 'account_balance_insufficient') {
281
+ actionUrl = siteUrl(text(error.action_url), TOP_UP_URL);
282
+ }
283
+ else if (MCP_LIMIT_CATEGORIES.has(category)) {
284
+ actionUrl = siteUrl(text(error.action_url), MCP_CONSOLE_URL);
285
+ }
286
+ else if (KEY_CATEGORIES.has(category)) {
287
+ actionUrl = siteUrl(text(error.action_url), API_KEYS_URL);
288
+ }
289
+ const headline = headlineFor(category);
290
+ const info = {
291
+ status,
292
+ category,
293
+ ...(headline ? { headline } : {}),
294
+ code,
295
+ message,
296
+ next_step: '',
297
+ retryable: RETRYABLE.has(category),
298
+ retry_after_seconds: retryAfterMs !== undefined ? Math.max(1, Math.ceil(retryAfterMs / 1000)) : undefined,
299
+ action_url: actionUrl,
300
+ request_id: requestId,
301
+ details: Object.keys(details).length > 0 ? details : undefined,
302
+ };
303
+ info.next_step = nextStep(category, info, mode);
304
+ return info;
305
+ }
306
+ /**
307
+ * With a headline the first line says which limit it is; the gateway's own
308
+ * sentence is left out because it speaks of "API key …" even for the MCP key.
309
+ */
310
+ export function formatGatewayError(info) {
311
+ const status = `${info.status}${info.code ? ` ${info.code}` : ''}`;
312
+ const lines = info.headline
313
+ ? [info.headline, `Next step: ${info.next_step}`, `Error: HTTP ${status}`]
314
+ : [`[${status}] ${info.message}`, `Next step: ${info.next_step}`];
315
+ if (info.request_id)
316
+ lines.push(`Request ID: ${info.request_id}`);
317
+ return lines.join('\n');
318
+ }
319
+ export function formatApiError(status, body) {
320
+ return formatGatewayError(classifyGatewayError(status, body));
321
+ }
322
+ const TASK_ERROR_MAP = {
323
+ content_policy_violation: {
324
+ suggestion: 'Revise the prompt: avoid real person photos, celebrity names, copyrighted content, NSFW or violence. An illustration style often passes.',
325
+ retryable: false,
326
+ },
327
+ invalid_parameters: {
328
+ suggestion: 'Check the parameter values (prompt length, image size, duration, resolution) against get_model.',
329
+ retryable: false,
330
+ },
331
+ image_dimension_mismatch: {
332
+ suggestion: 'The input image does not match the requested aspect ratio. Resize it (for example 1280x720 for 16:9) or change the ratio.',
333
+ retryable: false,
334
+ },
335
+ image_processing_error: {
336
+ suggestion: 'The input image could not be processed. Use JPG, PNG or WebP under 10 MB at a publicly reachable URL (upload_file gives one).',
337
+ retryable: false,
338
+ },
339
+ request_cancelled: {
340
+ suggestion: 'The task was cancelled. Submit a new request if it was not intended.',
341
+ retryable: false,
342
+ },
343
+ resource_not_found: {
344
+ suggestion: 'The task or an input resource was not found or has expired. Check the IDs and links.',
345
+ retryable: false,
346
+ },
347
+ generation_timeout: {
348
+ suggestion: 'Generation timed out, probably under high load. Retry, or simplify the prompt or lower the resolution.',
349
+ retryable: true,
350
+ },
351
+ quota_exceeded: {
352
+ suggestion: `The account was over quota or rate limited when the task ran. Wait, then retry; top up at ${TOP_UP_URL} if the balance is low.`,
353
+ retryable: true,
354
+ },
355
+ resource_exhausted: {
356
+ suggestion: 'Provider capacity was temporarily exhausted. Wait 30–60 seconds and retry.',
357
+ retryable: true,
358
+ },
359
+ generation_failed_no_content: {
360
+ suggestion: 'The model produced no output, often because of protected content or watermark removal requests. Change the prompt or input and retry.',
361
+ retryable: true,
362
+ },
363
+ service_error: {
364
+ suggestion: 'Temporary service error. Retry after a minute.',
365
+ retryable: true,
366
+ },
367
+ service_unavailable: {
368
+ suggestion: 'The service was temporarily unavailable. Retry after 1–2 minutes.',
369
+ retryable: true,
370
+ },
371
+ unknown_error: {
372
+ suggestion: 'Unknown error. Retry after a minute; if it keeps failing, give the task ID to EvoLink support.',
373
+ retryable: true,
374
+ },
375
+ };
376
+ export function getTaskErrorInfo(code) {
377
+ return TASK_ERROR_MAP[code] ?? TASK_ERROR_MAP.unknown_error;
378
+ }
379
+ export function formatTaskError(error) {
380
+ const code = error.code ?? 'unknown_error';
381
+ const info = getTaskErrorInfo(code);
382
+ const lines = [
383
+ `Error code: ${code}`,
384
+ `Message: ${error.message ?? 'No details provided'}`,
385
+ `Retryable: ${info.retryable ? 'Yes — you can retry this request' : 'No — modify your input before retrying'}`,
386
+ `Suggestion: ${info.suggestion}`,
387
+ ];
388
+ return lines.join('\n');
389
+ }
390
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../../../../core/src/services/error-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export interface FileUploadData {
2
+ file_id: string;
3
+ file_name: string;
4
+ original_name: string;
5
+ file_size: number;
6
+ mime_type: string;
7
+ upload_path: string;
8
+ file_url: string;
9
+ download_url: string;
10
+ upload_time: string;
11
+ expires_at: string;
12
+ }
13
+ interface FileApiResponse<T = unknown> {
14
+ success: boolean;
15
+ code: number;
16
+ msg: string;
17
+ data?: T;
18
+ request_id?: string;
19
+ }
20
+ export declare function fileBase64Upload(base64Data: string, uploadPath?: string, fileName?: string): Promise<FileApiResponse<FileUploadData>>;
21
+ export declare function fileStreamUpload(filePath: string, fileSize: number, mime: string, originalName: string, uploadPath?: string, fileName?: string): Promise<FileApiResponse<FileUploadData>>;
22
+ export declare function fileUrlUpload(fileUrl: string, uploadPath?: string, fileName?: string): Promise<FileApiResponse<FileUploadData>>;
23
+ export {};
24
+ //# sourceMappingURL=file-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,eAAe,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAwCD,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAK1C;AAUD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAsC1C;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAK1C"}
@@ -0,0 +1,100 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { createReadStream } from 'node:fs';
3
+ import { Readable } from 'node:stream';
4
+ import { getApiKey } from '../config.js';
5
+ import { ApiHttpError } from './api-client.js';
6
+ import { classifyGatewayError, formatGatewayError } from './error-handler.js';
7
+ import { DEFAULT_WRITE_TIMEOUT_MS, evoHeaders, fetchWithTimeout, newRunId, parseRetryAfter, readJsonBody, responseRequestId, timeoutFromEnv, } from './http-policy.js';
8
+ const FILES_API_BASE_URL = 'https://files-api.evolink.ai';
9
+ function requestHeaders(tool) {
10
+ const runId = newRunId();
11
+ return {
12
+ 'Authorization': `Bearer ${getApiKey()}`,
13
+ ...evoHeaders(tool),
14
+ 'Idempotency-Key': runId,
15
+ 'X-Evo-Run-Id': runId,
16
+ };
17
+ }
18
+ function apiError(status, data, headers) {
19
+ const retryAfterMs = parseRetryAfter(headers.get('retry-after'));
20
+ const info = classifyGatewayError(status, data, retryAfterMs, responseRequestId(headers));
21
+ return new ApiHttpError(status, formatGatewayError(info), retryAfterMs, info.request_id, info);
22
+ }
23
+ async function parseResponse(response) {
24
+ const data = await readJsonBody(response);
25
+ if (!response.ok)
26
+ throw apiError(response.status, data, response.headers);
27
+ const body = data;
28
+ if (body.success === false) {
29
+ const status = typeof body.code === 'number' && body.code >= 400 && body.code < 600 ? body.code : 400;
30
+ throw apiError(status, data, response.headers);
31
+ }
32
+ const requestId = responseRequestId(response.headers);
33
+ if (!body.request_id && requestId)
34
+ body.request_id = requestId;
35
+ return body;
36
+ }
37
+ async function jsonUpload(path, body) {
38
+ const response = await fetchWithTimeout(`${FILES_API_BASE_URL}${path}`, {
39
+ method: 'POST',
40
+ headers: { ...requestHeaders('upload_file'), 'Content-Type': 'application/json' },
41
+ body: JSON.stringify(body),
42
+ }, timeoutFromEnv('EVOLINK_MCP_WRITE_TIMEOUT_MS', DEFAULT_WRITE_TIMEOUT_MS));
43
+ return parseResponse(response);
44
+ }
45
+ export async function fileBase64Upload(base64Data, uploadPath, fileName) {
46
+ const body = { base64_data: base64Data };
47
+ if (uploadPath)
48
+ body.upload_path = uploadPath;
49
+ if (fileName)
50
+ body.file_name = fileName;
51
+ return jsonUpload('/api/v1/files/upload/base64', body);
52
+ }
53
+ function multipartField(name, value) {
54
+ return Buffer.from(`Content-Disposition: form-data; name="${name}"\r\n\r\n${value}\r\n`);
55
+ }
56
+ function safeDispositionValue(value) {
57
+ return value.replaceAll(/["\r\n]/g, '_');
58
+ }
59
+ export async function fileStreamUpload(filePath, fileSize, mime, originalName, uploadPath, fileName) {
60
+ const boundary = `----evolink-${randomUUID()}`;
61
+ const prefix = Buffer.from(`--${boundary}\r\nContent-Disposition: form-data; name="file"; filename="${safeDispositionValue(originalName)}"\r\nContent-Type: ${mime}\r\n\r\n`);
62
+ const fields = [];
63
+ if (uploadPath)
64
+ fields.push(multipartField('uploadPath', uploadPath));
65
+ if (fileName)
66
+ fields.push(multipartField('fileName', fileName));
67
+ const tailParts = [Buffer.from('\r\n')];
68
+ for (const field of fields) {
69
+ tailParts.push(Buffer.from(`--${boundary}\r\n`), field);
70
+ }
71
+ tailParts.push(Buffer.from(`--${boundary}--\r\n`));
72
+ const suffix = Buffer.concat(tailParts);
73
+ async function* multipartBody() {
74
+ yield prefix;
75
+ for await (const chunk of createReadStream(filePath)) {
76
+ yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
77
+ }
78
+ yield suffix;
79
+ }
80
+ const headers = requestHeaders('upload_file');
81
+ headers['Content-Type'] = `multipart/form-data; boundary=${boundary}`;
82
+ headers['Content-Length'] = String(prefix.length + fileSize + suffix.length);
83
+ const init = {
84
+ method: 'POST',
85
+ headers,
86
+ body: Readable.from(multipartBody()),
87
+ duplex: 'half',
88
+ };
89
+ const response = await fetchWithTimeout(`${FILES_API_BASE_URL}/api/v1/files/upload/stream`, init, timeoutFromEnv('EVOLINK_MCP_WRITE_TIMEOUT_MS', DEFAULT_WRITE_TIMEOUT_MS));
90
+ return parseResponse(response);
91
+ }
92
+ export async function fileUrlUpload(fileUrl, uploadPath, fileName) {
93
+ const body = { file_url: fileUrl };
94
+ if (uploadPath)
95
+ body.upload_path = uploadPath;
96
+ if (fileName)
97
+ body.file_name = fileName;
98
+ return jsonUpload('/api/v1/files/upload/url', body);
99
+ }
100
+ //# sourceMappingURL=file-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-client.js","sourceRoot":"","sources":["../../../../../core/src/services/file-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,MAAM,kBAAkB,GAAG,8BAA8B,CAAC;AAuB1D,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,OAAO;QACL,eAAe,EAAE,UAAU,SAAS,EAAE,EAAE;QACxC,GAAG,UAAU,CAAC,IAAI,CAAC;QACnB,iBAAiB,EAAE,KAAK;QACxB,cAAc,EAAE,KAAK;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAa,EAAE,OAAgB;IAC/D,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1F,OAAO,IAAI,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACjG,CAAC;AAED,KAAK,UAAU,aAAa,CAAI,QAAkB;IAChD,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,IAA0B,CAAC;IACxC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QACtG,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC/D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAI,IAAY,EAAE,IAA4B;IACrE,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,GAAG,kBAAkB,GAAG,IAAI,EAAE,EAAE;QACtE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,GAAG,cAAc,CAAC,aAAa,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE;QACjF,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,EAAE,cAAc,CAAC,8BAA8B,EAAE,wBAAwB,CAAC,CAAC,CAAC;IAC7E,OAAO,aAAa,CAAI,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,UAAmB,EACnB,QAAiB;IAEjB,MAAM,IAAI,GAA2B,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IACjE,IAAI,UAAU;QAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC9C,IAAI,QAAQ;QAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IACxC,OAAO,UAAU,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,KAAa;IACjD,OAAO,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,YAAY,KAAK,MAAM,CAAC,CAAC;AAC3F,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAgB,EAChB,QAAgB,EAChB,IAAY,EACZ,YAAoB,EACpB,UAAmB,EACnB,QAAiB;IAEjB,MAAM,QAAQ,GAAG,eAAe,UAAU,EAAE,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,KAAK,QAAQ,8DAA8D,oBAAoB,CAAC,YAAY,CAAC,sBAAsB,IAAI,UAAU,CAClJ,CAAC;IACF,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,UAAU;QAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAChE,MAAM,SAAS,GAAa,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IACD,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAExC,KAAK,SAAS,CAAC,CAAC,aAAa;QAC3B,MAAM,MAAM,CAAC;QACb,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YACrD,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,MAAM,CAAC;IACf,CAAC;IAED,MAAM,OAAO,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;IAC9C,OAAO,CAAC,cAAc,CAAC,GAAG,iCAAiC,QAAQ,EAAE,CAAC;IACtE,OAAO,CAAC,gBAAgB,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG;QACX,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,CAAmC;QACtE,MAAM,EAAE,MAAe;KACxB,CAAC;IACF,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CACrC,GAAG,kBAAkB,6BAA6B,EAClD,IAAmB,EACnB,cAAc,CAAC,8BAA8B,EAAE,wBAAwB,CAAC,CACzE,CAAC;IACF,OAAO,aAAa,CAAiB,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,UAAmB,EACnB,QAAiB;IAEjB,MAAM,IAAI,GAA2B,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC3D,IAAI,UAAU;QAAE,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAC9C,IAAI,QAAQ;QAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IACxC,OAAO,UAAU,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC"}
@@ -0,0 +1,40 @@
1
+ export declare const DEFAULT_READ_TIMEOUT_MS = 15000;
2
+ export declare const DEFAULT_WRITE_TIMEOUT_MS = 120000;
3
+ /** A generation submit only queues a task; keep it well inside the ~60 s tool-call limit of Codex and Cursor. */
4
+ export declare const DEFAULT_SUBMIT_TIMEOUT_MS = 30000;
5
+ export declare const MAX_RETRY_DELAY_MS = 30000;
6
+ /** Public site for console links in errors and results. */
7
+ export declare const EVOLINK_SITE = "https://evolink.ai";
8
+ export declare const TOP_UP_URL = "https://evolink.ai/dashboard/credits";
9
+ export declare const API_KEYS_URL = "https://evolink.ai/dashboard/keys";
10
+ /**
11
+ * Where a signed-in user manages the EvoLink MCP limit and pause. Until the
12
+ * console has an MCP section, the account's internal MCP key is listed under
13
+ * API Keys (as MCP_KEY_NAME) and its limit and on/off switch are set there.
14
+ * The gateway's action_url, when it sends one, takes precedence.
15
+ */
16
+ export declare const MCP_CONSOLE_URL = "https://evolink.ai/dashboard/keys";
17
+ /** Name of the account's internal MCP key in the API Keys list (set by the gateway). */
18
+ export declare const MCP_KEY_NAME = "EvoLink MCP (OAuth)";
19
+ /** The gateway accepts Idempotency-Key values of 16–96 characters from this set. */
20
+ export declare const CLIENT_REQUEST_ID_PATTERN: RegExp;
21
+ export declare class RequestTimeoutError extends Error {
22
+ readonly timeoutMs: number;
23
+ constructor(timeoutMs: number);
24
+ }
25
+ export declare class PaidRequestOutcomeUnknownError extends Error {
26
+ readonly cause: unknown;
27
+ readonly idempotencyKey?: string | undefined;
28
+ constructor(cause: unknown, idempotencyKey?: string | undefined);
29
+ }
30
+ export declare function newRunId(): string;
31
+ /** Headers that tell the gateway this call came from the MCP server, which tool and which assistant. */
32
+ export declare function evoHeaders(tool: string): Record<string, string>;
33
+ /** Turns a console path such as /dashboard/credits into a full link; full https links pass through. */
34
+ export declare function siteUrl(pathOrUrl: string | undefined, fallback: string): string;
35
+ export declare function timeoutFromEnv(name: string, fallback: number): number;
36
+ export declare function parseRetryAfter(value: string | null, nowMs?: number): number | undefined;
37
+ export declare function responseRequestId(headers: Headers): string | undefined;
38
+ export declare function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number, fetchImpl?: typeof fetch): Promise<Response>;
39
+ export declare function readJsonBody(response: Response): Promise<unknown>;
40
+ //# sourceMappingURL=http-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-policy.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/http-policy.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAC9C,eAAO,MAAM,wBAAwB,SAAU,CAAC;AAChD,iHAAiH;AACjH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAChD,eAAO,MAAM,kBAAkB,QAAS,CAAC;AAEzC,2DAA2D;AAC3D,eAAO,MAAM,YAAY,uBAAuB,CAAC;AACjD,eAAO,MAAM,UAAU,yCAAsC,CAAC;AAC9D,eAAO,MAAM,YAAY,sCAAmC,CAAC;AAC7D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,sCAAe,CAAC;AAC5C,wFAAwF;AACxF,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAElD,oFAAoF;AACpF,eAAO,MAAM,yBAAyB,QAA4B,CAAC;AAEnE,qBAAa,mBAAoB,SAAQ,KAAK;aAChB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM;CAI9C;AAED,qBAAa,8BAA+B,SAAQ,KAAK;aAC3B,KAAK,EAAE,OAAO;aAAkB,cAAc,CAAC,EAAE,MAAM;gBAAvD,KAAK,EAAE,OAAO,EAAkB,cAAc,CAAC,EAAE,MAAM,YAAA;CAIpF;AAED,wBAAgB,QAAQ,IAAI,MAAM,CAEjC;AAED,wGAAwG;AACxG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS/D;AAED,uGAAuG;AACvG,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK/E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAQrE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,SAAa,GAAG,MAAM,GAAG,SAAS,CAS5F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAItE;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,SAAS,EAAE,MAAM,EACjB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAQvE"}