@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.
Files changed (131) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +67 -2
  3. package/dist/core/src/branding.d.ts +3 -0
  4. package/dist/core/src/branding.d.ts.map +1 -0
  5. package/dist/core/src/branding.js +8 -0
  6. package/dist/core/src/branding.js.map +1 -0
  7. package/dist/core/src/config.d.ts +19 -0
  8. package/dist/core/src/config.d.ts.map +1 -0
  9. package/dist/core/src/config.js +90 -0
  10. package/dist/core/src/config.js.map +1 -0
  11. package/dist/core/src/data/model-params.d.ts +49 -0
  12. package/dist/core/src/data/model-params.d.ts.map +1 -0
  13. package/dist/core/src/data/model-params.generated.d.ts +2 -0
  14. package/dist/core/src/data/model-params.generated.d.ts.map +1 -0
  15. package/dist/core/src/data/model-params.generated.js +3 -0
  16. package/dist/core/src/data/model-params.generated.js.map +1 -0
  17. package/dist/core/src/data/model-params.js +22 -0
  18. package/dist/core/src/data/model-params.js.map +1 -0
  19. package/dist/core/src/request-context.d.ts +79 -0
  20. package/dist/core/src/request-context.d.ts.map +1 -0
  21. package/dist/core/src/request-context.js +52 -0
  22. package/dist/core/src/request-context.js.map +1 -0
  23. package/dist/core/src/server.d.ts +36 -0
  24. package/dist/core/src/server.d.ts.map +1 -0
  25. package/dist/core/src/server.js +123 -0
  26. package/dist/core/src/server.js.map +1 -0
  27. package/dist/core/src/services/api-client.d.ts +142 -0
  28. package/dist/core/src/services/api-client.d.ts.map +1 -0
  29. package/dist/core/src/services/api-client.js +179 -0
  30. package/dist/core/src/services/api-client.js.map +1 -0
  31. package/dist/core/src/services/error-handler.d.ts +51 -0
  32. package/dist/core/src/services/error-handler.d.ts.map +1 -0
  33. package/dist/core/src/services/error-handler.js +403 -0
  34. package/dist/core/src/services/error-handler.js.map +1 -0
  35. package/dist/core/src/services/file-client.d.ts +54 -0
  36. package/dist/core/src/services/file-client.d.ts.map +1 -0
  37. package/dist/core/src/services/file-client.js +131 -0
  38. package/dist/core/src/services/file-client.js.map +1 -0
  39. package/dist/core/src/services/http-policy.d.ts +40 -0
  40. package/dist/core/src/services/http-policy.d.ts.map +1 -0
  41. package/dist/core/src/services/http-policy.js +120 -0
  42. package/dist/core/src/services/http-policy.js.map +1 -0
  43. package/dist/core/src/services/media-preview.d.ts +24 -0
  44. package/dist/core/src/services/media-preview.d.ts.map +1 -0
  45. package/dist/core/src/services/media-preview.js +155 -0
  46. package/dist/core/src/services/media-preview.js.map +1 -0
  47. package/dist/core/src/services/model-catalog.d.ts +24 -0
  48. package/dist/core/src/services/model-catalog.d.ts.map +1 -0
  49. package/dist/core/src/services/model-catalog.js +45 -0
  50. package/dist/core/src/services/model-catalog.js.map +1 -0
  51. package/dist/core/src/services/param-validator.d.ts +21 -0
  52. package/dist/core/src/services/param-validator.d.ts.map +1 -0
  53. package/dist/core/src/services/param-validator.js +164 -0
  54. package/dist/core/src/services/param-validator.js.map +1 -0
  55. package/dist/core/src/services/preview-download.d.ts +11 -0
  56. package/dist/core/src/services/preview-download.d.ts.map +1 -0
  57. package/dist/core/src/services/preview-download.js +106 -0
  58. package/dist/core/src/services/preview-download.js.map +1 -0
  59. package/dist/core/src/services/pricing-client.d.ts +95 -0
  60. package/dist/core/src/services/pricing-client.d.ts.map +1 -0
  61. package/dist/core/src/services/pricing-client.js +396 -0
  62. package/dist/core/src/services/pricing-client.js.map +1 -0
  63. package/dist/core/src/services/upload-policy.d.ts +19 -0
  64. package/dist/core/src/services/upload-policy.d.ts.map +1 -0
  65. package/dist/core/src/services/upload-policy.js +168 -0
  66. package/dist/core/src/services/upload-policy.js.map +1 -0
  67. package/dist/core/src/services/upload-slots.d.ts +63 -0
  68. package/dist/core/src/services/upload-slots.d.ts.map +1 -0
  69. package/dist/core/src/services/upload-slots.js +24 -0
  70. package/dist/core/src/services/upload-slots.js.map +1 -0
  71. package/dist/core/src/services/utm.d.ts +29 -0
  72. package/dist/core/src/services/utm.d.ts.map +1 -0
  73. package/dist/core/src/services/utm.js +64 -0
  74. package/dist/core/src/services/utm.js.map +1 -0
  75. package/dist/core/src/tool-guidance.d.ts +6 -0
  76. package/dist/core/src/tool-guidance.d.ts.map +1 -0
  77. package/dist/core/src/tool-guidance.js +49 -0
  78. package/dist/core/src/tool-guidance.js.map +1 -0
  79. package/dist/core/src/tools/check-balance.d.ts +4 -0
  80. package/dist/core/src/tools/check-balance.d.ts.map +1 -0
  81. package/dist/core/src/tools/check-balance.js +82 -0
  82. package/dist/core/src/tools/check-balance.js.map +1 -0
  83. package/dist/core/src/tools/estimate-cost.d.ts +4 -0
  84. package/dist/core/src/tools/estimate-cost.d.ts.map +1 -0
  85. package/dist/core/src/tools/estimate-cost.js +131 -0
  86. package/dist/core/src/tools/estimate-cost.js.map +1 -0
  87. package/dist/core/src/tools/generate.d.ts +4 -0
  88. package/dist/core/src/tools/generate.d.ts.map +1 -0
  89. package/dist/core/src/tools/generate.js +221 -0
  90. package/dist/core/src/tools/generate.js.map +1 -0
  91. package/dist/core/src/tools/get-model.d.ts +5 -0
  92. package/dist/core/src/tools/get-model.d.ts.map +1 -0
  93. package/dist/core/src/tools/get-model.js +117 -0
  94. package/dist/core/src/tools/get-model.js.map +1 -0
  95. package/dist/core/src/tools/get-task.d.ts +7 -0
  96. package/dist/core/src/tools/get-task.d.ts.map +1 -0
  97. package/dist/core/src/tools/get-task.js +56 -0
  98. package/dist/core/src/tools/get-task.js.map +1 -0
  99. package/dist/core/src/tools/list-tasks.d.ts +6 -0
  100. package/dist/core/src/tools/list-tasks.d.ts.map +1 -0
  101. package/dist/core/src/tools/list-tasks.js +149 -0
  102. package/dist/core/src/tools/list-tasks.js.map +1 -0
  103. package/dist/core/src/tools/prepare-upload.d.ts +6 -0
  104. package/dist/core/src/tools/prepare-upload.d.ts.map +1 -0
  105. package/dist/core/src/tools/prepare-upload.js +134 -0
  106. package/dist/core/src/tools/prepare-upload.js.map +1 -0
  107. package/dist/core/src/tools/search-models.d.ts +5 -0
  108. package/dist/core/src/tools/search-models.d.ts.map +1 -0
  109. package/dist/core/src/tools/search-models.js +97 -0
  110. package/dist/core/src/tools/search-models.js.map +1 -0
  111. package/dist/core/src/tools/shared.d.ts +55 -0
  112. package/dist/core/src/tools/shared.d.ts.map +1 -0
  113. package/dist/core/src/tools/shared.js +137 -0
  114. package/dist/core/src/tools/shared.js.map +1 -0
  115. package/dist/core/src/tools/task-format.d.ts +48 -0
  116. package/dist/core/src/tools/task-format.d.ts.map +1 -0
  117. package/dist/core/src/tools/task-format.js +212 -0
  118. package/dist/core/src/tools/task-format.js.map +1 -0
  119. package/dist/core/src/tools/upload-file.d.ts +17 -0
  120. package/dist/core/src/tools/upload-file.d.ts.map +1 -0
  121. package/dist/core/src/tools/upload-file.js +134 -0
  122. package/dist/core/src/tools/upload-file.js.map +1 -0
  123. package/dist/core/src/version.d.ts +3 -0
  124. package/dist/core/src/version.d.ts.map +1 -0
  125. package/dist/core/src/version.js +3 -0
  126. package/dist/core/src/version.js.map +1 -0
  127. package/dist/evolink-media/src/index.d.ts +3 -0
  128. package/dist/evolink-media/src/index.d.ts.map +1 -0
  129. package/dist/evolink-media/src/index.js +18 -0
  130. package/dist/evolink-media/src/index.js.map +1 -0
  131. package/package.json +46 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE5G,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEnE,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAMD,oHAAoH;AACpH,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAgBpD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAGhF;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,EAAE,CAGtF;AAED,gEAAgE;AAChE,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,YAAY,CAAA;CAAE,CAAC,CAKlG"}
