@contractspec/lib.support-bot 3.7.5 → 3.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +62 -36
  2. package/dist/bot/auto-responder.d.ts +1 -1
  3. package/dist/bot/auto-responder.js +101 -101
  4. package/dist/bot/feedback-loop.js +101 -101
  5. package/dist/bot/index.js +101 -101
  6. package/dist/bot/tools.d.ts +1 -1
  7. package/dist/browser/bot/auto-responder.js +101 -101
  8. package/dist/browser/bot/feedback-loop.js +101 -101
  9. package/dist/browser/bot/index.js +101 -101
  10. package/dist/browser/i18n/catalogs/index.js +80 -80
  11. package/dist/browser/i18n/index.js +101 -101
  12. package/dist/browser/i18n/locale.js +2 -2
  13. package/dist/browser/i18n/messages.js +80 -80
  14. package/dist/browser/index.js +132 -132
  15. package/dist/browser/rag/index.js +101 -101
  16. package/dist/browser/rag/ticket-resolver.js +101 -101
  17. package/dist/browser/tickets/classifier.js +101 -101
  18. package/dist/browser/tickets/index.js +101 -101
  19. package/dist/i18n/catalogs/index.d.ts +1 -1
  20. package/dist/i18n/catalogs/index.js +80 -80
  21. package/dist/i18n/index.d.ts +7 -7
  22. package/dist/i18n/index.js +101 -101
  23. package/dist/i18n/locale.d.ts +1 -1
  24. package/dist/i18n/locale.js +2 -2
  25. package/dist/i18n/messages.js +80 -80
  26. package/dist/index.d.ts +3 -3
  27. package/dist/index.js +132 -132
  28. package/dist/node/bot/auto-responder.js +101 -101
  29. package/dist/node/bot/feedback-loop.js +101 -101
  30. package/dist/node/bot/index.js +101 -101
  31. package/dist/node/i18n/catalogs/index.js +80 -80
  32. package/dist/node/i18n/index.js +101 -101
  33. package/dist/node/i18n/locale.js +2 -2
  34. package/dist/node/i18n/messages.js +80 -80
  35. package/dist/node/index.js +132 -132
  36. package/dist/node/rag/index.js +101 -101
  37. package/dist/node/rag/ticket-resolver.js +101 -101
  38. package/dist/node/tickets/classifier.js +101 -101
  39. package/dist/node/tickets/index.js +101 -101
  40. package/dist/rag/index.js +101 -101
  41. package/dist/rag/ticket-resolver.js +101 -101
  42. package/dist/tickets/classifier.js +101 -101
  43. package/dist/tickets/index.js +101 -101
  44. package/package.json +10 -10
@@ -187,38 +187,38 @@ Respond to the customer.`,
187
187
  }
188
188
  });
189
189
 
190
- // src/i18n/catalogs/fr.ts
190
+ // src/i18n/catalogs/es.ts
191
191
  import { defineTranslation as defineTranslation2 } from "@contractspec/lib.contracts-spec/translations";
192
- var frMessages = defineTranslation2({
192
+ var esMessages = defineTranslation2({
193
193
  meta: {
194
194
  key: "support-bot.messages",
195
195
  version: "1.0.0",
196
196
  domain: "support-bot",
197
- description: "French translations for the support-bot package",
197
+ description: "Spanish translations for the support-bot package",
198
198
  owners: ["platform"],
199
199
  stability: "experimental"
200
200
  },
201
- locale: "fr",
201
+ locale: "es",
202
202
  fallback: "en",
203
203
  messages: {
204
204
  "prompt.classifier.system": {
205
- value: "Classifiez le ticket de support.",
205
+ value: "Clasifica el ticket de soporte.",
206
206
  description: "Classifier LLM system prompt"
207
207
  },
208
208
  "prompt.autoResponder.system": {
209
- value: "Rédigez des réponses de support empathiques et précises en citant les sources lorsque c’est pertinent.",
209
+ value: "Redacta respuestas de soporte empáticas y precisas citando fuentes cuando sea relevante.",
210
210
  description: "Auto-responder LLM system prompt"
211
211
  },
212
212
  "prompt.autoResponder.user": {
213
213
  value: `Ticket #{ticketId} ({category}, {priority}, {sentiment})
214
- Sujet : {subject}
214
+ Asunto: {subject}
215
215
 
216
216
  {body}
217
217
 
218
- Connaissances :
218
+ Conocimientos:
219
219
  {knowledge}
