@bedolla/enrivision 0.1.5 → 0.1.7

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 (64) hide show
  1. package/README.md +43 -9
  2. package/dist/client/EnriProxyClient.d.ts +296 -248
  3. package/dist/client/EnriProxyClient.d.ts.map +1 -1
  4. package/dist/client/EnriProxyClient.js +849 -119
  5. package/dist/client/EnriProxyClient.js.map +1 -1
  6. package/dist/client/EnriProxyClientContract.d.ts +478 -0
  7. package/dist/client/EnriProxyClientContract.d.ts.map +1 -0
  8. package/dist/client/EnriProxyClientContract.js +136 -0
  9. package/dist/client/EnriProxyClientContract.js.map +1 -0
  10. package/dist/index.js +23 -12
  11. package/dist/index.js.map +1 -1
  12. package/dist/package-info.d.ts +28 -0
  13. package/dist/package-info.d.ts.map +1 -1
  14. package/dist/package-info.js +28 -0
  15. package/dist/package-info.js.map +1 -1
  16. package/dist/server/EnriVisionServer.d.ts +186 -0
  17. package/dist/server/EnriVisionServer.d.ts.map +1 -1
  18. package/dist/server/EnriVisionServer.js +804 -94
  19. package/dist/server/EnriVisionServer.js.map +1 -1
  20. package/dist/shared/codepointTruncation.d.ts +61 -0
  21. package/dist/shared/codepointTruncation.d.ts.map +1 -0
  22. package/dist/shared/codepointTruncation.js +73 -0
  23. package/dist/shared/codepointTruncation.js.map +1 -0
  24. package/dist/shared/mediaUrlFetcher.d.ts +247 -9
  25. package/dist/shared/mediaUrlFetcher.d.ts.map +1 -1
  26. package/dist/shared/mediaUrlFetcher.js +712 -53
  27. package/dist/shared/mediaUrlFetcher.js.map +1 -1
  28. package/dist/shared/tar.d.ts +82 -2
  29. package/dist/shared/tar.d.ts.map +1 -1
  30. package/dist/shared/tar.js +106 -43
  31. package/dist/shared/tar.js.map +1 -1
  32. package/dist/shared/validation.d.ts +96 -2
  33. package/dist/shared/validation.d.ts.map +1 -1
  34. package/dist/shared/validation.js +169 -10
  35. package/dist/shared/validation.js.map +1 -1
  36. package/dist/tools/AnalyzeMediaContract.d.ts +462 -0
  37. package/dist/tools/AnalyzeMediaContract.d.ts.map +1 -0
  38. package/dist/tools/AnalyzeMediaContract.js +161 -0
  39. package/dist/tools/AnalyzeMediaContract.js.map +1 -0
  40. package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts +35 -0
  41. package/dist/tools/AnalyzeMediaExtractionSanitizer.d.ts.map +1 -0
  42. package/dist/tools/AnalyzeMediaExtractionSanitizer.js +214 -0
  43. package/dist/tools/AnalyzeMediaExtractionSanitizer.js.map +1 -0
  44. package/dist/tools/AnalyzeMediaInputResolver.d.ts +250 -0
  45. package/dist/tools/AnalyzeMediaInputResolver.d.ts.map +1 -0
  46. package/dist/tools/AnalyzeMediaInputResolver.js +430 -0
  47. package/dist/tools/AnalyzeMediaInputResolver.js.map +1 -0
  48. package/dist/tools/AnalyzeMediaParamParser.d.ts +307 -0
  49. package/dist/tools/AnalyzeMediaParamParser.d.ts.map +1 -0
  50. package/dist/tools/AnalyzeMediaParamParser.js +843 -0
  51. package/dist/tools/AnalyzeMediaParamParser.js.map +1 -0
  52. package/dist/tools/AnalyzeMediaResumableUploader.d.ts +244 -0
  53. package/dist/tools/AnalyzeMediaResumableUploader.d.ts.map +1 -0
  54. package/dist/tools/AnalyzeMediaResumableUploader.js +549 -0
  55. package/dist/tools/AnalyzeMediaResumableUploader.js.map +1 -0
  56. package/dist/tools/AnalyzeMediaTarPackager.d.ts +42 -0
  57. package/dist/tools/AnalyzeMediaTarPackager.d.ts.map +1 -0
  58. package/dist/tools/AnalyzeMediaTarPackager.js +245 -0
  59. package/dist/tools/AnalyzeMediaTarPackager.js.map +1 -0
  60. package/dist/tools/AnalyzeMediaTool.d.ts +156 -294
  61. package/dist/tools/AnalyzeMediaTool.d.ts.map +1 -1
  62. package/dist/tools/AnalyzeMediaTool.js +611 -457
  63. package/dist/tools/AnalyzeMediaTool.js.map +1 -1
  64. package/package.json +2 -1
