@contractspec/lib.ai-agent 2.4.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.
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
@@ -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
  }
@@ -2194,6 +2218,7 @@ var init_injector = __esm(() => {
2194
2218
  // src/providers/types.ts
2195
2219
  var ExternalProviderError, ProviderNotAvailableError, ProviderExecutionError, ContextCreationError;
2196
2220
  var init_types = __esm(() => {
2221
+ init_i18n();
2197
2222
  ExternalProviderError = class ExternalProviderError extends Error {
2198
2223
  provider;
2199
2224
  code;
@@ -2207,8 +2232,12 @@ var init_types = __esm(() => {
2207
2232
  }
2208
2233
  };
2209
2234
  ProviderNotAvailableError = class ProviderNotAvailableError extends ExternalProviderError {
2210
- constructor(provider, reason) {
2211
- super(`Provider '${provider}' is not available${reason ? `: ${reason}` : ""}`, provider, "PROVIDER_NOT_AVAILABLE");
2235
+ constructor(provider, reason, locale) {
2236
+ const i18n = createAgentI18n(locale);
2237
+ super(i18n.t("error.provider.notAvailable", {
2238
+ provider,
2239
+ reason: reason ? `: ${reason}` : ""
2240
+ }), provider, "PROVIDER_NOT_AVAILABLE");
2212
2241
  this.name = "ProviderNotAvailableError";
2213
2242
  }
2214
2243
  };
@@ -2230,7 +2259,7 @@ var init_types = __esm(() => {
2230
2259
  function specToolToClaudeAgentTool(tool, handler, context) {
2231
2260
  return {
2232
2261
  name: tool.name,
2233
- description: tool.description ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
2262
+ description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
2234
2263
  input_schema: normalizeSchema(tool.schema),
2235
2264
  requires_confirmation: tool.requiresApproval ?? !tool.automationSafe,
2236
2265
  execute: async (input) => {
@@ -2250,7 +2279,7 @@ function specToolsToClaudeAgentTools(tools, handlers, context) {
2250
2279
  return tools.filter((tool) => handlers.has(tool.name)).map((tool) => {
2251
2280
  const handler = handlers.get(tool.name);
2252
2281
  if (!handler) {
2253
- throw new Error(getDefaultI18n().t("error.handlerNotFoundForTool", {
2282
+ throw new Error(createAgentI18n().t("error.handlerNotFoundForTool", {
2254
2283
  name: tool.name
2255
2284
  }));
2256
2285
  }
@@ -2283,7 +2312,7 @@ function claudeAgentToolsToSpecTools(claudeTools) {
2283
2312
  function specToolToExternalTool(tool, handler, context) {
2284
2313
  return {
2285
2314
  name: tool.name,
2286
- description: tool.description ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
2315
+ description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
2287
2316
  inputSchema: tool.schema ?? { type: "object" },
2288
2317
  requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
2289
2318
  execute: handler ? async (input) => {
@@ -2479,7 +2508,7 @@ class ClaudeAgentSDKProvider {
2479
2508
  }
2480
2509
  async createContext(spec) {
2481
2510
  if (!this.isAvailable()) {
2482
- throw new ProviderNotAvailableError(this.name, getDefaultI18n().t("error.provider.sdkNotConfigured"));
2511
+ throw new ProviderNotAvailableError(this.name, createAgentI18n(this.config.locale).t("error.provider.sdkNotConfigured"));
2483
2512
  }
2484
2513
  try {
2485
2514
  const toolSet = {};
@@ -2504,7 +2533,7 @@ class ClaudeAgentSDKProvider {
2504
2533
  cleanup: async () => {}
2505
2534
  };
2506
2535
  } catch (error) {
2507
- throw new ContextCreationError(this.name, getDefaultI18n().t("error.provider.contextCreation", {
2536
+ throw new ContextCreationError(this.name, createAgentI18n(this.config.locale).t("error.provider.contextCreation", {
2508
2537
  error: error instanceof Error ? error.message : String(error)
2509
2538
  }), error instanceof Error ? error : undefined);
2510
2539
  }
@@ -2562,7 +2591,7 @@ ${params.systemOverride}` : context.spec.instructions;
2562
2591
  }
2563
2592
  };
2564
2593
  } catch (error) {
2565
- throw new ProviderExecutionError(this.name, getDefaultI18n().t("error.provider.executionFailed", {
2594
+ throw new ProviderExecutionError(this.name, createAgentI18n(this.config.locale).t("error.provider.executionFailed", {
2566
2595
  error: error instanceof Error ? error.message : String(error)
2567
2596
  }), error instanceof Error ? error : undefined);
2568
2597
  }
@@ -2644,7 +2673,7 @@ ${params.systemOverride}` : context.spec.instructions;
2644
2673
  }
2645
2674
  };
2646
2675
  } catch (error) {
2647
- throw new ProviderExecutionError(this.name, getDefaultI18n().t("error.provider.streamFailed", {
2676
+ throw new ProviderExecutionError(this.name, createAgentI18n(this.config.locale).t("error.provider.streamFailed", {
2648
2677
  error: error instanceof Error ? error.message : String(error)
2649
2678
  }), error instanceof Error ? error : undefined);
2650
2679
  }
@@ -2654,7 +2683,7 @@ ${params.systemOverride}` : context.spec.instructions;
2654
2683
  const module = __require("@anthropic-ai/claude-agent-sdk");
2655
2684
  return module.default ?? module;
2656
2685
  } catch {
2657
- throw new ProviderNotAvailableError(this.name, getDefaultI18n().t("error.provider.claudeSdkMissing"));
2686
+ throw new ProviderNotAvailableError(this.name, createAgentI18n(this.config.locale).t("error.provider.claudeSdkMissing"));
2658
2687
  }
2659
2688
  }
2660
2689
  prepareToolsForSDK(context, params) {
@@ -2664,7 +2693,7 @@ ${params.systemOverride}` : context.spec.instructions;
2664
2693
  if (externalTool?.execute) {
2665
2694
  handlers.set(tool.name, async (input) => {
2666
2695
  if (!externalTool.execute) {
2667
- throw new Error(getDefaultI18n().t("error.toolNoExecuteHandler", {
2696
+ throw new Error(createAgentI18n(this.config.locale).t("error.toolNoExecuteHandler", {
2668
2697
  name: tool.name
2669
2698
  }));
2670
2699
  }
@@ -2688,7 +2717,7 @@ ${params.systemOverride}` : context.spec.instructions;
2688
2717
  return {
2689
2718
  toolCallId: toolCall.toolCallId,
2690
2719
  toolName: toolCall.toolName,
2691
- output: getDefaultI18n().t("error.toolNotFoundOrNoHandler", {
2720
+ output: createAgentI18n(this.config.locale).t("error.toolNotFoundOrNoHandler", {
2692
2721
  name: toolCall.toolName
2693
2722
  })
2694
2723
  };
@@ -2773,7 +2802,7 @@ var init_claude_agent_sdk = __esm(() => {
2773
2802
  function specToolToOpenCodeTool(tool) {
2774
2803
  return {
2775
2804
  name: tool.name,
2776
- description: tool.description ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
2805
+ description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
2777
2806
  parameters: normalizeToOpenCodeParameters(tool.schema),
2778
2807
  permission: getPermissionLevel(tool)
2779
2808
  };
@@ -2805,7 +2834,7 @@ function openCodeToolsToSpecTools(openCodeTools) {
2805
2834
  function specToolToExternalToolForOpenCode(tool, handler, context) {
2806
2835
  return {
2807
2836
  name: tool.name,
2808
- description: tool.description ?? getDefaultI18n().t("tool.fallbackDescription", { name: tool.name }),
2837
+ description: tool.description ?? createAgentI18n().t("tool.fallbackDescription", { name: tool.name }),
2809
2838
  inputSchema: tool.schema ?? { type: "object" },
2810
2839
  requiresApproval: tool.requiresApproval ?? !tool.automationSafe,
2811
2840
  execute: handler ? async (input) => {
@@ -2869,7 +2898,7 @@ async function executeToolCall(toolCall, handlers) {
2869
2898
  if (!handler) {
2870
2899
  return {
2871
2900
  tool_call_id: toolCall.id,
2872
- output: getDefaultI18n().t("error.toolNotFoundOrNoHandler", {
2901
+ output: createAgentI18n().t("error.toolNotFoundOrNoHandler", {
2873
2902
  name: toolCall.name
2874
2903
  }),
2875
2904
  is_error: true
@@ -2966,7 +2995,7 @@ function specToOpenCodeMarkdown(spec, options) {
2966
2995
  };
2967
2996
  }
2968
2997
  function buildMarkdownBody(spec) {
2969
- const i18n = getDefaultI18n();
2998
+ const i18n = createAgentI18n(spec.locale);
2970
2999
  const lines = [];
2971
3000
  lines.push(`# ${spec.meta.key}`);
2972
3001
  lines.push("");
@@ -3088,7 +3117,7 @@ class OpenCodeSDKProvider {
3088
3117
  }
3089
3118
  async createContext(spec) {
3090
3119
  if (!this.isAvailable()) {
3091
- throw new ProviderNotAvailableError(this.name, getDefaultI18n().t("error.provider.sdkNotInstalled"));
3120
+ throw new ProviderNotAvailableError(this.name, createAgentI18n(this.config.locale).t("error.provider.sdkNotInstalled"));
3092
3121
  }
3093
3122
  try {
3094
3123
  const sdk = await this.loadSDK();
@@ -3127,7 +3156,7 @@ class OpenCodeSDKProvider {
3127
3156
  }
3128
3157
  };
3129
3158
  } catch (error) {
3130
- throw new ContextCreationError(this.name, getDefaultI18n().t("error.provider.contextCreation", {
3159
+ throw new ContextCreationError(this.name, createAgentI18n(this.config.locale).t("error.provider.contextCreation", {
3131
3160
  error: error instanceof Error ? error.message : String(error)
3132
3161
  }), error instanceof Error ? error : undefined);
3133
3162
  }
@@ -3177,7 +3206,7 @@ ${params.systemOverride}` : context.spec.instructions;
3177
3206
  }
3178
3207
  };
3179
3208
  } catch (error) {
3180
- throw new ProviderExecutionError(this.name, getDefaultI18n().t("error.provider.executionFailed", {
3209
+ throw new ProviderExecutionError(this.name, createAgentI18n(this.config.locale).t("error.provider.executionFailed", {
3181
3210
  error: error instanceof Error ? error.message : String(error)
3182
3211
  }), error instanceof Error ? error : undefined);
3183
3212
  }
@@ -3265,7 +3294,7 @@ ${params.systemOverride}` : context.spec.instructions;
3265
3294
  }
3266
3295
  };
3267
3296
  } catch (error) {
3268
- throw new ProviderExecutionError(this.name, getDefaultI18n().t("error.provider.streamFailed", {
3297
+ throw new ProviderExecutionError(this.name, createAgentI18n(this.config.locale).t("error.provider.streamFailed", {
3269
3298
  error: error instanceof Error ? error.message : String(error)
3270
3299
  }), error instanceof Error ? error : undefined);
3271
3300
  }
@@ -3275,7 +3304,7 @@ ${params.systemOverride}` : context.spec.instructions;
3275
3304
  const module = __require("@opencode-ai/sdk");
3276
3305
  return module;
3277
3306
  } catch {
3278
- throw new ProviderNotAvailableError(this.name, getDefaultI18n().t("error.provider.opencodeSdkMissing"));
3307
+ throw new ProviderNotAvailableError(this.name, createAgentI18n(this.config.locale).t("error.provider.opencodeSdkMissing"));
3279
3308
  }
3280
3309
  }
3281
3310
  getHostname() {
@@ -3369,13 +3398,14 @@ class InMemoryProviderRegistry {
3369
3398
  const provider = this.providers.get(name);
3370
3399
  return provider !== undefined && provider.isAvailable();
3371
3400
  }
3372
- require(name) {
3401
+ require(name, locale) {
3402
+ const i18n = createAgentI18n(locale);
3373
3403
  const provider = this.providers.get(name);
3374
3404
  if (!provider) {
3375
- throw new ProviderNotAvailableError(name, getDefaultI18n().t("error.provider.notRegistered"));
3405
+ throw new ProviderNotAvailableError(name, i18n.t("error.provider.notRegistered"));
3376
3406
  }
3377
3407
  if (!provider.isAvailable()) {
3378
- throw new ProviderNotAvailableError(name, getDefaultI18n().t("error.provider.depsNotInstalled"));
3408
+ throw new ProviderNotAvailableError(name, i18n.t("error.provider.depsNotInstalled"));
3379
3409
  }
3380
3410
  return provider;
3381
3411
  }