220
220
 
221
- Répondez au client.`,
221
+ Responde al cliente.`,
222
222
  description: "Auto-responder user prompt template",
223
223
  placeholders: [
224
224
  { name: "ticketId", type: "string" },
@@ -231,94 +231,94 @@ Répondez au client.`,
231
231
  ]
232
232
  },
233
233
  "responder.closing.friendly": {
234
- value: "Nous restons à votre disposition si vous avez besoin de quoi que ce soit.",
234
+ value: "Quedamos a su disposición si necesita cualquier otra cosa.",
235
235
  description: "Friendly closing line for support responses"
236
236
  },
237
237
  "responder.closing.formal": {
238
- value: "Veuillez nous contacter si vous avez besoin d’une assistance supplémentaire.",
238
+ value: "No dude en contactarnos si requiere asistencia adicional.",
239
239
  description: "Formal closing line for support responses"
240
240
  },
241
241
  "responder.greeting.named": {
242
- value: "Bonjour {name},",
242
+ value: "Hola {name},",
243
243
  description: "Greeting with customer name",
244
244
  placeholders: [{ name: "name", type: "string" }]
245
245
  },
246
246
  "responder.greeting.anonymous": {
247
- value: "Bonjour,",
247
+ value: "Hola,",
248
248
  description: "Greeting without customer name"
249
249
  },
250
250
  "responder.intro.thanks": {
251
- value: "Merci de nous avoir contactés au sujet de « {subject} ».",
251
+ value: "Gracias por contactarnos sobre «{subject}».",
252
252
  description: "Thank-you intro referencing the ticket subject",
253
253
  placeholders: [{ name: "subject", type: "string" }]
254
254
  },
255
255
  "responder.signature": {
256
- value: "— Support ContractSpec",
256
+ value: "— Soporte ContractSpec",
257
257
  description: "Email / response signature"
258
258
  },
259
259
  "responder.references.header": {
260
- value: "Références :",
260
+ value: "Referencias:",
261
261
  description: "Header for the references section"
262
262
  },
263
263
  "responder.references.sourceLabel": {
264
- value: "Source {index}",
264
+ value: "Fuente {index}",
265
265
  description: "Label for a numbered source reference",
266
266
  placeholders: [{ name: "index", type: "number" }]
267
267
  },
268
268
  "responder.category.billing": {
269
- value: "Je comprends que les problèmes de facturation peuvent être stressants, laissez-moi clarifier la situation.",
269
+ value: "Entiendo que los problemas de facturación pueden ser estresantes, permítame aclarar la situación.",
270
270
  description: "Category intro for billing tickets"
271
271
  },
272
272
  "responder.category.technical": {
273
- value: "Je vois que vous avez rencontré un problème technique. Voici ce qui s’est passé et comment le résoudre.",
273
+ value: "Veo que encontró un problema técnico. Esto es lo que sucedió y cómo solucionarlo.",
274
274
  description: "Category intro for technical tickets"
275
275
  },
276
276
  "responder.category.product": {
277
- value: "Merci d’avoir partagé vos retours sur le produit. Voici les prochaines étapes.",
277
+ value: "Gracias por compartir sus comentarios sobre el producto. Estos son los próximos pasos.",
278
278
  description: "Category intro for product tickets"
279
279
  },
280
280
  "responder.category.account": {
281
- value: "L’accès au compte est essentiel, laissez-moi vous guider vers la résolution.",
281
+ value: "El acceso a la cuenta es fundamental, permítame guiarle hacia la resolución.",
282
282
  description: "Category intro for account tickets"
283
283
  },
284
284
  "responder.category.compliance": {
285
- value: "Les questions de conformité exigent de la précision. Consultez la réponse conforme aux politiques ci-dessous.",
285
+ value: "Las preguntas de cumplimiento requieren precisión. Consulte la respuesta alineada con las políticas a continuación.",
286
286
  description: "Category intro for compliance tickets"
287
287
  },
288
288
  "responder.category.other": {
289
- value: "Voici ce que nous avons trouvé après examen de votre demande.",
289
+ value: "Esto es lo que encontramos tras revisar su solicitud.",
290
290
  description: "Category intro for uncategorized tickets"
291
291
  },
292
292
  "responder.subject.replyPrefix": {
293
- value: "Re : {subject}",
293
+ value: "Re: {subject}",
294
294
  description: "Reply subject line prefix",
295
295
  placeholders: [{ name: "subject", type: "string" }]
296
296
  },
297
297
  "resolver.question.subjectLabel": {
298
- value: "Sujet : {subject}",
298
+ value: "Asunto: {subject}",
299
299
  description: "Subject label in resolver question context",
300
300
  placeholders: [{ name: "subject", type: "string" }]
301
301
  },
302
302
  "resolver.question.channelLabel": {
303
- value: "Canal : {channel}",
303
+ value: "Canal: {channel}",
304
304
  description: "Channel label in resolver question context",
305
305
  placeholders: [{ name: "channel", type: "string" }]
306
306
  },
307
307
  "resolver.question.customerLabel": {
308
- value: "Client : {name}",
308
+ value: "Cliente: {name}",
309
309
  description: "Customer label in resolver question context",
310
310
  placeholders: [{ name: "name", type: "string" }]
311
311
  },
312
312
  "resolver.action.escalate": {
313
- value: "Escalader pour révision humaine",
313
+ value: "Escalar para revisión humana",
314
314
  description: "Action label for escalation"
315
315
  },
316
316
  "resolver.action.respond": {
317
- value: "Envoyer une réponse automatique",
317
+ value: "Enviar respuesta automática",
318
318
  description: "Action label for automated response"
319
319
  },
320
320
  "resolver.escalation.insufficientConfidence": {
321
- value: "Confiance insuffisante ou références de connaissances manquantes",
321
+ value: "Confianza insuficiente o referencias de conocimiento faltantes",
322
322
  description: "Escalation reason when confidence is too low"
323
323
  },
324
324
  "tool.classify.title": {
@@ -326,7 +326,7 @@ Répondez au client.`,
326
326
  description: "MCP tool title for ticket classification"
327
327
  },