@@ -0,0 +1,45 @@
1
+ import { allModelParams, findModelParams } from '../data/model-params.js';
2
+ import { closestMatches } from './param-validator.js';
3
+ import { getPricing } from './pricing-client.js';
4
+ function isMediaKind(value) {
5
+ return value === 'image' || value === 'video' || value === 'audio';
6
+ }
7
+ /** Merges the bundled parameter index with the live price list; works without prices if the list is unreachable. */
8
+ export async function loadCatalog() {
9
+ const entries = new Map();
10
+ for (const spec of allModelParams())
11
+ entries.set(spec.model, { id: spec.model, kind: spec.kind, spec });
12
+ let pricingWarning;
13
+ try {
14
+ const pricing = await getPricing();
15
+ if (pricing.source === 'stale-cache')
16
+ pricingWarning = 'Prices could not be refreshed; showing the last known prices.';
17
+ for (const priced of pricing.models.values()) {
18
+ const existing = entries.get(priced.id);
19
+ if (existing)
20
+ existing.priced = priced;
21
+ else if (isMediaKind(priced.kind))
22
+ entries.set(priced.id, { id: priced.id, kind: priced.kind, priced });
23
+ }
24
+ }
25
+ catch (error) {
26
+ pricingWarning = `Prices are unavailable right now (${error instanceof Error ? error.message : 'unknown error'}).`;
27
+ }
28
+ return { entries: [...entries.values()], pricingWarning };
29
+ }
30
+ export function findEntry(catalog, id) {
31
+ const lower = id.trim().toLowerCase();
32
+ return catalog.entries.find(entry => entry.id === id.trim()) ?? catalog.entries.find(entry => entry.id.toLowerCase() === lower);
33
+ }
34
+ export function suggestModels(catalog, id, kind) {
35
+ const pool = catalog.entries.filter(entry => !kind || entry.kind === kind).map(entry => entry.id);
36
+ return closestMatches(id, pool, 5);
37
+ }
38
+ /** Looks a model up for one request; prices are best effort. */
39
+ export async function resolveModel(id) {
40
+ const spec = findModelParams(id);
41
+ const catalog = await loadCatalog();
42
+ const entry = spec ? findEntry(catalog, spec.model) : findEntry(catalog, id);
43
+ return { catalog, entry };
44
+ }
45
+ //# sourceMappingURL=model-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-catalog.js","sourceRoot":"","sources":["../../../../../core/src/services/model-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ModelParams } from '../data/model-params.js';
2
+ export interface ValidationIssue {
3
+ param: string;
4
+ problem: string;
5
+ }
6
+ export interface ValidationResult {
7
+ /** The request would be rejected; it is not submitted. */
8
+ errors: ValidationIssue[];
9
+ /** Worth telling the user, but the gateway has the final say (for example prompt length, which it counts in tokens). */
10
+ warnings: ValidationIssue[];
11
+ }
12
+ /** Up to `limit` candidates that look like `value`, best first. */
13
+ export declare function closestMatches(value: string, candidates: string[], limit?: number): string[];
14
+ /**
15
+ * Checks a generation input against the documented parameters before
16
+ * anything is sent: unknown names, wrong types, values outside the documented
17
+ * choices or ranges. The gateway still validates the request in full.
18
+ */
19
+ export declare function validateInput(spec: ModelParams, input: Record<string, unknown>): ValidationResult;
20
+ export declare function formatIssues(issues: ValidationIssue[]): string[];
21
+ //# sourceMappingURL=param-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-validator.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,yBAAyB,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,wHAAwH;IACxH,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AA2BD,mEAAmE;AACnE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAavF;AAoGD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CAkBjG;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,EAAE,CAEhE"}
@@ -0,0 +1,164 @@
1
+ /** Parameters an assistant may not set through MCP, with the reason shown to it. */
2
+ const BLOCKED_PARAMS = {
3
+ callback_url: 'callbacks are not available through MCP; use get_task to wait for the result',
4
+ };
5
+ /** Levenshtein distance, capped for long strings. */
6
+ function distance(a, b) {
7
+ if (a === b)
8
+ return 0;
9
+ const rows = a.length + 1;
10
+ const cols = b.length + 1;
11
+ let previous = Array.from({ length: cols }, (_, j) => j);
12
+ for (let i = 1; i < rows; i++) {
13
+ const current = [i];
14
+ for (let j = 1; j < cols; j++) {
15
+ current[j] = Math.min(previous[j] + 1, current[j - 1] + 1, previous[j - 1] + (a[i - 1] === b[j - 1] ? 0 : 1));
16
+ }
17
+ previous = current;
18
+ }
19
+ return previous[cols - 1];
20
+ }
21
+ /** Up to `limit` candidates that look like `value`, best first. */
22
+ export function closestMatches(value, candidates, limit = 3) {
23
+ const needle = value.toLowerCase();
24
+ return candidates
25
+ .map(candidate => {
26
+ const lower = candidate.toLowerCase();
27
+ const contains = lower.includes(needle) || needle.includes(lower);
28
+ const score = distance(needle, lower) / Math.max(needle.length, lower.length, 1) - (contains ? 0.5 : 0);
29
+ return { candidate, score };
30
+ })
31
+ .filter(item => item.score <= 0.45)
32
+ .sort((a, b) => a.score - b.score || a.candidate.localeCompare(b.candidate))
33
+ .slice(0, limit)
34
+ .map(item => item.candidate);
35
+ }
36
+ function describeType(type) {
37
+ return type.split('|').map(part => (part === 'integer' ? 'a whole number' : part === 'array' ? 'a list' : `a ${part}`)).join(' or ');
38
+ }
39
+ function matchesType(type, value) {
40
+ if (!type)
41
+ return true;
42
+ return type.split('|').some(part => {
43
+ switch (part) {
44
+ case 'string': return typeof value === 'string';
45
+ case 'integer': return typeof value === 'number' && Number.isInteger(value);
46
+ case 'number': return typeof value === 'number' && Number.isFinite(value);
47
+ case 'boolean': return typeof value === 'boolean';
48
+ case 'array': return Array.isArray(value);
49
+ case 'object': return !!value && typeof value === 'object' && !Array.isArray(value);
50
+ case 'null': return value === null;
51
+ default: return true;
52
+ }
53
+ });
54
+ }
55
+ function show(value) {
56
+ const json = JSON.stringify(value);
57
+ return json && json.length > 60 ? `${json.slice(0, 57)}…` : json ?? String(value);
58
+ }
59
+ function checkValue(name, spec, value, result) {
60
+ if (value === undefined)
61
+ return;
62
+ if (!matchesType(spec.type, value)) {
63
+ const numericString = typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Number(value));
64
+ const hint = numericString && /integer|number/.test(spec.type ?? '') ? ` Use ${Number(value)} (a number), not "${value}".` : '';
65
+ result.errors.push({ param: name, problem: `must be ${describeType(spec.type)}, got ${show(value)}.${hint}` });
66
+ return;
67
+ }
68
+ if (spec.enum && spec.enum.length > 0 && (typeof value !== 'object' || value === null)) {
69
+ if (!spec.enum.some(option => option === value)) {
70
+ const caseMatch = typeof value === 'string'
71
+ ? spec.enum.find(option => typeof option === 'string' && option.toLowerCase() === value.toLowerCase())
72
+ : undefined;
73
+ result.errors.push({
74
+ param: name,
75
+ problem: caseMatch !== undefined
76
+ ? `use ${show(caseMatch)} (values are case-sensitive), got ${show(value)}.`
77
+ : `must be one of ${spec.enum.map(show).join(', ')}; got ${show(value)}.`,
78
+ });
79
+ return;
80
+ }
81
+ }
82
+ if (typeof value === 'number') {
83
+ if (spec.minimum !== undefined && value < spec.minimum)
84
+ result.errors.push({ param: name, problem: `must be at least ${spec.minimum}, got ${value}.` });
85
+ if (spec.maximum !== undefined && value > spec.maximum)
86
+ result.errors.push({ param: name, problem: `must be at most ${spec.maximum}, got ${value}.` });
87
+ if (spec.exclusiveMinimum !== undefined && value <= spec.exclusiveMinimum)
88
+ result.errors.push({ param: name, problem: `must be greater than ${spec.exclusiveMinimum}, got ${value}.` });
89
+ if (spec.exclusiveMaximum !== undefined && value >= spec.exclusiveMaximum)
90
+ result.errors.push({ param: name, problem: `must be less than ${spec.exclusiveMaximum}, got ${value}.` });
91
+ }
92
+ if (typeof value === 'string') {
93
+ if (spec.maxLength !== undefined && value.length > spec.maxLength) {
94
+ result.warnings.push({ param: name, problem: `is ${value.length} characters; the documented limit is ${spec.maxLength}. The gateway may reject it.` });
95
+ }
96
+ if (spec.minLength !== undefined && value.length < spec.minLength) {
97
+ result.errors.push({ param: name, problem: `must be at least ${spec.minLength} characters.` });
98
+ }
99
+ }
100
+ if (Array.isArray(value)) {
101
+ if (spec.maxItems !== undefined && value.length > spec.maxItems)
102
+ result.errors.push({ param: name, problem: `allows at most ${spec.maxItems} items, got ${value.length}.` });
103
+ if (spec.minItems !== undefined && value.length < spec.minItems)
104
+ result.errors.push({ param: name, problem: `needs at least ${spec.minItems} items, got ${value.length}.` });
105
+ const items = spec.items;
106
+ if (items) {
107
+ value.forEach((item, position) => {
108
+ checkValue(`${name}[${position}]`, { type: items.type, enum: items.enum, properties: items.properties }, item, result);
109
+ });
110
+ }
111
+ }
112
+ if (spec.properties && value && typeof value === 'object' && !Array.isArray(value)) {
113
+ checkObject(name, spec.properties, value, result);
114
+ }
115
+ }
116
+ function checkObject(prefix, properties, value, result) {
117
+ const known = Object.keys(properties);
118
+ for (const [key, nested] of Object.entries(value)) {
119
+ const spec = properties[key];
120
+ const path = prefix ? `${prefix}.${key}` : key;
121
+ if (!spec) {
122
+ const suggestions = closestMatches(key, known);
123
+ result.errors.push({
124
+ param: path,
125
+ problem: `is not a parameter here.${suggestions.length ? ` Did you mean ${suggestions.map(s => `"${s}"`).join(' or ')}?` : ''} Allowed: ${known.join(', ') || 'none'}.`,
126
+ });
127
+ continue;
128
+ }
129
+ checkValue(path, spec, nested, result);
130
+ }
131
+ for (const [key, spec] of Object.entries(properties)) {
132
+ if (spec.required && value[key] === undefined) {
133
+ result.errors.push({ param: prefix ? `${prefix}.${key}` : key, problem: 'is required.' });
134
+ }
135
+ }
136
+ }
137
+ /**
138
+ * Checks a generation input against the documented parameters before
139
+ * anything is sent: unknown names, wrong types, values outside the documented
140
+ * choices or ranges. The gateway still validates the request in full.
141
+ */
142
+ export function validateInput(spec, input) {
143
+ const result = { errors: [], warnings: [] };
144
+ const rest = {};
145
+ for (const [key, value] of Object.entries(input)) {
146
+ if (key === 'model') {
147
+ if (value !== undefined && value !== spec.model) {
148
+ result.errors.push({ param: 'model', problem: `set the model with the model argument, not inside input (input has ${show(value)}).` });
149
+ }
150
+ continue;
151
+ }
152
+ if (BLOCKED_PARAMS[key]) {
153
+ result.errors.push({ param: key, problem: `${BLOCKED_PARAMS[key]}.` });
154
+ continue;
155
+ }
156
+ rest[key] = value;
157
+ }
158
+ checkObject('', spec.params, rest, result);
159
+ return result;
160
+ }
161
+ export function formatIssues(issues) {
162
+ return issues.map(issue => `- ${issue.param} ${issue.problem}`);
163
+ }
164
+ //# sourceMappingURL=param-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"param-validator.js","sourceRoot":"","sources":["../../../../../core/src/services/param-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ /** Preview fetching must never attach the gateway's authorization or follow a URL into a private network. */
3
+ export declare function isPublicAddress(address: string): boolean;
4
+ export declare function previewURL(value: string): URL;
5
+ export declare function previewAddress(url: URL, signal: AbortSignal, resolve?: typeof lookup): Promise<{
6
+ address: string;
7
+ family: number;
8
+ }>;
9
+ /** Bounded HTTPS download, with every DNS answer checked and the selected address pinned to the socket. */
10
+ export declare function downloadPreview(value: string, maxBytes: number, signal: AbortSignal): Promise<Buffer>;
11
+ //# sourceMappingURL=preview-download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-download.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/preview-download.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAI3C,6GAA6G;AAC7G,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBxD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAU7C;AAWD,wBAAsB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,gBAAS;;;GAMnF;AAED,2GAA2G;AAC3G,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA2C3G"}
@@ -0,0 +1,106 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ import { request } from 'node:https';
3
+ import { isIP } from 'node:net';
4
+ /** Preview fetching must never attach the gateway's authorization or follow a URL into a private network. */
5
+ export function isPublicAddress(address) {
6
+ if (isIP(address) === 4) {
7
+ const [a, b, c] = address.split('.').map(Number);
8
+ return !(a === 0 || a === 10 || a === 127 || a >= 224
9
+ || (a === 100 && b >= 64 && b <= 127)
10
+ || (a === 169 && b === 254) || (a === 172 && b >= 16 && b <= 31)
11
+ || (a === 192 && (b === 0 || b === 168 || (b === 88 && c === 99)))
12
+ || (a === 198 && (b === 18 || b === 19 || (b === 51 && c === 100)))
13
+ || (a === 203 && b === 0 && c === 113));
14
+ }
15
+ if (isIP(address) === 6) {
16
+ // Only global unicast, excluding documentation, transition and special-use ranges.
17
+ const [first, second = '0'] = address.toLowerCase().split(':');
18
+ const a = parseInt(first, 16), b = parseInt(second || '0', 16);
19
+ return a >= 0x2000 && a < 0x4000 && a !== 0x2002 && a !== 0x3fff
20
+ && !(a === 0x2001 && (b < 0x200 || b === 0xdb8));
21
+ }
22
+ return false;
23
+ }
24
+ export function previewURL(value) {
25
+ const url = new URL(value);
26
+ const host = url.hostname.replace(/^\[|\]$/g, '').replace(/\.$/, '').toLowerCase();
27
+ if (url.protocol !== 'https:' || url.username || url.password || (url.port && url.port !== '443')
28
+ || (!host.includes('.') && isIP(host) === 0)
29
+ || /(?:^|\.)(?:localhost|local|internal|test|invalid|example)$/.test(host)
30
+ || (isIP(host) !== 0 && !isPublicAddress(host))) {
31
+ throw new Error('Preview URL is not public HTTPS');
32
+ }
33
+ return url;
34
+ }
35
+ function abortable(operation, signal) {
36
+ return new Promise((resolve, reject) => {
37
+ const abort = () => reject(new Error('Preview cancelled'));
38
+ signal.addEventListener('abort', abort, { once: true });
39
+ if (signal.aborted)
40
+ abort();
41
+ operation.then(resolve, reject).finally(() => signal.removeEventListener('abort', abort));
42
+ });
43
+ }
44
+ export async function previewAddress(url, signal, resolve = lookup) {
45
+ const host = url.hostname.replace(/^\[|\]$/g, '').replace(/\.$/, '');
46
+ const literal = isIP(host);
47
+ const addresses = literal ? [{ address: host, family: literal }] : await abortable(resolve(host, { all: true }), signal);
48
+ if (!addresses.length || addresses.some(entry => !isPublicAddress(entry.address)))
49
+ throw new Error('Preview address is not public');
50
+ return addresses[0];
51
+ }
52
+ /** Bounded HTTPS download, with every DNS answer checked and the selected address pinned to the socket. */
53
+ export async function downloadPreview(value, maxBytes, signal) {
54
+ let url = previewURL(value);
55
+ for (let redirects = 0; redirects <= 3; redirects++) {
56
+ const address = await previewAddress(url, signal);
57
+ signal.throwIfAborted();
58
+ const response = await new Promise((resolve, reject) => {
59
+ const req = request(url, {
60
+ method: 'GET', signal, family: address.family,
61
+ // The DNS name is still used for TLS/SNI and certificate verification.
62
+ lookup: (_hostname, _options, callback) => callback(null, address.address, address.family),
63
+ headers: { Accept: 'image/*,video/*', 'User-Agent': 'EvoLink-MCP-Preview/1' },
64
+ }, res => {
65
+ if ([301, 302, 303, 307, 308].includes(res.statusCode ?? 0)) {
66
+ res.destroy();
67
+ try {
68
+ if (!res.headers.location)
69
+ throw new Error('Missing redirect');
70
+ resolve(previewURL(new URL(res.headers.location, url).href));
71
+ }
72
+ catch (error) {
73
+ reject(error);
74
+ }
75
+ return;
76
+ }
77
+ if (res.statusCode !== 200 || Number(res.headers['content-length']) > maxBytes) {
78
+ res.destroy();
79
+ reject(new Error('Preview source unavailable or too large'));
80
+ return;
81
+ }
82
+ const chunks = [];
83
+ let size = 0;
84
+ res.on('data', (chunk) => {
85
+ size += chunk.length;
86
+ if (size > maxBytes) {
87
+ res.destroy();
88
+ reject(new Error('Preview source too large'));
89
+ return;
90
+ }
91
+ chunks.push(chunk);
92
+ });
93
+ res.on('end', () => resolve(Buffer.concat(chunks)));
94
+ res.on('error', reject);
95
+ res.on('aborted', () => reject(new Error('Preview source interrupted')));
96
+ });
97
+ req.on('error', reject);
98
+ req.end();
99
+ });
100
+ if (Buffer.isBuffer(response))
101
+ return response;
102
+ url = response;
103
+ }
104
+ throw new Error('Too many preview redirects');
105
+ }
106
+ //# sourceMappingURL=preview-download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview-download.js","sourceRoot":"","sources":["../../../../../core/src/services/preview-download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { ModelParams } from '../data/model-params.js';
2
+ /** One SKU from the public pricing endpoint (GET /web/api/models/pricing, default price group). */
3
+ export interface PricingSku {
4
+ sku_id: string;
5
+ sku_name: string;
6
+ model_name: string;
7
+ model_type: string;
8
+ description?: string;
9
+ vendor_slug?: string;
10
+ billing_rule: string;
11
+ cny_price?: number;
12
+ min_charge_uc?: number;
13
+ metadata?: string;
14
+ resolution_multipliers?: Record<string, number>;
15
+ price_range?: {
16
+ min_usd?: number;
17
+ max_usd?: number;
18
+ };
19
+ routing_note?: string;
20
+ }
21
+ /** What one SKU costs, in the unit the gateway bills it. */
22
+ export interface SkuPrice {
23
+ sku_id: string;
24
+ name: string;
25
+ /** "image", "second", "request", "1M tokens", "1K tokens", "token" or "hour". */
26
+ unit: string;
27
+ min_usd: number;
28
+ max_usd: number;
29
+ /** output: the main charge; add_on: extra inputs or features; token: usage-based. */
30
+ role: 'output' | 'add_on' | 'token';
31
+ multipliers?: Record<string, number>;
32
+ min_charge_usd?: number;
33
+ /** min and max are the prices of several upstream providers (the gateway's routing note says "Calls prioritize…"). */
34
+ provider_range?: boolean;
35
+ /** Price of the provider the gateway tries first (by channel priority, not by price). */
36
+ preferred_usd?: number;
37
+ }
38
+ export interface PricedModel {
39
+ id: string;
40
+ kind: string;
41
+ vendor?: string;
42
+ description?: string;
43
+ prices: SkuPrice[];
44
+ }
45
+ export interface PricingSnapshot {
46
+ models: Map<string, PricedModel>;
47
+ fetchedAt: number;
48
+ source: 'live' | 'cache' | 'stale-cache';
49
+ }
50
+ /** Base for the public web API (pricing); EVOLINK_CONTROL_BASE points it at a staging host. */
51
+ export declare function controlBaseURL(): string;
52
+ /** Unit and USD price of one SKU: the gateway's routing note first (it carries the corrected unit), the raw fields second. */
53
+ export declare function skuPrice(sku: PricingSku): SkuPrice | undefined;
54
+ /** Image, video and audio models with their published unit prices; cached for five minutes, served stale for a day if a refresh fails. */
55
+ export declare function getPricing(): Promise<PricingSnapshot>;
56
+ export declare function resetPricingCacheForTests(): void;
57
+ export declare function findPricedModel(models: Map<string, PricedModel>, id: string): PricedModel | undefined;
58
+ export declare function formatPrice(price: SkuPrice): string;
59
+ /** Lowest main unit price, for listings ("from $0.04 per image"). */
60
+ export declare function startingPrice(model: PricedModel): SkuPrice | undefined;
61
+ export interface CostEstimate {
62
+ /** partial: published rates were computed but do not cover the full request. */
63
+ status: 'estimated' | 'partial' | 'token_billed' | 'needs_input' | 'no_price';
64
+ min_usd?: number;
65
+ max_usd?: number;
66
+ min_credits?: number;
67
+ max_credits?: number;
68
+ /** How the range was computed, one line per charge. */
69
+ basis: string[];
70
+ /** Extra charges that may apply but are not in the range. */
71
+ possible_extras: string[];
72
+ notes: string[];
73
+ /** needs_input only: the quantity to pass, input.duration or media_seconds (see billedByMediaLength). */
74
+ missing?: 'duration' | 'media_seconds';
75
+ /** A known billing gap that prevents checking max_cost_usd, even when a range is available. */
76
+ uncheckable_reason?: 'reference_video';
77
+ }
78
+ export interface EstimateOptions {
79
+ /** Length of the media a per-second charge is based on, for models without a duration parameter; never sent to the model. */
80
+ mediaSeconds?: number;
81
+ }
82
+ /**
83
+ * A documented model billed per second that has no duration parameter: the gateway measures the seconds when
84
+ * the task runs, usually from the media it works on (the input video of an upscale, edit or motion transfer,
85
+ * the audio of a talking head). Its input alone cannot price it; media_seconds can.
86
+ */
87
+ export declare function billedByMediaLength(model: PricedModel | undefined, spec?: ModelParams): boolean;
88
+ /**
89
+ * Interim media estimate: published unit price × images or seconds, plus
90
+ * per-input-image charges. The gateway's own pre-charge at submit time is
91
+ * authoritative; this only tells the user what to expect.
92
+ */
93
+ export declare function estimateCost(model: PricedModel | undefined, kind: string, input: Record<string, unknown>, spec?: ModelParams, options?: EstimateOptions): CostEstimate;
94
+ export declare function formatEstimateRange(estimate: CostEstimate): string | undefined;
95
+ //# sourceMappingURL=pricing-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pricing-client.d.ts","sourceRoot":"","sources":["../../../../../core/src/services/pricing-client.ts"],"names":[],"mappings":"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"}