@contractspec/lib.ai-agent 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/dist/agent/agent-factory.js +97 -67
  2. package/dist/agent/contract-spec-agent.js +97 -67
  3. package/dist/agent/index.js +140 -100
  4. package/dist/agent/json-runner.js +103 -71
  5. package/dist/agent/unified-agent.d.ts +4 -0
  6. package/dist/agent/unified-agent.js +134 -96
  7. package/dist/approval/index.js +86 -62
  8. package/dist/approval/workflow.d.ts +2 -0
  9. package/dist/approval/workflow.js +86 -62
  10. package/dist/exporters/claude-agent-exporter.js +90 -66
  11. package/dist/exporters/index.js +100 -76
  12. package/dist/exporters/opencode-exporter.js +96 -72
  13. package/dist/exporters/types.d.ts +2 -0
  14. package/dist/i18n/catalogs/en.js +20 -0
  15. package/dist/i18n/catalogs/es.js +20 -0
  16. package/dist/i18n/catalogs/fr.js +20 -0
  17. package/dist/i18n/catalogs/index.js +60 -0
  18. package/dist/i18n/index.js +85 -61
  19. package/dist/i18n/keys.d.ts +16 -0
  20. package/dist/i18n/keys.js +5 -1
  21. package/dist/i18n/locale.d.ts +3 -28
  22. package/dist/i18n/locale.js +7 -18
  23. package/dist/i18n/messages.d.ts +9 -60
  24. package/dist/i18n/messages.js +71 -60
  25. package/dist/index.js +88 -64
  26. package/dist/interop/index.js +117 -79
  27. package/dist/interop/spec-consumer.d.ts +1 -0
  28. package/dist/interop/spec-consumer.js +92 -66
  29. package/dist/interop/tool-consumer.d.ts +1 -0
  30. package/dist/interop/tool-consumer.js +110 -74
  31. package/dist/interop/types.d.ts +10 -0
  32. package/dist/knowledge/index.js +85 -61
  33. package/dist/knowledge/injector.js +85 -61
  34. package/dist/node/agent/agent-factory.js +97 -67
  35. package/dist/node/agent/contract-spec-agent.js +97 -67
  36. package/dist/node/agent/index.js +140 -100
  37. package/dist/node/agent/json-runner.js +103 -71
  38. package/dist/node/agent/unified-agent.js +134 -96
  39. package/dist/node/approval/index.js +86 -62
  40. package/dist/node/approval/workflow.js +86 -62
  41. package/dist/node/exporters/claude-agent-exporter.js +90 -66
  42. package/dist/node/exporters/index.js +100 -76
  43. package/dist/node/exporters/opencode-exporter.js +96 -72
  44. package/dist/node/i18n/catalogs/en.js +20 -0
  45. package/dist/node/i18n/catalogs/es.js +20 -0
  46. package/dist/node/i18n/catalogs/fr.js +20 -0
  47. package/dist/node/i18n/catalogs/index.js +60 -0
  48. package/dist/node/i18n/index.js +85 -61
  49. package/dist/node/i18n/keys.js +5 -1
  50. package/dist/node/i18n/locale.js +7 -18
  51. package/dist/node/i18n/messages.js +71 -60
  52. package/dist/node/index.js +88 -64
  53. package/dist/node/interop/index.js +117 -79
  54. package/dist/node/interop/spec-consumer.js +92 -66
  55. package/dist/node/interop/tool-consumer.js +110 -74
  56. package/dist/node/knowledge/index.js +85 -61
  57. package/dist/node/knowledge/injector.js +85 -61
  58. package/dist/node/providers/claude-agent-sdk/adapter.js +103 -74
  59. package/dist/node/providers/claude-agent-sdk/index.js +103 -74
  60. package/dist/node/providers/claude-agent-sdk/tool-bridge.js +88 -64
  61. package/dist/node/providers/index.js +116 -86
  62. package/dist/node/providers/opencode-sdk/adapter.js +102 -73
  63. package/dist/node/providers/opencode-sdk/agent-bridge.js +89 -65
  64. package/dist/node/providers/opencode-sdk/index.js +102 -73
  65. package/dist/node/providers/opencode-sdk/tool-bridge.js +88 -64
  66. package/dist/node/providers/registry.js +96 -66
  67. package/dist/node/providers/types.js +2122 -2
  68. package/dist/node/spec/index.js +88 -64
  69. package/dist/node/spec/registry.js +87 -63
  70. package/dist/node/spec/spec.js +86 -62
  71. package/dist/node/telemetry/index.js +2122 -3
  72. package/dist/node/telemetry/posthog.js +2123 -3
  73. package/dist/node/tools/index.js +90 -63
  74. package/dist/node/tools/knowledge-tool.js +85 -61
  75. package/dist/node/tools/mcp-server.js +86 -62
  76. package/dist/node/tools/tool-adapter.js +89 -62
  77. package/dist/providers/claude-agent-sdk/adapter.js +103 -74
  78. package/dist/providers/claude-agent-sdk/index.js +103 -74
  79. package/dist/providers/claude-agent-sdk/tool-bridge.js +88 -64
  80. package/dist/providers/index.js +116 -86
  81. package/dist/providers/opencode-sdk/adapter.js +102 -73
  82. package/dist/providers/opencode-sdk/agent-bridge.js +89 -65
  83. package/dist/providers/opencode-sdk/index.js +102 -73
  84. package/dist/providers/opencode-sdk/tool-bridge.js +88 -64
  85. package/dist/providers/registry.d.ts +2 -2
  86. package/dist/providers/registry.js +96 -66
  87. package/dist/providers/types.d.ts +5 -1
  88. package/dist/providers/types.js +2122 -2
  89. package/dist/spec/index.js +88 -64
  90. package/dist/spec/registry.d.ts +1 -1
  91. package/dist/spec/registry.js +87 -63
  92. package/dist/spec/spec.js +86 -62
  93. package/dist/telemetry/index.js +2122 -3
  94. package/dist/telemetry/posthog.js +2123 -3
  95. package/dist/tools/index.js +90 -63
  96. package/dist/tools/knowledge-tool.js +85 -61
  97. package/dist/tools/mcp-server.js +86 -62
  98. package/dist/tools/tool-adapter.js +89 -62
  99. package/dist/types.d.ts +2 -0
  100. package/package.json +6 -6
