@iblai/iblai-js 1.25.2 → 1.25.3

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.
@@ -98332,11 +98332,16 @@ var clawSandboxAgentConfigPrompts$3 = {
98332
98332
  updateSuccess: "{label} updated successfully",
98333
98333
  updateError: "Failed to update {label}",
98334
98334
  moreInfoAriaLabel: "More info about {label}",
98335
- edit: "Edit"
98335
+ edit: "Edit",
98336
+ connectSandboxPrompt: "Connect a sandbox instance in the Sandbox tab to manage agent prompts.",
98337
+ enableSandboxPrompt: "Enable the dedicated sandbox on the Sandbox tab and connect it to an instance to manage agent prompts.",
98338
+ sandboxTabLabel: "Sandbox tab"
98336
98339
  };
98337
98340
  var clawSandboxAgentSkills$3 = {
98338
98341
  loadingSkills: "Loading skills...",
98339
98342
  connectSandboxPrompt: "Connect a sandbox instance in the Sandbox tab to manage skills.",
98343
+ enableSandboxPrompt: "Enable the dedicated sandbox on the Sandbox tab and connect it to an instance to manage skills.",
98344
+ sandboxTabLabel: "Sandbox tab",
98340
98345
  newSkill: "New Skill",
98341
98346
  noSkillsAvailable: "No skills available for this platform. Create one to get started.",
98342
98347
  moreInfoAbout: "More info about {name}",
@@ -99855,6 +99860,11 @@ var privacyTabLabels$3 = {
99855
99860
  title: "Privacy",
99856
99861
  description: "Detect and filter personally identifiable information from chat messages."
99857
99862
  },
99863
+ capability: {
99864
+ title: "PII filtering",
99865
+ description: "Automatically find and hide personal information — names, emails, phone numbers and more — in messages before the agent sees them. When on, choose what to detect and how to handle it below.",
99866
+ offHint: "Turn it on to detect and hide personal information in messages."
99867
+ },
99858
99868
  fields: {
99859
99869
  enableRouter: {
99860
99870
  label: "Enable Privacy Router",
@@ -99866,12 +99876,14 @@ var privacyTabLabels$3 = {
99866
99876
  options: {
99867
99877
  redact: "Redact",
99868
99878
  mask: "Mask",
99869
- block: "Block"
99879
+ block: "Block",
99880
+ allow: "Allow"
99870
99881
  },
99871
99882
  descriptions: {
99872
99883
  redact: "PII is replaced with its type — e.g. \"Email [EMAIL_ADDRESS]\".",
99873
99884
  mask: "PII is hidden behind asterisks — e.g. \"Email ***********\".",
99874
- block: "The message is rejected and your block message is shown to the user."
99885
+ block: "The message is rejected and your block message is shown to the user.",
99886
+ allow: "PII is detected but left untouched — the message passes through unchanged. Use this to monitor or audit personal information without altering messages."
99875
99887
  }
99876
99888
  },
99877
99889
  blockMessage: {
@@ -100561,6 +100573,11 @@ var screenshareTabLabels$3 = {
100561
100573
  title: "Screen Share",
100562
100574
  description: "How your agent behaves when a user shares their screen during a voice call."
100563
100575
  },
100576
+ capability: {
100577
+ title: "Screen sharing",
100578
+ description: "Let people share their screen during a voice call so the agent can see what they're doing and guide them step by step. When on, set the screen-sharing prompts below.",
100579
+ offHint: "Turn it on to let people share their screen during a call and edit these prompts."
100580
+ },
100564
100581
  disabledHint: "Screen sharing is currently turned off for this agent. These prompts will be saved but only take effect once it’s turned on.",
100565
100582
  fields: {
100566
100583
  systemPrompt: {
@@ -101327,7 +101344,8 @@ var tabsVoiceTab$3 = {
101327
101344
  var tasksTabLabels$3 = {
101328
101345
  header: {
101329
101346
  title: "Tasks",
101330
- description: "Configure automated tasks for your agent."
101347
+ description: "Configure automated tasks for your agent.",
101348
+ infoBox: "Let your agent work on its own schedule. Set up recurring tasks it runs automatically — like daily summaries or reminders — without anyone having to ask."
101331
101349
  },
101332
101350
  toolbar: {
101333
101351
  searchPlaceholder: "Search all tasks...",
@@ -101469,11 +101487,54 @@ var voiceTabCallConfigSection$3 = {
101469
101487
  refreshingAriaLabel: "Refreshing",
101470
101488
  moreInfoAbout: "More info about {label}"
101471
101489
  };
101490
+ var analyticsTabLabels$3 = {
101491
+ header: {
101492
+ title: "Analytics",
101493
+ description: "Usage reports and insights for this agent."
101494
+ },
101495
+ infoBox: "See how this agent is being used — who's chatting with it, what they talk about, what it costs, and more. Pick a report below to dive in.",
101496
+ openAria: "Open {label}",
101497
+ tabs: {
101498
+ overview: {
101499
+ label: "Overview",
101500
+ description: "A high-level snapshot of usage and engagement over time."
101501
+ },
101502
+ users: {
101503
+ label: "Users",
101504
+ description: "See who's chatting with this agent and how active they are."
101505
+ },
101506
+ topics: {
101507
+ label: "Topics",
101508
+ description: "The subjects people bring up most across conversations."
101509
+ },
101510
+ transcripts: {
101511
+ label: "Transcripts",
101512
+ description: "Read full conversation transcripts message by message."
101513
+ },
101514
+ financial: {
101515
+ label: "Costs",
101516
+ description: "Track token usage and what this agent is costing you."
101517
+ },
101518
+ audit: {
101519
+ label: "Audit",
101520
+ description: "Review the log of changes and activity for this agent."
101521
+ },
101522
+ reports: {
101523
+ label: "Data Reports",
101524
+ description: "Generate and download detailed reports to share or archive."
101525
+ }
101526
+ }
101527
+ };
101472
101528
  var voiceTabLabels$3 = {
101473
101529
  header: {
101474
101530
  title: "Voice",
101475
101531
  description: "Choose the voice your agent uses and how voice calls work."
101476
101532
  },
101533
+ capability: {
101534
+ title: "Voice calls",
101535
+ description: "Let people talk to this agent out loud and hear it reply, like a phone call. When on, pick the voice and fine-tune how calls behave below.",
101536
+ offHint: "Turn it on to let people start voice conversations with this agent."
101537
+ },
101477
101538
  subTabs: {
101478
101539
  voice: "Voice",
101479
101540
  callConfig: "Voice call"
@@ -101721,6 +101782,13 @@ var ltiTabLabels$3 = {
101721
101782
  title: "LTI",
101722
101783
  description: "Manage LTI agent links, signing keys, tools, and platform endpoints."
101723
101784
  },
101785
+ capability: {
101786
+ title: "LTI launches",
101787
+ description: "Let this agent be added to a Learning Management System (Canvas, Brightspace, Blackboard or Moodle) so students can open it right inside their course. When on, create the links, signing keys, and tools your LMS needs below.",
101788
+ offHint: "Turn it on to let this agent be embedded in an LMS and set up its links and keys.",
101789
+ toggleSuccess: "LTI setting updated",
101790
+ toggleError: "Couldn't update LTI setting"
101791
+ },
101724
101792
  subTabs: {
101725
101793
  agentLinks: "Links",
101726
101794
  keys: "Keys",
@@ -102124,6 +102192,7 @@ var en = {
102124
102192
  userProfileDropdownIndex: userProfileDropdownIndex$3,
102125
102193
  version: version$6,
102126
102194
  voiceTabCallConfigSection: voiceTabCallConfigSection$3,
102195
+ analyticsTabLabels: analyticsTabLabels$3,
102127
102196
  voiceTabLabels: voiceTabLabels$3,
102128
102197
  voiceTabVoicePicker: voiceTabVoicePicker$3,
102129
102198
  welcomeChatConversationStarters: welcomeChatConversationStarters$3,
@@ -103642,11 +103711,16 @@ var clawSandboxAgentConfigPrompts$2 = {
103642
103711
  updateSuccess: "{label} mis à jour avec succès",
103643
103712
  updateError: "Échec de la mise à jour de {label}",
103644
103713
  moreInfoAriaLabel: "Plus d'informations sur {label}",
103645
- edit: "Modifier"
103714
+ edit: "Modifier",
103715
+ connectSandboxPrompt: "Connectez une instance de sandbox dans l'onglet Sandbox pour gérer les invites de l'agent.",
103716
+ enableSandboxPrompt: "Activez le bac à sable dédié dans l'onglet Sandbox et connectez-le à une instance pour gérer les invites de l'agent.",
103717
+ sandboxTabLabel: "onglet Sandbox"
103646
103718
  };
103647
103719
  var clawSandboxAgentSkills$2 = {
103648
103720
  loadingSkills: "Chargement des compétences...",
103649
103721
  connectSandboxPrompt: "Connectez une instance sandbox dans l'onglet Sandbox pour gérer les compétences.",
103722
+ enableSandboxPrompt: "Activez le bac à sable dédié dans l'onglet Sandbox et connectez-le à une instance pour gérer les compétences.",
103723
+ sandboxTabLabel: "onglet Sandbox",
103650
103724
  newSkill: "Nouvelle compétence",
103651
103725
  noSkillsAvailable: "Aucune compétence disponible pour cette plateforme. Créez-en une pour commencer.",
103652
103726
  moreInfoAbout: "Plus d'informations sur {name}",
@@ -105165,6 +105239,11 @@ var privacyTabLabels$2 = {
105165
105239
  title: "Confidentialité",
105166
105240
  description: "Détectez et filtrez les informations personnellement identifiables des messages de chat."
105167
105241
  },
105242
+ capability: {
105243
+ title: "Filtrage des données personnelles",
105244
+ description: "Détectez et masquez automatiquement les informations personnelles — noms, e-mails, numéros de téléphone et plus — dans les messages avant que l'agent ne les voie. Une fois activé, choisissez ci-dessous ce qu'il faut détecter et comment le traiter.",
105245
+ offHint: "Activez-le pour détecter et masquer les informations personnelles dans les messages."
105246
+ },
105168
105247
  fields: {
105169
105248
  enableRouter: {
105170
105249
  label: "Activer le routeur de confidentialité",
@@ -105176,12 +105255,14 @@ var privacyTabLabels$2 = {
105176
105255
  options: {
105177
105256
  redact: "Masquer",
105178
105257
  mask: "Flouter",
105179
- block: "Bloquer"
105258
+ block: "Bloquer",
105259
+ allow: "Autoriser"
105180
105260
  },
105181
105261
  descriptions: {
105182
105262
  redact: "Les PII sont remplacées par leur type — ex. \"Email [EMAIL_ADDRESS]\".",
105183
105263
  mask: "Les PII sont masquées par des astérisques — ex. \"Email ***********\".",
105184
- block: "Le message est rejeté et votre message de blocage est affiché à l'utilisateur."
105264
+ block: "Le message est rejeté et votre message de blocage est affiché à l'utilisateur.",
105265
+ allow: "Les PII sont détectées mais laissées intactes — le message passe sans modification. Utilisez cette option pour surveiller ou auditer les informations personnelles sans altérer les messages."
105185
105266
  }
105186
105267
  },
105187
105268
  blockMessage: {
@@ -105871,6 +105952,11 @@ var screenshareTabLabels$2 = {
105871
105952
  title: "Partage d’écran",
105872
105953
  description: "Comment votre agent se comporte lorsqu’un utilisateur partage son écran pendant un appel vocal."
105873
105954
  },
105955
+ capability: {
105956
+ title: "Partage d’écran",
105957
+ description: "Permettez aux utilisateurs de partager leur écran pendant un appel vocal afin que l'agent voie ce qu'ils font et les guide étape par étape. Une fois activé, définissez les invites de partage d'écran ci-dessous.",
105958
+ offHint: "Activez-le pour permettre le partage d'écran pendant un appel et modifier ces invites."
105959
+ },
105874
105960
  disabledHint: "Le partage d’écran est actuellement désactivé pour cet agent. Ces invites seront enregistrées mais ne prendront effet qu’une fois activé.",
105875
105961
  fields: {
105876
105962
  systemPrompt: {
@@ -106637,7 +106723,8 @@ var tabsVoiceTab$2 = {
106637
106723
  var tasksTabLabels$2 = {
106638
106724
  header: {
106639
106725
  title: "Tâches",
106640
- description: "Configurez les tâches automatisées pour votre agent."
106726
+ description: "Configurez les tâches automatisées pour votre agent.",
106727
+ infoBox: "Laissez votre agent travailler selon son propre calendrier. Configurez des tâches récurrentes qu'il exécute automatiquement — comme des résumés quotidiens ou des rappels — sans que personne ait à le demander."
106641
106728
  },
106642
106729
  toolbar: {
106643
106730
  searchPlaceholder: "Rechercher toutes les tâches...",
@@ -106779,11 +106866,54 @@ var voiceTabCallConfigSection$2 = {
106779
106866
  refreshingAriaLabel: "Actualisation en cours",
106780
106867
  moreInfoAbout: "Plus d'infos sur {label}"
106781
106868
  };
106869
+ var analyticsTabLabels$2 = {
106870
+ header: {
106871
+ title: "Analytique",
106872
+ description: "Rapports d'utilisation et insights pour cet agent."
106873
+ },
106874
+ infoBox: "Découvrez comment cet agent est utilisé — qui discute avec lui, de quoi les gens parlent, combien il coûte, et plus encore. Choisissez un rapport ci-dessous pour approfondir.",
106875
+ openAria: "Ouvrir {label}",
106876
+ tabs: {
106877
+ overview: {
106878
+ label: "Vue d’ensemble",
106879
+ description: "Un aperçu global de l'utilisation et de l'engagement dans le temps."
106880
+ },
106881
+ users: {
106882
+ label: "Utilisateurs",
106883
+ description: "Voyez qui discute avec cet agent et à quel point ils sont actifs."
106884
+ },
106885
+ topics: {
106886
+ label: "Sujets",
106887
+ description: "Les sujets que les gens abordent le plus dans les conversations."
106888
+ },
106889
+ transcripts: {
106890
+ label: "Transcriptions",
106891
+ description: "Lisez les transcriptions complètes des conversations, message par message."
106892
+ },
106893
+ financial: {
106894
+ label: "Coûts",
106895
+ description: "Suivez l'utilisation des jetons et ce que cet agent vous coûte."
106896
+ },
106897
+ audit: {
106898
+ label: "Audit",
106899
+ description: "Consultez le journal des modifications et de l'activité de cet agent."
106900
+ },
106901
+ reports: {
106902
+ label: "Rapports de données",
106903
+ description: "Générez et téléchargez des rapports détaillés à partager ou à archiver."
106904
+ }
106905
+ }
106906
+ };
106782
106907
  var voiceTabLabels$2 = {
106783
106908
  header: {
106784
106909
  title: "Voix",
106785
106910
  description: "Choisissez la voix utilisée par votre agent et le fonctionnement des appels vocaux."
106786
106911
  },
106912
+ capability: {
106913
+ title: "Appels vocaux",
106914
+ description: "Permettez aux utilisateurs de parler à cet agent à voix haute et d'entendre sa réponse, comme lors d'un appel téléphonique. Une fois activé, choisissez la voix et affinez le comportement des appels ci-dessous.",
106915
+ offHint: "Activez-le pour permettre aux utilisateurs de démarrer des conversations vocales avec cet agent."
106916
+ },
106787
106917
  subTabs: {
106788
106918
  voice: "Voix",
106789
106919
  callConfig: "Appel vocal"
@@ -107031,6 +107161,13 @@ var ltiTabLabels$2 = {
107031
107161
  title: "LTI",
107032
107162
  description: "Gérez les liens LTI de l'agent, les clés de signature, les outils et les endpoints de la plateforme."
107033
107163
  },
107164
+ capability: {
107165
+ title: "Lancements LTI",
107166
+ description: "Permettez d'ajouter cet agent à un système de gestion de l'apprentissage (Canvas, Brightspace, Blackboard ou Moodle) afin que les étudiants puissent l'ouvrir directement dans leur cours. Une fois activé, créez ci-dessous les liens, les clés de signature et les outils dont votre LMS a besoin.",
107167
+ offHint: "Activez-le pour permettre l'intégration de cet agent dans un LMS et configurer ses liens et ses clés.",
107168
+ toggleSuccess: "Paramètre LTI mis à jour",
107169
+ toggleError: "Impossible de mettre à jour le paramètre LTI"
107170
+ },
107034
107171
  subTabs: {
107035
107172
  agentLinks: "Liens",
107036
107173
  keys: "Clés",
@@ -107434,6 +107571,7 @@ var fr = {
107434
107571
  userProfileDropdownIndex: userProfileDropdownIndex$2,
107435
107572
  version: version$5,
107436
107573
  voiceTabCallConfigSection: voiceTabCallConfigSection$2,
107574
+ analyticsTabLabels: analyticsTabLabels$2,
107437
107575
  voiceTabLabels: voiceTabLabels$2,
107438
107576
  voiceTabVoicePicker: voiceTabVoicePicker$2,
107439
107577
  welcomeChatConversationStarters: welcomeChatConversationStarters$2,
@@ -108952,11 +109090,16 @@ var clawSandboxAgentConfigPrompts$1 = {
108952
109090
  updateSuccess: "{label} actualizado correctamente",
108953
109091
  updateError: "Error al actualizar {label}",
108954
109092
  moreInfoAriaLabel: "Más información sobre {label}",
108955
- edit: "Editar"
109093
+ edit: "Editar",
109094
+ connectSandboxPrompt: "Conecta una instancia de sandbox en la pestaña Sandbox para gestionar las indicaciones del agente.",
109095
+ enableSandboxPrompt: "Activa el sandbox dedicado en la pestaña Sandbox y conéctalo a una instancia para gestionar las indicaciones del agente.",
109096
+ sandboxTabLabel: "pestaña Sandbox"
108956
109097
  };
108957
109098
  var clawSandboxAgentSkills$1 = {
108958
109099
  loadingSkills: "Cargando habilidades...",
108959
109100
  connectSandboxPrompt: "Conecta una instancia de sandbox en la pestaña Sandbox para gestionar habilidades.",
109101
+ enableSandboxPrompt: "Activa el sandbox dedicado en la pestaña Sandbox y conéctalo a una instancia para gestionar habilidades.",
109102
+ sandboxTabLabel: "pestaña Sandbox",
108960
109103
  newSkill: "Nueva habilidad",
108961
109104
  noSkillsAvailable: "No hay habilidades disponibles para esta plataforma. Crea una para empezar.",
108962
109105
  moreInfoAbout: "Más información sobre {name}",
@@ -110475,6 +110618,11 @@ var privacyTabLabels$1 = {
110475
110618
  title: "Privacidad",
110476
110619
  description: "Detecta y filtra información de identificación personal de los mensajes del chat."
110477
110620
  },
110621
+ capability: {
110622
+ title: "Filtrado de datos personales",
110623
+ description: "Detecta y oculta automáticamente la información personal — nombres, correos, números de teléfono y más — en los mensajes antes de que el agente los vea. Cuando esté activado, elige a continuación qué detectar y cómo tratarlo.",
110624
+ offHint: "Actívalo para detectar y ocultar la información personal en los mensajes."
110625
+ },
110478
110626
  fields: {
110479
110627
  enableRouter: {
110480
110628
  label: "Activar enrutador de privacidad",
@@ -110486,12 +110634,14 @@ var privacyTabLabels$1 = {
110486
110634
  options: {
110487
110635
  redact: "Redactar",
110488
110636
  mask: "Enmascarar",
110489
- block: "Bloquear"
110637
+ block: "Bloquear",
110638
+ allow: "Permitir"
110490
110639
  },
110491
110640
  descriptions: {
110492
110641
  redact: "La PII se reemplaza por su tipo — ej. \"Email [EMAIL_ADDRESS]\".",
110493
110642
  mask: "La PII se oculta con asteriscos — ej. \"Email ***********\".",
110494
- block: "El mensaje es rechazado y se muestra al usuario el mensaje de bloqueo."
110643
+ block: "El mensaje es rechazado y se muestra al usuario el mensaje de bloqueo.",
110644
+ allow: "La PII se detecta pero se deja intacta — el mensaje pasa sin cambios. Use esta opción para supervisar o auditar la información personal sin alterar los mensajes."
110495
110645
  }
110496
110646
  },
110497
110647
  blockMessage: {
@@ -111181,6 +111331,11 @@ var screenshareTabLabels$1 = {
111181
111331
  title: "Pantalla compartida",
111182
111332
  description: "Cómo se comporta tu agente cuando un usuario comparte su pantalla durante una llamada de voz."
111183
111333
  },
111334
+ capability: {
111335
+ title: "Pantalla compartida",
111336
+ description: "Permite que las personas compartan su pantalla durante una llamada de voz para que el agente vea lo que hacen y las guíe paso a paso. Cuando esté activado, define las indicaciones de pantalla compartida a continuación.",
111337
+ offHint: "Actívalo para permitir compartir la pantalla durante una llamada y editar estas indicaciones."
111338
+ },
111184
111339
  disabledHint: "El uso compartido de pantalla está actualmente desactivado para este agente. Estas instrucciones se guardarán, pero solo surtirán efecto una vez que se active.",
111185
111340
  fields: {
111186
111341
  systemPrompt: {
@@ -111947,7 +112102,8 @@ var tabsVoiceTab$1 = {
111947
112102
  var tasksTabLabels$1 = {
111948
112103
  header: {
111949
112104
  title: "Tareas",
111950
- description: "Configure las tareas automatizadas para su agente."
112105
+ description: "Configure las tareas automatizadas para su agente.",
112106
+ infoBox: "Deja que tu agente trabaje según su propio calendario. Configura tareas recurrentes que ejecuta automáticamente —como resúmenes diarios o recordatorios— sin que nadie tenga que pedírselo."
111951
112107
  },
111952
112108
  toolbar: {
111953
112109
  searchPlaceholder: "Buscar todas las tareas...",
@@ -112089,11 +112245,54 @@ var voiceTabCallConfigSection$1 = {
112089
112245
  refreshingAriaLabel: "Actualizando",
112090
112246
  moreInfoAbout: "Más información sobre {label}"
112091
112247
  };
112248
+ var analyticsTabLabels$1 = {
112249
+ header: {
112250
+ title: "Analíticas",
112251
+ description: "Informes de uso e insights para este agente."
112252
+ },
112253
+ infoBox: "Descubre cómo se usa este agente: quién chatea con él, de qué hablan, cuánto cuesta y más. Elige un informe a continuación para profundizar.",
112254
+ openAria: "Abrir {label}",
112255
+ tabs: {
112256
+ overview: {
112257
+ label: "Resumen",
112258
+ description: "Una vista general del uso y la participación a lo largo del tiempo."
112259
+ },
112260
+ users: {
112261
+ label: "Usuarios",
112262
+ description: "Mira quién chatea con este agente y qué tan activos son."
112263
+ },
112264
+ topics: {
112265
+ label: "Temas",
112266
+ description: "Los temas que la gente menciona más en las conversaciones."
112267
+ },
112268
+ transcripts: {
112269
+ label: "Transcripciones",
112270
+ description: "Lee las transcripciones completas de las conversaciones, mensaje a mensaje."
112271
+ },
112272
+ financial: {
112273
+ label: "Costos",
112274
+ description: "Controla el uso de tokens y lo que te cuesta este agente."
112275
+ },
112276
+ audit: {
112277
+ label: "Auditoría",
112278
+ description: "Revisa el registro de cambios y actividad de este agente."
112279
+ },
112280
+ reports: {
112281
+ label: "Informes de datos",
112282
+ description: "Genera y descarga informes detallados para compartir o archivar."
112283
+ }
112284
+ }
112285
+ };
112092
112286
  var voiceTabLabels$1 = {
112093
112287
  header: {
112094
112288
  title: "Voz",
112095
112289
  description: "Elige la voz que usa tu agente y cómo funcionan las llamadas de voz."
112096
112290
  },
112291
+ capability: {
112292
+ title: "Llamadas de voz",
112293
+ description: "Permite que las personas hablen con este agente en voz alta y escuchen su respuesta, como en una llamada telefónica. Cuando esté activado, elige la voz y ajusta el comportamiento de las llamadas a continuación.",
112294
+ offHint: "Actívalo para permitir que las personas inicien conversaciones de voz con este agente."
112295
+ },
112097
112296
  subTabs: {
112098
112297
  voice: "Voz",
112099
112298
  callConfig: "Llamada de voz"
@@ -112341,6 +112540,13 @@ var ltiTabLabels$1 = {
112341
112540
  title: "LTI",
112342
112541
  description: "Gestiona los enlaces LTI del agente, las claves de firma, las herramientas y los endpoints de la plataforma."
112343
112542
  },
112543
+ capability: {
112544
+ title: "Lanzamientos LTI",
112545
+ description: "Permite añadir este agente a un sistema de gestión del aprendizaje (Canvas, Brightspace, Blackboard o Moodle) para que los estudiantes puedan abrirlo directamente en su curso. Cuando esté activado, crea a continuación los enlaces, las claves de firma y las herramientas que necesita tu LMS.",
112546
+ offHint: "Actívalo para permitir que este agente se integre en un LMS y configurar sus enlaces y claves.",
112547
+ toggleSuccess: "Ajuste de LTI actualizado",
112548
+ toggleError: "No se pudo actualizar el ajuste de LTI"
112549
+ },
112344
112550
  subTabs: {
112345
112551
  agentLinks: "Enlaces",
112346
112552
  keys: "Claves",
@@ -112744,6 +112950,7 @@ var es = {
112744
112950
  userProfileDropdownIndex: userProfileDropdownIndex$1,
112745
112951
  version: version$4,
112746
112952
  voiceTabCallConfigSection: voiceTabCallConfigSection$1,
112953
+ analyticsTabLabels: analyticsTabLabels$1,
112747
112954
  voiceTabLabels: voiceTabLabels$1,
112748
112955
  voiceTabVoicePicker: voiceTabVoicePicker$1,
112749
112956
  welcomeChatConversationStarters: welcomeChatConversationStarters$1,
@@ -114262,11 +114469,16 @@ var clawSandboxAgentConfigPrompts = {
114262
114469
  updateSuccess: "{label} 更新成功",
114263
114470
  updateError: "更新 {label} 失败",
114264
114471
  moreInfoAriaLabel: "关于 {label} 的更多信息",
114265
- edit: "编辑"
114472
+ edit: "编辑",
114473
+ connectSandboxPrompt: "在沙盒选项卡中连接沙盒实例以管理智能体提示词。",
114474
+ enableSandboxPrompt: "在沙盒选项卡中启用专用沙盒并连接到实例,以管理智能体提示词。",
114475
+ sandboxTabLabel: "沙盒选项卡"
114266
114476
  };
114267
114477
  var clawSandboxAgentSkills = {
114268
114478
  loadingSkills: "正在加载技能...",
114269
114479
  connectSandboxPrompt: "在 Sandbox 标签页中连接一个 sandbox 实例以管理技能。",
114480
+ enableSandboxPrompt: "在 Sandbox 标签页中启用专用沙盒并连接到实例,以管理技能。",
114481
+ sandboxTabLabel: "Sandbox 标签页",
114270
114482
  newSkill: "新建技能",
114271
114483
  noSkillsAvailable: "该平台暂无可用技能。创建一个以开始使用。",
114272
114484
  moreInfoAbout: "关于 {name} 的更多信息",
@@ -115785,6 +115997,11 @@ var privacyTabLabels = {
115785
115997
  title: "隐私",
115786
115998
  description: "检测并过滤聊天消息中的个人身份信息。"
115787
115999
  },
116000
+ capability: {
116001
+ title: "个人信息过滤",
116002
+ description: "在智能体看到消息之前,自动查找并隐藏其中的个人信息——姓名、电子邮件、电话号码等。开启后,可在下方选择要检测的内容及处理方式。",
116003
+ offHint: "开启后可检测并隐藏消息中的个人信息。"
116004
+ },
115788
116005
  fields: {
115789
116006
  enableRouter: {
115790
116007
  label: "启用隐私路由",
@@ -115796,12 +116013,14 @@ var privacyTabLabels = {
115796
116013
  options: {
115797
116014
  redact: "编辑",
115798
116015
  mask: "遮蔽",
115799
- block: "拦截"
116016
+ block: "拦截",
116017
+ allow: "允许"
115800
116018
  },
115801
116019
  descriptions: {
115802
116020
  redact: "PII 将被替换为其类型,例如:「Email [EMAIL_ADDRESS]」。",
115803
116021
  mask: "PII 将被星号隐藏,例如:「Email ***********」。",
115804
- block: "消息将被拒绝,并向用户显示您的拦截消息。"
116022
+ block: "消息将被拒绝,并向用户显示您的拦截消息。",
116023
+ allow: "检测到 PII 但不做处理——消息将原样通过。适用于在不修改消息的情况下监控或审计个人信息。"
115805
116024
  }
115806
116025
  },
115807
116026
  blockMessage: {
@@ -116491,6 +116710,11 @@ var screenshareTabLabels = {
116491
116710
  title: "屏幕共享",
116492
116711
  description: "当用户在语音通话中共享屏幕时,您的智能体的表现方式。"
116493
116712
  },
116713
+ capability: {
116714
+ title: "屏幕共享",
116715
+ description: "允许用户在语音通话中共享屏幕,以便智能体看到他们的操作并逐步引导。开启后,可在下方设置屏幕共享提示词。",
116716
+ offHint: "开启后可允许在通话中共享屏幕并编辑这些提示词。"
116717
+ },
116494
116718
  disabledHint: "屏幕共享当前已为该智能体关闭。这些提示将被保存,但开启后才会生效。",
116495
116719
  fields: {
116496
116720
  systemPrompt: {
@@ -117257,7 +117481,8 @@ var tabsVoiceTab = {
117257
117481
  var tasksTabLabels = {
117258
117482
  header: {
117259
117483
  title: "任务",
117260
- description: "为您的智能体配置自动化任务。"
117484
+ description: "为您的智能体配置自动化任务。",
117485
+ infoBox: "让您的智能体按自己的日程工作。设置它自动运行的周期性任务——例如每日摘要或提醒——无需任何人主动提出。"
117261
117486
  },
117262
117487
  toolbar: {
117263
117488
  searchPlaceholder: "搜索所有任务...",
@@ -117399,11 +117624,54 @@ var voiceTabCallConfigSection = {
117399
117624
  refreshingAriaLabel: "刷新中",
117400
117625
  moreInfoAbout: "关于 {label} 的更多信息"
117401
117626
  };
117627
+ var analyticsTabLabels = {
117628
+ header: {
117629
+ title: "分析",
117630
+ description: "该智能体的使用报告和数据洞察。"
117631
+ },
117632
+ infoBox: "了解该智能体的使用情况——谁在与它对话、大家在谈论什么、花费多少等等。在下方选择一份报告即可深入查看。",
117633
+ openAria: "打开{label}",
117634
+ tabs: {
117635
+ overview: {
117636
+ label: "概览",
117637
+ description: "随时间变化的使用情况和参与度的总体快照。"
117638
+ },
117639
+ users: {
117640
+ label: "用户",
117641
+ description: "查看谁在与该智能体对话以及他们的活跃程度。"
117642
+ },
117643
+ topics: {
117644
+ label: "主题",
117645
+ description: "对话中人们最常提及的主题。"
117646
+ },
117647
+ transcripts: {
117648
+ label: "对话记录",
117649
+ description: "逐条阅读完整的对话记录。"
117650
+ },
117651
+ financial: {
117652
+ label: "费用",
117653
+ description: "跟踪令牌用量以及该智能体的花费。"
117654
+ },
117655
+ audit: {
117656
+ label: "审计",
117657
+ description: "查看该智能体的更改和活动日志。"
117658
+ },
117659
+ reports: {
117660
+ label: "数据报告",
117661
+ description: "生成并下载详细报告以供分享或存档。"
117662
+ }
117663
+ }
117664
+ };
117402
117665
  var voiceTabLabels = {
117403
117666
  header: {
117404
117667
  title: "语音",
117405
117668
  description: "选择您的智能体使用的声音以及语音通话的工作方式。"
117406
117669
  },
117670
+ capability: {
117671
+ title: "语音通话",
117672
+ description: "让用户可以与该智能体语音交谈并听到其回复,就像打电话一样。开启后,可在下方选择声音并微调通话行为。",
117673
+ offHint: "开启后可让用户与该智能体开始语音对话。"
117674
+ },
117407
117675
  subTabs: {
117408
117676
  voice: "语音",
117409
117677
  callConfig: "语音通话"
@@ -117651,6 +117919,13 @@ var ltiTabLabels = {
117651
117919
  title: "LTI",
117652
117920
  description: "管理此智能体的 LTI 链接、签名密钥、工具和平台端点。"
117653
117921
  },
117922
+ capability: {
117923
+ title: "LTI 启动",
117924
+ description: "允许将此智能体添加到学习管理系统(Canvas、Brightspace、Blackboard 或 Moodle),以便学生可以直接在课程中打开它。开启后,可在下方创建您的 LMS 所需的链接、签名密钥和工具。",
117925
+ offHint: "开启后可将此智能体嵌入 LMS 并设置其链接和密钥。",
117926
+ toggleSuccess: "LTI 设置已更新",
117927
+ toggleError: "无法更新 LTI 设置"
117928
+ },
117654
117929
  subTabs: {
117655
117930
  agentLinks: "链接",
117656
117931
  keys: "密钥",
@@ -118054,6 +118329,7 @@ var zh = {
118054
118329
  userProfileDropdownIndex: userProfileDropdownIndex,
118055
118330
  version: version$3,
118056
118331
  voiceTabCallConfigSection: voiceTabCallConfigSection,
118332
+ analyticsTabLabels: analyticsTabLabels,
118057
118333
  voiceTabLabels: voiceTabLabels,
118058
118334
  voiceTabVoicePicker: voiceTabVoicePicker,
118059
118335
  welcomeChatConversationStarters: welcomeChatConversationStarters,
@@ -258933,6 +259209,129 @@ function AgentMemoryTab({ labels: labelsOverride } = {}) {
258933
259209
  return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-6 overflow-y-auto p-3 lg:p-4", children: jsx("div", { className: "space-y-8", children: jsx(ManageMemories, { tenantKey: tenantKey, username: username, mentorId: mentorId }) }) })] }));
258934
259210
  }
258935
259211
 
259212
+ /**
259213
+ * Icon per analytics `value` — icons carry no user-facing text so they live
259214
+ * outside i18n.
259215
+ */
259216
+ const ANALYTICS_HUB_ICONS = {
259217
+ '': LayoutDashboard,
259218
+ users: Users,
259219
+ topics: MessageSquare,
259220
+ transcripts: FileText,
259221
+ financial: DollarSign,
259222
+ audit: ScrollText,
259223
+ reports: ChartColumn,
259224
+ };
259225
+ /**
259226
+ * Canonical order + the i18n key that supplies each destination's copy. The
259227
+ * route `value` mirrors the SDK `AnalyticsLayout` (Overview, Users, Topics,
259228
+ * Transcripts, Costs=`financial`, Audit, Data Reports=`reports`).
259229
+ */
259230
+ const ANALYTICS_HUB_ORDER = [
259231
+ { value: '', key: 'overview' },
259232
+ { value: 'users', key: 'users' },
259233
+ { value: 'topics', key: 'topics' },
259234
+ { value: 'transcripts', key: 'transcripts' },
259235
+ { value: 'financial', key: 'financial' },
259236
+ { value: 'audit', key: 'audit' },
259237
+ { value: 'reports', key: 'reports' },
259238
+ ];
259239
+ /**
259240
+ * English fallback bundle. Rendered copy comes from i18n via
259241
+ * {@link buildAnalyticsTabLabels}; this is only used when no translate
259242
+ * function is available (e.g. outside an i18n provider) and to seed
259243
+ * {@link DEFAULT_ANALYTICS_HUB_TABS}. Mirrors the pattern of the other tab
259244
+ * label bundles.
259245
+ */
259246
+ const AGENT_ANALYTICS_TAB_LABELS = {
259247
+ header: {
259248
+ title: 'Analytics',
259249
+ description: 'Usage reports and insights for this agent.',
259250
+ },
259251
+ infoBox: "See how this agent is being used — who's chatting with it, what they talk about, what it costs, and more. Pick a report below to dive in.",
259252
+ openAria: (label) => `Open ${label}`,
259253
+ tabs: {
259254
+ overview: {
259255
+ label: 'Overview',
259256
+ description: 'A high-level snapshot of usage and engagement over time.',
259257
+ },
259258
+ users: {
259259
+ label: 'Users',
259260
+ description: "See who's chatting with this agent and how active they are.",
259261
+ },
259262
+ topics: {
259263
+ label: 'Topics',
259264
+ description: 'The subjects people bring up most across conversations.',
259265
+ },
259266
+ transcripts: {
259267
+ label: 'Transcripts',
259268
+ description: 'Read full conversation transcripts message by message.',
259269
+ },
259270
+ financial: {
259271
+ label: 'Costs',
259272
+ description: 'Track token usage and what this agent is costing you.',
259273
+ },
259274
+ audit: {
259275
+ label: 'Audit',
259276
+ description: 'Review the log of changes and activity for this agent.',
259277
+ },
259278
+ reports: {
259279
+ label: 'Data Reports',
259280
+ description: 'Generate and download detailed reports to share or archive.',
259281
+ },
259282
+ },
259283
+ };
259284
+ function buildAnalyticsTabLabels(t) {
259285
+ const tabs = {};
259286
+ for (const { key } of ANALYTICS_HUB_ORDER) {
259287
+ tabs[key] = {
259288
+ label: t(`analyticsTabLabels.tabs.${key}.label`),
259289
+ description: t(`analyticsTabLabels.tabs.${key}.description`),
259290
+ };
259291
+ }
259292
+ return {
259293
+ header: {
259294
+ title: t('analyticsTabLabels.header.title'),
259295
+ description: t('analyticsTabLabels.header.description'),
259296
+ },
259297
+ infoBox: t('analyticsTabLabels.infoBox'),
259298
+ openAria: (label) => t('analyticsTabLabels.openAria', { label }),
259299
+ tabs,
259300
+ };
259301
+ }
259302
+ function resolveAnalyticsTabLabels(t) {
259303
+ return t ? buildAnalyticsTabLabels(t) : AGENT_ANALYTICS_TAB_LABELS;
259304
+ }
259305
+ /** Build the destination list (value + icon + copy) from a labels bundle. */
259306
+ function buildHubTabs(labels) {
259307
+ return ANALYTICS_HUB_ORDER.map(({ value, key }) => ({
259308
+ value,
259309
+ label: labels.tabs[key].label,
259310
+ description: labels.tabs[key].description,
259311
+ icon: ANALYTICS_HUB_ICONS[value],
259312
+ }));
259313
+ }
259314
+ /** English default destinations — see {@link AGENT_ANALYTICS_TAB_LABELS}. */
259315
+ const DEFAULT_ANALYTICS_HUB_TABS = buildHubTabs(AGENT_ANALYTICS_TAB_LABELS);
259316
+ /**
259317
+ * Analytics "hub" rendered inside the Edit-Agent modal. Instead of embedding
259318
+ * the full analytics dashboards in the dialog, it presents each analytics
259319
+ * destination as a card; activating one hands the value back to the host,
259320
+ * which navigates to the corresponding full-page analytics view.
259321
+ */
259322
+ function AgentAnalyticsTab({ tabs, excludeTabs = [], onNavigate }) {
259323
+ const t = useT();
259324
+ const labels = React__default.useMemo(() => resolveAnalyticsTabLabels(t), [t]);
259325
+ const defaultHubTabs = React__default.useMemo(() => buildHubTabs(labels), [labels]);
259326
+ const hubTabs = tabs !== null && tabs !== void 0 ? tabs : defaultHubTabs;
259327
+ const visibleTabs = hubTabs.filter((tab) => !excludeTabs.includes(tab.value));
259328
+ return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsxs("div", { className: "flex-1 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "analytics-tab-body", children: [jsx("div", { className: "mb-4 rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-600", "data-testid": "analytics-info-box", children: labels.infoBox }), jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: visibleTabs.map((tab) => {
259329
+ var _a;
259330
+ const Icon = (_a = tab.icon) !== null && _a !== void 0 ? _a : LayoutDashboard;
259331
+ return (jsxs("button", { type: "button", onClick: () => onNavigate(tab.value), "aria-label": labels.openAria(tab.label), "data-testid": `analytics-hub-${tab.value || 'overview'}`, className: cn('group flex items-start gap-3 rounded-lg border border-gray-200 bg-white p-4 text-left transition-all', 'hover:border-blue-300 hover:shadow-sm focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:outline-none'), children: [jsx("span", { className: "flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600", children: jsx(Icon, { className: "h-5 w-5", "aria-hidden": "true" }) }), jsxs("span", { className: "min-w-0 flex-1", children: [jsxs("span", { className: "flex items-center justify-between gap-2", children: [jsx("span", { className: "text-sm font-medium text-gray-900", children: tab.label }), jsx(ChevronRight, { className: "h-4 w-4 flex-shrink-0 text-gray-400 transition-transform group-hover:translate-x-0.5 group-hover:text-blue-600", "aria-hidden": "true" })] }), jsx("span", { className: "mt-0.5 block text-xs leading-relaxed text-gray-600", children: tab.description })] })] }, tab.value || 'overview'));
259332
+ }) })] })] }));
259333
+ }
259334
+
258936
259335
  const AUTH_SCOPE = {
258937
259336
  TENANT: 'tenant',
258938
259337
  MENTOR: 'mentor',
@@ -260931,11 +261330,30 @@ function AgentSafetyTab({ renderPromptContent, FlaggedPromptsModal, showFlaggedP
260931
261330
  selectedPrompt: selectedPrompt, isEditing: isEditMentorLoading })), isFlaggedPromptsModalOpen && FlaggedPromptsModal && (jsx(FlaggedPromptsModal, { isOpen: isFlaggedPromptsModalOpen, onClose: () => setIsFlaggedPromptsModalOpen(false), mentorId: mentorId, tenantKey: tenantKey, username: username !== null && username !== void 0 ? username : '' }))] }) })] }));
260932
261331
  }
260933
261332
 
261333
+ /**
261334
+ * Reusable header used at the top of every capability-gated agent-settings
261335
+ * tab. It surfaces the capability's on/off toggle (previously buried in the
261336
+ * Settings → Capabilities list) right where the feature is configured, with a
261337
+ * naive-friendly explanation.
261338
+ *
261339
+ * The configuration UI below is always rendered so admins can preview what
261340
+ * they'll get, but it's grayed out and made inert (`pointer-events-none`,
261341
+ * `aria-hidden`) until the capability is switched on.
261342
+ */
261343
+ function CapabilityGate({ title, description, enabled, onToggle, disabled = false, ariaLabel, offHint, toggleTestId, children, }) {
261344
+ return (jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "flex items-start justify-between gap-4 rounded-lg border border-gray-200 bg-gray-50/60 p-4", "data-testid": "capability-gate-header", children: [jsx("div", { className: "min-w-0", children: jsxs("p", { className: "text-xs leading-relaxed text-gray-600", children: [description, !enabled && offHint && (jsxs("span", { className: "font-medium text-gray-500", "data-testid": "capability-gate-off-hint", children: [' ', offHint] }))] }) }), jsx(CustomSwitch, { checked: enabled, onCheckedChange: onToggle, disabled: disabled, "aria-label": ariaLabel !== null && ariaLabel !== void 0 ? ariaLabel : title, "aria-checked": enabled, "data-testid": toggleTestId, className: "mt-0.5 flex-shrink-0" })] }), jsx("div", { className: cn('transition-opacity', !enabled && 'pointer-events-none select-none opacity-50'), "aria-hidden": !enabled, inert: !enabled, "data-testid": "capability-gate-content", "data-enabled": enabled, children: children })] }));
261345
+ }
261346
+
260934
261347
  const AGENT_PRIVACY_TAB_LABELS = {
260935
261348
  header: {
260936
261349
  title: 'Privacy',
260937
261350
  description: 'Detect and filter personally identifiable information from chat messages.',
260938
261351
  },
261352
+ capability: {
261353
+ title: 'PII filtering',
261354
+ description: 'Automatically find and hide personal information — names, emails, phone numbers and more — in messages before the agent sees them. When on, choose what to detect and how to handle it below.',
261355
+ offHint: 'Turn it on to detect and hide personal information in messages.',
261356
+ },
260939
261357
  fields: {
260940
261358
  enableRouter: {
260941
261359
  label: 'Enable Privacy Router',
@@ -260948,11 +261366,13 @@ const AGENT_PRIVACY_TAB_LABELS = {
260948
261366
  redact: 'Redact',
260949
261367
  mask: 'Mask',
260950
261368
  block: 'Block',
261369
+ allow: 'Allow',
260951
261370
  },
260952
261371
  descriptions: {
260953
261372
  redact: 'PII is replaced with its type — e.g. "Email [EMAIL_ADDRESS]".',
260954
261373
  mask: 'PII is hidden behind asterisks — e.g. "Email ***********".',
260955
261374
  block: 'The message is rejected and your block message is shown to the user.',
261375
+ allow: 'PII is detected but left untouched — the message passes through unchanged. Use this to monitor or audit personal information without altering messages.',
260956
261376
  },
260957
261377
  },
260958
261378
  blockMessage: {
@@ -260995,6 +261415,11 @@ function buildPrivacyTabLabels(t) {
260995
261415
  title: t('privacyTabLabels.header.title'),
260996
261416
  description: t('privacyTabLabels.header.description'),
260997
261417
  },
261418
+ capability: {
261419
+ title: t('privacyTabLabels.capability.title'),
261420
+ description: t('privacyTabLabels.capability.description'),
261421
+ offHint: t('privacyTabLabels.capability.offHint'),
261422
+ },
260998
261423
  fields: {
260999
261424
  enableRouter: {
261000
261425
  label: t('privacyTabLabels.fields.enableRouter.label'),
@@ -261007,11 +261432,13 @@ function buildPrivacyTabLabels(t) {
261007
261432
  redact: t('privacyTabLabels.fields.action.options.redact'),
261008
261433
  mask: t('privacyTabLabels.fields.action.options.mask'),
261009
261434
  block: t('privacyTabLabels.fields.action.options.block'),
261435
+ allow: t('privacyTabLabels.fields.action.options.allow'),
261010
261436
  },
261011
261437
  descriptions: {
261012
261438
  redact: t('privacyTabLabels.fields.action.descriptions.redact'),
261013
261439
  mask: t('privacyTabLabels.fields.action.descriptions.mask'),
261014
261440
  block: t('privacyTabLabels.fields.action.descriptions.block'),
261441
+ allow: t('privacyTabLabels.fields.action.descriptions.allow'),
261015
261442
  },
261016
261443
  },
261017
261444
  blockMessage: {
@@ -261120,24 +261547,24 @@ function AgentPrivacyTab({ labels: labelsOverride, tenantKey: tenantKeyProp, men
261120
261547
  : entities.filter((e) => e !== entity);
261121
261548
  void updateField('privacy_entities', next);
261122
261549
  }
261123
- return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex hidden h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-700", children: labels.header.description })] }) }), jsx("div", { "data-testid": "privacy-tab-body", className: "flex-1 space-y-6 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, children: enabled && (jsxs(Fragment$1, { children: [jsx(WithFormPermissions, { name: "privacy_action",
261124
- // @ts-ignore
261125
- permissions: (_h = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _h === void 0 ? void 0 : _h.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.action.label }), jsx(FieldTooltip$1, { text: labels.fields.action.tooltip })] }), jsxs(Select$1, { value: action, onValueChange: (v) => void updateField('privacy_action', v), disabled: isDisabled || disabled, children: [jsx(SelectTrigger, { "aria-label": labels.fields.action.label, children: jsx(SelectValue, {}) }), jsx(SelectContent, { children: PRIVACY_ACTIONS.map((opt) => (jsx(SelectItem, { value: opt, children: labels.fields.action.options[opt] }, opt))) })] }), jsx("p", { className: "text-xs text-gray-500", children: labels.fields.action.descriptions[action] })] })) }), action === 'block' && (jsx(WithFormPermissions, { name: "privacy_response",
261126
- // @ts-ignore
261127
- permissions: (_j = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _j === void 0 ? void 0 : _j.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.blockMessage.label }), jsx(Textarea, { value: localResponse, onChange: (e) => setLocalResponse(e.target.value), onBlur: () => {
261128
- if (localResponse !== responseText) {
261129
- void updateField('privacy_response', localResponse);
261130
- }
261131
- }, placeholder: labels.fields.blockMessage.placeholder, className: "min-h-[100px]", disabled: isDisabled || disabled, "aria-label": labels.fields.blockMessage.label })] })) })), jsx(WithFormPermissions, { name: "privacy_entities",
261132
- // @ts-ignore
261133
- permissions: (_k = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _k === void 0 ? void 0 : _k.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.entities.label }), jsx(FieldTooltip$1, { text: labels.fields.entities.tooltip })] }), jsx("div", { className: "flex flex-wrap gap-2", children: PRIVACY_ENTITY_TYPES.map((entity) => {
261134
- var _a;
261135
- return (jsx(EntityChip, { entity: entity, label: (_a = labels.fields.entities.labels[entity]) !== null && _a !== void 0 ? _a : entity, selected: entities.includes(entity), disabled: isDisabled || disabled, onToggle: (checked) => toggleEntity(entity, checked) }, entity));
261136
- }) }), entities.length === 0 && (jsx("p", { className: "text-xs text-gray-500", children: labels.fields.entities.emptyHint }))] })) }), jsx(WithFormPermissions, { name: "enable_privacy_output_filter",
261137
- // @ts-ignore
261138
- permissions: (_l = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _l === void 0 ? void 0 : _l.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: labels.fields.outputFilter.label }), jsx(FieldTooltip$1, { text: labels.fields.outputFilter.tooltip })] }), jsx(CustomSwitch, { checked: outputFilter, onCheckedChange: (checked) => void updateField('enable_privacy_output_filter', checked), disabled: isDisabled || disabled, "aria-label": outputFilter
261139
- ? t('tabsPrivacyTab.outputFilterAriaLabelEnabled')
261140
- : t('tabsPrivacyTab.outputFilterAriaLabelDisabled') })] })) })] })) })] }));
261550
+ return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex hidden h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-700", children: labels.header.description })] }) }), jsx("div", { "data-testid": "privacy-tab-body", className: "flex-1 space-y-6 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, children: jsx(CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: enabled, onToggle: (checked) => void updateField('enable_privacy_router', checked), disabled: isDisabled, ariaLabel: labels.capability.title, toggleTestId: "privacy-capability-toggle", children: jsxs("div", { className: "space-y-6", children: [jsx(WithFormPermissions, { name: "privacy_action",
261551
+ // @ts-ignore
261552
+ permissions: (_h = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _h === void 0 ? void 0 : _h.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.action.label }), jsx(FieldTooltip$1, { text: labels.fields.action.tooltip })] }), jsxs(Select$1, { value: action, onValueChange: (v) => void updateField('privacy_action', v), disabled: isDisabled || disabled, children: [jsx(SelectTrigger, { "aria-label": labels.fields.action.label, children: jsx(SelectValue, {}) }), jsx(SelectContent, { children: PRIVACY_ACTIONS.map((opt) => (jsx(SelectItem, { value: opt, children: labels.fields.action.options[opt] }, opt))) })] }), jsx("p", { className: "text-xs text-gray-500", children: labels.fields.action.descriptions[action] })] })) }), action === 'block' && (jsx(WithFormPermissions, { name: "privacy_response",
261553
+ // @ts-ignore
261554
+ permissions: (_j = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _j === void 0 ? void 0 : _j.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.blockMessage.label }), jsx(Textarea, { value: localResponse, onChange: (e) => setLocalResponse(e.target.value), onBlur: () => {
261555
+ if (localResponse !== responseText) {
261556
+ void updateField('privacy_response', localResponse);
261557
+ }
261558
+ }, placeholder: labels.fields.blockMessage.placeholder, className: "min-h-[100px]", disabled: isDisabled || disabled, "aria-label": labels.fields.blockMessage.label })] })) })), jsx(WithFormPermissions, { name: "privacy_entities",
261559
+ // @ts-ignore
261560
+ permissions: (_k = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _k === void 0 ? void 0 : _k.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.fields.entities.label }), jsx(FieldTooltip$1, { text: labels.fields.entities.tooltip })] }), jsx("div", { className: "flex flex-wrap gap-2", children: PRIVACY_ENTITY_TYPES.map((entity) => {
261561
+ var _a;
261562
+ return (jsx(EntityChip, { entity: entity, label: (_a = labels.fields.entities.labels[entity]) !== null && _a !== void 0 ? _a : entity, selected: entities.includes(entity), disabled: isDisabled || disabled, onToggle: (checked) => toggleEntity(entity, checked) }, entity));
261563
+ }) }), entities.length === 0 && (jsx("p", { className: "text-xs text-gray-500", children: labels.fields.entities.emptyHint }))] })) }), jsx(WithFormPermissions, { name: "enable_privacy_output_filter",
261564
+ // @ts-ignore
261565
+ permissions: (_l = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _l === void 0 ? void 0 : _l.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "flex items-center justify-between", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "text-sm font-medium text-[#646464]", children: labels.fields.outputFilter.label }), jsx(FieldTooltip$1, { text: labels.fields.outputFilter.tooltip })] }), jsx(CustomSwitch, { checked: outputFilter, onCheckedChange: (checked) => void updateField('enable_privacy_output_filter', checked), disabled: isDisabled || disabled, "aria-label": outputFilter
261566
+ ? t('tabsPrivacyTab.outputFilterAriaLabelEnabled')
261567
+ : t('tabsPrivacyTab.outputFilterAriaLabelDisabled') })] })) })] }) }) })] }));
261141
261568
  }
