@contractspec/lib.ai-agent 2.3.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/agent-factory.js +97 -67
- package/dist/agent/contract-spec-agent.js +97 -67
- package/dist/agent/index.js +140 -100
- package/dist/agent/json-runner.js +103 -71
- package/dist/agent/unified-agent.d.ts +4 -0
- package/dist/agent/unified-agent.js +134 -96
- package/dist/approval/index.js +86 -62
- package/dist/approval/workflow.d.ts +2 -0
- package/dist/approval/workflow.js +86 -62
- package/dist/exporters/claude-agent-exporter.js +90 -66
- package/dist/exporters/index.js +100 -76
- package/dist/exporters/opencode-exporter.js +96 -72
- package/dist/exporters/types.d.ts +2 -0
- package/dist/i18n/catalogs/en.js +20 -0
- package/dist/i18n/catalogs/es.js +20 -0
- package/dist/i18n/catalogs/fr.js +20 -0
- package/dist/i18n/catalogs/index.js +60 -0
- package/dist/i18n/index.js +85 -61
- package/dist/i18n/keys.d.ts +16 -0
- package/dist/i18n/keys.js +5 -1
- package/dist/i18n/locale.d.ts +3 -28
- package/dist/i18n/locale.js +7 -18
- package/dist/i18n/messages.d.ts +9 -60
- package/dist/i18n/messages.js +71 -60
- package/dist/index.js +88 -64
- package/dist/interop/index.js +117 -79
- package/dist/interop/spec-consumer.d.ts +1 -0
- package/dist/interop/spec-consumer.js +92 -66
- package/dist/interop/tool-consumer.d.ts +1 -0
- package/dist/interop/tool-consumer.js +110 -74
- package/dist/interop/types.d.ts +10 -0
- package/dist/knowledge/index.js +85 -61
- package/dist/knowledge/injector.js +85 -61
- package/dist/node/agent/agent-factory.js +97 -67
- package/dist/node/agent/contract-spec-agent.js +97 -67
- package/dist/node/agent/index.js +140 -100
- package/dist/node/agent/json-runner.js +103 -71
- package/dist/node/agent/unified-agent.js +134 -96
- package/dist/node/approval/index.js +86 -62
- package/dist/node/approval/workflow.js +86 -62
- package/dist/node/exporters/claude-agent-exporter.js +90 -66
- package/dist/node/exporters/index.js +100 -76
- package/dist/node/exporters/opencode-exporter.js +96 -72
- package/dist/node/i18n/catalogs/en.js +20 -0
- package/dist/node/i18n/catalogs/es.js +20 -0
- package/dist/node/i18n/catalogs/fr.js +20 -0
- package/dist/node/i18n/catalogs/index.js +60 -0
- package/dist/node/i18n/index.js +85 -61
- package/dist/node/i18n/keys.js +5 -1
- package/dist/node/i18n/locale.js +7 -18
- package/dist/node/i18n/messages.js +71 -60
- package/dist/node/index.js +88 -64
- package/dist/node/interop/index.js +117 -79
- package/dist/node/interop/spec-consumer.js +92 -66
- package/dist/node/interop/tool-consumer.js +110 -74
- package/dist/node/knowledge/index.js +85 -61
- package/dist/node/knowledge/injector.js +85 -61
- package/dist/node/providers/claude-agent-sdk/adapter.js +103 -74
- package/dist/node/providers/claude-agent-sdk/index.js +103 -74
- package/dist/node/providers/claude-agent-sdk/tool-bridge.js +88 -64
- package/dist/node/providers/index.js +116 -86
- package/dist/node/providers/opencode-sdk/adapter.js +102 -73
- package/dist/node/providers/opencode-sdk/agent-bridge.js +89 -65
- package/dist/node/providers/opencode-sdk/index.js +102 -73
- package/dist/node/providers/opencode-sdk/tool-bridge.js +88 -64
- package/dist/node/providers/registry.js +96 -66
- package/dist/node/providers/types.js +2122 -2
- package/dist/node/spec/index.js +88 -64
- package/dist/node/spec/registry.js +87 -63
- package/dist/node/spec/spec.js +86 -62
- package/dist/node/telemetry/index.js +2122 -3
- package/dist/node/telemetry/posthog.js +2123 -3
- package/dist/node/tools/index.js +90 -63
- package/dist/node/tools/knowledge-tool.js +85 -61
- package/dist/node/tools/mcp-server.js +86 -62
- package/dist/node/tools/tool-adapter.js +89 -62
- package/dist/providers/claude-agent-sdk/adapter.js +103 -74
- package/dist/providers/claude-agent-sdk/index.js +103 -74
- package/dist/providers/claude-agent-sdk/tool-bridge.js +88 -64
- package/dist/providers/index.js +116 -86
- package/dist/providers/opencode-sdk/adapter.js +102 -73
- package/dist/providers/opencode-sdk/agent-bridge.js +89 -65
- package/dist/providers/opencode-sdk/index.js +102 -73
- package/dist/providers/opencode-sdk/tool-bridge.js +88 -64
- package/dist/providers/registry.d.ts +2 -2
- package/dist/providers/registry.js +96 -66
- package/dist/providers/types.d.ts +5 -1
- package/dist/providers/types.js +2122 -2
- package/dist/spec/index.js +88 -64
- package/dist/spec/registry.d.ts +1 -1
- package/dist/spec/registry.js +87 -63
- package/dist/spec/spec.js +86 -62
- package/dist/telemetry/index.js +2122 -3
- package/dist/telemetry/posthog.js +2123 -3
- package/dist/tools/index.js +90 -63
- package/dist/tools/knowledge-tool.js +85 -61
- package/dist/tools/mcp-server.js +86 -62
- package/dist/tools/tool-adapter.js +89 -62
- package/dist/types.d.ts +2 -0
- package/package.json +6 -6
|
@@ -603,6 +603,26 @@ var init_en = __esm(() => {
|
|
|
603
603
|
value: "[MCPToolServer] Stopped {name}",
|
|
604
604
|
description: "Log message when MCP tool server stops",
|
|
605
605
|
placeholders: [{ name: "name", type: "string" }]
|
|
606
|
+
},
|
|
607
|
+
"error.telemetry.posthogAiRequired": {
|
|
608
|
+
value: "PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node",
|
|
609
|
+
description: "Error when PostHog AI dependency is missing"
|
|
610
|
+
},
|
|
611
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
612
|
+
value: "PostHog LLM Analytics requires either a client instance or an apiKey.",
|
|
613
|
+
description: "Error when PostHog client or API key is not configured"
|
|
614
|
+
},
|
|
615
|
+
"error.telemetry.posthogNodeRequired": {
|
|
616
|
+
value: "PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node",
|
|
617
|
+
description: "Error when posthog-node dependency is missing"
|
|
618
|
+
},
|
|
619
|
+
"error.provider.notAvailable": {
|
|
620
|
+
value: "Provider '{provider}' is not available{reason}",
|
|
621
|
+
description: "Error when a provider is unavailable",
|
|
622
|
+
placeholders: [
|
|
623
|
+
{ name: "provider", type: "string" },
|
|
624
|
+
{ name: "reason", type: "string" }
|
|
625
|
+
]
|
|
606
626
|
}
|
|
607
627
|
}
|
|
608
628
|
});
|
|
@@ -1214,6 +1234,26 @@ var init_fr = __esm(() => {
|
|
|
1214
1234
|
value: "[MCPToolServer] {name} arrêté",
|
|
1215
1235
|
description: "Log message when MCP tool server stops",
|
|
1216
1236
|
placeholders: [{ name: "name", type: "string" }]
|
|
1237
|
+
},
|
|
1238
|
+
"error.telemetry.posthogAiRequired": {
|
|
1239
|
+
value: "PostHog LLM Analytics nécessite l'installation de @posthog/ai. Exécutez : npm install @posthog/ai posthog-node",
|
|
1240
|
+
description: "Error when PostHog AI dependency is missing"
|
|
1241
|
+
},
|
|
1242
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
1243
|
+
value: "PostHog LLM Analytics nécessite soit une instance client, soit une apiKey.",
|
|
1244
|
+
description: "Error when PostHog client or API key is not configured"
|
|
1245
|
+
},
|
|
1246
|
+
"error.telemetry.posthogNodeRequired": {
|
|
1247
|
+
value: "PostHog LLM Analytics nécessite l'installation de posthog-node. Exécutez : npm install posthog-node",
|
|
1248
|
+
description: "Error when posthog-node dependency is missing"
|
|
1249
|
+
},
|
|
1250
|
+
"error.provider.notAvailable": {
|
|
1251
|
+
value: "Le fournisseur « {provider} » n'est pas disponible{reason}",
|
|
1252
|
+
description: "Error when a provider is unavailable",
|
|
1253
|
+
placeholders: [
|
|
1254
|
+
{ name: "provider", type: "string" },
|
|
1255
|
+
{ name: "reason", type: "string" }
|
|
1256
|
+
]
|
|
1217
1257
|
}
|
|
1218
1258
|
}
|
|
1219
1259
|
});
|
|
@@ -1859,78 +1899,58 @@ var init_es = __esm(() => {
|
|
|
1859
1899
|
value: "[MCPToolServer] Detenido {name}",
|
|
1860
1900
|
description: "Mensaje de registro cuando el servidor de herramientas MCP se detiene",
|
|
1861
1901
|
placeholders: [{ name: "name", type: "string" }]
|
|
1902
|
+
},
|
|
1903
|
+
"error.telemetry.posthogAiRequired": {
|
|
1904
|
+
value: "PostHog LLM Analytics requiere que @posthog/ai esté instalado. Ejecute: npm install @posthog/ai posthog-node",
|
|
1905
|
+
description: "Error when PostHog AI dependency is missing"
|
|
1906
|
+
},
|
|
1907
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
1908
|
+
value: "PostHog LLM Analytics requiere una instancia de cliente o una apiKey.",
|
|
1909
|
+
description: "Error when PostHog client or API key is not configured"
|
|
1910
|
+
},
|
|
1911
|
+
"error.telemetry.posthogNodeRequired": {
|
|
1912
|
+
value: "PostHog LLM Analytics requiere que posthog-node esté instalado. Ejecute: npm install posthog-node",
|
|
1913
|
+
description: "Error when posthog-node dependency is missing"
|
|
1914
|
+
},
|
|
1915
|
+
"error.provider.notAvailable": {
|
|
1916
|
+
value: "El proveedor '{provider}' no está disponible{reason}",
|
|
1917
|
+
description: "Error when a provider is unavailable",
|
|
1918
|
+
placeholders: [
|
|
1919
|
+
{ name: "provider", type: "string" },
|
|
1920
|
+
{ name: "reason", type: "string" }
|
|
1921
|
+
]
|
|
1862
1922
|
}
|
|
1863
1923
|
}
|
|
1864
1924
|
});
|
|
1865
1925
|
});
|
|
1866
1926
|
|
|
1867
|
-
// src/i18n/locale.ts
|
|
1868
|
-
function resolveLocale(specLocale, runtimeLocale) {
|
|
1869
|
-
const raw = runtimeLocale ?? specLocale ?? DEFAULT_LOCALE;
|
|
1870
|
-
if (isSupportedLocale(raw)) {
|
|
1871
|
-
return raw;
|
|
1872
|
-
}
|
|
1873
|
-
const base = raw.split("-")[0];
|
|
1874
|
-
if (base && isSupportedLocale(base)) {
|
|
1875
|
-
return base;
|
|
1876
|
-
}
|
|
1877
|
-
return DEFAULT_LOCALE;
|
|
1878
|
-
}
|
|
1879
|
-
function isSupportedLocale(locale) {
|
|
1880
|
-
return SUPPORTED_LOCALES.includes(locale);
|
|
1881
|
-
}
|
|
1882
|
-
var DEFAULT_LOCALE = "en", SUPPORTED_LOCALES;
|
|
1883
|
-
var init_locale = __esm(() => {
|
|
1884
|
-
SUPPORTED_LOCALES = ["en", "fr", "es"];
|
|
1885
|
-
});
|
|
1886
|
-
|
|
1887
1927
|
// src/i18n/messages.ts
|
|
1888
|
-
import {
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
enMessages,
|
|
1893
|
-
frMessages,
|
|
1894
|
-
esMessages
|
|
1895
|
-
]);
|
|
1896
|
-
}
|
|
1897
|
-
return sharedRegistry;
|
|
1898
|
-
}
|
|
1899
|
-
function interpolate(template, params) {
|
|
1900
|
-
if (!params)
|
|
1901
|
-
return template;
|
|
1902
|
-
return template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
1903
|
-
if (key in params) {
|
|
1904
|
-
return String(params[key]);
|
|
1905
|
-
}
|
|
1906
|
-
return match;
|
|
1907
|
-
});
|
|
1908
|
-
}
|
|
1909
|
-
function createAgentI18n(specLocale, runtimeLocale) {
|
|
1910
|
-
const locale = resolveLocale(specLocale, runtimeLocale);
|
|
1911
|
-
const registry = getRegistry();
|
|
1912
|
-
return {
|
|
1913
|
-
locale,
|
|
1914
|
-
t(key, params) {
|
|
1915
|
-
const raw = registry.getValue(SPEC_KEY, key, locale, key);
|
|
1916
|
-
return interpolate(raw, params);
|
|
1917
|
-
}
|
|
1918
|
-
};
|
|
1919
|
-
}
|
|
1920
|
-
function getDefaultI18n() {
|
|
1921
|
-
return createAgentI18n(DEFAULT_LOCALE);
|
|
1922
|
-
}
|
|
1923
|
-
function resetI18nRegistry() {
|
|
1924
|
-
sharedRegistry = null;
|
|
1925
|
-
}
|
|
1926
|
-
var SPEC_KEY = "ai-agent.messages", sharedRegistry = null;
|
|
1928
|
+
import {
|
|
1929
|
+
createI18nFactory
|
|
1930
|
+
} from "@contractspec/lib.contracts-spec/translations";
|
|
1931
|
+
var factory, createAgentI18n, getDefaultI18n, resetI18nRegistry;
|
|
1927
1932
|
var init_messages = __esm(() => {
|
|
1928
1933
|
init_en();
|
|
1929
1934
|
init_fr();
|
|
1930
1935
|
init_es();
|
|
1931
|
-
|
|
1936
|
+
factory = createI18nFactory({
|
|
1937
|
+
specKey: "ai-agent.messages",
|
|
1938
|
+
catalogs: [enMessages, frMessages, esMessages]
|
|
1939
|
+
});
|
|
1940
|
+
createAgentI18n = factory.create;
|
|
1941
|
+
getDefaultI18n = factory.getDefault;
|
|
1942
|
+
resetI18nRegistry = factory.resetRegistry;
|
|
1932
1943
|
});
|
|
1933
1944
|
|
|
1945
|
+
// src/i18n/locale.ts
|
|
1946
|
+
import {
|
|
1947
|
+
DEFAULT_LOCALE,
|
|
1948
|
+
SUPPORTED_LOCALES,
|
|
1949
|
+
resolveLocale,
|
|
1950
|
+
isSupportedLocale
|
|
1951
|
+
} from "@contractspec/lib.contracts-spec/translations";
|
|
1952
|
+
var init_locale = () => {};
|
|
1953
|
+
|
|
1934
1954
|
// src/i18n/keys.ts
|
|
1935
1955
|
var AGENT_KEYS, KNOWLEDGE_KEYS, TOOL_KEYS, INTEROP_KEYS, ERROR_KEYS, EXPORT_KEYS, APPROVAL_KEYS, LOG_KEYS, I18N_KEYS;
|
|
1936
1956
|
var init_keys = __esm(() => {
|
|
@@ -2025,7 +2045,11 @@ var init_keys = __esm(() => {
|
|
|
2025
2045
|
"error.provider.sdkNotInstalled": "error.provider.sdkNotInstalled",
|
|
2026
2046
|
"error.provider.contextCreation": "error.provider.contextCreation",
|
|
2027
2047
|
"error.provider.executionFailed": "error.provider.executionFailed",
|
|
2028
|
-
"error.provider.streamFailed": "error.provider.streamFailed"
|
|
2048
|
+
"error.provider.streamFailed": "error.provider.streamFailed",
|
|
2049
|
+
"error.provider.notAvailable": "error.provider.notAvailable",
|
|
2050
|
+
"error.telemetry.posthogAiRequired": "error.telemetry.posthogAiRequired",
|
|
2051
|
+
"error.telemetry.posthogClientOrKeyRequired": "error.telemetry.posthogClientOrKeyRequired",
|
|
2052
|
+
"error.telemetry.posthogNodeRequired": "error.telemetry.posthogNodeRequired"
|
|
2029
2053
|
};
|
|
2030
2054
|
EXPORT_KEYS = {
|
|
2031
2055
|
"export.agentConfiguration": "export.agentConfiguration",
|
|
@@ -2105,7 +2129,7 @@ var init_i18n = __esm(() => {
|
|
|
2105
2129
|
|
|
2106
2130
|
// src/spec/spec.ts
|
|
2107
2131
|
function defineAgent(spec) {
|
|
2108
|
-
const i18n =
|
|
2132
|
+
const i18n = createAgentI18n(spec.locale);
|
|
2109
2133
|
if (!spec.meta?.key) {
|
|
2110
2134
|
throw new Error(i18n.t("error.agentKeyRequired"));
|
|
2111
2135
|
}
|
|
@@ -2141,7 +2165,7 @@ var init_spec = __esm(() => {
|
|
|
2141
2165
|
function specToolToClaudeAgentTool(tool, handler, context) {
|
|
2142
2166
|
return {
|
|
2143
2167
|
name: tool.name,
|
|
2144
|
-
description: tool.description ??
|
|
2168
|
+
description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
|
|
2145
2169
|
input_schema: normalizeSchema(tool.schema),
|
|
2146
2170
|
requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,
|
|
2147
2171
|
execute: async (input) => {
|
|
@@ -2161,7 +2185,7 @@ function specToolsToClaudeAgentTools(tools, handlers, context) {
|
|
|
2161
2185
|
return tools.filter((tool) => handlers.has(tool.name)).map((tool) => {
|
|
2162
2186
|
const handler = handlers.get(tool.name);
|
|
2163
2187
|
if (!handler) {
|
|
2164
|
-
throw new Error(
|
|
2188
|
+
throw new Error(createAgentI18n().t("error.handlerNotFoundForTool", {
|
|
2165
2189
|
name: tool.name
|
|
2166
2190
|
}));
|
|
2167
2191
|
}
|
|
@@ -2194,7 +2218,7 @@ function claudeAgentToolsToSpecTools(claudeTools) {
|
|
|
2194
2218
|
function specToolToExternalTool(tool, handler, context) {
|
|
2195
2219
|
return {
|
|
2196
2220
|
name: tool.name,
|
|
2197
|
-
description: tool.description ??
|
|
2221
|
+
description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
|
|
2198
2222
|
inputSchema: tool.schema ?? { type: "object" },
|
|
2199
2223
|
requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
|
|
2200
2224
|
execute: handler ? async (input) => {
|
|
@@ -2243,7 +2267,7 @@ var init_tool_bridge = __esm(() => {
|
|
|
2243
2267
|
function specToolToOpenCodeTool(tool) {
|
|
2244
2268
|
return {
|
|
2245
2269
|
name: tool.name,
|
|
2246
|
-
description: tool.description ??
|
|
2270
|
+
description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
|
|
2247
2271
|
parameters: normalizeToOpenCodeParameters(tool.schema),
|
|
2248
2272
|
permission: getPermissionLevel(tool)
|
|
2249
2273
|
};
|
|
@@ -2275,7 +2299,7 @@ function openCodeToolsToSpecTools(openCodeTools) {
|
|
|
2275
2299
|
function specToolToExternalToolForOpenCode(tool, handler, context) {
|
|
2276
2300
|
return {
|
|
2277
2301
|
name: tool.name,
|
|
2278
|
-
description: tool.description ??
|
|
2302
|
+
description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
|
|
2279
2303
|
inputSchema: tool.schema ?? { type: "object" },
|
|
2280
2304
|
requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
|
|
2281
2305
|
execute: handler ? async (input) => {
|
|
@@ -2339,7 +2363,7 @@ async function executeToolCall(toolCall, handlers) {
|
|
|
2339
2363
|
if (!handler) {
|
|
2340
2364
|
return {
|
|
2341
2365
|
tool_call_id: toolCall.id,
|
|
2342
|
-
output:
|
|
2366
|
+
output: createAgentI18n().t("error.toolNotFoundOrNoHandler", {
|
|
2343
2367
|
name: toolCall.name
|
|
2344
2368
|
}),
|
|
2345
2369
|
is_error: true
|
|
@@ -2370,10 +2394,12 @@ class ContractSpecConsumer {
|
|
|
2370
2394
|
specs;
|
|
2371
2395
|
includeMetadata;
|
|
2372
2396
|
baseUrl;
|
|
2397
|
+
locale;
|
|
2373
2398
|
constructor(config) {
|
|
2374
2399
|
this.specs = new Map;
|
|
2375
2400
|
this.includeMetadata = config.includeMetadata ?? true;
|
|
2376
2401
|
this.baseUrl = config.baseUrl;
|
|
2402
|
+
this.locale = config.locale;
|
|
2377
2403
|
for (const spec of config.specs) {
|
|
2378
2404
|
const key = agentKey(spec.meta);
|
|
2379
2405
|
this.specs.set(key, spec);
|
|
@@ -2382,9 +2408,9 @@ class ContractSpecConsumer {
|
|
|
2382
2408
|
getSpecMarkdown(specKey, options) {
|
|
2383
2409
|
const spec = this.specs.get(specKey);
|
|
2384
2410
|
if (!spec) {
|
|
2385
|
-
throw new Error(
|
|
2411
|
+
throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
|
|
2386
2412
|
}
|
|
2387
|
-
const i18n =
|
|
2413
|
+
const i18n = createAgentI18n(options?.locale ?? this.locale);
|
|
2388
2414
|
const sections = [];
|
|
2389
2415
|
const opts = {
|
|
2390
2416
|
includeToc: options?.includeToc ?? true,
|
|
@@ -2507,9 +2533,9 @@ class ContractSpecConsumer {
|
|
|
2507
2533
|
getSpecPrompt(specKey, options) {
|
|
2508
2534
|
const spec = this.specs.get(specKey);
|
|
2509
2535
|
if (!spec) {
|
|
2510
|
-
throw new Error(
|
|
2536
|
+
throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
|
|
2511
2537
|
}
|
|
2512
|
-
const i18n =
|
|
2538
|
+
const i18n = createAgentI18n(options?.locale ?? this.locale);
|
|
2513
2539
|
const sections = [];
|
|
2514
2540
|
const opts = {
|
|
2515
2541
|
includeTools: options?.includeTools ?? true,
|
|
@@ -2652,11 +2678,13 @@ class MCPToolServer {
|
|
|
2652
2678
|
tools;
|
|
2653
2679
|
name;
|
|
2654
2680
|
version;
|
|
2681
|
+
locale;
|
|
2655
2682
|
running = false;
|
|
2656
2683
|
constructor(config) {
|
|
2657
2684
|
this.tools = new Map;
|
|
2658
2685
|
this.name = config.name ?? "contractspec-tools";
|
|
2659
2686
|
this.version = config.version ?? "1.0.0";
|
|
2687
|
+
this.locale = config.locale;
|
|
2660
2688
|
for (const tool of config.tools) {
|
|
2661
2689
|
this.tools.set(tool.config.name, tool);
|
|
2662
2690
|
}
|
|
@@ -2666,7 +2694,7 @@ class MCPToolServer {
|
|
|
2666
2694
|
return;
|
|
2667
2695
|
}
|
|
2668
2696
|
this.running = true;
|
|
2669
|
-
console.log(
|
|
2697
|
+
console.log(createAgentI18n(this.locale).t("log.mcpServer.started", {
|
|
2670
2698
|
name: this.name,
|
|
2671
2699
|
version: this.version,
|
|
2672
2700
|
count: this.tools.size
|
|
@@ -2677,7 +2705,9 @@ class MCPToolServer {
|
|
|
2677
2705
|
return;
|
|
2678
2706
|
}
|
|
2679
2707
|
this.running = false;
|
|
2680
|
-
console.log(
|
|
2708
|
+
console.log(createAgentI18n(this.locale).t("log.mcpServer.stopped", {
|
|
2709
|
+
name: this.name
|
|
2710
|
+
}));
|
|
2681
2711
|
}
|
|
2682
2712
|
isRunning() {
|
|
2683
2713
|
return this.running;
|
|
@@ -2686,18 +2716,20 @@ class MCPToolServer {
|
|
|
2686
2716
|
return Array.from(this.tools.values()).map((t) => t.config);
|
|
2687
2717
|
}
|
|
2688
2718
|
async executeTool(toolName, args, context) {
|
|
2719
|
+
const i18n = createAgentI18n(context?.locale ?? this.locale);
|
|
2689
2720
|
const tool = this.tools.get(toolName);
|
|
2690
2721
|
if (!tool) {
|
|
2691
|
-
throw new Error(
|
|
2722
|
+
throw new Error(i18n.t("error.toolNotFound", { name: toolName }));
|
|
2692
2723
|
}
|
|
2693
2724
|
if (!tool.handler) {
|
|
2694
|
-
throw new Error(
|
|
2725
|
+
throw new Error(i18n.t("error.noHandlerForTool", { name: toolName }));
|
|
2695
2726
|
}
|
|
2696
2727
|
const fullContext = {
|
|
2697
2728
|
agentId: context?.agentId ?? "mcp-server",
|
|
2698
2729
|
sessionId: context?.sessionId ?? "mcp-session",
|
|
2699
2730
|
tenantId: context?.tenantId,
|
|
2700
2731
|
actorId: context?.actorId,
|
|
2732
|
+
locale: context?.locale ?? this.locale,
|
|
2701
2733
|
metadata: context?.metadata,
|
|
2702
2734
|
signal: context?.signal
|
|
2703
2735
|
};
|
|
@@ -2726,8 +2758,10 @@ class MCPToolServer {
|
|
|
2726
2758
|
|
|
2727
2759
|
class ContractSpecToolConsumer {
|
|
2728
2760
|
tools;
|
|
2761
|
+
locale;
|
|
2729
2762
|
constructor(config) {
|
|
2730
2763
|
this.tools = new Map;
|
|
2764
|
+
this.locale = config.locale;
|
|
2731
2765
|
for (const tool of config.tools) {
|
|
2732
2766
|
this.tools.set(tool.config.name, tool);
|
|
2733
2767
|
}
|
|
@@ -2768,7 +2802,9 @@ class ContractSpecToolConsumer {
|
|
|
2768
2802
|
}
|
|
2769
2803
|
}));
|
|
2770
2804
|
default:
|
|
2771
|
-
throw new Error(
|
|
2805
|
+
throw new Error(createAgentI18n(this.locale).t("error.unknownExportFormat", {
|
|
2806
|
+
format
|
|
2807
|
+
}));
|
|
2772
2808
|
}
|
|
2773
2809
|
}
|
|
2774
2810
|
createBridgedHandler(toolName, _format) {
|
|
@@ -2795,18 +2831,20 @@ class ContractSpecToolConsumer {
|
|
|
2795
2831
|
return this.tools.has(name);
|
|
2796
2832
|
}
|
|
2797
2833
|
async executeTool(name, args, context) {
|
|
2834
|
+
const i18n = createAgentI18n(context?.locale ?? this.locale);
|
|
2798
2835
|
const tool = this.tools.get(name);
|
|
2799
2836
|
if (!tool) {
|
|
2800
|
-
throw new Error(
|
|
2837
|
+
throw new Error(i18n.t("error.toolNotFound", { name }));
|
|
2801
2838
|
}
|
|
2802
2839
|
if (!tool.handler) {
|
|
2803
|
-
throw new Error(
|
|
2840
|
+
throw new Error(i18n.t("error.noToolHandler", { name }));
|
|
2804
2841
|
}
|
|
2805
2842
|
const fullContext = {
|
|
2806
2843
|
agentId: context?.agentId ?? "consumer",
|
|
2807
2844
|
sessionId: context?.sessionId ?? "consumer-session",
|
|
2808
2845
|
tenantId: context?.tenantId,
|
|
2809
2846
|
actorId: context?.actorId,
|
|
2847
|
+
locale: context?.locale ?? this.locale,
|
|
2810
2848
|
metadata: context?.metadata,
|
|
2811
2849
|
signal: context?.signal
|
|
2812
2850
|
};
|
|
@@ -603,6 +603,26 @@ var init_en = __esm(() => {
|
|
|
603
603
|
value: "[MCPToolServer] Stopped {name}",
|
|
604
604
|
description: "Log message when MCP tool server stops",
|
|
605
605
|
placeholders: [{ name: "name", type: "string" }]
|
|
606
|
+
},
|
|
607
|
+
"error.telemetry.posthogAiRequired": {
|
|
608
|
+
value: "PostHog LLM Analytics requires @posthog/ai to be installed. Run: npm install @posthog/ai posthog-node",
|
|
609
|
+
description: "Error when PostHog AI dependency is missing"
|
|
610
|
+
},
|
|
611
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
612
|
+
value: "PostHog LLM Analytics requires either a client instance or an apiKey.",
|
|
613
|
+
description: "Error when PostHog client or API key is not configured"
|
|
614
|
+
},
|
|
615
|
+
"error.telemetry.posthogNodeRequired": {
|
|
616
|
+
value: "PostHog LLM Analytics requires posthog-node to be installed. Run: npm install posthog-node",
|
|
617
|
+
description: "Error when posthog-node dependency is missing"
|
|
618
|
+
},
|
|
619
|
+
"error.provider.notAvailable": {
|
|
620
|
+
value: "Provider '{provider}' is not available{reason}",
|
|
621
|
+
description: "Error when a provider is unavailable",
|
|
622
|
+
placeholders: [
|
|
623
|
+
{ name: "provider", type: "string" },
|
|
624
|
+
{ name: "reason", type: "string" }
|
|
625
|
+
]
|
|
606
626
|
}
|
|
607
627
|
}
|
|
608
628
|
});
|
|
@@ -1214,6 +1234,26 @@ var init_fr = __esm(() => {
|
|
|
1214
1234
|
value: "[MCPToolServer] {name} arrêté",
|
|
1215
1235
|
description: "Log message when MCP tool server stops",
|
|
1216
1236
|
placeholders: [{ name: "name", type: "string" }]
|
|
1237
|
+
},
|
|
1238
|
+
"error.telemetry.posthogAiRequired": {
|
|
1239
|
+
value: "PostHog LLM Analytics nécessite l'installation de @posthog/ai. Exécutez : npm install @posthog/ai posthog-node",
|
|
1240
|
+
description: "Error when PostHog AI dependency is missing"
|
|
1241
|
+
},
|
|
1242
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
1243
|
+
value: "PostHog LLM Analytics nécessite soit une instance client, soit une apiKey.",
|
|
1244
|
+
description: "Error when PostHog client or API key is not configured"
|
|
1245
|
+
},
|
|
1246
|
+
"error.telemetry.posthogNodeRequired": {
|
|
1247
|
+
value: "PostHog LLM Analytics nécessite l'installation de posthog-node. Exécutez : npm install posthog-node",
|
|
1248
|
+
description: "Error when posthog-node dependency is missing"
|
|
1249
|
+
},
|
|
1250
|
+
"error.provider.notAvailable": {
|
|
1251
|
+
value: "Le fournisseur « {provider} » n'est pas disponible{reason}",
|
|
1252
|
+
description: "Error when a provider is unavailable",
|
|
1253
|
+
placeholders: [
|
|
1254
|
+
{ name: "provider", type: "string" },
|
|
1255
|
+
{ name: "reason", type: "string" }
|
|
1256
|
+
]
|
|
1217
1257
|
}
|
|
1218
1258
|
}
|
|
1219
1259
|
});
|
|
@@ -1859,78 +1899,58 @@ var init_es = __esm(() => {
|
|
|
1859
1899
|
value: "[MCPToolServer] Detenido {name}",
|
|
1860
1900
|
description: "Mensaje de registro cuando el servidor de herramientas MCP se detiene",
|
|
1861
1901
|
placeholders: [{ name: "name", type: "string" }]
|
|
1902
|
+
},
|
|
1903
|
+
"error.telemetry.posthogAiRequired": {
|
|
1904
|
+
value: "PostHog LLM Analytics requiere que @posthog/ai esté instalado. Ejecute: npm install @posthog/ai posthog-node",
|
|
1905
|
+
description: "Error when PostHog AI dependency is missing"
|
|
1906
|
+
},
|
|
1907
|
+
"error.telemetry.posthogClientOrKeyRequired": {
|
|
1908
|
+
value: "PostHog LLM Analytics requiere una instancia de cliente o una apiKey.",
|
|
1909
|
+
description: "Error when PostHog client or API key is not configured"
|
|
1910
|
+
},
|
|
1911
|
+
"error.telemetry.posthogNodeRequired": {
|
|
1912
|
+
value: "PostHog LLM Analytics requiere que posthog-node esté instalado. Ejecute: npm install posthog-node",
|
|
1913
|
+
description: "Error when posthog-node dependency is missing"
|
|
1914
|
+
},
|
|
1915
|
+
"error.provider.notAvailable": {
|
|
1916
|
+
value: "El proveedor '{provider}' no está disponible{reason}",
|
|
1917
|
+
description: "Error when a provider is unavailable",
|
|
1918
|
+
placeholders: [
|
|
1919
|
+
{ name: "provider", type: "string" },
|
|
1920
|
+
{ name: "reason", type: "string" }
|
|
1921
|
+
]
|
|
1862
1922
|
}
|
|
1863
1923
|
}
|
|
1864
1924
|
});
|
|
1865
1925
|
});
|
|
1866
1926
|
|
|
1867
|
-
// src/i18n/locale.ts
|
|
1868
|
-
function resolveLocale(specLocale, runtimeLocale) {
|
|
1869
|
-
const raw = runtimeLocale ?? specLocale ?? DEFAULT_LOCALE;
|
|
1870
|
-
if (isSupportedLocale(raw)) {
|
|
1871
|
-
return raw;
|
|
1872
|
-
}
|
|
1873
|
-
const base = raw.split("-")[0];
|
|
1874
|
-
if (base && isSupportedLocale(base)) {
|
|
1875
|
-
return base;
|
|
1876
|
-
}
|
|
1877
|
-
return DEFAULT_LOCALE;
|
|
1878
|
-
}
|
|
1879
|
-
function isSupportedLocale(locale) {
|
|
1880
|
-
return SUPPORTED_LOCALES.includes(locale);
|
|
1881
|
-
}
|
|
1882
|
-
var DEFAULT_LOCALE = "en", SUPPORTED_LOCALES;
|
|
1883
|
-
var init_locale = __esm(() => {
|
|
1884
|
-
SUPPORTED_LOCALES = ["en", "fr", "es"];
|
|
1885
|
-
});
|
|
1886
|
-
|
|
1887
1927
|
// src/i18n/messages.ts
|
|
1888
|
-
import {
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
enMessages,
|
|
1893
|
-
frMessages,
|
|
1894
|
-
esMessages
|
|
1895
|
-
]);
|
|
1896
|
-
}
|
|
1897
|
-
return sharedRegistry;
|
|
1898
|
-
}
|
|
1899
|
-
function interpolate(template, params) {
|
|
1900
|
-
if (!params)
|
|
1901
|
-
return template;
|
|
1902
|
-
return template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
1903
|
-
if (key in params) {
|
|
1904
|
-
return String(params[key]);
|
|
1905
|
-
}
|
|
1906
|
-
return match;
|
|
1907
|
-
});
|
|
1908
|
-
}
|
|
1909
|
-
function createAgentI18n(specLocale, runtimeLocale) {
|
|
1910
|
-
const locale = resolveLocale(specLocale, runtimeLocale);
|
|
1911
|
-
const registry = getRegistry();
|
|
1912
|
-
return {
|
|
1913
|
-
locale,
|
|
1914
|
-
t(key, params) {
|
|
1915
|
-
const raw = registry.getValue(SPEC_KEY, key, locale, key);
|
|
1916
|
-
return interpolate(raw, params);
|
|
1917
|
-
}
|
|
1918
|
-
};
|
|
1919
|
-
}
|
|
1920
|
-
function getDefaultI18n() {
|
|
1921
|
-
return createAgentI18n(DEFAULT_LOCALE);
|
|
1922
|
-
}
|
|
1923
|
-
function resetI18nRegistry() {
|
|
1924
|
-
sharedRegistry = null;
|
|
1925
|
-
}
|
|
1926
|
-
var SPEC_KEY = "ai-agent.messages", sharedRegistry = null;
|
|
1928
|
+
import {
|
|
1929
|
+
createI18nFactory
|
|
1930
|
+
} from "@contractspec/lib.contracts-spec/translations";
|
|
1931
|
+
var factory, createAgentI18n, getDefaultI18n, resetI18nRegistry;
|
|
1927
1932
|
var init_messages = __esm(() => {
|
|
1928
1933
|
init_en();
|
|
1929
1934
|
init_fr();
|
|
1930
1935
|
init_es();
|
|
1931
|
-
|
|
1936
|
+
factory = createI18nFactory({
|
|
1937
|
+
specKey: "ai-agent.messages",
|
|
1938
|
+
catalogs: [enMessages, frMessages, esMessages]
|
|
1939
|
+
});
|
|
1940
|
+
createAgentI18n = factory.create;
|
|
1941
|
+
getDefaultI18n = factory.getDefault;
|
|
1942
|
+
resetI18nRegistry = factory.resetRegistry;
|
|
1932
1943
|
});
|
|
1933
1944
|
|
|
1945
|
+
// src/i18n/locale.ts
|
|
1946
|
+
import {
|
|
1947
|
+
DEFAULT_LOCALE,
|
|
1948
|
+
SUPPORTED_LOCALES,
|
|
1949
|
+
resolveLocale,
|
|
1950
|
+
isSupportedLocale
|
|
1951
|
+
} from "@contractspec/lib.contracts-spec/translations";
|
|
1952
|
+
var init_locale = () => {};
|
|
1953
|
+
|
|
1934
1954
|
// src/i18n/keys.ts
|
|
1935
1955
|
var AGENT_KEYS, KNOWLEDGE_KEYS, TOOL_KEYS, INTEROP_KEYS, ERROR_KEYS, EXPORT_KEYS, APPROVAL_KEYS, LOG_KEYS, I18N_KEYS;
|
|
1936
1956
|
var init_keys = __esm(() => {
|
|
@@ -2025,7 +2045,11 @@ var init_keys = __esm(() => {
|
|
|
2025
2045
|
"error.provider.sdkNotInstalled": "error.provider.sdkNotInstalled",
|
|
2026
2046
|
"error.provider.contextCreation": "error.provider.contextCreation",
|
|
2027
2047
|
"error.provider.executionFailed": "error.provider.executionFailed",
|
|
2028
|
-
"error.provider.streamFailed": "error.provider.streamFailed"
|
|
2048
|
+
"error.provider.streamFailed": "error.provider.streamFailed",
|
|
2049
|
+
"error.provider.notAvailable": "error.provider.notAvailable",
|
|
2050
|
+
"error.telemetry.posthogAiRequired": "error.telemetry.posthogAiRequired",
|
|
2051
|
+
"error.telemetry.posthogClientOrKeyRequired": "error.telemetry.posthogClientOrKeyRequired",
|
|
2052
|
+
"error.telemetry.posthogNodeRequired": "error.telemetry.posthogNodeRequired"
|
|
2029
2053
|
};
|
|
2030
2054
|
EXPORT_KEYS = {
|
|
2031
2055
|
"export.agentConfiguration": "export.agentConfiguration",
|
|
@@ -2105,7 +2129,7 @@ var init_i18n = __esm(() => {
|
|
|
2105
2129
|
|
|
2106
2130
|
// src/spec/spec.ts
|
|
2107
2131
|
function defineAgent(spec) {
|
|
2108
|
-
const i18n =
|
|
2132
|
+
const i18n = createAgentI18n(spec.locale);
|
|
2109
2133
|
if (!spec.meta?.key) {
|
|
2110
2134
|
throw new Error(i18n.t("error.agentKeyRequired"));
|
|
2111
2135
|
}
|
|
@@ -2145,10 +2169,12 @@ class ContractSpecConsumer {
|
|
|
2145
2169
|
specs;
|
|
2146
2170
|
includeMetadata;
|
|
2147
2171
|
baseUrl;
|
|
2172
|
+
locale;
|
|
2148
2173
|
constructor(config) {
|
|
2149
2174
|
this.specs = new Map;
|
|
2150
2175
|
this.includeMetadata = config.includeMetadata ?? true;
|
|
2151
2176
|
this.baseUrl = config.baseUrl;
|
|
2177
|
+
this.locale = config.locale;
|
|
2152
2178
|
for (const spec of config.specs) {
|
|
2153
2179
|
const key = agentKey(spec.meta);
|
|
2154
2180
|
this.specs.set(key, spec);
|
|
@@ -2157,9 +2183,9 @@ class ContractSpecConsumer {
|
|
|
2157
2183
|
getSpecMarkdown(specKey, options) {
|
|
2158
2184
|
const spec = this.specs.get(specKey);
|
|
2159
2185
|
if (!spec) {
|
|
2160
|
-
throw new Error(
|
|
2186
|
+
throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
|
|
2161
2187
|
}
|
|
2162
|
-
const i18n =
|
|
2188
|
+
const i18n = createAgentI18n(options?.locale ?? this.locale);
|
|
2163
2189
|
const sections = [];
|
|
2164
2190
|
const opts = {
|
|
2165
2191
|
includeToc: options?.includeToc ?? true,
|
|
@@ -2282,9 +2308,9 @@ class ContractSpecConsumer {
|
|
|
2282
2308
|
getSpecPrompt(specKey, options) {
|
|
2283
2309
|
const spec = this.specs.get(specKey);
|
|
2284
2310
|
if (!spec) {
|
|
2285
|
-
throw new Error(
|
|
2311
|
+
throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
|
|
2286
2312
|
}
|
|
2287
|
-
const i18n =
|
|
2313
|
+
const i18n = createAgentI18n(options?.locale ?? this.locale);
|
|
2288
2314
|
const sections = [];
|
|
2289
2315
|
const opts = {
|
|
2290
2316
|
includeTools: options?.includeTools ?? true,
|