package/dist/index.js CHANGED
@@ -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\xEAt\xE9",
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\xE9cessite l'installation de @posthog/ai. Ex\xE9cutez : 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\xE9cessite 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\xE9cessite l'installation de posthog-node. Ex\xE9cutez : npm install posthog-node",
1248
+ description: "Error when posthog-node dependency is missing"
1249
+ },
1250
+ "error.provider.notAvailable": {
1251
+ value: "Le fournisseur \xAB {provider} \xBB 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\xE9 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\xE9 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\xE1 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 { TranslationRegistry } from "@contractspec/lib.contracts-spec/translations";
1889
- function getRegistry() {
1890
- if (!sharedRegistry) {
1891
- sharedRegistry = new TranslationRegistry([
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
- init_locale();
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 = getDefaultI18n();
2132
+ const i18n = createAgentI18n(spec.locale);
2109
2133
  if (!spec.meta?.key) {
2110
2134
  throw new Error(i18n.t("error.agentKeyRequired"));
2111
2135
  }
@@ -2153,10 +2177,10 @@ class AgentRegistry extends SpecContractRegistry {
2153
2177
  }
2154
2178
  return [...names];
2155
2179
  }
2156
- require(name, version) {
2180
+ require(name, version, locale) {
2157
2181
  const spec = this.get(name, version);
2158
2182
  if (!spec) {
2159
- throw new Error(getDefaultI18n().t("error.agentSpecNotFound", {
2183
+ throw new Error(createAgentI18n(locale).t("error.agentSpecNotFound", {
2160
2184
  name: `${name}${version != null ? `.v${version}` : ""}`
2161
2185
  }));
2162
2186
  }
@@ -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\xEAt\xE9",
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\xE9cessite l'installation de @posthog/ai. Ex\xE9cutez : 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\xE9cessite 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\xE9cessite l'installation de posthog-node. Ex\xE9cutez : npm install posthog-node",
1248
+ description: "Error when posthog-node dependency is missing"
1249
+ },
1250
+ "error.provider.notAvailable": {
1251
+ value: "Le fournisseur \xAB {provider} \xBB 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\xE9 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\xE9 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\xE1 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 { TranslationRegistry } from "@contractspec/lib.contracts-spec/translations";
1889
- function getRegistry() {
1890
- if (!sharedRegistry) {
1891
- sharedRegistry = new TranslationRegistry([
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
- init_locale();
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 = getDefaultI18n();
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 ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
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(getDefaultI18n().t("error.handlerNotFoundForTool", {
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 ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
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 ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
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 ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
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: getDefaultI18n().t("error.toolNotFoundOrNoHandler", {
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(getDefaultI18n().t("error.specNotFound", { specKey }));
2411
+ throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
2386
2412
  }
2387
- const i18n = getDefaultI18n();
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(getDefaultI18n().t("error.specNotFound", { specKey }));
2536
+ throw new Error(createAgentI18n(this.locale).t("error.specNotFound", { specKey }));
2511
2537
  }
2512
- const i18n = getDefaultI18n();
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(getDefaultI18n().t("log.mcpServer.started", {
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(getDefaultI18n().t("log.mcpServer.stopped", { name: this.name }));
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(getDefaultI18n().t("error.toolNotFound", { name: toolName }));
2722
+ throw new Error(i18n.t("error.toolNotFound", { name: toolName }));
2692
2723
  }
2693
2724
  if (!tool.handler) {
2694
- throw new Error(getDefaultI18n().t("error.noHandlerForTool", { name: toolName }));
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(getDefaultI18n().t("error.unknownExportFormat", { format }));
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(getDefaultI18n().t("error.toolNotFound", { name }));
2837
+ throw new Error(i18n.t("error.toolNotFound", { name }));
2801
2838
  }
2802
2839
  if (!tool.handler) {
2803
- throw new Error(getDefaultI18n().t("error.noToolHandler", { name }));
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
  };
@@ -31,6 +31,7 @@ export declare class ContractSpecConsumer implements SpecConsumer {
31
31
  private readonly specs;
32
32
  private readonly includeMetadata;
33
33
  private readonly baseUrl?;
34
+ private readonly locale?;
34
35
  constructor(config: SpecConsumerConfig);
35
36
  /**
36
37
  * Get a spec as markdown.