@bedolla/enrivision 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -6
- package/dist/client/EnriProxyClient.d.ts +289 -244
- package/dist/client/EnriProxyClient.d.ts.map +1 -1
- package/dist/client/EnriProxyClient.js +841 -115
- package/dist/client/EnriProxyClient.js.map +1 -1
- package/dist/client/EnriProxyClientContract.d.ts +425 -0
- package/dist/client/EnriProxyClientContract.d.ts.map +1 -0
- package/dist/client/EnriProxyClientContract.js +87 -0
- package/dist/client/EnriProxyClientContract.js.map +1 -0
- package/dist/index.js +23 -12
- package/dist/index.js.map +1 -1
- package/dist/package-info.d.ts +28 -0
- package/dist/package-info.d.ts.map +1 -1
- package/dist/package-info.js +28 -0
- package/dist/package-info.js.map +1 -1
- package/dist/server/EnriVisionServer.d.ts +186 -0
- package/dist/server/EnriVisionServer.d.ts.map +1 -1
- package/dist/server/EnriVisionServer.js +780 -93
- package/dist/server/EnriVisionServer.js.map +1 -1
- package/dist/shared/codepointTruncation.d.ts +61 -0
- package/dist/shared/codepointTruncation.d.ts.map +1 -0
- package/dist/shared/codepointTruncation.js +73 -0
- package/dist/shared/codepointTruncation.js.map +1 -0
- package/dist/shared/mediaUrlFetcher.d.ts +247 -9
- package/dist/shared/mediaUrlFetcher.d.ts.map +1 -1
- package/dist/shared/mediaUrlFetcher.js +712 -53
- package/dist/shared/mediaUrlFetcher.js.map +1 -1
- package/dist/shared/tar.d.ts +82 -2
- package/dist/shared/tar.d.ts.map +1 -1
- package/dist/shared/tar.js +106 -43
- package/dist/shared/tar.js.map +1 -1
- package/dist/shared/validation.d.ts +96 -2
- package/dist/shared/validation.d.ts.map +1 -1
- package/dist/shared/validation.js +169 -10
- package/dist/shared/validation.js.map +1 -1
- package/dist/tools/AnalyzeMediaContract.d.ts +457 -0
- package/dist/tools/AnalyzeMediaContract.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaContract.js +161 -0
- package/dist/tools/AnalyzeMediaContract.js.map +1 -0
- package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts +35 -0
- package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaExtractionSanitizer.js +214 -0
- package/dist/tools/AnalyzeMediaExtractionSanitizer.js.map +1 -0
- package/dist/tools/AnalyzeMediaInputResolver.d.ts +250 -0
- package/dist/tools/AnalyzeMediaInputResolver.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaInputResolver.js +430 -0
- package/dist/tools/AnalyzeMediaInputResolver.js.map +1 -0
- package/dist/tools/AnalyzeMediaParamParser.d.ts +299 -0
- package/dist/tools/AnalyzeMediaParamParser.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaParamParser.js +824 -0
- package/dist/tools/AnalyzeMediaParamParser.js.map +1 -0
- package/dist/tools/AnalyzeMediaResumableUploader.d.ts +244 -0
- package/dist/tools/AnalyzeMediaResumableUploader.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaResumableUploader.js +549 -0
- package/dist/tools/AnalyzeMediaResumableUploader.js.map +1 -0
- package/dist/tools/AnalyzeMediaTarPackager.d.ts +42 -0
- package/dist/tools/AnalyzeMediaTarPackager.d.ts.map +1 -0
- package/dist/tools/AnalyzeMediaTarPackager.js +245 -0
- package/dist/tools/AnalyzeMediaTarPackager.js.map +1 -0
- package/dist/tools/AnalyzeMediaTool.d.ts +155 -294
- package/dist/tools/AnalyzeMediaTool.d.ts.map +1 -1
- package/dist/tools/AnalyzeMediaTool.js +600 -457
- package/dist/tools/AnalyzeMediaTool.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -10,6 +10,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
|
|
|
10
10
|
import { EnriProxyClient } from "./client/EnriProxyClient.js";
|
|
11
11
|
import { AnalyzeMediaTool } from "./tools/AnalyzeMediaTool.js";
|
|
12
12
|
import { EnriVisionServer } from "./server/EnriVisionServer.js";
|
|
13
|
+
import { resolveTimeoutMs } from "./shared/validation.js";
|
|
13
14
|
import { packageInfoService } from "./package-info.js";
|
|
14
15
|
/**
|
|
15
16
|
* Environment variable for EnriProxy base URL.
|
|
@@ -42,18 +43,21 @@ async function main() {
|
|
|
42
43
|
if (args[0] === "--help" || args[0] === "-h" || args[0] === "help") {
|
|
43
44
|
console.log("EnriVision");
|
|
44
45
|
console.log("");
|
|
45
|
-
console.log("This is an MCP server over stdio that uploads local media to EnriProxy for server-side extraction and analysis.");
|
|
46
|
+
console.log("This is an MCP server over stdio that uploads local media to EnriProxy for server-side extraction and analysis. / Este es un servidor MCP sobre stdio que sube media local a EnriProxy para extracción y análisis del lado servidor.");
|
|
46
47
|
console.log("");
|
|
47
|
-
console.log("Usage:");
|
|
48
|
-
console.log(" enrivision (
|
|
48
|
+
console.log("Usage / Uso:");
|
|
49
|
+
console.log(" enrivision (starts the MCP server over stdio / inicia el servidor MCP sobre stdio)");
|
|
49
50
|
console.log(" enrivision --version");
|
|
50
51
|
console.log(" enrivision --help");
|
|
51
52
|
console.log("");
|
|
52
|
-
console.log("Environment variables:");
|
|
53
|
-
console.log(" ENRIPROXY_URL (optional, default: http://127.0.0.1:8787)");
|
|
54
|
-
console.log(" ENRIPROXY_API_KEY (required)");
|
|
55
|
-
console.log(" ENRIVISION_TIMEOUT_MS (optional, default: 1800000)");
|
|
56
|
-
console.log(" ENRIVISION_DEFAULT_LANGUAGE (optional, e.g. es/en)");
|
|
53
|
+
console.log("Environment variables / Variables de entorno:");
|
|
54
|
+
console.log(" ENRIPROXY_URL (optional, default: http://127.0.0.1:8787 / opcional, por defecto: http://127.0.0.1:8787)");
|
|
55
|
+
console.log(" ENRIPROXY_API_KEY (required / requerida)");
|
|
56
|
+
console.log(" ENRIVISION_TIMEOUT_MS (optional, default: 1800000; operator cap: the analyze timeout is min(operator, mode budget) with single 10 min and multipass/auto 20 min; per-chunk timeouts honor min(operator, derived 30s..300s) floored at 30 s / opcional, por defecto: 1800000; tope del operador: el timeout de análisis es min(operador, presupuesto del modo) con single 10 min y multipass/auto 20 min; los timeouts por chunk honran min(operador, derivado 30s..300s) con piso de 30 s)");
|
|
57
|
+
console.log(" ENRIVISION_DEFAULT_LANGUAGE (optional, e.g. es/en / opcional, p. ej. es/en)");
|
|
58
|
+
console.log(" ENRIVISION_QUIET=1 (optional, silences upload/retry progress on stderr / opcional, silencia el progreso subida/reintentos en stderr)");
|
|
59
|
+
console.log(" ENRIVISION_DENY_SYMLINKS=1 (optional, rejects symlinked path/paths inputs; on Windows O_NOFOLLOW is 0 (advisory), so strict mode rests on the lstat-vs-fstat dev:ino comparison with a small swap window / opcional, rechaza path/paths con enlaces simbólicos; en Windows O_NOFOLLOW es 0 (consultivo), así que el modo estricto descansa en la comparación dev:ino de lstat-vs-fstat con una ventana pequeña)");
|
|
60
|
+
console.log(" ENRIVISION_MODEL (optional, model id for dispatch affinity; omit for auto-dispatch / opcional, id del modelo para afinidad de dispatch; omita para auto-dispatch)");
|
|
57
61
|
process.exit(0);
|
|
58
62
|
}
|
|
59
63
|
if (args[0] === "--version" || args[0] === "-v" || args[0] === "version") {
|
|
@@ -62,8 +66,15 @@ async function main() {
|
|
|
62
66
|
}
|
|
63
67
|
const serverUrl = (process.env[ENRIPROXY_URL_ENV] ?? DEFAULT_ENRIPROXY_URL).trim();
|
|
64
68
|
const apiKey = (process.env[ENRIPROXY_API_KEY_ENV] ?? "").trim();
|
|
69
|
+
if (!apiKey) {
|
|
70
|
+
console.error("[EnriVision] WARNING: missing ENRIPROXY_API_KEY; the server starts but every analyze_media call will fail until it is set. / AVISO: falta ENRIPROXY_API_KEY; el servidor arranca pero cada llamada a analyze_media fallará hasta configurarla.");
|
|
71
|
+
}
|
|
65
72
|
const timeoutMsRaw = (process.env[ENRIVISION_TIMEOUT_MS_ENV] ?? "").trim();
|
|
66
|
-
const
|
|
73
|
+
const resolvedTimeout = resolveTimeoutMs(timeoutMsRaw, ENRIVISION_TIMEOUT_MS_ENV, DEFAULT_TIMEOUT_MS);
|
|
74
|
+
if (resolvedTimeout.warning) {
|
|
75
|
+
console.error(`[EnriVision] WARNING / AVISO: ${resolvedTimeout.warning}`);
|
|
76
|
+
}
|
|
77
|
+
const timeoutMs = resolvedTimeout.timeoutMs;
|
|
67
78
|
const analyzeMediaTool = new AnalyzeMediaTool({
|
|
68
79
|
createClient: (baseUrl, key, timeout) => new EnriProxyClient({
|
|
69
80
|
baseUrl,
|
|
@@ -72,7 +83,7 @@ async function main() {
|
|
|
72
83
|
}),
|
|
73
84
|
defaultServerUrl: serverUrl,
|
|
74
85
|
defaultApiKey: apiKey,
|
|
75
|
-
defaultTimeoutMs:
|
|
86
|
+
defaultTimeoutMs: timeoutMs
|
|
76
87
|
});
|
|
77
88
|
const server = new EnriVisionServer({
|
|
78
89
|
name: "EnriVision",
|
|
@@ -81,10 +92,10 @@ async function main() {
|
|
|
81
92
|
});
|
|
82
93
|
const transport = new StdioServerTransport();
|
|
83
94
|
await server.connect(transport);
|
|
84
|
-
console.error("[EnriVision] MCP server running on stdio");
|
|
95
|
+
console.error("[EnriVision] MCP server running on stdio / Servidor MCP en ejecución sobre stdio");
|
|
85
96
|
}
|
|
86
97
|
void main().catch((error) => {
|
|
87
|
-
console.error("[EnriVision] FATAL:", error instanceof Error ? error.message : String(error));
|
|
98
|
+
console.error("[EnriVision] FATAL ERROR / ERROR FATAL:", error instanceof Error ? error.message : String(error));
|
|
88
99
|
process.exit(1);
|
|
89
100
|
});
|
|
90
101
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C;;GAEG;AACH,MAAM,qBAAqB,GAAG,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAE1D;;GAEG;AACH,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE1C;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/package-info.d.ts
CHANGED
|
@@ -1,8 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PACKAGE INFO
|
|
3
|
+
*
|
|
4
|
+
* Reads the published package version from `package.json` with an
|
|
5
|
+
* injectable-free `createRequire` lookup and a safe fallback.
|
|
6
|
+
*
|
|
7
|
+
* @module package-info
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Provides the current package version.
|
|
11
|
+
*/
|
|
1
12
|
export declare class PackageInfoService {
|
|
13
|
+
/**
|
|
14
|
+
* Node require function anchored at this module.
|
|
15
|
+
*/
|
|
2
16
|
private readonly require;
|
|
17
|
+
/**
|
|
18
|
+
* Cached version once resolved.
|
|
19
|
+
*/
|
|
3
20
|
private cachedVersion;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a new {@link PackageInfoService}.
|
|
23
|
+
*/
|
|
4
24
|
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Returns the package version from `package.json`.
|
|
27
|
+
*
|
|
28
|
+
* @returns Version string, or `0.0.0` when unreadable.
|
|
29
|
+
*/
|
|
5
30
|
getVersion(): string;
|
|
6
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Shared package info service instance.
|
|
34
|
+
*/
|
|
7
35
|
export declare const packageInfoService: PackageInfoService;
|
|
8
36
|
//# sourceMappingURL=package-info.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"package-info.d.ts","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IAEtC;;OAEG;IACH,OAAO,CAAC,aAAa,CAAuB;IAE5C;;OAEG;;IAKH;;;;OAIG;IACI,UAAU,IAAI,MAAM;CAkB5B;AAED;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,kBAA6C,CAAC"}
|
package/dist/package-info.js
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PACKAGE INFO
|
|
3
|
+
*
|
|
4
|
+
* Reads the published package version from `package.json` with an
|
|
5
|
+
* injectable-free `createRequire` lookup and a safe fallback.
|
|
6
|
+
*
|
|
7
|
+
* @module package-info
|
|
8
|
+
*/
|
|
1
9
|
import { createRequire } from "node:module";
|
|
10
|
+
/**
|
|
11
|
+
* Provides the current package version.
|
|
12
|
+
*/
|
|
2
13
|
export class PackageInfoService {
|
|
14
|
+
/**
|
|
15
|
+
* Node require function anchored at this module.
|
|
16
|
+
*/
|
|
3
17
|
require;
|
|
18
|
+
/**
|
|
19
|
+
* Cached version once resolved.
|
|
20
|
+
*/
|
|
4
21
|
cachedVersion = null;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a new {@link PackageInfoService}.
|
|
24
|
+
*/
|
|
5
25
|
constructor() {
|
|
6
26
|
this.require = createRequire(import.meta.url);
|
|
7
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Returns the package version from `package.json`.
|
|
30
|
+
*
|
|
31
|
+
* @returns Version string, or `0.0.0` when unreadable.
|
|
32
|
+
*/
|
|
8
33
|
getVersion() {
|
|
9
34
|
if (this.cachedVersion !== null)
|
|
10
35
|
return this.cachedVersion;
|
|
@@ -24,5 +49,8 @@ export class PackageInfoService {
|
|
|
24
49
|
return fallback;
|
|
25
50
|
}
|
|
26
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Shared package info service instance.
|
|
54
|
+
*/
|
|
27
55
|
export const packageInfoService = new PackageInfoService();
|
|
28
56
|
//# sourceMappingURL=package-info.js.map
|
package/dist/package-info.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-info.js","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"package-info.js","sourceRoot":"","sources":["../src/package-info.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO5C;;GAEG;AACH,MAAM,OAAO,kBAAkB;IAC7B;;OAEG;IACc,OAAO,CAAc;IAEtC;;OAEG;IACK,aAAa,GAAkB,IAAI,CAAC;IAE5C;;OAEG;IACH;QACE,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACI,UAAU;QACf,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,aAAa,CAAC;QAE3D,MAAM,QAAQ,GAAG,OAAO,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAqB,CAAC;YAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;gBAC7B,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAuB,IAAI,kBAAkB,EAAE,CAAC"}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import type { Transport } from "@modelcontextprotocol/sdk/shared/transport.js";
|
|
10
10
|
import type { AnalyzeMediaTool } from "../tools/AnalyzeMediaTool.js";
|
|
11
|
+
import { type AnalyzeMediaErrorCode } from "../tools/AnalyzeMediaContract.js";
|
|
11
12
|
/**
|
|
12
13
|
* Configuration for {@link EnriVisionServer}.
|
|
13
14
|
*/
|
|
@@ -29,6 +30,25 @@ export interface EnriVisionServerConfig {
|
|
|
29
30
|
* MCP server exposing EnriVision tools.
|
|
30
31
|
*/
|
|
31
32
|
export declare class EnriVisionServer {
|
|
33
|
+
/**
|
|
34
|
+
* Maximum warnings carried by either envelope (server-controlled input).
|
|
35
|
+
*/
|
|
36
|
+
private static readonly MAX_ENVELOPE_WARNINGS;
|
|
37
|
+
/**
|
|
38
|
+
* Maximum code points kept per warning line.
|
|
39
|
+
*/
|
|
40
|
+
private static readonly MAX_ENVELOPE_WARNING_CHARS;
|
|
41
|
+
/**
|
|
42
|
+
* Maximum grounded elements carried by either envelope.
|
|
43
|
+
*/
|
|
44
|
+
private static readonly MAX_ENVELOPE_ELEMENTS;
|
|
45
|
+
/**
|
|
46
|
+
* Bounds server-controlled warnings for model-facing envelopes.
|
|
47
|
+
*
|
|
48
|
+
* @param warnings - Raw warnings, when present.
|
|
49
|
+
* @returns Capped warnings with code-point-safe lines.
|
|
50
|
+
*/
|
|
51
|
+
private static boundEnvelopeWarnings;
|
|
32
52
|
/**
|
|
33
53
|
* Underlying MCP server implementation.
|
|
34
54
|
*/
|
|
@@ -53,6 +73,172 @@ export declare class EnriVisionServer {
|
|
|
53
73
|
* Registers tool list and tool call handlers.
|
|
54
74
|
*/
|
|
55
75
|
private registerToolHandlers;
|
|
76
|
+
/**
|
|
77
|
+
* Maps one tool failure to bilingual text plus a machine-readable error shape.
|
|
78
|
+
*
|
|
79
|
+
* @remarks
|
|
80
|
+
* OpenAI-compatible third-party clients cannot branch on a human string:
|
|
81
|
+
* every MCP error carries `structuredContent: {code, retryable, httpStatus?}`
|
|
82
|
+
* reusing the EnriCode `VisionAnalyzeMediaErrorMapper` vocabulary
|
|
83
|
+
* (`ENRICODE_ERR_TOOL_INPUT_INVALID` for argument/tuning errors including
|
|
84
|
+
* proxy 400/422, `ENRICODE_ERR_TOOL_EXECUTION_FAILED` for server/transport
|
|
85
|
+
* failures, `ENRICODE_ERR_TOOL_EXECUTION_TIMEOUT` for expired budgets,
|
|
86
|
+
* `ENRICODE_ERR_TOOL_EXECUTION_ABORTED` for caller cancels). `retryable` is
|
|
87
|
+
* true only for 408/429/5xx proxy statuses and expired budgets; terminal
|
|
88
|
+
* input/auth errors and cancels never retry unchanged. `httpStatus` is
|
|
89
|
+
* present only when the failure carries a proxy HTTP status.
|
|
90
|
+
*
|
|
91
|
+
* @param error - Unknown caught failure.
|
|
92
|
+
* @returns Bilingual text plus the machine-readable error shape.
|
|
93
|
+
*/
|
|
94
|
+
static mapToolError(error: unknown): {
|
|
95
|
+
readonly text: string;
|
|
96
|
+
readonly structuredContent: {
|
|
97
|
+
readonly code: AnalyzeMediaErrorCode;
|
|
98
|
+
readonly retryable: boolean;
|
|
99
|
+
readonly httpStatus?: number;
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
/**
|
|
103
|
+
* Reads a proxy HTTP status from an unknown failure.
|
|
104
|
+
*
|
|
105
|
+
* @param error - Unknown caught failure.
|
|
106
|
+
* @returns HTTP status when the failure carries one, otherwise undefined.
|
|
107
|
+
*/
|
|
108
|
+
private static readHttpStatus;
|
|
109
|
+
/**
|
|
110
|
+
* Bounds the `structuredContent` payload for small MCP clients.
|
|
111
|
+
*
|
|
112
|
+
* @remarks
|
|
113
|
+
* MCP delivers the whole result in one JSON frame, so the full `analysis`
|
|
114
|
+
* is truncated to `maxStructuredContentAnalysisChars` keeping
|
|
115
|
+
* `maxStructuredContentAnalysisHeadChars` at the start and the remainder
|
|
116
|
+
* at the end (conclusions survive) with an inline Spanish-first bilingual
|
|
117
|
+
* seam stating
|
|
118
|
+
* both ends plus the total (`analysis_truncated: true` plus
|
|
119
|
+
* `analysis_total_chars`; code-point safe, single pass with O(limit)
|
|
120
|
+
* memory via `truncateCodePointsHeadTail`), and `extraction` is capped at
|
|
121
|
+
* `maxStructuredContentExtractionChars` serialized characters with its
|
|
122
|
+
* shape preserved. Small payloads pass through untouched. The seam mirrors
|
|
123
|
+
* `content.text` and EnriCode `VisionAnalyzeMediaResultTruncator` so models
|
|
124
|
+
* reading only `structuredContent` never hallucinate continuity.
|
|
125
|
+
*
|
|
126
|
+
* @param result - Full tool result.
|
|
127
|
+
* @returns Bounded structured content.
|
|
128
|
+
*/
|
|
129
|
+
private static boundStructuredContent;
|
|
130
|
+
/**
|
|
131
|
+
* Builds the Spanish-first bilingual truncation seam for the structured
|
|
132
|
+
* analysis head+tail cut.
|
|
133
|
+
*
|
|
134
|
+
* @param headChars - Head code points kept.
|
|
135
|
+
* @param tailChars - Tail code points kept.
|
|
136
|
+
* @param totalChars - Total analysis code points.
|
|
137
|
+
* @returns Seam string placed between head and tail.
|
|
138
|
+
*/
|
|
139
|
+
private static buildStructuredSeam;
|
|
140
|
+
/**
|
|
141
|
+
* Caps an extraction payload to the structured-content budget.
|
|
142
|
+
*
|
|
143
|
+
* @remarks
|
|
144
|
+
* Single `JSON.stringify` size probe measured in code points (not UTF-16
|
|
145
|
+
* units, so astral-plane text is budgeted in the same units as every
|
|
146
|
+
* other truncation in this module): payloads within budget keep their
|
|
147
|
+
* exact reference (callers can rely on passthrough). Over-budget payloads
|
|
148
|
+
* get long strings head+tail cut at `maxBoundExtractionStringChars` with
|
|
149
|
+
* an Spanish-first bilingual marker; the object shape is preserved. The
|
|
150
|
+
* result is re-probed after every cut: when tightening still exceeds the
|
|
151
|
+
* budget the per-string cap is quartered (down to 64 chars) and, as a last
|
|
152
|
+
* resort, the payload degrades to a bilingual omission marker — so
|
|
153
|
+
* `serialized(bounded)` never exceeds the budget. The walk is iterative
|
|
154
|
+
* with explicit depth and node budgets, so a hostile deep/wide server
|
|
155
|
+
* response degrades to the omission marker instead of overflowing
|
|
156
|
+
* the call stack.
|
|
157
|
+
*
|
|
158
|
+
* @param extraction - Raw extraction object.
|
|
159
|
+
* @returns Original object when within budget, otherwise a bounded copy.
|
|
160
|
+
*/
|
|
161
|
+
private static boundExtraction;
|
|
162
|
+
/**
|
|
163
|
+
* Reports whether one serialized extraction exceeds the budget (code points).
|
|
164
|
+
*
|
|
165
|
+
* @remarks
|
|
166
|
+
* Single-pass probe with O(budget) memory (no second full string): counts
|
|
167
|
+
* code points while retaining at most the budget head.
|
|
168
|
+
*
|
|
169
|
+
* @param serialized - Serialized extraction payload.
|
|
170
|
+
* @returns True when the payload exceeds `maxStructuredContentExtractionChars`.
|
|
171
|
+
*/
|
|
172
|
+
private static isOverExtractionBudget;
|
|
173
|
+
/**
|
|
174
|
+
* Copies a value cutting strings longer than the cap (head+tail).
|
|
175
|
+
*
|
|
176
|
+
* @remarks
|
|
177
|
+
* Iterative post-order walk with an explicit stack: `MAX_DEPTH` bounds
|
|
178
|
+
* nesting (deeper subtrees become a bilingual omission marker) and
|
|
179
|
+
* `MAX_NODES` bounds breadth (past the budget, remaining containers
|
|
180
|
+
* become the same marker), so hostile server payloads cannot overflow the
|
|
181
|
+
* call stack or stall the MCP frame. `__proto__`/`constructor`/`prototype`
|
|
182
|
+
* keys are still dropped. JSON-derived extractions cannot cycle, but the
|
|
183
|
+
* node budget doubles as a cycle backstop.
|
|
184
|
+
*
|
|
185
|
+
* @param value - Unknown value to bound.
|
|
186
|
+
* @param perString - Maximum code points kept per string (split head/tail).
|
|
187
|
+
* @returns Bounded copy.
|
|
188
|
+
*/
|
|
189
|
+
private static cutLongStrings;
|
|
190
|
+
/**
|
|
191
|
+
* Cuts one string to the per-string budget keeping head and tail.
|
|
192
|
+
*
|
|
193
|
+
* @param value - Raw string.
|
|
194
|
+
* @param perString - Maximum code points kept (split head/tail).
|
|
195
|
+
* @returns Original string when within budget, otherwise a bounded copy with an Spanish-first bilingual seam.
|
|
196
|
+
*/
|
|
197
|
+
private static cutOneLongString;
|
|
198
|
+
/**
|
|
199
|
+
* Builds the Spanish-first bilingual truncation seam for the text-output
|
|
200
|
+
* analysis head+tail cut, including its framing newlines.
|
|
201
|
+
*
|
|
202
|
+
* @param head - Head code points kept.
|
|
203
|
+
* @param tail - Tail code points kept.
|
|
204
|
+
* @param totalChars - Total analysis code points.
|
|
205
|
+
* @returns Seam string placed between head and tail.
|
|
206
|
+
*/
|
|
207
|
+
private static buildTextOutputSeam;
|
|
208
|
+
/**
|
|
209
|
+
* Formats the model-facing text output with a bounded analysis appendix.
|
|
210
|
+
*
|
|
211
|
+
* @remarks
|
|
212
|
+
* The server `analysis` text can reach tens of MiB; only head+tail
|
|
213
|
+
* (`maxAnalysisTextChars` code points split evenly, single pass) reach the
|
|
214
|
+
* model context, followed by an explicit Spanish-first bilingual truncation
|
|
215
|
+
* notice naming both ends and the total. Keeping the tail preserves
|
|
216
|
+
* conclusions that head-only truncation drops. When analysis fails, the
|
|
217
|
+
* thrown message may embed a `Detalle del servidor:` fragment in the proxy
|
|
218
|
+
* language. Element labels are sliced by code point (never splitting
|
|
219
|
+
* surrogate pairs) and flattened to one line; the server `media_type` is
|
|
220
|
+
* stripped of line breaks and bounded to 128 chars so a hostile value
|
|
221
|
+
* cannot break the envelope.
|
|
222
|
+
*
|
|
223
|
+
* @param analysis - Raw server analysis text.
|
|
224
|
+
* @param mediaType - Detected media type.
|
|
225
|
+
* @param elements - Optional grounded element boxes.
|
|
226
|
+
* @param warnings - Optional Spanish-first bilingual honesty notes (e.g., clamped clip).
|
|
227
|
+
* @returns Bounded Spanish-first bilingual text output.
|
|
228
|
+
*/
|
|
229
|
+
private static formatAnalysisText;
|
|
230
|
+
/**
|
|
231
|
+
* Sanitizes one server `media_type` value for the text envelope header.
|
|
232
|
+
*
|
|
233
|
+
* @remarks
|
|
234
|
+
* The header interpolates the value verbatim today (validated non-empty
|
|
235
|
+
* only): line breaks are flattened and the value is bounded to 128 code
|
|
236
|
+
* points so a hostile server value cannot inject envelope lines.
|
|
237
|
+
*
|
|
238
|
+
* @param mediaType - Raw server media type.
|
|
239
|
+
* @returns Single-line media type label (at most 128 code points).
|
|
240
|
+
*/
|
|
241
|
+
private static sanitizeMediaTypeLabel;
|
|
56
242
|
/**
|
|
57
243
|
* Returns the JSON schema tool definition for `analyze_media`.
|
|
58
244
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnriVisionServer.d.ts","sourceRoot":"","sources":["../../src/server/EnriVisionServer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAQ/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"EnriVisionServer.d.ts","sourceRoot":"","sources":["../../src/server/EnriVisionServer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAQ/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAoB1C;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;CAC7C;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAc;IAE3D;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,0BAA0B,CAAgB;IAElE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAe;IAE5D;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IASpC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAEhC;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IAEpD;;;;OAIG;gBACgB,MAAM,EAAE,sBAAsB;IAiBjD;;;;OAIG;IACU,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAkD5B;;;;;;;;;;;;;;;;;OAiBG;WACW,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG;QAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,iBAAiB,EAAE;YAC1B,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC;YACrC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;YAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;SAC9B,CAAC;KACH;IA0DD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAiErC;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IAyC9B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAQrC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IA0D7B;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAU/B;;;;;;;;OAQG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAIlC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAwDjC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAMrC;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;CAubtC"}
|