@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,6 +1899,26 @@ 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
  });
@@ -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",
@@ -181,6 +181,14 @@ export declare const ERROR_KEYS: {
181
181
  readonly 'error.provider.executionFailed': "error.provider.executionFailed";
182
182
  /** "Stream failed: {error}" */
183
183
  readonly 'error.provider.streamFailed': "error.provider.streamFailed";
184
+ /** "Provider '{provider}' is not available: {reason}" */
185
+ readonly 'error.provider.notAvailable': "error.provider.notAvailable";
186
+ /** "PostHog LLM Analytics requires @posthog/ai to be installed." */
187
+ readonly 'error.telemetry.posthogAiRequired': "error.telemetry.posthogAiRequired";
188
+ /** "PostHog LLM Analytics requires either a client instance or an apiKey." */
189
+ readonly 'error.telemetry.posthogClientOrKeyRequired': "error.telemetry.posthogClientOrKeyRequired";
190
+ /** "PostHog LLM Analytics requires posthog-node to be installed." */
191
+ readonly 'error.telemetry.posthogNodeRequired': "error.telemetry.posthogNodeRequired";
184
192
  };
185
193
  export declare const EXPORT_KEYS: {
186
194
  /** "# Agent Configuration" */
@@ -443,6 +451,14 @@ export declare const I18N_KEYS: {
443
451
  readonly 'error.provider.executionFailed': "error.provider.executionFailed";
444
452
  /** "Stream failed: {error}" */
445
453
  readonly 'error.provider.streamFailed': "error.provider.streamFailed";
454
+ /** "Provider '{provider}' is not available: {reason}" */
455
+ readonly 'error.provider.notAvailable': "error.provider.notAvailable";
456
+ /** "PostHog LLM Analytics requires @posthog/ai to be installed." */
457
+ readonly 'error.telemetry.posthogAiRequired': "error.telemetry.posthogAiRequired";
458
+ /** "PostHog LLM Analytics requires either a client instance or an apiKey." */
459
+ readonly 'error.telemetry.posthogClientOrKeyRequired': "error.telemetry.posthogClientOrKeyRequired";
460
+ /** "PostHog LLM Analytics requires posthog-node to be installed." */
461
+ readonly 'error.telemetry.posthogNodeRequired': "error.telemetry.posthogNodeRequired";
446
462
  /** "# Agent Identity" */
447
463
  readonly 'interop.prompt.agentIdentity': "interop.prompt.agentIdentity";
448
464
  /** "You are {key} (v{version})." */
package/dist/i18n/keys.js CHANGED
@@ -106,7 +106,11 @@ var init_keys = __esm(() => {
106
106
  "error.provider.sdkNotInstalled": "error.provider.sdkNotInstalled",
107
107
  "error.provider.contextCreation": "error.provider.contextCreation",
108
108
  "error.provider.executionFailed": "error.provider.executionFailed",
109
- "error.provider.streamFailed": "error.provider.streamFailed"
109
+ "error.provider.streamFailed": "error.provider.streamFailed",
110
+ "error.provider.notAvailable": "error.provider.notAvailable",
111
+ "error.telemetry.posthogAiRequired": "error.telemetry.posthogAiRequired",
112
+ "error.telemetry.posthogClientOrKeyRequired": "error.telemetry.posthogClientOrKeyRequired",
113
+ "error.telemetry.posthogNodeRequired": "error.telemetry.posthogNodeRequired"
110
114
  };
111
115
  EXPORT_KEYS = {
112
116
  "export.agentConfiguration": "export.agentConfiguration",
@@ -1,33 +1,8 @@
1
1
  /**
2
- * Locale resolution and configuration for the ai-agent i18n system.
2
+ * Locale utilities for the ai-agent package.
3
3
  *
4
- * Locale priority: runtime override > spec-level > DEFAULT_LOCALE
4
+ * Re-exported from the shared i18n factory in contracts-spec.
5
5
  *
6
6
  * @module i18n/locale
7
7
  */
8
- /** Default locale when none is specified */
9
- export declare const DEFAULT_LOCALE = "en";
10
- /** Supported locales shipped with the ai-agent package */
11
- export declare const SUPPORTED_LOCALES: readonly ["en", "fr", "es"];
12
- /** Type for supported locales */
13
- export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
14
- /**
15
- * Resolve the effective locale from spec-level and runtime overrides.
16
- *
17
- * Priority (highest wins):
18
- * 1. runtimeLocale (from AgentCallOptions.locale)
19
- * 2. specLocale (from AgentSpec.locale)
20
- * 3. DEFAULT_LOCALE ("en")
21
- *
22
- * If the resolved locale is not in SUPPORTED_LOCALES, falls back
23
- * to the base language (e.g., "fr-CA" -> "fr") or DEFAULT_LOCALE.
24
- *
25
- * @param specLocale - Locale from the agent spec definition
26
- * @param runtimeLocale - Locale override passed at execution time
27
- * @returns The effective locale string
28
- */
29
- export declare function resolveLocale(specLocale?: string, runtimeLocale?: string): string;
30
- /**
31
- * Check if a locale string is one of the supported locales.
32
- */
33
- export declare function isSupportedLocale(locale: string): locale is SupportedLocale;
8
+ export { DEFAULT_LOCALE, SUPPORTED_LOCALES, resolveLocale, isSupportedLocale, type SupportedLocale, } from '@contractspec/lib.contracts-spec/translations';
@@ -13,24 +13,13 @@ var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
13
13
  var __require = import.meta.require;
14
14
 
15
15
  // src/i18n/locale.ts
16
- function resolveLocale(specLocale, runtimeLocale) {
17
- const raw = runtimeLocale ?? specLocale ?? DEFAULT_LOCALE;
18
- if (isSupportedLocale(raw)) {
19
- return raw;
20
- }
21
- const base = raw.split("-")[0];
22
- if (base && isSupportedLocale(base)) {
23
- return base;
24
- }
25
- return DEFAULT_LOCALE;
26
- }
27
- function isSupportedLocale(locale) {
28
- return SUPPORTED_LOCALES.includes(locale);
29
- }
30
- var DEFAULT_LOCALE = "en", SUPPORTED_LOCALES;
31
- var init_locale = __esm(() => {
32
- SUPPORTED_LOCALES = ["en", "fr", "es"];
33
- });
16
+ import {
17
+ DEFAULT_LOCALE,
18
+ SUPPORTED_LOCALES,
19
+ resolveLocale,
20
+ isSupportedLocale
21
+ } from "@contractspec/lib.contracts-spec/translations";
22
+ var init_locale = () => {};
34
23
  init_locale();
35
24
 
36
25
  export {
@@ -1,65 +1,14 @@
1
1
  /**
2
2
  * Translation helper for the ai-agent package.
3
- *
4
- * Provides a lightweight `t()` function that resolves message keys
5
- * to translated strings using the TranslationRegistry from
6
- * @contractspec/lib.contracts-spec.
7
- *
8
3
  * @module i18n/messages
9
4
  */
5
+ import { type I18nInstance } from '@contractspec/lib.contracts-spec/translations';
10
6
  import type { AgentMessageKey } from './keys';
11
- /**
12
- * Interface for the agent i18n helper.
13
- */
14
- export interface AgentI18n {
15
- /**
16
- * Translate a message key, with optional placeholder interpolation.
17
- *
18
- * @param key - A key from I18N_KEYS
19
- * @param params - Optional placeholder values to interpolate
20
- * @returns The translated string (falls back to English, then to the key itself)
21
- *
22
- * @example
23
- * ```ts
24
- * const i18n = createAgentI18n("fr");
25
- * i18n.t("error.missingToolHandler", { name: "search" });
26
- * // => "Gestionnaire manquant pour l'outil : search"
27
- * ```
28
- */
29
- t(key: AgentMessageKey | string, params?: Record<string, string | number>): string;
30
- /** The effective locale being used */
31
- readonly locale: string;
32
- }
33
- /**
34
- * Create an AgentI18n instance for a given locale.
35
- *
36
- * The locale is resolved through the standard priority chain:
37
- * runtimeLocale > specLocale > DEFAULT_LOCALE ("en")
38
- *
39
- * @param specLocale - Locale from the agent spec (optional)
40
- * @param runtimeLocale - Runtime locale override (optional)
41
- * @returns An AgentI18n instance bound to the resolved locale
42
- *
43
- * @example
44
- * ```ts
45
- * // Use spec locale
46
- * const i18n = createAgentI18n("fr");
47
- *
48
- * // Use runtime override
49
- * const i18n = createAgentI18n("fr", "es"); // resolves to "es"
50
- *
51
- * // Use default
52
- * const i18n = createAgentI18n(); // resolves to "en"
53
- * ```
54
- */
55
- export declare function createAgentI18n(specLocale?: string, runtimeLocale?: string): AgentI18n;
56
- /**
57
- * Convenience: create a default (English) i18n instance.
58
- * Useful in contexts where no locale information is available.
59
- */
60
- export declare function getDefaultI18n(): AgentI18n;
61
- /**
62
- * Reset the shared registry (useful for testing).
63
- * @internal
64
- */
65
- export declare function resetI18nRegistry(): void;
7
+ /** I18n instance type for the ai-agent package. */
8
+ export type AgentI18n = I18nInstance<AgentMessageKey>;
9
+ /** Create an i18n instance for a given locale. */
10
+ export declare const createAgentI18n: (optionsLocale?: string, runtimeLocale?: string) => I18nInstance<"agent.json.rules.validJsonOnly" | "agent.json.rules.noMarkdownFences" | "agent.json.rules.noCommentary" | "agent.json.rules.doubleQuotes" | "agent.json.rules.noTrailingCommas" | "agent.json.defaultDescription" | "agent.json.systemPrompt" | "knowledge.header" | "knowledge.description" | "tool.knowledge.description" | "tool.knowledge.availableSpaces" | "tool.knowledge.spaceDefault" | "tool.knowledge.param.query" | "tool.knowledge.param.spaceKey" | "tool.knowledge.param.topK" | "tool.knowledge.noResults" | "tool.knowledge.sourceLabel" | "tool.fallbackDescription" | "tool.mcp.param.message" | "tool.mcp.param.sessionId" | "tool.mcp.agentDescription" | "tool.mcp.executePrompt" | "tool.mcp.toolDescription" | "interop.prompt.agentIdentity" | "interop.prompt.youAre" | "interop.prompt.description" | "interop.prompt.instructions" | "interop.prompt.availableTools" | "interop.prompt.toolsIntro" | "interop.prompt.parameters" | "interop.prompt.knowledgeContext" | "interop.prompt.additionalContext" | "interop.md.toc" | "interop.md.overview" | "interop.md.tools" | "interop.md.knowledge" | "interop.md.policy" | "interop.md.metaKey" | "interop.md.metaVersion" | "interop.md.metaStability" | "interop.md.metaOwners" | "interop.md.metaTags" | "interop.md.schema" | "interop.md.automationSafe" | "interop.md.required" | "interop.md.optional" | "interop.md.minConfidence" | "interop.md.escalationThreshold" | "interop.md.escalateToolFailure" | "interop.md.escalateTimeout" | "interop.md.yes" | "interop.md.no" | "error.jsonRunner.requiresModel" | "error.missingToolHandler" | "error.unknownBackend" | "error.claudeSdk.notAvailable" | "error.claudeSdk.notInstalled" | "error.opencodeSdk.notAvailable" | "error.opencodeSdk.notInstalled" | "error.providerNotInitialized" | "error.agentKeyRequired" | "error.agentMissingVersion" | "error.agentRequiresInstructions" | "error.agentRequiresTool" | "error.agentDuplicateTool" | "error.agentSpecNotFound" | "error.specNotFound" | "error.toolNotFound" | "error.noHandlerForTool" | "error.noToolHandler" | "error.unknownExportFormat" | "error.handlerNotFoundForTool" | "error.toolNotFoundOrNoHandler" | "error.toolNoExecuteHandler" | "error.provider.notRegistered" | "error.provider.depsNotInstalled" | "error.provider.sdkNotConfigured" | "error.provider.claudeSdkMissing" | "error.provider.opencodeSdkMissing" | "error.provider.sdkNotInstalled" | "error.provider.contextCreation" | "error.provider.executionFailed" | "error.provider.streamFailed" | "export.agentConfiguration" | "export.metadata" | "export.metaName" | "export.metaVersion" | "export.metaOwners" | "export.metaModel" | "export.instructions" | "export.availableTools" | "export.tools" | "export.knowledgeSources" | "export.policy" | "export.additionalContext" | "export.configuration" | "export.mcpServers" | "export.parameters" | "export.requiresApproval" | "export.notAutomationSafe" | "export.requiresApprovalMd" | "export.notAutomationSafeMd" | "export.required" | "export.optional" | "export.minConfidence" | "export.escalationConfigured" | "export.escalationPolicyConfigured" | "export.featureFlags" | "export.generatedFrom" | "export.exportedAt" | "export.agentType" | "export.noDescription" | "export.validation.requiresKey" | "export.validation.requiresInstructions" | "export.validation.requiresTool" | "export.validation.toolRequiresName" | "export.validation.toolRequiresDescOrName" | "export.validation.toolInvalidName" | "export.agentType.build" | "export.agentType.plan" | "export.agentType.general" | "export.agentType.explore" | "export.bridge.requiresApproval" | "export.bridge.askMode" | "approval.toolRequiresApproval" | "log.unifiedAgent.fallback" | "log.knowledge.spaceNotAvailable" | "log.knowledge.loadFailed" | "log.knowledge.queryFailed" | "log.mcpServer.started" | "log.mcpServer.stopped" | "error.telemetry.posthogAiRequired" | "error.telemetry.posthogClientOrKeyRequired" | "error.telemetry.posthogNodeRequired" | "error.provider.notAvailable">;
11
+ /** Create a default (English) i18n instance. */
12
+ export declare const getDefaultI18n: () => I18nInstance<"agent.json.rules.validJsonOnly" | "agent.json.rules.noMarkdownFences" | "agent.json.rules.noCommentary" | "agent.json.rules.doubleQuotes" | "agent.json.rules.noTrailingCommas" | "agent.json.defaultDescription" | "agent.json.systemPrompt" | "knowledge.header" | "knowledge.description" | "tool.knowledge.description" | "tool.knowledge.availableSpaces" | "tool.knowledge.spaceDefault" | "tool.knowledge.param.query" | "tool.knowledge.param.spaceKey" | "tool.knowledge.param.topK" | "tool.knowledge.noResults" | "tool.knowledge.sourceLabel" | "tool.fallbackDescription" | "tool.mcp.param.message" | "tool.mcp.param.sessionId" | "tool.mcp.agentDescription" | "tool.mcp.executePrompt" | "tool.mcp.toolDescription" | "interop.prompt.agentIdentity" | "interop.prompt.youAre" | "interop.prompt.description" | "interop.prompt.instructions" | "interop.prompt.availableTools" | "interop.prompt.toolsIntro" | "interop.prompt.parameters" | "interop.prompt.knowledgeContext" | "interop.prompt.additionalContext" | "interop.md.toc" | "interop.md.overview" | "interop.md.tools" | "interop.md.knowledge" | "interop.md.policy" | "interop.md.metaKey" | "interop.md.metaVersion" | "interop.md.metaStability" | "interop.md.metaOwners" | "interop.md.metaTags" | "interop.md.schema" | "interop.md.automationSafe" | "interop.md.required" | "interop.md.optional" | "interop.md.minConfidence" | "interop.md.escalationThreshold" | "interop.md.escalateToolFailure" | "interop.md.escalateTimeout" | "interop.md.yes" | "interop.md.no" | "error.jsonRunner.requiresModel" | "error.missingToolHandler" | "error.unknownBackend" | "error.claudeSdk.notAvailable" | "error.claudeSdk.notInstalled" | "error.opencodeSdk.notAvailable" | "error.opencodeSdk.notInstalled" | "error.providerNotInitialized" | "error.agentKeyRequired" | "error.agentMissingVersion" | "error.agentRequiresInstructions" | "error.agentRequiresTool" | "error.agentDuplicateTool" | "error.agentSpecNotFound" | "error.specNotFound" | "error.toolNotFound" | "error.noHandlerForTool" | "error.noToolHandler" | "error.unknownExportFormat" | "error.handlerNotFoundForTool" | "error.toolNotFoundOrNoHandler" | "error.toolNoExecuteHandler" | "error.provider.notRegistered" | "error.provider.depsNotInstalled" | "error.provider.sdkNotConfigured" | "error.provider.claudeSdkMissing" | "error.provider.opencodeSdkMissing" | "error.provider.sdkNotInstalled" | "error.provider.contextCreation" | "error.provider.executionFailed" | "error.provider.streamFailed" | "export.agentConfiguration" | "export.metadata" | "export.metaName" | "export.metaVersion" | "export.metaOwners" | "export.metaModel" | "export.instructions" | "export.availableTools" | "export.tools" | "export.knowledgeSources" | "export.policy" | "export.additionalContext" | "export.configuration" | "export.mcpServers" | "export.parameters" | "export.requiresApproval" | "export.notAutomationSafe" | "export.requiresApprovalMd" | "export.notAutomationSafeMd" | "export.required" | "export.optional" | "export.minConfidence" | "export.escalationConfigured" | "export.escalationPolicyConfigured" | "export.featureFlags" | "export.generatedFrom" | "export.exportedAt" | "export.agentType" | "export.noDescription" | "export.validation.requiresKey" | "export.validation.requiresInstructions" | "export.validation.requiresTool" | "export.validation.toolRequiresName" | "export.validation.toolRequiresDescOrName" | "export.validation.toolInvalidName" | "export.agentType.build" | "export.agentType.plan" | "export.agentType.general" | "export.agentType.explore" | "export.bridge.requiresApproval" | "export.bridge.askMode" | "approval.toolRequiresApproval" | "log.unifiedAgent.fallback" | "log.knowledge.spaceNotAvailable" | "log.knowledge.loadFailed" | "log.knowledge.queryFailed" | "log.mcpServer.started" | "log.mcpServer.stopped" | "error.telemetry.posthogAiRequired" | "error.telemetry.posthogClientOrKeyRequired" | "error.telemetry.posthogNodeRequired" | "error.provider.notAvailable">;
13
+ /** Reset the shared registry (useful for testing). @internal */
14
+ export declare const resetI18nRegistry: () => void;
@@ -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,76 +1899,47 @@ 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
  init_messages();
1934
1945