261142
261569
  function FieldTooltip$1({ text }) {
261143
261570
  const t = useT();
@@ -261154,6 +261581,11 @@ const AGENT_VOICE_TAB_LABELS = {
261154
261581
  title: 'Voice',
261155
261582
  description: 'Choose the voice your agent uses and how voice calls work.',
261156
261583
  },
261584
+ capability: {
261585
+ title: 'Voice calls',
261586
+ description: 'Let people talk to this agent out loud and hear it reply, like a phone call. When on, pick the voice and fine-tune how calls behave below.',
261587
+ offHint: 'Turn it on to let people start voice conversations with this agent.',
261588
+ },
261157
261589
  subTabs: {
261158
261590
  voice: 'Voice',
261159
261591
  callConfig: 'Voice call',
@@ -261247,6 +261679,11 @@ function buildVoiceTabLabels(t) {
261247
261679
  title: t('voiceTabLabels.header.title'),
261248
261680
  description: t('voiceTabLabels.header.description'),
261249
261681
  },
261682
+ capability: {
261683
+ title: t('voiceTabLabels.capability.title'),
261684
+ description: t('voiceTabLabels.capability.description'),
261685
+ offHint: t('voiceTabLabels.capability.offHint'),
261686
+ },
261250
261687
  subTabs: {
261251
261688
  voice: t('voiceTabLabels.subTabs.voice'),
261252
261689
  callConfig: t('voiceTabLabels.subTabs.callConfig'),
@@ -261842,7 +262279,7 @@ function readVoiceName(value) {
261842
262279
  return null;
261843
262280
  }
261844
262281
  function AgentVoiceTab({ labels: labelsOverride, defaultSubTab = 'voice', renderPromptContent, tenantKey: tenantKeyProp, mentorId: mentorIdProp, username: usernameProp, enableRBAC: enableRBACProp, }) {
261845
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
262282
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
261846
262283
  const ctx = useAgentSettingsOptional();
261847
262284
  const tenantKey = (_a = tenantKeyProp !== null && tenantKeyProp !== void 0 ? tenantKeyProp : ctx === null || ctx === void 0 ? void 0 : ctx.tenantKey) !== null && _a !== void 0 ? _a : '';
261848
262285
  const mentorId = (_b = mentorIdProp !== null && mentorIdProp !== void 0 ? mentorIdProp : ctx === null || ctx === void 0 ? void 0 : ctx.mentorId) !== null && _b !== void 0 ? _b : '';
@@ -261890,6 +262327,37 @@ function AgentVoiceTab({ labels: labelsOverride, defaultSubTab = 'voice', render
261890
262327
  const effectiveOpenaiVoice = (_h = pickedOpenaiVoice !== null && pickedOpenaiVoice !== void 0 ? pickedOpenaiVoice : resolvedOpenaiVoice) !== null && _h !== void 0 ? _h : null;
261891
262328
  const effectiveGoogleVoice = (_j = pickedGoogleVoice !== null && pickedGoogleVoice !== void 0 ? pickedGoogleVoice : resolvedGoogleVoice) !== null && _j !== void 0 ? _j : null;
261892
262329
  const [editMentor, { isLoading: isSavingMentor }] = useEditMentorMutation();
262330
+ // "Enable voice calls" master toggle. Optimistic local mirror of the
262331
+ // server value so the switch responds instantly; re-synced whenever the
262332
+ // settings response changes.
262333
+ const serverVoiceCallEnabled = (_k = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.show_voice_call) !== null && _k !== void 0 ? _k : true;
262334
+ const [voiceCallEnabled, setVoiceCallEnabled] = React__default.useState(serverVoiceCallEnabled);
262335
+ const [isTogglingVoiceCall, setIsTogglingVoiceCall] = React__default.useState(false);
262336
+ React__default.useEffect(() => {
262337
+ setVoiceCallEnabled(serverVoiceCallEnabled);
262338
+ }, [serverVoiceCallEnabled]);
262339
+ const handleToggleVoiceCall = async (checked) => {
262340
+ setVoiceCallEnabled(checked); // optimistic
262341
+ setIsTogglingVoiceCall(true);
262342
+ try {
262343
+ await editMentor({
262344
+ mentor: mentorId,
262345
+ org: tenantKey,
262346
+ // @ts-expect-error userId is accepted at runtime
262347
+ userId: username,
262348
+ formData: { show_voice_call: checked },
262349
+ }).unwrap();
262350
+ toast.success(labels.toasts.voiceSaved);
262351
+ }
262352
+ catch (error) {
262353
+ console.error('[AgentVoiceTab] toggle voice calls error', error);
262354
+ setVoiceCallEnabled(!checked); // roll back
262355
+ toast.error(labels.toasts.voiceError);
262356
+ }
262357
+ finally {
262358
+ setIsTogglingVoiceCall(false);
262359
+ }
262360
+ };
261893
262361
  const isDisabled = isMentorSettingsLoading || isSavingMentor;
261894
262362
  const isDirty = provider !== initialProvider || pickedOpenaiVoice != null || pickedGoogleVoice != null;
261895
262363
  /**
@@ -261955,22 +262423,24 @@ function AgentVoiceTab({ labels: labelsOverride, defaultSubTab = 'voice', render
261955
262423
  else if (provider === 'google')
261956
262424
  setPickedGoogleVoice(voice);
261957
262425
  };
261958
- return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-4 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "voice-tab-body", children: isMentorSettingsLoading ? (jsx("div", { className: "flex items-center justify-center py-12", "data-testid": "voice-tab-loading", children: jsx(Spinner, {}) })) : (jsxs(Tabs, { defaultValue: SUB_TAB_VALUES[defaultSubTab], className: "w-full", children: [jsxs(TabsList, { "aria-label": labels.header.title, "data-testid": "voice-sub-tabs", children: [jsx(TabsTrigger, { value: SUB_TAB_VALUES.voice, "data-testid": "voice-sub-tab-voice", children: labels.subTabs.voice }), jsx(TabsTrigger, { value: SUB_TAB_VALUES.callConfig, "data-testid": "voice-sub-tab-call-config", children: labels.subTabs.callConfig })] }), jsxs(TabsContent, { value: SUB_TAB_VALUES.voice, className: "space-y-4", children: [jsx("p", { className: "text-xs text-gray-600", children: labels.mentorVoice.description }), jsx(WithFormPermissions, { name: "voice_provider",
261959
- // @ts-expect-error permissions.field is opaque
261960
- permissions: (_k = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _k === void 0 ? void 0 : _k.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.mentorVoice.providerLabel }), jsx(FieldTooltip, { text: labels.mentorVoice.providerTooltip })] }), jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-3", role: "radiogroup", "aria-label": labels.mentorVoice.providerLabel, children: providerOptions.map((option) => {
261961
- const isSelected = provider === option.value;
261962
- const isDisabledOption = isDisabled || disabled;
261963
- return (jsxs("button", { type: "button", role: "radio", "aria-checked": isSelected, "aria-label": option.label, disabled: isDisabledOption, "data-testid": `voice-provider-${option.value}`, "data-voice-provider": option.value, onClick: () => setProvider(option.value), className: cn('flex flex-col items-start gap-2 rounded-lg border-2 p-3 text-left transition-all hover:shadow-sm', isSelected
261964
- ? 'border-blue-500 bg-blue-50/40'
261965
- : 'border-gray-200 bg-white hover:border-gray-300', isDisabledOption && 'cursor-not-allowed opacity-60'), children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "flex h-6 w-6 flex-shrink-0 items-center justify-center", children: option.logo.type === 'image' ? (jsx(Image$4, { src: option.logo.src, alt: option.logo.alt, width: 24, height: 24, className: "h-6 w-6 object-contain" })) : (jsx(option.logo.Icon, { className: "h-5 w-5 text-blue-600", "aria-hidden": "true" })) }), jsx("span", { className: "text-sm font-medium text-gray-900", children: option.label })] }), jsx("p", { className: "text-xs text-gray-500", children: option.description })] }, option.value));
261966
- }) })] })) }), (provider === 'openai' || provider === 'google') && (jsx(WithFormPermissions, { name: provider === 'openai' ? 'openai_voice' : 'google_voice',
261967
- // @ts-expect-error permissions.field is opaque
261968
- permissions: (_l = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _l === void 0 ? void 0 : _l.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: t('tabsVoiceTab.voiceLabel') }), jsx(VoicePickerTrigger, { org: tenantKey, userId: username, provider: provider, selectedVoice: selectedVoice, onSelect: onSelectVoice, disabled: isDisabled || disabled, labels: labels.mentorVoice, modalTitle: t('tabsVoiceTab.selectVoiceModalTitle', {
261969
- voiceType: labels.mentorVoice.voicePickerLabel[provider],
261970
- }), modalDescription: t('tabsVoiceTab.selectVoiceModalDescription'), testId: "mentor-voice-trigger" })] })) })), jsx("div", { className: "flex items-center justify-end border-t border-gray-100 pt-3", children: jsx(Button$1, { type: "button", onClick: handleSaveVoice, disabled: isDisabled || !isDirty, "data-testid": "voice-save-button", className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isSavingMentor ? labels.mentorVoice.savingButton : labels.mentorVoice.saveButton }) })] }), jsxs(TabsContent, { value: SUB_TAB_VALUES.callConfig, className: "space-y-4", children: [jsx("p", { className: "text-xs text-gray-600", children: labels.callConfig.description }), mentorId && username && tenantKey && (jsx(CallConfigSection, { org: tenantKey, userId: username, mentorId: mentorId, isDisabled: isDisabled, labels: labels.callConfig, voicePickerLabels: labels.mentorVoice, initialConfig: (_m = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.call_configuration) !== null && _m !== void 0 ? _m : null, renderPromptContent: renderPromptContent, toastLabels: {
261971
- saved: labels.toasts.callConfigSaved,
261972
- error: labels.toasts.callConfigError,
261973
- } }))] })] })) })] }));
262426
+ return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-4 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "voice-tab-body", children: isMentorSettingsLoading ? (jsx("div", { className: "flex items-center justify-center py-12", "data-testid": "voice-tab-loading", children: jsx(Spinner, {}) })) : (jsx(CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: voiceCallEnabled, onToggle: handleToggleVoiceCall, disabled: isDisabled || isTogglingVoiceCall, ariaLabel: labels.capability.title, toggleTestId: "voice-capability-toggle", children: jsxs(Tabs, { defaultValue: SUB_TAB_VALUES[defaultSubTab], className: "w-full", children: [jsxs(TabsList, { "aria-label": labels.header.title, "data-testid": "voice-sub-tabs", children: [jsx(TabsTrigger, { value: SUB_TAB_VALUES.voice, "data-testid": "voice-sub-tab-voice", children: labels.subTabs.voice }), jsx(TabsTrigger, { value: SUB_TAB_VALUES.callConfig, "data-testid": "voice-sub-tab-call-config", children: labels.subTabs.callConfig })] }), jsxs(TabsContent, { value: SUB_TAB_VALUES.voice, className: "space-y-4", children: [jsx("p", { className: "text-xs text-gray-600", children: labels.mentorVoice.description }), jsx(WithFormPermissions, { name: "voice_provider",
262427
+ // @ts-expect-error permissions.field is opaque
262428
+ permissions: (_l = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _l === void 0 ? void 0 : _l.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: labels.mentorVoice.providerLabel }), jsx(FieldTooltip, { text: labels.mentorVoice.providerTooltip })] }), jsx("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-3", role: "radiogroup", "aria-label": labels.mentorVoice.providerLabel, children: providerOptions.map((option) => {
262429
+ const isSelected = provider === option.value;
262430
+ const isDisabledOption = isDisabled || disabled;
262431
+ return (jsxs("button", { type: "button", role: "radio", "aria-checked": isSelected, "aria-label": option.label, disabled: isDisabledOption, "data-testid": `voice-provider-${option.value}`, "data-voice-provider": option.value, onClick: () => setProvider(option.value), className: cn('flex flex-col items-start gap-2 rounded-lg border-2 p-3 text-left transition-all hover:shadow-sm', isSelected
262432
+ ? 'border-blue-500 bg-blue-50/40'
262433
+ : 'border-gray-200 bg-white hover:border-gray-300', isDisabledOption && 'cursor-not-allowed opacity-60'), children: [jsxs("div", { className: "flex items-center gap-2", children: [jsx("span", { className: "flex h-6 w-6 flex-shrink-0 items-center justify-center", children: option.logo.type === 'image' ? (jsx(Image$4, { src: option.logo.src, alt: option.logo.alt, width: 24, height: 24, className: "h-6 w-6 object-contain" })) : (jsx(option.logo.Icon, { className: "h-5 w-5 text-blue-600", "aria-hidden": "true" })) }), jsx("span", { className: "text-sm font-medium text-gray-900", children: option.label })] }), jsx("p", { className: "text-xs text-gray-500", children: option.description })] }, option.value));
262434
+ }) })] })) }), (provider === 'openai' || provider === 'google') && (jsx(WithFormPermissions, { name: provider === 'openai' ? 'openai_voice' : 'google_voice',
262435
+ // @ts-expect-error permissions.field is opaque
262436
+ permissions: (_m = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.permissions) === null || _m === void 0 ? void 0 : _m.field, enableRBAC: enableRBAC, children: ({ disabled }) => (jsxs("div", { className: "space-y-2", children: [jsx(Label$1, { className: "text-sm font-medium text-[#646464]", children: t('tabsVoiceTab.voiceLabel') }), jsx(VoicePickerTrigger, { org: tenantKey, userId: username, provider: provider, selectedVoice: selectedVoice, onSelect: onSelectVoice, disabled: isDisabled || disabled, labels: labels.mentorVoice, modalTitle: t('tabsVoiceTab.selectVoiceModalTitle', {
262437
+ voiceType: labels.mentorVoice.voicePickerLabel[provider],
262438
+ }), modalDescription: t('tabsVoiceTab.selectVoiceModalDescription'), testId: "mentor-voice-trigger" })] })) })), jsx("div", { className: "flex items-center justify-end border-t border-gray-100 pt-3", children: jsx(Button$1, { type: "button", onClick: handleSaveVoice, disabled: isDisabled || !isDirty, "data-testid": "voice-save-button", className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", children: isSavingMentor
262439
+ ? labels.mentorVoice.savingButton
262440
+ : labels.mentorVoice.saveButton }) })] }), jsxs(TabsContent, { value: SUB_TAB_VALUES.callConfig, className: "space-y-4", children: [jsx("p", { className: "text-xs text-gray-600", children: labels.callConfig.description }), mentorId && username && tenantKey && (jsx(CallConfigSection, { org: tenantKey, userId: username, mentorId: mentorId, isDisabled: isDisabled, labels: labels.callConfig, voicePickerLabels: labels.mentorVoice, initialConfig: (_o = mentorSettings === null || mentorSettings === void 0 ? void 0 : mentorSettings.call_configuration) !== null && _o !== void 0 ? _o : null, renderPromptContent: renderPromptContent, toastLabels: {
262441
+ saved: labels.toasts.callConfigSaved,
262442
+ error: labels.toasts.callConfigError,
262443
+ } }))] })] }) })) })] }));
261974
262444
  }
261975
262445
  function FieldTooltip({ text }) {
261976
262446
  const t = useT();
@@ -261995,6 +262465,11 @@ const AGENT_SCREENSHARE_TAB_LABELS = {
261995
262465
  title: 'Screen Share',
261996
262466
  description: 'How your agent behaves when a user shares their screen during a voice call.',
261997
262467
  },
262468
+ capability: {
262469
+ title: 'Screen sharing',
262470
+ description: "Let people share their screen during a voice call so the agent can see what they're doing and guide them step by step. When on, set the screen-sharing prompts below.",
262471
+ offHint: 'Turn it on to let people share their screen during a call and edit these prompts.',
262472
+ },
261998
262473
  disabledHint: 'Screen sharing is currently turned off for this agent. These prompts will be saved but only take effect once it’s turned on.',
261999
262474
  fields: {
262000
262475
  systemPrompt: {
@@ -262019,6 +262494,11 @@ function buildScreenShareTabLabels(t) {
262019
262494
  title: t('screenshareTabLabels.header.title'),
262020
262495
  description: t('screenshareTabLabels.header.description'),
262021
262496
  },
262497
+ capability: {
262498
+ title: t('screenshareTabLabels.capability.title'),
262499
+ description: t('screenshareTabLabels.capability.description'),
262500
+ offHint: t('screenshareTabLabels.capability.offHint'),
262501
+ },
262022
262502
  disabledHint: t('screenshareTabLabels.disabledHint'),
262023
262503
  fields: {
262024
262504
  systemPrompt: {
@@ -262080,6 +262560,13 @@ function AgentScreenShareTab({ labels: labelsOverride, renderPromptContent, tena
262080
262560
  const initialSystemPrompt = (_e = existing === null || existing === void 0 ? void 0 : existing.screensharing_system_prompt) !== null && _e !== void 0 ? _e : '';
262081
262561
  const initialProactivePrompt = (_f = existing === null || existing === void 0 ? void 0 : existing.screensharing_proactive_prompt) !== null && _f !== void 0 ? _f : '';
262082
262562
  const enableVideo = (existing === null || existing === void 0 ? void 0 : existing.enable_video) === true;
262563
+ // "Enable screen sharing" master toggle. Optimistic local mirror of
262564
+ // `enable_video` on the CallConfiguration so the switch responds instantly.
262565
+ const [screenShareEnabled, setScreenShareEnabled] = React__default.useState(enableVideo);
262566
+ const [isTogglingScreenShare, setIsTogglingScreenShare] = React__default.useState(false);
262567
+ React__default.useEffect(() => {
262568
+ setScreenShareEnabled(enableVideo);
262569
+ }, [enableVideo]);
262083
262570
  const [systemPrompt, setSystemPrompt] = React__default.useState(initialSystemPrompt);
262084
262571
  const [proactivePrompt, setProactivePrompt] = React__default.useState(initialProactivePrompt);
262085
262572
  const [selectedPrompt, setSelectedPrompt] = React__default.useState(null);
@@ -262123,6 +262610,43 @@ function AgentScreenShareTab({ labels: labelsOverride, renderPromptContent, tena
262123
262610
  toast.error(labels.toasts.error);
262124
262611
  }
262125
262612
  };
262613
+ const handleToggleScreenShare = async (checked) => {
262614
+ setScreenShareEnabled(checked); // optimistic
262615
+ setIsTogglingScreenShare(true);
262616
+ try {
262617
+ if (existing === null || existing === void 0 ? void 0 : existing.id) {
262618
+ await updateCallConfig({
262619
+ org: tenantKey,
262620
+ userId: username,
262621
+ id: existing.id,
262622
+ requestBody: { enable_video: checked },
262623
+ }).unwrap();
262624
+ }
262625
+ else {
262626
+ // No CallConfiguration row yet — POST one so the flag has somewhere
262627
+ // to live. Mirrors the shape the Settings tab used to create.
262628
+ await createCallConfig({
262629
+ org: tenantKey,
262630
+ userId: username,
262631
+ requestBody: {
262632
+ mentor: mentorId,
262633
+ mode: 'realtime',
262634
+ language: 'en',
262635
+ enable_video: checked,
262636
+ },
262637
+ }).unwrap();
262638
+ }
262639
+ toast.success(labels.toasts.saved);
262640
+ }
262641
+ catch (error) {
262642
+ console.error('[AgentScreenShareTab] toggle screen sharing error', error);
262643
+ setScreenShareEnabled(!checked); // roll back
262644
+ toast.error(labels.toasts.error);
262645
+ }
262646
+ finally {
262647
+ setIsTogglingScreenShare(false);
262648
+ }
262649
+ };
262126
262650
  const openEditor = (field) => {
262127
262651
  setSelectedPrompt({
262128
262652
  label: field === 'screensharing_system_prompt'
@@ -262138,7 +262662,7 @@ function AgentScreenShareTab({ labels: labelsOverride, renderPromptContent, tena
262138
262662
  return renderPromptContent(text);
262139
262663
  return jsx("p", { className: "text-sm whitespace-pre-wrap text-gray-700", children: text });
262140
262664
  };
262141
- return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-4 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "screenshare-tab-body", children: isLoading ? (jsx("div", { className: "flex items-center justify-center py-12", "data-testid": "screenshare-tab-loading", children: jsx(Spinner, {}) })) : (jsxs(Fragment$1, { children: [!enableVideo && (jsx("div", { className: "rounded-md border border-amber-200 bg-amber-50 p-3 text-xs text-amber-800", "data-testid": "screenshare-disabled-hint", role: "status", children: labels.disabledHint })), jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [jsx(PromptCard$1, { label: labels.fields.systemPrompt.label, placeholder: labels.fields.systemPrompt.placeholder, value: systemPrompt, disabled: isSaving, renderContent: renderContent, onEdit: () => openEditor('screensharing_system_prompt') }), jsx(PromptCard$1, { label: labels.fields.proactivePrompt.label, placeholder: labels.fields.proactivePrompt.placeholder, value: proactivePrompt, disabled: isSaving, renderContent: renderContent, onEdit: () => openEditor('screensharing_proactive_prompt') })] }), jsx("div", { className: "flex items-center justify-end border-t border-gray-100 pt-3", children: jsx("button", { type: "button", onClick: handleSave, disabled: isSaving || !isDirty, "data-testid": "screenshare-save-button", className: "inline-flex items-center gap-2 rounded-md bg-gradient-to-r from-[#2563EB] to-[#93C5FD] px-4 py-2 text-sm font-medium text-white hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: isSaving ? labels.savingButton : labels.saveButton }) }), selectedPrompt && (
262665
+ return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-4 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "screenshare-tab-body", children: isLoading ? (jsx("div", { className: "flex items-center justify-center py-12", "data-testid": "screenshare-tab-loading", children: jsx(Spinner, {}) })) : (jsxs(CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: screenShareEnabled, onToggle: handleToggleScreenShare, disabled: isSaving || isTogglingScreenShare, ariaLabel: labels.capability.title, toggleTestId: "screenshare-capability-toggle", children: [jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [jsx(PromptCard$1, { label: labels.fields.systemPrompt.label, placeholder: labels.fields.systemPrompt.placeholder, value: systemPrompt, disabled: isSaving, renderContent: renderContent, onEdit: () => openEditor('screensharing_system_prompt') }), jsx(PromptCard$1, { label: labels.fields.proactivePrompt.label, placeholder: labels.fields.proactivePrompt.placeholder, value: proactivePrompt, disabled: isSaving, renderContent: renderContent, onEdit: () => openEditor('screensharing_proactive_prompt') })] }), jsx("div", { className: "mt-4 flex items-center justify-end border-t border-gray-100 pt-3", children: jsx("button", { type: "button", onClick: handleSave, disabled: isSaving || !isDirty, "data-testid": "screenshare-save-button", className: "inline-flex items-center gap-2 rounded-md bg-gradient-to-r from-[#2563EB] to-[#93C5FD] px-4 py-2 text-sm font-medium text-white hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: isSaving ? labels.savingButton : labels.saveButton }) }), selectedPrompt && (
262142
262666
  // EditPromptModal calls strict `useAgentSettings()` to read
262143
262667
  // `tenantKey` / `username` / `executeGatedAction`. The host
262144
262668
  // app may not have wrapped this tab in `<AgentSettingsProvider>`
@@ -262714,6 +263238,13 @@ const AGENT_LTI_TAB_LABELS = {
262714
263238
  title: 'LTI',
262715
263239
  description: 'Manage LTI agent links, signing keys, tools, and platform endpoints.',
262716
263240
  },
263241
+ capability: {
263242
+ title: 'LTI launches',
263243
+ description: 'Let this agent be added to a Learning Management System (Canvas, Brightspace, Blackboard or Moodle) so students can open it right inside their course. When on, create the links, signing keys, and tools your LMS needs below.',
263244
+ offHint: 'Turn it on to let this agent be embedded in an LMS and set up its links and keys.',
263245
+ toggleSuccess: 'LTI setting updated',
263246
+ toggleError: "Couldn't update LTI setting",
263247
+ },
262717
263248
  subTabs: {
262718
263249
  agentLinks: 'Links',
262719
263250
  keys: 'Keys',
@@ -262875,6 +263406,13 @@ function buildLtiTabLabels(t) {
262875
263406
  title: t('ltiTabLabels.header.title'),
262876
263407
  description: t('ltiTabLabels.header.description'),
262877
263408
  },
263409
+ capability: {
263410
+ title: t('ltiTabLabels.capability.title'),
263411
+ description: t('ltiTabLabels.capability.description'),
263412
+ offHint: t('ltiTabLabels.capability.offHint'),
263413
+ toggleSuccess: t('ltiTabLabels.capability.toggleSuccess'),
263414
+ toggleError: t('ltiTabLabels.capability.toggleError'),
263415
+ },
262878
263416
  subTabs: {
262879
263417
  agentLinks: t('ltiTabLabels.subTabs.agentLinks'),
262880
263418
  keys: t('ltiTabLabels.subTabs.keys'),
@@ -263535,7 +264073,39 @@ function AgentLtiTab({ labels: labelsOverride, tenantKey: tenantKeyProp, mentorI
263535
264073
  const platformKey = tenantKey;
263536
264074
  const settings = mentorSettings;
263537
264075
  const mentorUniqueId = (_e = settings === null || settings === void 0 ? void 0 : settings.mentor_unique_id) !== null && _e !== void 0 ? _e : '';
263538
- const isLtiAccessible = Boolean(settings === null || settings === void 0 ? void 0 : settings.is_lti_accessible);
264076
+ const serverLtiAccessible = Boolean(settings === null || settings === void 0 ? void 0 : settings.is_lti_accessible);
264077
+ // "Enable LTI launches" master toggle (`is_lti_accessible`), moved here from
264078
+ // Settings → Capabilities. Optimistic local mirror so the switch — and the
264079
+ // sub-sections that key off `isLtiAccessible` — respond instantly.
264080
+ const [ltiEnabled, setLtiEnabled] = React__default.useState(serverLtiAccessible);
264081
+ const [isTogglingLti, setIsTogglingLti] = React__default.useState(false);
264082
+ React__default.useEffect(() => {
264083
+ setLtiEnabled(serverLtiAccessible);
264084
+ }, [serverLtiAccessible]);
264085
+ const [editMentor] = useEditMentorMutation();
264086
+ const handleToggleLti = async (checked) => {
264087
+ setLtiEnabled(checked); // optimistic
264088
+ setIsTogglingLti(true);
264089
+ try {
264090
+ await editMentor({
264091
+ mentor: mentorId,
264092
+ org: tenantKey,
264093
+ // @ts-expect-error userId is accepted at runtime
264094
+ userId: username,
264095
+ formData: { is_lti_accessible: checked },
264096
+ }).unwrap();
264097
+ toast.success(labels.capability.toggleSuccess);
264098
+ }
264099
+ catch (error) {
264100
+ console.error('[AgentLtiTab] toggle LTI launches error', error);
264101
+ setLtiEnabled(!checked); // roll back
264102
+ toast.error(labels.capability.toggleError);
264103
+ }
264104
+ finally {
264105
+ setIsTogglingLti(false);
264106
+ }
264107
+ };
264108
+ const isLtiAccessible = ltiEnabled;
263539
264109
  const identity = {
263540
264110
  tenantKey,
263541
264111
  platformKey,
@@ -263551,7 +264121,7 @@ function AgentLtiTab({ labels: labelsOverride, tenantKey: tenantKeyProp, mentorI
263551
264121
  isSettingsLoading,
263552
264122
  isReady: Boolean(platformKey && username),
263553
264123
  };
263554
- return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "lti-tab-body", children: jsxs(Tabs, { defaultValue: SUB_TABS.agentLinks, className: "w-full", children: [jsxs(TabsList, { "aria-label": labels.header.title, "data-testid": "lti-sub-tabs", children: [jsx(TabsTrigger, { value: SUB_TABS.agentLinks, "data-testid": "lti-sub-tab-agent-links", children: labels.subTabs.agentLinks }), jsx(TabsTrigger, { value: SUB_TABS.keys, "data-testid": "lti-sub-tab-keys", children: labels.subTabs.keys }), jsx(TabsTrigger, { value: SUB_TABS.tools, "data-testid": "lti-sub-tab-tools", children: labels.subTabs.tools }), jsx(TabsTrigger, { value: SUB_TABS.toolEndpoints, "data-testid": "lti-sub-tab-tool-endpoints", children: labels.subTabs.toolEndpoints })] }), jsx(TabsContent, { value: SUB_TABS.agentLinks, className: "space-y-4", children: jsx(AgentLinksSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.keys, className: "space-y-4", children: jsx(KeysSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.tools, className: "space-y-4", children: jsx(ToolsSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.toolEndpoints, className: "space-y-4", children: jsx(ToolEndpointsSection, { identity: identity, labels: labels }) })] }) })] }));
264124
+ return (jsxs(Fragment$1, { children: [jsx("div", { className: "flex h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-600", children: labels.header.description })] }) }), jsx("div", { className: "flex-1 space-y-4 p-3 lg:p-4", style: { overflowY: 'auto', overflowX: 'hidden' }, "data-testid": "lti-tab-body", children: jsx(CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: ltiEnabled, onToggle: handleToggleLti, disabled: isSettingsLoading || isTogglingLti, ariaLabel: labels.capability.title, toggleTestId: "lti-capability-toggle", children: jsxs(Tabs, { defaultValue: SUB_TABS.agentLinks, className: "w-full", children: [jsxs(TabsList, { "aria-label": labels.header.title, "data-testid": "lti-sub-tabs", children: [jsx(TabsTrigger, { value: SUB_TABS.agentLinks, "data-testid": "lti-sub-tab-agent-links", children: labels.subTabs.agentLinks }), jsx(TabsTrigger, { value: SUB_TABS.keys, "data-testid": "lti-sub-tab-keys", children: labels.subTabs.keys }), jsx(TabsTrigger, { value: SUB_TABS.tools, "data-testid": "lti-sub-tab-tools", children: labels.subTabs.tools }), jsx(TabsTrigger, { value: SUB_TABS.toolEndpoints, "data-testid": "lti-sub-tab-tool-endpoints", children: labels.subTabs.toolEndpoints })] }), jsx(TabsContent, { value: SUB_TABS.agentLinks, className: "space-y-4", children: jsx(AgentLinksSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.keys, className: "space-y-4", children: jsx(KeysSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.tools, className: "space-y-4", children: jsx(ToolsSection, { identity: identity, labels: labels }) }), jsx(TabsContent, { value: SUB_TABS.toolEndpoints, className: "space-y-4", children: jsx(ToolEndpointsSection, { identity: identity, labels: labels }) })] }) }) })] }));
263555
264125
  }
263556
264126
 
263557
264127
  function SuggestedPrompts({ prompts, permissions, labels, renderContent, onSelectPrompt, onOpenAddPromptModal, }) {
@@ -271785,6 +272355,7 @@ const AGENT_TASKS_TAB_LABELS = {
271785
272355
  header: {
271786
272356
  title: 'Tasks',
271787
272357
  description: 'Configure automated tasks for your agent.',
272358
+ infoBox: 'Let your agent work on its own schedule. Set up recurring tasks it runs automatically — like daily summaries or reminders — without anyone having to ask.',
271788
272359
  },
271789
272360
  toolbar: {
271790
272361
  searchPlaceholder: 'Search all tasks...',
@@ -271871,6 +272442,7 @@ function buildTasksTabLabels(t) {
271871
272442
  header: {
271872
272443
  title: t('tasksTabLabels.header.title'),
271873
272444
  description: t('tasksTabLabels.header.description'),
272445
+ infoBox: t('tasksTabLabels.header.infoBox'),
271874
272446
  },
271875
272447
  toolbar: {
271876
272448
  searchPlaceholder: t('tasksTabLabels.toolbar.searchPlaceholder'),
@@ -272212,13 +272784,13 @@ function AgentTasksTab({ PaginationComponent = DefaultTasksPagination, labels: l
272212
272784
  toast.error(labels.toasts.deleteError);
272213
272785
  }
272214
272786
  };
272215
- return (jsxs("div", { className: "flex h-full flex-col", children: [jsx("div", { className: "flex hidden h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-700", children: labels.header.description })] }) }), jsx("div", { className: "scrollbar-hide flex-1 overflow-y-auto p-3 lg:p-4", children: jsx(TasksTabContent, { taskDate: taskDate, setTaskDate: setTaskDate, setIsScheduleTaskDialogOpen: setIsScheduleTaskDialogOpen, tasksData: paginatedTasks, taskLogs: paginatedLogs, handleOpenDeleteDialog: handleOpenDeleteDialog, isLoading: isLoading, tasksCurrentPage: tasksCurrentPage, tasksTotalPages: tasksTotalPages, onTasksPageChange: setTasksCurrentPage, logsCurrentPage: logsCurrentPage, logsTotalPages: logsTotalPages, onLogsPageChange: setLogsCurrentPage, handleClickLog: (log) => {
272216
- setSelectedLog(log);
272217
- setIsLogDetailModalOpen(true);
272218
- }, selectedTaskId: selectedTaskId, selectedTaskName: (_c = selectedTask === null || selectedTask === void 0 ? void 0 : selectedTask.name) !== null && _c !== void 0 ? _c : null, onSelectTask: setSelectedTaskId, isLogsLoading: isLogsLoading || isLogsFetching, searchQuery: searchQuery, setSearchQuery: setSearchQuery, PaginationComponent: PaginationComponent, labels: labels,
272219
- /* Pass the full unpaginated set so the metric cards reflect totals
272220
- across all pages — not just the visible page. */
272221
- allTasksData: filteredTasks }) }), jsx(ScheduleTaskDialog, { open: isScheduleTaskDialogOpen, onOpenChange: setIsScheduleTaskDialogOpen, onSave: handleSaveTask, isCreating: isCreating, labels: labels }), jsx(DeleteTaskDialog, { open: isDeleteTaskDialogOpen, onOpenChange: setIsDeleteTaskDialogOpen, onConfirm: handleConfirmDelete, taskName: taskToDelete === null || taskToDelete === void 0 ? void 0 : taskToDelete.name, isDeleting: isDeleting, labels: labels }), selectedLog && (jsx(TaskLogDetails, { isOpen: isLogDetailModalOpen, onClose: () => {
272787
+ return (jsxs("div", { className: "flex h-full flex-col", children: [jsx("div", { className: "flex hidden h-[73px] flex-shrink-0 items-center border-b border-gray-200 bg-white p-4 lg:block", children: jsxs("div", { children: [jsx("h3", { className: "mb-1 text-base font-medium text-gray-900", children: labels.header.title }), jsx("p", { className: "text-xs text-gray-700", children: labels.header.description })] }) }), jsxs("div", { className: "scrollbar-hide flex-1 overflow-y-auto p-3 lg:p-4", children: [jsx("div", { className: "mb-4 rounded-md border border-gray-200 bg-gray-50 p-3 text-xs text-gray-600", "data-testid": "tasks-info-box", children: labels.header.infoBox }), jsx(TasksTabContent, { taskDate: taskDate, setTaskDate: setTaskDate, setIsScheduleTaskDialogOpen: setIsScheduleTaskDialogOpen, tasksData: paginatedTasks, taskLogs: paginatedLogs, handleOpenDeleteDialog: handleOpenDeleteDialog, isLoading: isLoading, tasksCurrentPage: tasksCurrentPage, tasksTotalPages: tasksTotalPages, onTasksPageChange: setTasksCurrentPage, logsCurrentPage: logsCurrentPage, logsTotalPages: logsTotalPages, onLogsPageChange: setLogsCurrentPage, handleClickLog: (log) => {
272788
+ setSelectedLog(log);
272789
+ setIsLogDetailModalOpen(true);
272790
+ }, selectedTaskId: selectedTaskId, selectedTaskName: (_c = selectedTask === null || selectedTask === void 0 ? void 0 : selectedTask.name) !== null && _c !== void 0 ? _c : null, onSelectTask: setSelectedTaskId, isLogsLoading: isLogsLoading || isLogsFetching, searchQuery: searchQuery, setSearchQuery: setSearchQuery, PaginationComponent: PaginationComponent, labels: labels,
272791
+ /* Pass the full unpaginated set so the metric cards reflect totals
272792
+ across all pages — not just the visible page. */
272793
+ allTasksData: filteredTasks })] }), jsx(ScheduleTaskDialog, { open: isScheduleTaskDialogOpen, onOpenChange: setIsScheduleTaskDialogOpen, onSave: handleSaveTask, isCreating: isCreating, labels: labels }), jsx(DeleteTaskDialog, { open: isDeleteTaskDialogOpen, onOpenChange: setIsDeleteTaskDialogOpen, onConfirm: handleConfirmDelete, taskName: taskToDelete === null || taskToDelete === void 0 ? void 0 : taskToDelete.name, isDeleting: isDeleting, labels: labels }), selectedLog && (jsx(TaskLogDetails, { isOpen: isLogDetailModalOpen, onClose: () => {
272222
272794
  setIsLogDetailModalOpen(false);
272223
272795
  setSelectedLog(null);
272224
272796
  }, selectedLog: selectedLog, labels: labels }))] }));
@@ -322644,5 +323216,5 @@ var index_es = /*#__PURE__*/Object.freeze({
322644
323216
  vectorsRatio: vectorsRatio
322645
323217
  });
322646
323218
 
322647
- export { AGENT_ACCESS_TAB_LABELS, AGENT_API_TAB_LABELS, AGENT_DATASETS_TAB_LABELS, AGENT_DISCLAIMERS_TAB_LABELS, AGENT_EMBED_TAB_LABELS, AGENT_HISTORY_TAB_LABELS, AGENT_LLM_TAB_LABELS, AGENT_LTI_TAB_LABELS, AGENT_MEMORY_TAB_LABELS, AGENT_PICKER_LABELS, AGENT_PRIVACY_TAB_LABELS, AGENT_PROMPTS_TAB_LABELS, AGENT_SAFETY_TAB_LABELS, AGENT_SCREENSHARE_TAB_LABELS, AGENT_SEARCH_LABELS, AGENT_SETTINGS_TAB_LABELS, AGENT_TASKS_TAB_LABELS, AGENT_TOOLS_TAB_LABELS, AGENT_VOICE_TAB_LABELS, Account, AgentAccessTab, AgentApiTab, AgentCard, AgentDatasetsTab, AgentDisclaimersTab, AgentEmbedTab, AgentEmptyState, AgentHistoryTab, AgentLLMTab, AgentLtiTab, AgentMemoryTab, AgentPrivacyTab, AgentPromptsTab, AgentSafetyTab, AgentScreenShareTab, AgentSearch, AgentSearchFilters, AgentSearchInput, AgentSettingsProvider, AgentSettingsTab, AgentTasksTab, AgentToolsTab, AgentVoiceTab, AppSidebar, CATALOGS, Chat, ClientErrorPage, ConversationStarters$1 as ConversationStarters, CopyButton, CopyMentorModal, CourseBox, CourseContentLayout, CourseContentTabPage, CreatePathwayModal, CredentialDetailModal, CredentialMiniBox, DEFAULT_LOCALE, DeleteMentorModal, EMPTY_PROGRAM_SETTINGS_FORM, EdxIframe, ErrorPage, GreetingMethod, McpTab, MediaBox, MentorSelectionGrid, NavBar, OrganizationTab, PLATFORM_SIDEBAR_FLYOUT_ITEM_COLOR, PLATFORM_SIDEBAR_FLYOUT_TITLE_COLOR, PLATFORM_SIDEBAR_NAV_ACTIVE_BG_OPEN, PLATFORM_SIDEBAR_NAV_MUTED, PathwayDetailModal, PlatformAccountSheet, PlatformSidebar, PlatformSidebarCollapsedLabelFlyout, PlatformSidebarCollapsedNavFlyout, PlatformSidebarFooter, PlatformSidebarNavDivider, PlatformSidebarNavSection, PlatformSidebarSubNavItem, ProfileInfoCards, ProfileTabs, ProgramDetailModal, ProjectsSidebarDropdown, SUPPORTED_LOCALES, SidebarInset, SidebarProvider, SidebarTrigger, SsoLogin, StarButton, UserProfileDropdown, UserProfileModal, WebContainersI18nProvider, formatDateString, getCatalog, getLLMProviderDetails, initializeLocalStorageWithObject, isValidLocale, resolveAgentPickerLabels, resolveAgentSearchLabels, resolveSettingsTabLabels, useAgentSearch, useAgentSearchWithPagination, useAgentSettings, useAgentStar, useGetChatDetails, usePlatformSidebarFooterActions, usePlatformSidebarNavCallback, useSidebar, useT, useTimeTracker, useWebContainersI18n, useWebContainersLocale };
323219
+ export { AGENT_ACCESS_TAB_LABELS, AGENT_ANALYTICS_TAB_LABELS, AGENT_API_TAB_LABELS, AGENT_DATASETS_TAB_LABELS, AGENT_DISCLAIMERS_TAB_LABELS, AGENT_EMBED_TAB_LABELS, AGENT_HISTORY_TAB_LABELS, AGENT_LLM_TAB_LABELS, AGENT_LTI_TAB_LABELS, AGENT_MEMORY_TAB_LABELS, AGENT_PICKER_LABELS, AGENT_PRIVACY_TAB_LABELS, AGENT_PROMPTS_TAB_LABELS, AGENT_SAFETY_TAB_LABELS, AGENT_SCREENSHARE_TAB_LABELS, AGENT_SEARCH_LABELS, AGENT_SETTINGS_TAB_LABELS, AGENT_TASKS_TAB_LABELS, AGENT_TOOLS_TAB_LABELS, AGENT_VOICE_TAB_LABELS, Account, AgentAccessTab, AgentAnalyticsTab, AgentApiTab, AgentCard, AgentDatasetsTab, AgentDisclaimersTab, AgentEmbedTab, AgentEmptyState, AgentHistoryTab, AgentLLMTab, AgentLtiTab, AgentMemoryTab, AgentPrivacyTab, AgentPromptsTab, AgentSafetyTab, AgentScreenShareTab, AgentSearch, AgentSearchFilters, AgentSearchInput, AgentSettingsProvider, AgentSettingsTab, AgentTasksTab, AgentToolsTab, AgentVoiceTab, AppSidebar, CATALOGS, Chat, ClientErrorPage, ConversationStarters$1 as ConversationStarters, CopyButton, CopyMentorModal, CourseBox, CourseContentLayout, CourseContentTabPage, CreatePathwayModal, CredentialDetailModal, CredentialMiniBox, DEFAULT_ANALYTICS_HUB_TABS, DEFAULT_LOCALE, DeleteMentorModal, EMPTY_PROGRAM_SETTINGS_FORM, EdxIframe, ErrorPage, GreetingMethod, McpTab, MediaBox, MentorSelectionGrid, NavBar, OrganizationTab, PLATFORM_SIDEBAR_FLYOUT_ITEM_COLOR, PLATFORM_SIDEBAR_FLYOUT_TITLE_COLOR, PLATFORM_SIDEBAR_NAV_ACTIVE_BG_OPEN, PLATFORM_SIDEBAR_NAV_MUTED, PathwayDetailModal, PlatformAccountSheet, PlatformSidebar, PlatformSidebarCollapsedLabelFlyout, PlatformSidebarCollapsedNavFlyout, PlatformSidebarFooter, PlatformSidebarNavDivider, PlatformSidebarNavSection, PlatformSidebarSubNavItem, ProfileInfoCards, ProfileTabs, ProgramDetailModal, ProjectsSidebarDropdown, SUPPORTED_LOCALES, SidebarInset, SidebarProvider, SidebarTrigger, SsoLogin, StarButton, UserProfileDropdown, UserProfileModal, WebContainersI18nProvider, formatDateString, getCatalog, getLLMProviderDetails, initializeLocalStorageWithObject, isValidLocale, resolveAgentPickerLabels, resolveAgentSearchLabels, resolveSettingsTabLabels, useAgentSearch, useAgentSearchWithPagination, useAgentSettings, useAgentStar, useGetChatDetails, usePlatformSidebarFooterActions, usePlatformSidebarNavCallback, useSidebar, useT, useTimeTracker, useWebContainersI18n, useWebContainersLocale };
322648
323220
  //# sourceMappingURL=index.esm.js.map