@@ -0,0 +1,136 @@
1
+ /**
2
+ * ENRIPROXY CLIENT CONTRACT
3
+ *
4
+ * Public parameter, response, and error contracts for the EnriProxy HTTP
5
+ * endpoints used by EnriVision. The client facade (`EnriProxyClient`)
6
+ * re-exports these types so external import sites keep working.
7
+ *
8
+ * @module client/EnriProxyClientContract
9
+ */
10
+ import { truncateCodePointsHeadTail } from "../shared/codepointTruncation.js";
11
+ /**
12
+ * Error thrown when EnriProxy returns a non-2xx HTTP response.
13
+ */
14
+ export class EnriProxyHttpError extends Error {
15
+ /**
16
+ * HTTP status code returned by the server.
17
+ */
18
+ status;
19
+ /**
20
+ * Response headers returned by the server.
21
+ */
22
+ headers;
23
+ /**
24
+ * Response body returned by the server (best-effort UTF-8).
25
+ */
26
+ body;
27
+ /**
28
+ * Stable machine-readable error code parsed from the body (`invalid_*`
29
+ * knob codes), when the server sent one.
30
+ */
31
+ serverCode;
32
+ /**
33
+ * Dotted request field carrying the invalid value, when the server sent
34
+ * one.
35
+ */
36
+ serverField;
37
+ /**
38
+ * Creates a new {@link EnriProxyHttpError}.
39
+ *
40
+ * @param message - Error message
41
+ * @param status - HTTP status code
42
+ * @param headers - Response headers
43
+ * @param body - Response body
44
+ * @param serverCode - Stable machine-readable error code, when parsed
45
+ * @param serverField - Dotted invalid-value field, when parsed
46
+ */
47
+ constructor(message, status, headers, body, serverCode, serverField) {
48
+ super(message);
49
+ this.name = "EnriProxyHttpError";
50
+ this.status = status;
51
+ this.headers = headers;
52
+ this.body = body;
53
+ this.serverCode = serverCode;
54
+ this.serverField = serverField;
55
+ }
56
+ }
57
+ /**
58
+ * Maximum characters of server-provided detail embedded in thrown errors.
59
+ */
60
+ const MAX_SERVER_DETAIL_CHARS = 300;
61
+ /**
62
+ * Extracts a human-readable error detail from a non-2xx response body.
63
+ *
64
+ * @param body - Raw response body (best-effort UTF-8).
65
+ * @returns Spanish-ready server detail, or null when none is recognizable.
66
+ */
67
+ export function extractServerErrorDetail(body) {
68
+ return extractServerErrorInsight(body).detail;
69
+ }
70
+ /**
71
+ * Extracts the full stable insight (detail + machine code + field) from one
72
+ * non-2xx proxy body.
73
+ *
74
+ * @remarks
75
+ * EnriProxy knob-validation errors carry `code` (`invalid_<root>`) and a
76
+ * dotted `field` alongside the message so EnriVision/EnriCode can match on
77
+ * codes instead of Spanish prose; unknown shapes degrade to detail-only.
78
+ *
79
+ * @param body - Raw response body (best-effort UTF-8).
80
+ * @returns Parsed insight with optional stable code/field.
81
+ */
82
+ export function extractServerErrorInsight(body) {
83
+ const trimmed = body.trim();
84
+ if (!trimmed) {
85
+ return { detail: null };
86
+ }
87
+ try {
88
+ const parsed = JSON.parse(trimmed);
89
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
90
+ const record = parsed;
91
+ const nested = record["error"];
92
+ if (typeof nested === "string" && nested.trim()) {
93
+ return { detail: truncateCodePointsHeadTail(nested.trim(), MAX_SERVER_DETAIL_CHARS, 0).text };
94
+ }
95
+ if (nested && typeof nested === "object" && !Array.isArray(nested)) {
96
+ const nestedRecord = nested;
97
+ const nestedMessage = nestedRecord["message"];
98
+ const code = nestedRecord["code"] ?? record["code"];
99
+ const field = nestedRecord["field"] ?? record["field"];
100
+ if (typeof nestedMessage === "string" && nestedMessage.trim()) {
101
+ return {
102
+ detail: truncateCodePointsHeadTail(nestedMessage.trim(), MAX_SERVER_DETAIL_CHARS, 0).text,
103
+ ...(typeof code === "string" && code.trim() ? { code: code.trim() } : {}),
104
+ ...(typeof field === "string" && field.trim() ? { field: field.trim() } : {}),
105
+ };
106
+ }
107
+ }
108
+ const message = record["message"];
109
+ const code = record["code"];
110
+ const field = record["field"];
111
+ if (typeof message === "string" && message.trim()) {
112
+ return {
113
+ detail: truncateCodePointsHeadTail(message.trim(), MAX_SERVER_DETAIL_CHARS, 0).text,
114
+ ...(typeof code === "string" && code.trim() ? { code: code.trim() } : {}),
115
+ ...(typeof field === "string" && field.trim() ? { field: field.trim() } : {}),
116
+ };
117
+ }
118
+ // Code-only bodies (no message) still carry the stable classification.
119
+ if (typeof code === "string" && code.trim()) {
120
+ return {
121
+ detail: null,
122
+ code: code.trim(),
123
+ ...(typeof field === "string" && field.trim() ? { field: field.trim() } : {}),
124
+ };
125
+ }
126
+ }
127
+ }
128
+ catch {
129
+ // Not JSON: fall through to the plain-text handling below.
130
+ }
131
+ if (trimmed.startsWith("<")) {
132
+ return { detail: null };
133
+ }
134
+ return { detail: truncateCodePointsHeadTail(trimmed, MAX_SERVER_DETAIL_CHARS, 0).text };
135
+ }
136
+ //# sourceMappingURL=EnriProxyClientContract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EnriProxyClientContract.js","sourceRoot":"","sources":["../../src/client/EnriProxyClientContract.ts"],"names":[],"mappings":"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"}
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 (start MCP server over stdio)");
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 timeoutMs = timeoutMsRaw ? Number.parseInt(timeoutMsRaw, 10) : DEFAULT_TIMEOUT_MS;
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: Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : DEFAULT_TIMEOUT_MS
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":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -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":"AAIA,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,aAAa,CAAuB;;IAMrC,UAAU,IAAI,MAAM;CAkB5B;AAED,eAAO,MAAM,kBAAkB,EAAE,kBAA6C,CAAC"}
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"}
@@ -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
@@ -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;AAI5C,MAAM,OAAO,kBAAkB;IACZ,OAAO,CAAc;IAC9B,aAAa,GAAkB,IAAI,CAAC;IAE5C;QACE,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAEM,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,MAAM,CAAC,MAAM,kBAAkB,GAAuB,IAAI,kBAAkB,EAAE,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;AAErE;;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,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;IAiD5B;;;;OAIG;IACH,OAAO,CAAC,6BAA6B;CAiMtC"}
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;IAqED;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAc7B;;;;;;;;;;;;;;;;;;;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;CA+btC"}