328
328
  "tool.classify.description": {
329
- value: "Classifier un ticket par priorité, sentiment et catégorie",
329
+ value: "Clasificar un ticket por prioridad, sentimiento y categoría",
330
330
  description: "MCP tool description for ticket classification"
331
331
  },
332
332
  "tool.resolve.title": {
@@ -334,7 +334,7 @@ Répondez au client.`,
334
334
  description: "MCP tool title for ticket resolution"
335
335
  },
336
336
  "tool.resolve.description": {
337
- value: "Générer une résolution fondée sur la base de connaissances pour un ticket",
337
+ value: "Generar una resolución basada en conocimientos para un ticket",
338
338
  description: "MCP tool description for ticket resolution"
339
339
  },
340
340
  "tool.draft.title": {
@@ -342,72 +342,72 @@ Répondez au client.`,
342
342
  description: "MCP tool title for response drafting"
343
343
  },
344
344
  "tool.draft.description": {
345
- value: "Rédiger une réponse client basée sur la résolution et la classification",
345
+ value: "Redactar una respuesta al cliente basada en la resolución y la clasificación",
346
346
  description: "MCP tool description for response drafting"
347
347
  },
348
348
  "error.inputMustIncludeTicket": {
349
- value: "L’entrée doit inclure un ticket",
349
+ value: "La entrada debe incluir un ticket",
350
350
  description: "Error when input payload is missing the ticket field"
351
351
  },
352
352
  "error.ticketMissingId": {
353
- value: "Le ticket n’a pas d’identifiant",
353
+ value: "El ticket no tiene identificador",
354
354
  description: "Error when ticket object lacks an id"
355
355
  },
356
356
  "error.resolutionClassificationRequired": {
357
- value: "la résolution et la classification sont requises",
357
+ value: "la resolución y la clasificación son obligatorias",
358
358
  description: "Error when draft endpoint is called without resolution and classification"
359
359
  },
360
360
  "feedback.noRecords": {
361
- value: "Aucun retour enregistré pour le moment.",
361
+ value: "No hay comentarios registrados aún.",
362
362
  description: "Placeholder when no feedback entries exist"
363
363
  },
364
364
  "feedback.status.escalated": {
365
- value: "Escaladé",
365
+ value: "Escalado",
366
366
  description: "Status label for escalated tickets"
367
367
  },
368
368
  "feedback.status.autoResolved": {
369
- value: "Résolu automatiquement",
369
+ value: "Resuelto automáticamente",
370
370
  description: "Status label for auto-resolved tickets"
371
371
  },
372
372
  "spec.instructionsAppendix": {
373
- value: "Citez toujours les sources de connaissances du support et signalez les problèmes de conformité/facturation pour révision humaine en cas de doute.",
373
+ value: "Cite siempre las fuentes de conocimiento de soporte y señale los problemas de cumplimiento/facturación para revisión humana en caso de duda.",
374
374
  description: "Instructions appendix appended to agent spec"
375
375
  }
376
376
  }
377
377
  });
378
378
 
379
- // src/i18n/catalogs/es.ts
379
+ // src/i18n/catalogs/fr.ts
380
380
  import { defineTranslation as defineTranslation3 } from "@contractspec/lib.contracts-spec/translations";
381
- var esMessages = defineTranslation3({
381
+ var frMessages = defineTranslation3({
382
382
  meta: {
383
383
  key: "support-bot.messages",
384
384
  version: "1.0.0",
385
385
  domain: "support-bot",
386
- description: "Spanish translations for the support-bot package",
386
+ description: "French translations for the support-bot package",
387
387
  owners: ["platform"],
388
388
  stability: "experimental"
389
389
  },
390
- locale: "es",
390
+ locale: "fr",
391
391
  fallback: "en",
392
392
  messages: {
393
393
  "prompt.classifier.system": {
394
- value: "Clasifica el ticket de soporte.",
394
+ value: "Classifiez le ticket de support.",
395
395
  description: "Classifier LLM system prompt"
396
396
  },
397
397
  "prompt.autoResponder.system": {
398
- value: "Redacta respuestas de soporte empáticas y precisas citando fuentes cuando sea relevante.",
398
+ value: "Rédigez des réponses de support empathiques et précises en citant les sources lorsque c’est pertinent.",
399
399
  description: "Auto-responder LLM system prompt"
400
400
  },
401
401
  "prompt.autoResponder.user": {
402
402
  value: `Ticket #{ticketId} ({category}, {priority}, {sentiment})
403
- Asunto: {subject}
403
+ Sujet : {subject}
404
404
 
405
405
  {body}
406
406
 
407
- Conocimientos:
407
+ Connaissances :
408
408
  {knowledge}
409
409
 
410
- Responde al cliente.`,
410
+ Répondez au client.`,
411
411
  description: "Auto-responder user prompt template",
412
412
  placeholders: [
413
413
  { name: "ticketId", type: "string" },
@@ -420,94 +420,94 @@ Responde al cliente.`,
420
420
  ]
421
421
  },
422
422
  "responder.closing.friendly": {
423
- value: "Quedamos a su disposición si necesita cualquier otra cosa.",
423
+ value: "Nous restons à votre disposition si vous avez besoin de quoi que ce soit.",
424
424
  description: "Friendly closing line for support responses"
425
425
  },
426
426
  "responder.closing.formal": {
427
- value: "No dude en contactarnos si requiere asistencia adicional.",
427
+ value: "Veuillez nous contacter si vous avez besoin d’une assistance supplémentaire.",
428
428
  description: "Formal closing line for support responses"
429
429
  },
430
430
  "responder.greeting.named": {
431
- value: "Hola {name},",
431
+ value: "Bonjour {name},",
432
432
  description: "Greeting with customer name",
433
433
  placeholders: [{ name: "name", type: "string" }]
434
434
  },
435
435
  "responder.greeting.anonymous": {
436
- value: "Hola,",
436
+ value: "Bonjour,",
437
437
  description: "Greeting without customer name"
438
438
  },
439
439
  "responder.intro.thanks": {
440
- value: "Gracias por contactarnos sobre «{subject}».",
440
+ value: "Merci de nous avoir contactés au sujet de « {subject} ».",
441
441
  description: "Thank-you intro referencing the ticket subject",
442
442
  placeholders: [{ name: "subject", type: "string" }]
443
443
  },
444
444
  "responder.signature": {
445
- value: "— Soporte ContractSpec",
445
+ value: "— Support ContractSpec",
446
446
  description: "Email / response signature"
447
447
  },
448
448
  "responder.references.header": {
449
- value: "Referencias:",
449
+ value: "Références :",
450
450
  description: "Header for the references section"
451
451
  },
452
452
  "responder.references.sourceLabel": {
453
- value: "Fuente {index}",
453
+ value: "Source {index}",
454
454
  description: "Label for a numbered source reference",
455
455
  placeholders: [{ name: "index", type: "number" }]
456
456
  },
457
457
  "responder.category.billing": {
458
- value: "Entiendo que los problemas de facturación pueden ser estresantes, permítame aclarar la situación.",
458
+ value: "Je comprends que les problèmes de facturation peuvent être stressants, laissez-moi clarifier la situation.",
459
459
  description: "Category intro for billing tickets"
460
460
  },
461
461
  "responder.category.technical": {
462
- value: "Veo que encontró un problema técnico. Esto es lo que sucedió y cómo solucionarlo.",
462
+ value: "Je vois que vous avez rencontré un problème technique. Voici ce qui s’est passé et comment le résoudre.",
463
463
  description: "Category intro for technical tickets"
464
464
  },
465
465
  "responder.category.product": {
466
- value: "Gracias por compartir sus comentarios sobre el producto. Estos son los próximos pasos.",
466
+ value: "Merci d’avoir partagé vos retours sur le produit. Voici les prochaines étapes.",
467
467
  description: "Category intro for product tickets"
468
468
  },
469
469
  "responder.category.account": {
470
- value: "El acceso a la cuenta es fundamental, permítame guiarle hacia la resolución.",
470
+ value: "L’accès au compte est essentiel, laissez-moi vous guider vers la résolution.",
471
471
  description: "Category intro for account tickets"
472
472
  },
473
473
  "responder.category.compliance": {
474
- value: "Las preguntas de cumplimiento requieren precisión. Consulte la respuesta alineada con las políticas a continuación.",
474
+ value: "Les questions de conformité exigent de la précision. Consultez la réponse conforme aux politiques ci-dessous.",
475
475
  description: "Category intro for compliance tickets"
476
476
  },
477
477
  "responder.category.other": {
478
- value: "Esto es lo que encontramos tras revisar su solicitud.",
478
+ value: "Voici ce que nous avons trouvé après examen de votre demande.",
479
479
  description: "Category intro for uncategorized tickets"
480
480
  },
481
481
  "responder.subject.replyPrefix": {
482
- value: "Re: {subject}",
482
+ value: "Re : {subject}",
483
483
  description: "Reply subject line prefix",
484
484
  placeholders: [{ name: "subject", type: "string" }]
485
485
  },
486
486
  "resolver.question.subjectLabel": {
487
- value: "Asunto: {subject}",
487
+ value: "Sujet : {subject}",
488
488
  description: "Subject label in resolver question context",
489
489
  placeholders: [{ name: "subject", type: "string" }]
490
490
  },
491
491
  "resolver.question.channelLabel": {
492
- value: "Canal: {channel}",
492
+ value: "Canal : {channel}",
493
493
  description: "Channel label in resolver question context",
494
494
  placeholders: [{ name: "channel", type: "string" }]
495
495
  },
496
496
  "resolver.question.customerLabel": {
497
- value: "Cliente: {name}",
497
+ value: "Client : {name}",
498
498
  description: "Customer label in resolver question context",
499
499
  placeholders: [{ name: "name", type: "string" }]
500
500
  },
501
501
  "resolver.action.escalate": {
502
- value: "Escalar para revisión humana",
502
+ value: "Escalader pour révision humaine",
503
503
  description: "Action label for escalation"
504
504
  },
505
505
  "resolver.action.respond": {
506
- value: "Enviar respuesta automática",
506
+ value: "Envoyer une réponse automatique",
507
507
  description: "Action label for automated response"
508
508
  },
509
509
  "resolver.escalation.insufficientConfidence": {
510
- value: "Confianza insuficiente o referencias de conocimiento faltantes",
510
+ value: "Confiance insuffisante ou références de connaissances manquantes",
511
511
  description: "Escalation reason when confidence is too low"
512
512
  },
513
513
  "tool.classify.title": {
@@ -515,7 +515,7 @@ Responde al cliente.`,
515
515
  description: "MCP tool title for ticket classification"
516
516
  },
517
517
  "tool.classify.description": {
518
- value: "Clasificar un ticket por prioridad, sentimiento y categoría",
518
+ value: "Classifier un ticket par priorité, sentiment et catégorie",
519
519
  description: "MCP tool description for ticket classification"
520
520
  },
521
521
  "tool.resolve.title": {
@@ -523,7 +523,7 @@ Responde al cliente.`,
523
523
  description: "MCP tool title for ticket resolution"
524
524
  },
525
525
  "tool.resolve.description": {
526
- value: "Generar una resolución basada en conocimientos para un ticket",
526
+ value: "Générer une résolution fondée sur la base de connaissances pour un ticket",
527
527
  description: "MCP tool description for ticket resolution"
528
528
  },
529
529
  "tool.draft.title": {
@@ -531,61 +531,40 @@ Responde al cliente.`,
531
531
  description: "MCP tool title for response drafting"
532
532
  },
533
533
  "tool.draft.description": {
534
- value: "Redactar una respuesta al cliente basada en la resolución y la clasificación",
534
+ value: "Rédiger une réponse client basée sur la résolution et la classification",
535
535
  description: "MCP tool description for response drafting"
536
536
  },
537
537
  "error.inputMustIncludeTicket": {
538
- value: "La entrada debe incluir un ticket",
538
+ value: "L’entrée doit inclure un ticket",
539
539
  description: "Error when input payload is missing the ticket field"
540
540
  },
541
541
  "error.ticketMissingId": {
542
- value: "El ticket no tiene identificador",
542
+ value: "Le ticket n’a pas d’identifiant",
543
543
  description: "Error when ticket object lacks an id"
544
544
  },
545
545
  "error.resolutionClassificationRequired": {
546
- value: "la resolución y la clasificación son obligatorias",
546
+ value: "la résolution et la classification sont requises",
547
547
  description: "Error when draft endpoint is called without resolution and classification"
548
548
  },
549
549
  "feedback.noRecords": {
550
- value: "No hay comentarios registrados aún.",
550
+ value: "Aucun retour enregistré pour le moment.",
551
551
  description: "Placeholder when no feedback entries exist"
552
552
  },
553
553
  "feedback.status.escalated": {
554
- value: "Escalado",
554
+ value: "Escaladé",
555
555
  description: "Status label for escalated tickets"
556
556
  },
557
557
  "feedback.status.autoResolved": {
558
- value: "Resuelto automáticamente",
558
+ value: "Résolu automatiquement",
559
559
  description: "Status label for auto-resolved tickets"
560
560
  },
561
561
  "spec.instructionsAppendix": {
562
- value: "Cite siempre las fuentes de conocimiento de soporte y señale los problemas de cumplimiento/facturación para revisión humana en caso de duda.",
562
+ value: "Citez toujours les sources de connaissances du support et signalez les problèmes de conformité/facturation pour révision humaine en cas de doute.",
563
563
  description: "Instructions appendix appended to agent spec"
564
564
  }
565
565
  }
566
566
  });
567
567
 
568
- // src/i18n/messages.ts
569
- import {
570
- createI18nFactory
571
- } from "@contractspec/lib.contracts-spec/translations";
572
- import { interpolate } from "@contractspec/lib.contracts-spec/translations";
573
- var factory = createI18nFactory({
574
- specKey: "support-bot.messages",
575
- catalogs: [enMessages, frMessages, esMessages]
576
- });
577
- var createSupportBotI18n = factory.create;
578
- var getDefaultI18n = factory.getDefault;
579
- var resetI18nRegistry = factory.resetRegistry;
580
-
581
- // src/i18n/locale.ts
582
- import {
583
- DEFAULT_LOCALE,
584
- SUPPORTED_LOCALES,
585
- resolveLocale,
586
- isSupportedLocale
587
- } from "@contractspec/lib.contracts-spec/translations";
588
-
589
568
  // src/i18n/keys.ts
590
569
  var PROMPT_KEYS = {
591
570
  "prompt.classifier.system": "prompt.classifier.system",
@@ -647,6 +626,27 @@ var I18N_KEYS = {
647
626
  ...FEEDBACK_KEYS,
648
627
  ...SPEC_KEYS
649
628
  };
629
+
630
+ // src/i18n/locale.ts
631
+ import {
632
+ DEFAULT_LOCALE,
633
+ isSupportedLocale,
634
+ resolveLocale,
635
+ SUPPORTED_LOCALES
636
+ } from "@contractspec/lib.contracts-spec/translations";
637
+
638
+ // src/i18n/messages.ts
639
+ import {
640
+ createI18nFactory
641
+ } from "@contractspec/lib.contracts-spec/translations";
642
+ import { interpolate } from "@contractspec/lib.contracts-spec/translations";
643
+ var factory = createI18nFactory({
644
+ specKey: "support-bot.messages",
645
+ catalogs: [enMessages, frMessages, esMessages]
646
+ });
647
+ var createSupportBotI18n = factory.create;
648
+ var getDefaultI18n = factory.getDefault;
649
+ var resetI18nRegistry = factory.resetRegistry;
650
650
  // src/bot/feedback-loop.ts
651
651
  class SupportFeedbackLoop {
652
652
  history = [];