@iblai/iblai-js 2.14.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1980,6 +1980,7 @@ var analyticsAnalyticsCourses$3 = {
1980
1980
  loading: "Loading...",
1981
1981
  colCourseName: "Course Name",
1982
1982
  colCourseId: "Course ID",
1983
+ openCourseAriaLabel: "Open course {id} in a new tab",
1983
1984
  colEnrollments: "Enrollments",
1984
1985
  viewCourseAriaLabel: "View details for {name}",
1985
1986
  goToFirstPage: "Go to first page",
@@ -2032,15 +2033,15 @@ var analyticsAnalyticsFinancialStats$3 = {
2032
2033
  viewTraces: "Traces →",
2033
2034
  costByLLMFooter: "{shown} models · ranked by cost"
2034
2035
  };
2036
+ var analyticsAgentScopeLink$3 = {
2037
+ scopeToAgent: "View analytics for {name}"
2038
+ };
2035
2039
  var analyticsAnalyticsMemoryStats$3 = {
2036
2040
  noPermission: "You do not have permission to view user memories.",
2037
2041
  scopeLabel: "Memory scope",
2038
2042
  scopeMentor: "This Agent",
2039
2043
  scopeAllMentors: "All Agents",
2040
2044
  scopeGlobal: "Global",
2041
- searchAgents: "Search Agents…",
2042
- searchAgentsTitle: "Search Agents",
2043
- clearAgentSearch: "Clear Agent Search",
2044
2045
  contentPlaceholder: "Search memory content",
2045
2046
  pickDateRange: "Pick a Date Range",
2046
2047
  allCategories: "All Categories",
@@ -2185,6 +2186,7 @@ var analyticsAnalyticsPrograms$3 = {
2185
2186
  loading: "Loading...",
2186
2187
  programName: "Program Name",
2187
2188
  programId: "Program ID",
2189
+ openProgramAriaLabel: "Open program {id} in a new tab",
2188
2190
  viewDetailsAriaLabel: "View details for {name}",
2189
2191
  goToFirstPage: "Go to first page",
2190
2192
  goToPreviousPage: "Go to previous page",
@@ -2264,7 +2266,6 @@ var analyticsAnalyticsTranscriptsStats$3 = {
2264
2266
  labelModel: "Model:",
2265
2267
  labelModelCard: "model:",
2266
2268
  labelUser: "User:",
2267
- labelUserId: "user_id:",
2268
2269
  roleUser: "User",
2269
2270
  roleAgent: "Agent",
2270
2271
  noMessages: "No messages in this conversation.",
@@ -5670,6 +5671,10 @@ var settingsTabLabels$3 = {
5670
5671
  label: "Featured",
5671
5672
  tooltip: "Feature this agent to highlight it in listings."
5672
5673
  },
5674
+ showExploreMentors: {
5675
+ label: "Show additional agents",
5676
+ tooltip: "Shows the additional agents section on this agent's welcome screen."
5677
+ },
5673
5678
  showAttachment: {
5674
5679
  label: "Show Attachment",
5675
5680
  tooltip: "Lets people attach files to a conversation. Each surface has its own switch: In-app chat covers conversations hosted in the app, Embed widget covers the widget on your own site."
@@ -6488,6 +6493,7 @@ var tabsSettingsTab$3 = {
6488
6493
  whoCanViewTooltipAriaLabel: "More info about chat access",
6489
6494
  whoCanChatTooltipAriaLabel: "More info about chat access",
6490
6495
  featuredTooltipAriaLabel: "More info about featured",
6496
+ showExploreMentorsTooltipAriaLabel: "More info about show additional agents",
6491
6497
  showAttachmentTooltipAriaLabel: "More info about show attachment",
6492
6498
  showVoiceRecordTooltipAriaLabel: "More info about show voice record",
6493
6499
  showVoiceCallTooltipAriaLabel: "More info about show voice call",
@@ -8184,6 +8190,7 @@ var en = {
8184
8190
  analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$3,
8185
8191
  analyticsAnalyticsCourses: analyticsAnalyticsCourses$3,
8186
8192
  analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$3,
8193
+ analyticsAgentScopeLink: analyticsAgentScopeLink$3,
8187
8194
  analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$3,
8188
8195
  analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$3,
8189
8196
  analyticsAnalyticsOverview: analyticsAnalyticsOverview$3,
@@ -9131,6 +9138,7 @@ var analyticsAnalyticsCourses$2 = {
9131
9138
  loading: "Chargement...",
9132
9139
  colCourseName: "Nom du cours",
9133
9140
  colCourseId: "ID du cours",
9141
+ openCourseAriaLabel: "Ouvrir le cours {id} dans un nouvel onglet",
9134
9142
  colEnrollments: "Inscriptions",
9135
9143
  viewCourseAriaLabel: "Voir les détails de {name}",
9136
9144
  goToFirstPage: "Aller à la première page",
@@ -9183,15 +9191,15 @@ var analyticsAnalyticsFinancialStats$2 = {
9183
9191
  viewTraces: "Traces →",
9184
9192
  costByLLMFooter: "{shown} modèles · classés par coût"
9185
9193
  };
9194
+ var analyticsAgentScopeLink$2 = {
9195
+ scopeToAgent: "Voir les analyses de {name}"
9196
+ };
9186
9197
  var analyticsAnalyticsMemoryStats$2 = {
9187
9198
  noPermission: "Vous n'avez pas l'autorisation de consulter les mémoires des utilisateurs.",
9188
9199
  scopeLabel: "Portée de la mémoire",
9189
9200
  scopeMentor: "Cet agent",
9190
9201
  scopeAllMentors: "Tous les agents",
9191
9202
  scopeGlobal: "Global",
9192
- searchAgents: "Rechercher des agents…",
9193
- searchAgentsTitle: "Rechercher des agents",
9194
- clearAgentSearch: "Effacer la recherche d'agent",
9195
9203
  contentPlaceholder: "Rechercher dans le contenu des mémoires",
9196
9204
  pickDateRange: "Choisir une plage de dates",
9197
9205
  allCategories: "Toutes les catégories",
@@ -9336,6 +9344,7 @@ var analyticsAnalyticsPrograms$2 = {
9336
9344
  loading: "Chargement...",
9337
9345
  programName: "Nom du programme",
9338
9346
  programId: "ID du programme",
9347
+ openProgramAriaLabel: "Ouvrir le programme {id} dans un nouvel onglet",
9339
9348
  viewDetailsAriaLabel: "Voir les détails de {name}",
9340
9349
  goToFirstPage: "Aller à la première page",
9341
9350
  goToPreviousPage: "Aller à la page précédente",
@@ -9415,7 +9424,6 @@ var analyticsAnalyticsTranscriptsStats$2 = {
9415
9424
  labelModel: "Modèle :",
9416
9425
  labelModelCard: "modèle :",
9417
9426
  labelUser: "Utilisateur :",
9418
- labelUserId: "ID utilisateur :",
9419
9427
  roleUser: "Utilisateur",
9420
9428
  roleAgent: "Agent",
9421
9429
  noMessages: "Aucun message dans cette conversation.",
@@ -12987,6 +12995,10 @@ var settingsTabLabels$2 = {
12987
12995
  label: "En vedette",
12988
12996
  tooltip: "Mettez cet agent en avant pour le mettre en valeur dans les listes."
12989
12997
  },
12998
+ showExploreMentors: {
12999
+ label: "Afficher les agents supplémentaires",
13000
+ tooltip: "Affiche la section des agents supplémentaires sur l'écran d'accueil de cet agent."
13001
+ },
12990
13002
  showAttachment: {
12991
13003
  label: "Afficher les pièces jointes",
12992
13004
  tooltip: "Permet aux personnes de joindre des fichiers à une conversation. Chaque surface a son propre interrupteur : In-app chat couvre les conversations hébergées dans l'application et Embed widget couvre le widget sur votre propre site."
@@ -13805,6 +13817,7 @@ var tabsSettingsTab$2 = {
13805
13817
  whoCanViewTooltipAriaLabel: "Plus d'informations sur l'accès à la consultation",
13806
13818
  whoCanChatTooltipAriaLabel: "Plus d'informations sur l'accès au chat",
13807
13819
  featuredTooltipAriaLabel: "Plus d'informations sur la mise en avant",
13820
+ showExploreMentorsTooltipAriaLabel: "Plus d'informations sur l'affichage des agents supplémentaires",
13808
13821
  showAttachmentTooltipAriaLabel: "Plus d'informations sur l'affichage des pièces jointes",
13809
13822
  showVoiceRecordTooltipAriaLabel: "Plus d'informations sur l'affichage de l'enregistrement vocal",
13810
13823
  showVoiceCallTooltipAriaLabel: "More info about show voice call",
@@ -15335,6 +15348,7 @@ var fr = {
15335
15348
  analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$2,
15336
15349
  analyticsAnalyticsCourses: analyticsAnalyticsCourses$2,
15337
15350
  analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$2,
15351
+ analyticsAgentScopeLink: analyticsAgentScopeLink$2,
15338
15352
  analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$2,
15339
15353
  analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$2,
15340
15354
  analyticsAnalyticsOverview: analyticsAnalyticsOverview$2,
@@ -16282,6 +16296,7 @@ var analyticsAnalyticsCourses$1 = {
16282
16296
  loading: "Cargando...",
16283
16297
  colCourseName: "Nombre del curso",
16284
16298
  colCourseId: "ID del curso",
16299
+ openCourseAriaLabel: "Abrir el curso {id} en una pestaña nueva",
16285
16300
  colEnrollments: "Inscripciones",
16286
16301
  viewCourseAriaLabel: "Ver detalles de {name}",
16287
16302
  goToFirstPage: "Ir a la primera página",
@@ -16334,15 +16349,15 @@ var analyticsAnalyticsFinancialStats$1 = {
16334
16349
  viewTraces: "Trazas →",
16335
16350
  costByLLMFooter: "{shown} modelos · ordenados por costo"
16336
16351
  };
16352
+ var analyticsAgentScopeLink$1 = {
16353
+ scopeToAgent: "Ver analíticas de {name}"
16354
+ };
16337
16355
  var analyticsAnalyticsMemoryStats$1 = {
16338
16356
  noPermission: "No tienes permiso para ver los recuerdos de los usuarios.",
16339
16357
  scopeLabel: "Alcance de la memoria",
16340
16358
  scopeMentor: "Este agente",
16341
16359
  scopeAllMentors: "Todos los agentes",
16342
16360
  scopeGlobal: "Global",
16343
- searchAgents: "Buscar agentes…",
16344
- searchAgentsTitle: "Buscar agentes",
16345
- clearAgentSearch: "Borrar la búsqueda de agentes",
16346
16361
  contentPlaceholder: "Buscar en el contenido de los recuerdos",
16347
16362
  pickDateRange: "Elige un rango de fechas",
16348
16363
  allCategories: "Todas las categorías",
@@ -16487,6 +16502,7 @@ var analyticsAnalyticsPrograms$1 = {
16487
16502
  loading: "Cargando...",
16488
16503
  programName: "Nombre del programa",
16489
16504
  programId: "ID del programa",
16505
+ openProgramAriaLabel: "Abrir el programa {id} en una pestaña nueva",
16490
16506
  viewDetailsAriaLabel: "Ver detalles de {name}",
16491
16507
  goToFirstPage: "Ir a la primera página",
16492
16508
  goToPreviousPage: "Ir a la página anterior",
@@ -16566,7 +16582,6 @@ var analyticsAnalyticsTranscriptsStats$1 = {
16566
16582
  labelModel: "Modelo:",
16567
16583
  labelModelCard: "modelo:",
16568
16584
  labelUser: "Usuario:",
16569
- labelUserId: "ID de usuario:",
16570
16585
  roleUser: "Usuario",
16571
16586
  roleAgent: "Agente",
16572
16587
  noMessages: "No hay mensajes en esta conversación.",
@@ -20138,6 +20153,10 @@ var settingsTabLabels$1 = {
20138
20153
  label: "Destacado",
20139
20154
  tooltip: "Destaque este agente para resaltarlo en los listados."
20140
20155
  },
20156
+ showExploreMentors: {
20157
+ label: "Mostrar agentes adicionales",
20158
+ tooltip: "Muestra la sección de agentes adicionales en la pantalla de bienvenida de este agente."
20159
+ },
20141
20160
  showAttachment: {
20142
20161
  label: "Mostrar archivos adjuntos",
20143
20162
  tooltip: "Permite que las personas adjunten archivos a una conversación. Cada superficie tiene su propio interruptor: In-app chat cubre las conversaciones alojadas en la aplicación y Embed widget cubre el widget en tu propio sitio."
@@ -20956,6 +20975,7 @@ var tabsSettingsTab$1 = {
20956
20975
  whoCanViewTooltipAriaLabel: "Más información sobre el acceso de visualización",
20957
20976
  whoCanChatTooltipAriaLabel: "Más información sobre el acceso al chat",
20958
20977
  featuredTooltipAriaLabel: "Más información sobre destacado",
20978
+ showExploreMentorsTooltipAriaLabel: "Más información sobre mostrar agentes adicionales",
20959
20979
  showAttachmentTooltipAriaLabel: "Más información sobre mostrar adjuntos",
20960
20980
  showVoiceRecordTooltipAriaLabel: "Más información sobre mostrar grabación de voz",
20961
20981
  showVoiceCallTooltipAriaLabel: "More info about show voice call",
@@ -22486,6 +22506,7 @@ var es = {
22486
22506
  analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail$1,
22487
22507
  analyticsAnalyticsCourses: analyticsAnalyticsCourses$1,
22488
22508
  analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats$1,
22509
+ analyticsAgentScopeLink: analyticsAgentScopeLink$1,
22489
22510
  analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats$1,
22490
22511
  analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats$1,
22491
22512
  analyticsAnalyticsOverview: analyticsAnalyticsOverview$1,
@@ -23433,6 +23454,7 @@ var analyticsAnalyticsCourses = {
23433
23454
  loading: "加载中...",
23434
23455
  colCourseName: "课程名称",
23435
23456
  colCourseId: "课程 ID",
23457
+ openCourseAriaLabel: "在新标签页中打开课程 {id}",
23436
23458
  colEnrollments: "注册人数",
23437
23459
  viewCourseAriaLabel: "查看 {name} 的详情",
23438
23460
  goToFirstPage: "跳转到第一页",
@@ -23485,15 +23507,15 @@ var analyticsAnalyticsFinancialStats = {
23485
23507
  viewTraces: "追踪 →",
23486
23508
  costByLLMFooter: "{shown} 个模型 · 按成本排序"
23487
23509
  };
23510
+ var analyticsAgentScopeLink = {
23511
+ scopeToAgent: "查看 {name} 的分析"
23512
+ };
23488
23513
  var analyticsAnalyticsMemoryStats = {
23489
23514
  noPermission: "您没有查看用户记忆的权限。",
23490
23515
  scopeLabel: "记忆范围",
23491
23516
  scopeMentor: "当前智能体",
23492
23517
  scopeAllMentors: "所有智能体",
23493
23518
  scopeGlobal: "全局",
23494
- searchAgents: "搜索智能体…",
23495
- searchAgentsTitle: "搜索智能体",
23496
- clearAgentSearch: "清除智能体搜索",
23497
23519
  contentPlaceholder: "搜索记忆内容",
23498
23520
  pickDateRange: "选择日期范围",
23499
23521
  allCategories: "所有类别",
@@ -23638,6 +23660,7 @@ var analyticsAnalyticsPrograms = {
23638
23660
  loading: "加载中...",
23639
23661
  programName: "项目名称",
23640
23662
  programId: "项目 ID",
23663
+ openProgramAriaLabel: "在新标签页中打开项目 {id}",
23641
23664
  viewDetailsAriaLabel: "查看 {name} 的详情",
23642
23665
  goToFirstPage: "跳至第一页",
23643
23666
  goToPreviousPage: "跳至上一页",
@@ -23717,7 +23740,6 @@ var analyticsAnalyticsTranscriptsStats = {
23717
23740
  labelModel: "模型:",
23718
23741
  labelModelCard: "模型:",
23719
23742
  labelUser: "用户:",
23720
- labelUserId: "用户 ID:",
23721
23743
  roleUser: "用户",
23722
23744
  roleAgent: "智能体",
23723
23745
  noMessages: "此对话中没有消息。",
@@ -27289,6 +27311,10 @@ var settingsTabLabels = {
27289
27311
  label: "推荐",
27290
27312
  tooltip: "将此智能体设为推荐,使其在列表中突出显示。"
27291
27313
  },
27314
+ showExploreMentors: {
27315
+ label: "显示其他智能体",
27316
+ tooltip: "在此智能体的欢迎界面上显示“其他智能体”部分。"
27317
+ },
27292
27318
  showAttachment: {
27293
27319
  label: "显示附件",
27294
27320
  tooltip: "允许用户在对话中添加附件。每个界面都有独立的开关:In-app chat 用于应用内托管的对话,Embed widget 用于您自己网站上的小组件。"
@@ -28107,6 +28133,7 @@ var tabsSettingsTab = {
28107
28133
  whoCanViewTooltipAriaLabel: "关于查看访问权限的更多信息",
28108
28134
  whoCanChatTooltipAriaLabel: "关于聊天访问权限的更多信息",
28109
28135
  featuredTooltipAriaLabel: "关于精选的更多信息",
28136
+ showExploreMentorsTooltipAriaLabel: "关于显示其他智能体的更多信息",
28110
28137
  showAttachmentTooltipAriaLabel: "关于显示附件的更多信息",
28111
28138
  showVoiceRecordTooltipAriaLabel: "关于显示语音录制的更多信息",
28112
28139
  showVoiceCallTooltipAriaLabel: "More info about show voice call",
@@ -29637,6 +29664,7 @@ var zh = {
29637
29664
  analyticsAnalyticsCourseDetail: analyticsAnalyticsCourseDetail,
29638
29665
  analyticsAnalyticsCourses: analyticsAnalyticsCourses,
29639
29666
  analyticsAnalyticsFinancialStats: analyticsAnalyticsFinancialStats,
29667
+ analyticsAgentScopeLink: analyticsAgentScopeLink,
29640
29668
  analyticsAnalyticsMemoryStats: analyticsAnalyticsMemoryStats,
29641
29669
  analyticsAnalyticsMonetizationStats: analyticsAnalyticsMonetizationStats,
29642
29670
  analyticsAnalyticsOverview: analyticsAnalyticsOverview,
@@ -78337,7 +78365,7 @@ const createLucideIcon = (iconName, iconNode) => {
78337
78365
  */
78338
78366
 
78339
78367
 
78340
- const __iconNode$2q = [
78368
+ const __iconNode$2r = [
78341
78369
  [
78342
78370
  "path",
78343
78371
  {
@@ -78346,7 +78374,7 @@ const __iconNode$2q = [
78346
78374
  }
78347
78375
  ]
78348
78376
  ];
78349
- const Activity = createLucideIcon("activity", __iconNode$2q);
78377
+ const Activity = createLucideIcon("activity", __iconNode$2r);
78350
78378
 
78351
78379
  /**
78352
78380
  * @license lucide-react v0.528.0 - ISC
@@ -78356,12 +78384,12 @@ const Activity = createLucideIcon("activity", __iconNode$2q);
78356
78384
  */
78357
78385
 
78358
78386
 
78359
- const __iconNode$2p = [
78387
+ const __iconNode$2q = [
78360
78388
  ["path", { d: "M17 12H7", key: "16if0g" }],
78361
78389
  ["path", { d: "M19 18H5", key: "18s9l3" }],
78362
78390
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
78363
78391
  ];
78364
- const AlignCenter = createLucideIcon("align-center", __iconNode$2p);
78392
+ const AlignCenter = createLucideIcon("align-center", __iconNode$2q);
78365
78393
 
78366
78394
  /**
78367
78395
  * @license lucide-react v0.528.0 - ISC
@@ -78371,12 +78399,12 @@ const AlignCenter = createLucideIcon("align-center", __iconNode$2p);
78371
78399
  */
78372
78400
 
78373
78401
 
78374
- const __iconNode$2o = [
78402
+ const __iconNode$2p = [
78375
78403
  ["path", { d: "M15 12H3", key: "6jk70r" }],
78376
78404
  ["path", { d: "M17 18H3", key: "1amg6g" }],
78377
78405
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
78378
78406
  ];
78379
- const AlignLeft = createLucideIcon("align-left", __iconNode$2o);
78407
+ const AlignLeft = createLucideIcon("align-left", __iconNode$2p);
78380
78408
 
78381
78409
  /**
78382
78410
  * @license lucide-react v0.528.0 - ISC
@@ -78386,12 +78414,12 @@ const AlignLeft = createLucideIcon("align-left", __iconNode$2o);
78386
78414
  */
78387
78415
 
78388
78416
 
78389
- const __iconNode$2n = [
78417
+ const __iconNode$2o = [
78390
78418
  ["path", { d: "M21 12H9", key: "dn1m92" }],
78391
78419
  ["path", { d: "M21 18H7", key: "1ygte8" }],
78392
78420
  ["path", { d: "M21 6H3", key: "1jwq7v" }]
78393
78421
  ];
78394
- const AlignRight = createLucideIcon("align-right", __iconNode$2n);
78422
+ const AlignRight = createLucideIcon("align-right", __iconNode$2o);
78395
78423
 
78396
78424
  /**
78397
78425
  * @license lucide-react v0.528.0 - ISC
@@ -78401,12 +78429,12 @@ const AlignRight = createLucideIcon("align-right", __iconNode$2n);
78401
78429
  */
78402
78430
 
78403
78431
 
78404
- const __iconNode$2m = [
78432
+ const __iconNode$2n = [
78405
78433
  ["rect", { width: "20", height: "5", x: "2", y: "3", rx: "1", key: "1wp1u1" }],
78406
78434
  ["path", { d: "M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8", key: "1s80jp" }],
78407
78435
  ["path", { d: "M10 12h4", key: "a56b0p" }]
78408
78436
  ];
78409
- const Archive = createLucideIcon("archive", __iconNode$2m);
78437
+ const Archive = createLucideIcon("archive", __iconNode$2n);
78410
78438
 
78411
78439
  /**
78412
78440
  * @license lucide-react v0.528.0 - ISC
@@ -78416,11 +78444,11 @@ const Archive = createLucideIcon("archive", __iconNode$2m);
78416
78444
  */
78417
78445
 
78418
78446
 
78419
- const __iconNode$2l = [
78447
+ const __iconNode$2m = [
78420
78448
  ["path", { d: "M12 5v14", key: "s699le" }],
78421
78449
  ["path", { d: "m19 12-7 7-7-7", key: "1idqje" }]
78422
78450
  ];
78423
- const ArrowDown = createLucideIcon("arrow-down", __iconNode$2l);
78451
+ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2m);
78424
78452
 
78425
78453
  /**
78426
78454
  * @license lucide-react v0.528.0 - ISC
@@ -78430,11 +78458,11 @@ const ArrowDown = createLucideIcon("arrow-down", __iconNode$2l);
78430
78458
  */
78431
78459
 
78432
78460
 
78433
- const __iconNode$2k = [
78461
+ const __iconNode$2l = [
78434
78462
  ["path", { d: "m12 19-7-7 7-7", key: "1l729n" }],
78435
78463
  ["path", { d: "M19 12H5", key: "x3x0zl" }]
78436
78464
  ];
78437
- const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2k);
78465
+ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2l);
78438
78466
 
78439
78467
  /**
78440
78468
  * @license lucide-react v0.528.0 - ISC
@@ -78444,11 +78472,11 @@ const ArrowLeft = createLucideIcon("arrow-left", __iconNode$2k);
78444
78472
  */
78445
78473
 
78446
78474
 
78447
- const __iconNode$2j = [
78475
+ const __iconNode$2k = [
78448
78476
  ["path", { d: "M5 12h14", key: "1ays0h" }],
78449
78477
  ["path", { d: "m12 5 7 7-7 7", key: "xquz4c" }]
78450
78478
  ];
78451
- const ArrowRight = createLucideIcon("arrow-right", __iconNode$2j);
78479
+ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2k);
78452
78480
 
78453
78481
  /**
78454
78482
  * @license lucide-react v0.528.0 - ISC
@@ -78458,11 +78486,11 @@ const ArrowRight = createLucideIcon("arrow-right", __iconNode$2j);
78458
78486
  */
78459
78487
 
78460
78488
 
78461
- const __iconNode$2i = [
78489
+ const __iconNode$2j = [
78462
78490
  ["path", { d: "m5 12 7-7 7 7", key: "hav0vg" }],
78463
78491
  ["path", { d: "M12 19V5", key: "x0mq9r" }]
78464
78492
  ];
78465
- const ArrowUp = createLucideIcon("arrow-up", __iconNode$2i);
78493
+ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2j);
78466
78494
 
78467
78495
  /**
78468
78496
  * @license lucide-react v0.528.0 - ISC
@@ -78472,7 +78500,7 @@ const ArrowUp = createLucideIcon("arrow-up", __iconNode$2i);
78472
78500
  */
78473
78501
 
78474
78502
 
78475
- const __iconNode$2h = [
78503
+ const __iconNode$2i = [
78476
78504
  [
78477
78505
  "path",
78478
78506
  {
@@ -78482,7 +78510,7 @@ const __iconNode$2h = [
78482
78510
  ],
78483
78511
  ["circle", { cx: "12", cy: "8", r: "6", key: "1vp47v" }]
78484
78512
  ];
78485
- const Award = createLucideIcon("award", __iconNode$2h);
78513
+ const Award = createLucideIcon("award", __iconNode$2i);
78486
78514
 
78487
78515
  /**
78488
78516
  * @license lucide-react v0.528.0 - ISC
@@ -78492,11 +78520,11 @@ const Award = createLucideIcon("award", __iconNode$2h);
78492
78520
  */
78493
78521
 
78494
78522
 
78495
- const __iconNode$2g = [
78523
+ const __iconNode$2h = [
78496
78524
  ["path", { d: "M4.929 4.929 19.07 19.071", key: "196cmz" }],
78497
78525
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
78498
78526
  ];
78499
- const Ban = createLucideIcon("ban", __iconNode$2g);
78527
+ const Ban = createLucideIcon("ban", __iconNode$2h);
78500
78528
 
78501
78529
  /**
78502
78530
  * @license lucide-react v0.528.0 - ISC
@@ -78506,12 +78534,12 @@ const Ban = createLucideIcon("ban", __iconNode$2g);
78506
78534
  */
78507
78535
 
78508
78536
 
78509
- const __iconNode$2f = [
78537
+ const __iconNode$2g = [
78510
78538
  ["rect", { width: "20", height: "12", x: "2", y: "6", rx: "2", key: "9lu3g6" }],
78511
78539
  ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }],
78512
78540
  ["path", { d: "M6 12h.01M18 12h.01", key: "113zkx" }]
78513
78541
  ];
78514
- const Banknote = createLucideIcon("banknote", __iconNode$2f);
78542
+ const Banknote = createLucideIcon("banknote", __iconNode$2g);
78515
78543
 
78516
78544
  /**
78517
78545
  * @license lucide-react v0.528.0 - ISC
@@ -78521,7 +78549,7 @@ const Banknote = createLucideIcon("banknote", __iconNode$2f);
78521
78549
  */
78522
78550
 
78523
78551
 
78524
- const __iconNode$2e = [
78552
+ const __iconNode$2f = [
78525
78553
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
78526
78554
  ["path", { d: "M22 8c0-2.3-.8-4.3-2-6", key: "5bb3ad" }],
78527
78555
  [
@@ -78533,7 +78561,7 @@ const __iconNode$2e = [
78533
78561
  ],
78534
78562
  ["path", { d: "M4 2C2.8 3.7 2 5.7 2 8", key: "tap9e0" }]
78535
78563
  ];
78536
- const BellRing = createLucideIcon("bell-ring", __iconNode$2e);
78564
+ const BellRing = createLucideIcon("bell-ring", __iconNode$2f);
78537
78565
 
78538
78566
  /**
78539
78567
  * @license lucide-react v0.528.0 - ISC
@@ -78543,7 +78571,7 @@ const BellRing = createLucideIcon("bell-ring", __iconNode$2e);
78543
78571
  */
78544
78572
 
78545
78573
 
78546
- const __iconNode$2d = [
78574
+ const __iconNode$2e = [
78547
78575
  ["path", { d: "M10.268 21a2 2 0 0 0 3.464 0", key: "vwvbt9" }],
78548
78576
  [
78549
78577
  "path",
@@ -78553,7 +78581,7 @@ const __iconNode$2d = [
78553
78581
  }
78554
78582
  ]
78555
78583
  ];
78556
- const Bell = createLucideIcon("bell", __iconNode$2d);
78584
+ const Bell = createLucideIcon("bell", __iconNode$2e);
78557
78585
 
78558
78586
  /**
78559
78587
  * @license lucide-react v0.528.0 - ISC
@@ -78563,13 +78591,13 @@ const Bell = createLucideIcon("bell", __iconNode$2d);
78563
78591
  */
78564
78592
 
78565
78593
 
78566
- const __iconNode$2c = [
78594
+ const __iconNode$2d = [
78567
78595
  [
78568
78596
  "path",
78569
78597
  { d: "M6 12h9a4 4 0 0 1 0 8H7a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h7a4 4 0 0 1 0 8", key: "mg9rjx" }
78570
78598
  ]
78571
78599
  ];
78572
- const Bold$1 = createLucideIcon("bold", __iconNode$2c);
78600
+ const Bold$1 = createLucideIcon("bold", __iconNode$2d);
78573
78601
 
78574
78602
  /**
78575
78603
  * @license lucide-react v0.528.0 - ISC
@@ -78579,7 +78607,7 @@ const Bold$1 = createLucideIcon("bold", __iconNode$2c);
78579
78607
  */
78580
78608
 
78581
78609
 
78582
- const __iconNode$2b = [
78610
+ const __iconNode$2c = [
78583
78611
  ["path", { d: "M12 7v14", key: "1akyts" }],
78584
78612
  [
78585
78613
  "path",
@@ -78589,7 +78617,7 @@ const __iconNode$2b = [
78589
78617
  }
78590
78618
  ]
78591
78619
  ];
78592
- const BookOpen = createLucideIcon("book-open", __iconNode$2b);
78620
+ const BookOpen = createLucideIcon("book-open", __iconNode$2c);
78593
78621
 
78594
78622
  /**
78595
78623
  * @license lucide-react v0.528.0 - ISC
@@ -78599,7 +78627,7 @@ const BookOpen = createLucideIcon("book-open", __iconNode$2b);
78599
78627
  */
78600
78628
 
78601
78629
 
78602
- const __iconNode$2a = [
78630
+ const __iconNode$2b = [
78603
78631
  ["path", { d: "M12 8V4H8", key: "hb8ula" }],
78604
78632
  ["rect", { width: "16", height: "12", x: "4", y: "8", rx: "2", key: "enze0r" }],
78605
78633
  ["path", { d: "M2 14h2", key: "vft8re" }],
@@ -78607,7 +78635,7 @@ const __iconNode$2a = [
78607
78635
  ["path", { d: "M15 13v2", key: "1xurst" }],
78608
78636
  ["path", { d: "M9 13v2", key: "rq6x2g" }]
78609
78637
  ];
78610
- const Bot = createLucideIcon("bot", __iconNode$2a);
78638
+ const Bot = createLucideIcon("bot", __iconNode$2b);
78611
78639
 
78612
78640
  /**
78613
78641
  * @license lucide-react v0.528.0 - ISC
@@ -78617,11 +78645,11 @@ const Bot = createLucideIcon("bot", __iconNode$2a);
78617
78645
  */
78618
78646
 
78619
78647
 
78620
- const __iconNode$29 = [
78648
+ const __iconNode$2a = [
78621
78649
  ["path", { d: "M16 20V4a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16", key: "jecpp" }],
78622
78650
  ["rect", { width: "20", height: "14", x: "2", y: "6", rx: "2", key: "i6l2r4" }]
78623
78651
  ];
78624
- const Briefcase = createLucideIcon("briefcase", __iconNode$29);
78652
+ const Briefcase = createLucideIcon("briefcase", __iconNode$2a);
78625
78653
 
78626
78654
  /**
78627
78655
  * @license lucide-react v0.528.0 - ISC
@@ -78631,7 +78659,7 @@ const Briefcase = createLucideIcon("briefcase", __iconNode$29);
78631
78659
  */
78632
78660
 
78633
78661
 
78634
- const __iconNode$28 = [
78662
+ const __iconNode$29 = [
78635
78663
  ["path", { d: "M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z", key: "1b4qmf" }],
78636
78664
  ["path", { d: "M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2", key: "i71pzd" }],
78637
78665
  ["path", { d: "M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2", key: "10jefs" }],
@@ -78640,7 +78668,7 @@ const __iconNode$28 = [
78640
78668
  ["path", { d: "M10 14h4", key: "kelpxr" }],
78641
78669
  ["path", { d: "M10 18h4", key: "1ulq68" }]
78642
78670
  ];
78643
- const Building2 = createLucideIcon("building-2", __iconNode$28);
78671
+ const Building2 = createLucideIcon("building-2", __iconNode$29);
78644
78672
 
78645
78673
  /**
78646
78674
  * @license lucide-react v0.528.0 - ISC
@@ -78650,13 +78678,13 @@ const Building2 = createLucideIcon("building-2", __iconNode$28);
78650
78678
  */
78651
78679
 
78652
78680
 
78653
- const __iconNode$27 = [
78681
+ const __iconNode$28 = [
78654
78682
  ["path", { d: "M8 2v4", key: "1cmpym" }],
78655
78683
  ["path", { d: "M16 2v4", key: "4m81vk" }],
78656
78684
  ["rect", { width: "18", height: "18", x: "3", y: "4", rx: "2", key: "1hopcy" }],
78657
78685
  ["path", { d: "M3 10h18", key: "8toen8" }]
78658
78686
  ];
78659
- const Calendar$1 = createLucideIcon("calendar", __iconNode$27);
78687
+ const Calendar$1 = createLucideIcon("calendar", __iconNode$28);
78660
78688
 
78661
78689
  /**
78662
78690
  * @license lucide-react v0.528.0 - ISC
@@ -78666,11 +78694,11 @@ const Calendar$1 = createLucideIcon("calendar", __iconNode$27);
78666
78694
  */
78667
78695
 
78668
78696
 
78669
- const __iconNode$26 = [
78697
+ const __iconNode$27 = [
78670
78698
  ["path", { d: "M18 6 7 17l-5-5", key: "116fxf" }],
78671
78699
  ["path", { d: "m22 10-7.5 7.5L13 16", key: "ke71qq" }]
78672
78700
  ];
78673
- const CheckCheck = createLucideIcon("check-check", __iconNode$26);
78701
+ const CheckCheck = createLucideIcon("check-check", __iconNode$27);
78674
78702
 
78675
78703
  /**
78676
78704
  * @license lucide-react v0.528.0 - ISC
@@ -78680,8 +78708,8 @@ const CheckCheck = createLucideIcon("check-check", __iconNode$26);
78680
78708
  */
78681
78709
 
78682
78710
 
78683
- const __iconNode$25 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
78684
- const Check = createLucideIcon("check", __iconNode$25);
78711
+ const __iconNode$26 = [["path", { d: "M20 6 9 17l-5-5", key: "1gmf2c" }]];
78712
+ const Check = createLucideIcon("check", __iconNode$26);
78685
78713
 
78686
78714
  /**
78687
78715
  * @license lucide-react v0.528.0 - ISC
@@ -78691,8 +78719,8 @@ const Check = createLucideIcon("check", __iconNode$25);
78691
78719
  */
78692
78720
 
78693
78721
 
78694
- const __iconNode$24 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
78695
- const ChevronDown = createLucideIcon("chevron-down", __iconNode$24);
78722
+ const __iconNode$25 = [["path", { d: "m6 9 6 6 6-6", key: "qrunsl" }]];
78723
+ const ChevronDown = createLucideIcon("chevron-down", __iconNode$25);
78696
78724
 
78697
78725
  /**
78698
78726
  * @license lucide-react v0.528.0 - ISC
@@ -78702,11 +78730,11 @@ const ChevronDown = createLucideIcon("chevron-down", __iconNode$24);
78702
78730
  */
78703
78731
 
78704
78732
 
78705
- const __iconNode$23 = [
78733
+ const __iconNode$24 = [
78706
78734
  ["path", { d: "m17 18-6-6 6-6", key: "1yerx2" }],
78707
78735
  ["path", { d: "M7 6v12", key: "1p53r6" }]
78708
78736
  ];
78709
- const ChevronFirst = createLucideIcon("chevron-first", __iconNode$23);
78737
+ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$24);
78710
78738
 
78711
78739
  /**
78712
78740
  * @license lucide-react v0.528.0 - ISC
@@ -78716,11 +78744,11 @@ const ChevronFirst = createLucideIcon("chevron-first", __iconNode$23);
78716
78744
  */
78717
78745
 
78718
78746
 
78719
- const __iconNode$22 = [
78747
+ const __iconNode$23 = [
78720
78748
  ["path", { d: "m7 18 6-6-6-6", key: "lwmzdw" }],
78721
78749
  ["path", { d: "M17 6v12", key: "1o0aio" }]
78722
78750
  ];
78723
- const ChevronLast = createLucideIcon("chevron-last", __iconNode$22);
78751
+ const ChevronLast = createLucideIcon("chevron-last", __iconNode$23);
78724
78752
 
78725
78753
  /**
78726
78754
  * @license lucide-react v0.528.0 - ISC
@@ -78730,8 +78758,8 @@ const ChevronLast = createLucideIcon("chevron-last", __iconNode$22);
78730
78758
  */
78731
78759
 
78732
78760
 
78733
- const __iconNode$21 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
78734
- const ChevronLeft = createLucideIcon("chevron-left", __iconNode$21);
78761
+ const __iconNode$22 = [["path", { d: "m15 18-6-6 6-6", key: "1wnfg3" }]];
78762
+ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$22);
78735
78763
 
78736
78764
  /**
78737
78765
  * @license lucide-react v0.528.0 - ISC
@@ -78741,8 +78769,8 @@ const ChevronLeft = createLucideIcon("chevron-left", __iconNode$21);
78741
78769
  */
78742
78770
 
78743
78771
 
78744
- const __iconNode$20 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
78745
- const ChevronRight = createLucideIcon("chevron-right", __iconNode$20);
78772
+ const __iconNode$21 = [["path", { d: "m9 18 6-6-6-6", key: "mthhwq" }]];
78773
+ const ChevronRight = createLucideIcon("chevron-right", __iconNode$21);
78746
78774
 
78747
78775
  /**
78748
78776
  * @license lucide-react v0.528.0 - ISC
@@ -78752,8 +78780,8 @@ const ChevronRight = createLucideIcon("chevron-right", __iconNode$20);
78752
78780
  */
78753
78781
 
78754
78782
 
78755
- const __iconNode$1$ = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
78756
- const ChevronUp = createLucideIcon("chevron-up", __iconNode$1$);
78783
+ const __iconNode$20 = [["path", { d: "m18 15-6-6-6 6", key: "153udz" }]];
78784
+ const ChevronUp = createLucideIcon("chevron-up", __iconNode$20);
78757
78785
 
78758
78786
  /**
78759
78787
  * @license lucide-react v0.528.0 - ISC
@@ -78763,11 +78791,11 @@ const ChevronUp = createLucideIcon("chevron-up", __iconNode$1$);
78763
78791
  */
78764
78792
 
78765
78793
 
78766
- const __iconNode$1_ = [
78794
+ const __iconNode$1$ = [
78767
78795
  ["path", { d: "m11 17-5-5 5-5", key: "13zhaf" }],
78768
78796
  ["path", { d: "m18 17-5-5 5-5", key: "h8a8et" }]
78769
78797
  ];
78770
- const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1_);
78798
+ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1$);
78771
78799
 
78772
78800
  /**
78773
78801
  * @license lucide-react v0.528.0 - ISC
@@ -78777,11 +78805,11 @@ const ChevronsLeft = createLucideIcon("chevrons-left", __iconNode$1_);
78777
78805
  */
78778
78806
 
78779
78807
 
78780
- const __iconNode$1Z = [
78808
+ const __iconNode$1_ = [
78781
78809
  ["path", { d: "m6 17 5-5-5-5", key: "xnjwq" }],
78782
78810
  ["path", { d: "m13 17 5-5-5-5", key: "17xmmf" }]
78783
78811
  ];
78784
- const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1Z);
78812
+ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1_);
78785
78813
 
78786
78814
  /**
78787
78815
  * @license lucide-react v0.528.0 - ISC
@@ -78791,11 +78819,11 @@ const ChevronsRight = createLucideIcon("chevrons-right", __iconNode$1Z);
78791
78819
  */
78792
78820
 
78793
78821
 
78794
- const __iconNode$1Y = [
78822
+ const __iconNode$1Z = [
78795
78823
  ["path", { d: "m7 15 5 5 5-5", key: "1hf1tw" }],
78796
78824
  ["path", { d: "m7 9 5-5 5 5", key: "sgt6xg" }]
78797
78825
  ];
78798
- const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1Y);
78826
+ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1Z);
78799
78827
 
78800
78828
  /**
78801
78829
  * @license lucide-react v0.528.0 - ISC
@@ -78805,12 +78833,12 @@ const ChevronsUpDown = createLucideIcon("chevrons-up-down", __iconNode$1Y);
78805
78833
  */
78806
78834
 
78807
78835
 
78808
- const __iconNode$1X = [
78836
+ const __iconNode$1Y = [
78809
78837
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
78810
78838
  ["line", { x1: "12", x2: "12", y1: "8", y2: "12", key: "1pkeuh" }],
78811
78839
  ["line", { x1: "12", x2: "12.01", y1: "16", y2: "16", key: "4dfq90" }]
78812
78840
  ];
78813
- const CircleAlert = createLucideIcon("circle-alert", __iconNode$1X);
78841
+ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1Y);
78814
78842
 
78815
78843
  /**
78816
78844
  * @license lucide-react v0.528.0 - ISC
@@ -78820,11 +78848,11 @@ const CircleAlert = createLucideIcon("circle-alert", __iconNode$1X);
78820
78848
  */
78821
78849
 
78822
78850
 
78823
- const __iconNode$1W = [
78851
+ const __iconNode$1X = [
78824
78852
  ["path", { d: "M21.801 10A10 10 0 1 1 17 3.335", key: "yps3ct" }],
78825
78853
  ["path", { d: "m9 11 3 3L22 4", key: "1pflzl" }]
78826
78854
  ];
78827
- const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1W);
78855
+ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1X);
78828
78856
 
78829
78857
  /**
78830
78858
  * @license lucide-react v0.528.0 - ISC
@@ -78834,11 +78862,11 @@ const CircleCheckBig = createLucideIcon("circle-check-big", __iconNode$1W);
78834
78862
  */
78835
78863
 
78836
78864
 
78837
- const __iconNode$1V = [
78865
+ const __iconNode$1W = [
78838
78866
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
78839
78867
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
78840
78868
  ];
78841
- const CircleCheck = createLucideIcon("circle-check", __iconNode$1V);
78869
+ const CircleCheck = createLucideIcon("circle-check", __iconNode$1W);
78842
78870
 
78843
78871
  /**
78844
78872
  * @license lucide-react v0.528.0 - ISC
@@ -78848,11 +78876,11 @@ const CircleCheck = createLucideIcon("circle-check", __iconNode$1V);
78848
78876
  */
78849
78877
 
78850
78878
 
78851
- const __iconNode$1U = [
78879
+ const __iconNode$1V = [
78852
78880
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
78853
78881
  ["path", { d: "M8 12h8", key: "1wcyev" }]
78854
78882
  ];
78855
- const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1U);
78883
+ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1V);
78856
78884
 
78857
78885
  /**
78858
78886
  * @license lucide-react v0.528.0 - ISC
@@ -78862,11 +78890,11 @@ const CircleMinus$1 = createLucideIcon("circle-minus", __iconNode$1U);
78862
78890
  */
78863
78891
 
78864
78892
 
78865
- const __iconNode$1T = [
78893
+ const __iconNode$1U = [
78866
78894
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
78867
78895
  ["rect", { x: "9", y: "9", width: "6", height: "6", rx: "1", key: "1ssd4o" }]
78868
78896
  ];
78869
- const CircleStop = createLucideIcon("circle-stop", __iconNode$1T);
78897
+ const CircleStop = createLucideIcon("circle-stop", __iconNode$1U);
78870
78898
 
78871
78899
  /**
78872
78900
  * @license lucide-react v0.528.0 - ISC
@@ -78876,12 +78904,12 @@ const CircleStop = createLucideIcon("circle-stop", __iconNode$1T);
78876
78904
  */
78877
78905
 
78878
78906
 
78879
- const __iconNode$1S = [
78907
+ const __iconNode$1T = [
78880
78908
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
78881
78909
  ["path", { d: "m15 9-6 6", key: "1uzhvr" }],
78882
78910
  ["path", { d: "m9 9 6 6", key: "z0biqf" }]
78883
78911
  ];
78884
- const CircleX = createLucideIcon("circle-x", __iconNode$1S);
78912
+ const CircleX = createLucideIcon("circle-x", __iconNode$1T);
78885
78913
 
78886
78914
  /**
78887
78915
  * @license lucide-react v0.528.0 - ISC
@@ -78891,8 +78919,8 @@ const CircleX = createLucideIcon("circle-x", __iconNode$1S);
78891
78919
  */
78892
78920
 
78893
78921
 
78894
- const __iconNode$1R = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
78895
- const Circle = createLucideIcon("circle", __iconNode$1R);
78922
+ const __iconNode$1S = [["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]];
78923
+ const Circle = createLucideIcon("circle", __iconNode$1S);
78896
78924
 
78897
78925
  /**
78898
78926
  * @license lucide-react v0.528.0 - ISC
@@ -78902,7 +78930,7 @@ const Circle = createLucideIcon("circle", __iconNode$1R);
78902
78930
  */
78903
78931
 
78904
78932
 
78905
- const __iconNode$1Q = [
78933
+ const __iconNode$1R = [
78906
78934
  ["rect", { width: "8", height: "4", x: "8", y: "2", rx: "1", ry: "1", key: "tgr4d6" }],
78907
78935
  [
78908
78936
  "path",
@@ -78916,7 +78944,7 @@ const __iconNode$1Q = [
78916
78944
  ["path", { d: "M8 11h.01", key: "1dfujw" }],
78917
78945
  ["path", { d: "M8 16h.01", key: "18s6g9" }]
78918
78946
  ];
78919
- const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1Q);
78947
+ const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1R);
78920
78948
 
78921
78949
  /**
78922
78950
  * @license lucide-react v0.528.0 - ISC
@@ -78926,11 +78954,11 @@ const ClipboardList = createLucideIcon("clipboard-list", __iconNode$1Q);
78926
78954
  */
78927
78955
 
78928
78956
 
78929
- const __iconNode$1P = [
78957
+ const __iconNode$1Q = [
78930
78958
  ["path", { d: "M12 6v6l4 2", key: "mmk7yg" }],
78931
78959
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }]
78932
78960
  ];
78933
- const Clock = createLucideIcon("clock", __iconNode$1P);
78961
+ const Clock = createLucideIcon("clock", __iconNode$1Q);
78934
78962
 
78935
78963
  /**
78936
78964
  * @license lucide-react v0.528.0 - ISC
@@ -78940,12 +78968,12 @@ const Clock = createLucideIcon("clock", __iconNode$1P);
78940
78968
  */
78941
78969
 
78942
78970
 
78943
- const __iconNode$1O = [
78971
+ const __iconNode$1P = [
78944
78972
  ["path", { d: "m18 16 4-4-4-4", key: "1inbqp" }],
78945
78973
  ["path", { d: "m6 8-4 4 4 4", key: "15zrgr" }],
78946
78974
  ["path", { d: "m14.5 4-5 16", key: "e7oirm" }]
78947
78975
  ];
78948
- const CodeXml = createLucideIcon("code-xml", __iconNode$1O);
78976
+ const CodeXml = createLucideIcon("code-xml", __iconNode$1P);
78949
78977
 
78950
78978
  /**
78951
78979
  * @license lucide-react v0.528.0 - ISC
@@ -78955,11 +78983,11 @@ const CodeXml = createLucideIcon("code-xml", __iconNode$1O);
78955
78983
  */
78956
78984
 
78957
78985
 
78958
- const __iconNode$1N = [
78986
+ const __iconNode$1O = [
78959
78987
  ["path", { d: "m16 18 6-6-6-6", key: "eg8j8" }],
78960
78988
  ["path", { d: "m8 6-6 6 6 6", key: "ppft3o" }]
78961
78989
  ];
78962
- const Code$1 = createLucideIcon("code", __iconNode$1N);
78990
+ const Code$1 = createLucideIcon("code", __iconNode$1O);
78963
78991
 
78964
78992
  /**
78965
78993
  * @license lucide-react v0.528.0 - ISC
@@ -78969,11 +78997,11 @@ const Code$1 = createLucideIcon("code", __iconNode$1N);
78969
78997
  */
78970
78998
 
78971
78999
 
78972
- const __iconNode$1M = [
79000
+ const __iconNode$1N = [
78973
79001
  ["rect", { width: "14", height: "14", x: "8", y: "8", rx: "2", ry: "2", key: "17jyea" }],
78974
79002
  ["path", { d: "M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2", key: "zix9uf" }]
78975
79003
  ];
78976
- const Copy = createLucideIcon("copy", __iconNode$1M);
79004
+ const Copy = createLucideIcon("copy", __iconNode$1N);
78977
79005
 
78978
79006
  /**
78979
79007
  * @license lucide-react v0.528.0 - ISC
@@ -78983,11 +79011,11 @@ const Copy = createLucideIcon("copy", __iconNode$1M);
78983
79011
  */
78984
79012
 
78985
79013
 
78986
- const __iconNode$1L = [
79014
+ const __iconNode$1M = [
78987
79015
  ["rect", { width: "20", height: "14", x: "2", y: "5", rx: "2", key: "ynyp8z" }],
78988
79016
  ["line", { x1: "2", x2: "22", y1: "10", y2: "10", key: "1b3vmo" }]
78989
79017
  ];
78990
- const CreditCard = createLucideIcon("credit-card", __iconNode$1L);
79018
+ const CreditCard = createLucideIcon("credit-card", __iconNode$1M);
78991
79019
 
78992
79020
  /**
78993
79021
  * @license lucide-react v0.528.0 - ISC
@@ -78997,12 +79025,12 @@ const CreditCard = createLucideIcon("credit-card", __iconNode$1L);
78997
79025
  */
78998
79026
 
78999
79027
 
79000
- const __iconNode$1K = [
79028
+ const __iconNode$1L = [
79001
79029
  ["ellipse", { cx: "12", cy: "5", rx: "9", ry: "3", key: "msslwz" }],
79002
79030
  ["path", { d: "M3 5V19A9 3 0 0 0 21 19V5", key: "1wlel7" }],
79003
79031
  ["path", { d: "M3 12A9 3 0 0 0 21 12", key: "mv7ke4" }]
79004
79032
  ];
79005
- const Database = createLucideIcon("database", __iconNode$1K);
79033
+ const Database = createLucideIcon("database", __iconNode$1L);
79006
79034
 
79007
79035
  /**
79008
79036
  * @license lucide-react v0.528.0 - ISC
@@ -79012,11 +79040,11 @@ const Database = createLucideIcon("database", __iconNode$1K);
79012
79040
  */
79013
79041
 
79014
79042
 
79015
- const __iconNode$1J = [
79043
+ const __iconNode$1K = [
79016
79044
  ["line", { x1: "12", x2: "12", y1: "2", y2: "22", key: "7eqyqh" }],
79017
79045
  ["path", { d: "M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6", key: "1b0p4s" }]
79018
79046
  ];
79019
- const DollarSign = createLucideIcon("dollar-sign", __iconNode$1J);
79047
+ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1K);
79020
79048
 
79021
79049
  /**
79022
79050
  * @license lucide-react v0.528.0 - ISC
@@ -79026,7 +79054,7 @@ const DollarSign = createLucideIcon("dollar-sign", __iconNode$1J);
79026
79054
  */
79027
79055
 
79028
79056
 
79029
- const __iconNode$1I = [
79057
+ const __iconNode$1J = [
79030
79058
  ["path", { d: "M11 20H2", key: "nlcfvz" }],
79031
79059
  [
79032
79060
  "path",
@@ -79039,7 +79067,7 @@ const __iconNode$1I = [
79039
79067
  ["path", { d: "M14 12h.01", key: "1jfl7z" }],
79040
79068
  ["path", { d: "M22 20h-3", key: "vhrsz" }]
79041
79069
  ];
79042
- const DoorOpen = createLucideIcon("door-open", __iconNode$1I);
79070
+ const DoorOpen = createLucideIcon("door-open", __iconNode$1J);
79043
79071
 
79044
79072
  /**
79045
79073
  * @license lucide-react v0.528.0 - ISC
@@ -79049,12 +79077,12 @@ const DoorOpen = createLucideIcon("door-open", __iconNode$1I);
79049
79077
  */
79050
79078
 
79051
79079
 
79052
- const __iconNode$1H = [
79080
+ const __iconNode$1I = [
79053
79081
  ["path", { d: "M12 15V3", key: "m9g1x1" }],
79054
79082
  ["path", { d: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4", key: "ih7n3h" }],
79055
79083
  ["path", { d: "m7 10 5 5 5-5", key: "brsn70" }]
79056
79084
  ];
79057
- const Download = createLucideIcon("download", __iconNode$1H);
79085
+ const Download = createLucideIcon("download", __iconNode$1I);
79058
79086
 
79059
79087
  /**
79060
79088
  * @license lucide-react v0.528.0 - ISC
@@ -79064,12 +79092,12 @@ const Download = createLucideIcon("download", __iconNode$1H);
79064
79092
  */
79065
79093
 
79066
79094
 
79067
- const __iconNode$1G = [
79095
+ const __iconNode$1H = [
79068
79096
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
79069
79097
  ["circle", { cx: "12", cy: "5", r: "1", key: "gxeob9" }],
79070
79098
  ["circle", { cx: "12", cy: "19", r: "1", key: "lyex9k" }]
79071
79099
  ];
79072
- const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1G);
79100
+ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1H);
79073
79101
 
79074
79102
  /**
79075
79103
  * @license lucide-react v0.528.0 - ISC
@@ -79079,12 +79107,12 @@ const EllipsisVertical = createLucideIcon("ellipsis-vertical", __iconNode$1G);
79079
79107
  */
79080
79108
 
79081
79109
 
79082
- const __iconNode$1F = [
79110
+ const __iconNode$1G = [
79083
79111
  ["circle", { cx: "12", cy: "12", r: "1", key: "41hilf" }],
79084
79112
  ["circle", { cx: "19", cy: "12", r: "1", key: "1wjl8i" }],
79085
79113
  ["circle", { cx: "5", cy: "12", r: "1", key: "1pcz8c" }]
79086
79114
  ];
79087
- const Ellipsis = createLucideIcon("ellipsis", __iconNode$1F);
79115
+ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1G);
79088
79116
 
79089
79117
  /**
79090
79118
  * @license lucide-react v0.528.0 - ISC
@@ -79094,12 +79122,12 @@ const Ellipsis = createLucideIcon("ellipsis", __iconNode$1F);
79094
79122
  */
79095
79123
 
79096
79124
 
79097
- const __iconNode$1E = [
79125
+ const __iconNode$1F = [
79098
79126
  ["path", { d: "M15 3h6v6", key: "1q9fwt" }],
79099
79127
  ["path", { d: "M10 14 21 3", key: "gplh6r" }],
79100
79128
  ["path", { d: "M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6", key: "a6xqqp" }]
79101
79129
  ];
79102
- const ExternalLink = createLucideIcon("external-link", __iconNode$1E);
79130
+ const ExternalLink = createLucideIcon("external-link", __iconNode$1F);
79103
79131
 
79104
79132
  /**
79105
79133
  * @license lucide-react v0.528.0 - ISC
@@ -79109,7 +79137,7 @@ const ExternalLink = createLucideIcon("external-link", __iconNode$1E);
79109
79137
  */
79110
79138
 
79111
79139
 
79112
- const __iconNode$1D = [
79140
+ const __iconNode$1E = [
79113
79141
  [
79114
79142
  "path",
79115
79143
  {
@@ -79127,7 +79155,7 @@ const __iconNode$1D = [
79127
79155
  ],
79128
79156
  ["path", { d: "m2 2 20 20", key: "1ooewy" }]
79129
79157
  ];
79130
- const EyeOff = createLucideIcon("eye-off", __iconNode$1D);
79158
+ const EyeOff = createLucideIcon("eye-off", __iconNode$1E);
79131
79159
 
79132
79160
  /**
79133
79161
  * @license lucide-react v0.528.0 - ISC
@@ -79137,7 +79165,7 @@ const EyeOff = createLucideIcon("eye-off", __iconNode$1D);
79137
79165
  */
79138
79166
 
79139
79167
 
79140
- const __iconNode$1C = [
79168
+ const __iconNode$1D = [
79141
79169
  [
79142
79170
  "path",
79143
79171
  {
@@ -79147,7 +79175,7 @@ const __iconNode$1C = [
79147
79175
  ],
79148
79176
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
79149
79177
  ];
79150
- const Eye = createLucideIcon("eye", __iconNode$1C);
79178
+ const Eye = createLucideIcon("eye", __iconNode$1D);
79151
79179
 
79152
79180
  /**
79153
79181
  * @license lucide-react v0.528.0 - ISC
@@ -79157,7 +79185,7 @@ const Eye = createLucideIcon("eye", __iconNode$1C);
79157
79185
  */
79158
79186
 
79159
79187
 
79160
- const __iconNode$1B = [
79188
+ const __iconNode$1C = [
79161
79189
  ["path", { d: "M10 12v-1", key: "v7bkov" }],
79162
79190
  ["path", { d: "M10 18v-2", key: "1cjy8d" }],
79163
79191
  ["path", { d: "M10 7V6", key: "dljcrl" }],
@@ -79168,7 +79196,7 @@ const __iconNode$1B = [
79168
79196
  ],
79169
79197
  ["circle", { cx: "10", cy: "20", r: "2", key: "1xzdoj" }]
79170
79198
  ];
79171
- const FileArchive = createLucideIcon("file-archive", __iconNode$1B);
79199
+ const FileArchive = createLucideIcon("file-archive", __iconNode$1C);
79172
79200
 
79173
79201
  /**
79174
79202
  * @license lucide-react v0.528.0 - ISC
@@ -79178,7 +79206,7 @@ const FileArchive = createLucideIcon("file-archive", __iconNode$1B);
79178
79206
  */
79179
79207
 
79180
79208
 
79181
- const __iconNode$1A = [
79209
+ const __iconNode$1B = [
79182
79210
  ["path", { d: "M17.5 22h.5a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v3", key: "rslqgf" }],
79183
79211
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79184
79212
  [
@@ -79189,7 +79217,7 @@ const __iconNode$1A = [
79189
79217
  }
79190
79218
  ]
79191
79219
  ];
79192
- const FileAudio = createLucideIcon("file-audio", __iconNode$1A);
79220
+ const FileAudio = createLucideIcon("file-audio", __iconNode$1B);
79193
79221
 
79194
79222
  /**
79195
79223
  * @license lucide-react v0.528.0 - ISC
@@ -79199,13 +79227,13 @@ const FileAudio = createLucideIcon("file-audio", __iconNode$1A);
79199
79227
  */
79200
79228
 
79201
79229
 
79202
- const __iconNode$1z = [
79230
+ const __iconNode$1A = [
79203
79231
  ["path", { d: "M10 12.5 8 15l2 2.5", key: "1tg20x" }],
79204
79232
  ["path", { d: "m14 12.5 2 2.5-2 2.5", key: "yinavb" }],
79205
79233
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79206
79234
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }]
79207
79235
  ];
79208
- const FileCode = createLucideIcon("file-code", __iconNode$1z);
79236
+ const FileCode = createLucideIcon("file-code", __iconNode$1A);
79209
79237
 
79210
79238
  /**
79211
79239
  * @license lucide-react v0.528.0 - ISC
@@ -79215,13 +79243,13 @@ const FileCode = createLucideIcon("file-code", __iconNode$1z);
79215
79243
  */
79216
79244
 
79217
79245
 
79218
- const __iconNode$1y = [
79246
+ const __iconNode$1z = [
79219
79247
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
79220
79248
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79221
79249
  ["path", { d: "M12 18v-6", key: "17g6i2" }],
79222
79250
  ["path", { d: "m9 15 3 3 3-3", key: "1npd3o" }]
79223
79251
  ];
79224
- const FileDown = createLucideIcon("file-down", __iconNode$1y);
79252
+ const FileDown = createLucideIcon("file-down", __iconNode$1z);
79225
79253
 
79226
79254
  /**
79227
79255
  * @license lucide-react v0.528.0 - ISC
@@ -79231,13 +79259,13 @@ const FileDown = createLucideIcon("file-down", __iconNode$1y);
79231
79259
  */
79232
79260
 
79233
79261
 
79234
- const __iconNode$1x = [
79262
+ const __iconNode$1y = [
79235
79263
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
79236
79264
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79237
79265
  ["circle", { cx: "10", cy: "12", r: "2", key: "737tya" }],
79238
79266
  ["path", { d: "m20 17-1.296-1.296a2.41 2.41 0 0 0-3.408 0L9 22", key: "wt3hpn" }]
79239
79267
  ];
79240
- const FileImage = createLucideIcon("file-image", __iconNode$1x);
79268
+ const FileImage = createLucideIcon("file-image", __iconNode$1y);
79241
79269
 
79242
79270
  /**
79243
79271
  * @license lucide-react v0.528.0 - ISC
@@ -79247,7 +79275,7 @@ const FileImage = createLucideIcon("file-image", __iconNode$1x);
79247
79275
  */
79248
79276
 
79249
79277
 
79250
- const __iconNode$1w = [
79278
+ const __iconNode$1x = [
79251
79279
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79252
79280
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z", key: "1mlx9k" }],
79253
79281
  [
@@ -79258,7 +79286,7 @@ const __iconNode$1w = [
79258
79286
  }
79259
79287
  ]
79260
79288
  ];
79261
- const FilePlay = createLucideIcon("file-play", __iconNode$1w);
79289
+ const FilePlay = createLucideIcon("file-play", __iconNode$1x);
79262
79290
 
79263
79291
  /**
79264
79292
  * @license lucide-react v0.528.0 - ISC
@@ -79268,7 +79296,7 @@ const FilePlay = createLucideIcon("file-play", __iconNode$1w);
79268
79296
  */
79269
79297
 
79270
79298
 
79271
- const __iconNode$1v = [
79299
+ const __iconNode$1w = [
79272
79300
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
79273
79301
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79274
79302
  ["path", { d: "M8 13h2", key: "yr2amv" }],
@@ -79276,7 +79304,7 @@ const __iconNode$1v = [
79276
79304
  ["path", { d: "M8 17h2", key: "2yhykz" }],
79277
79305
  ["path", { d: "M14 17h2", key: "10kma7" }]
79278
79306
  ];
79279
- const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1v);
79307
+ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1w);
79280
79308
 
79281
79309
  /**
79282
79310
  * @license lucide-react v0.528.0 - ISC
@@ -79286,14 +79314,14 @@ const FileSpreadsheet = createLucideIcon("file-spreadsheet", __iconNode$1v);
79286
79314
  */
79287
79315
 
79288
79316
 
79289
- const __iconNode$1u = [
79317
+ const __iconNode$1v = [
79290
79318
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
79291
79319
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }],
79292
79320
  ["path", { d: "M10 9H8", key: "b1mrlr" }],
79293
79321
  ["path", { d: "M16 13H8", key: "t4e002" }],
79294
79322
  ["path", { d: "M16 17H8", key: "z1uh3a" }]
79295
79323
  ];
79296
- const FileText = createLucideIcon("file-text", __iconNode$1u);
79324
+ const FileText = createLucideIcon("file-text", __iconNode$1v);
79297
79325
 
79298
79326
  /**
79299
79327
  * @license lucide-react v0.528.0 - ISC
@@ -79303,11 +79331,11 @@ const FileText = createLucideIcon("file-text", __iconNode$1u);
79303
79331
  */
79304
79332
 
79305
79333
 
79306
- const __iconNode$1t = [
79334
+ const __iconNode$1u = [
79307
79335
  ["path", { d: "M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z", key: "1rqfz7" }],
79308
79336
  ["path", { d: "M14 2v4a2 2 0 0 0 2 2h4", key: "tnqrlb" }]
79309
79337
  ];
79310
- const File$1 = createLucideIcon("file", __iconNode$1t);
79338
+ const File$1 = createLucideIcon("file", __iconNode$1u);
79311
79339
 
79312
79340
  /**
79313
79341
  * @license lucide-react v0.528.0 - ISC
@@ -79317,7 +79345,7 @@ const File$1 = createLucideIcon("file", __iconNode$1t);
79317
79345
  */
79318
79346
 
79319
79347
 
79320
- const __iconNode$1s = [
79348
+ const __iconNode$1t = [
79321
79349
  [
79322
79350
  "path",
79323
79351
  {
@@ -79335,7 +79363,7 @@ const __iconNode$1s = [
79335
79363
  ["path", { d: "M3 5a2 2 0 0 0 2 2h3", key: "f2jnh7" }],
79336
79364
  ["path", { d: "M3 3v13a2 2 0 0 0 2 2h3", key: "k8epm1" }]
79337
79365
  ];
79338
- const FolderTree = createLucideIcon("folder-tree", __iconNode$1s);
79366
+ const FolderTree = createLucideIcon("folder-tree", __iconNode$1t);
79339
79367
 
79340
79368
  /**
79341
79369
  * @license lucide-react v0.528.0 - ISC
@@ -79345,14 +79373,14 @@ const FolderTree = createLucideIcon("folder-tree", __iconNode$1s);
79345
79373
  */
79346
79374
 
79347
79375
 
79348
- const __iconNode$1r = [
79376
+ const __iconNode$1s = [
79349
79377
  ["path", { d: "m14.5 12.5-8 8a2.119 2.119 0 1 1-3-3l8-8", key: "15492f" }],
79350
79378
  ["path", { d: "m16 16 6-6", key: "vzrcl6" }],
79351
79379
  ["path", { d: "m8 8 6-6", key: "18bi4p" }],
79352
79380
  ["path", { d: "m9 7 8 8", key: "5jnvq1" }],
79353
79381
  ["path", { d: "m21 11-8-8", key: "z4y7zo" }]
79354
79382
  ];
79355
- const Gavel = createLucideIcon("gavel", __iconNode$1r);
79383
+ const Gavel = createLucideIcon("gavel", __iconNode$1s);
79356
79384
 
79357
79385
  /**
79358
79386
  * @license lucide-react v0.528.0 - ISC
@@ -79362,13 +79390,13 @@ const Gavel = createLucideIcon("gavel", __iconNode$1r);
79362
79390
  */
79363
79391
 
79364
79392
 
79365
- const __iconNode$1q = [
79393
+ const __iconNode$1r = [
79366
79394
  ["line", { x1: "6", x2: "6", y1: "3", y2: "15", key: "17qcm7" }],
79367
79395
  ["circle", { cx: "18", cy: "6", r: "3", key: "1h7g24" }],
79368
79396
  ["circle", { cx: "6", cy: "18", r: "3", key: "fqmcym" }],
79369
79397
  ["path", { d: "M18 9a9 9 0 0 1-9 9", key: "n2h4wq" }]
79370
79398
  ];
79371
- const GitBranch = createLucideIcon("git-branch", __iconNode$1q);
79399
+ const GitBranch = createLucideIcon("git-branch", __iconNode$1r);
79372
79400
 
79373
79401
  /**
79374
79402
  * @license lucide-react v0.528.0 - ISC
@@ -79378,12 +79406,12 @@ const GitBranch = createLucideIcon("git-branch", __iconNode$1q);
79378
79406
  */
79379
79407
 
79380
79408
 
79381
- const __iconNode$1p = [
79409
+ const __iconNode$1q = [
79382
79410
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
79383
79411
  ["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
79384
79412
  ["path", { d: "M2 12h20", key: "9i4pu4" }]
79385
79413
  ];
79386
- const Globe = createLucideIcon("globe", __iconNode$1p);
79414
+ const Globe = createLucideIcon("globe", __iconNode$1q);
79387
79415
 
79388
79416
  /**
79389
79417
  * @license lucide-react v0.528.0 - ISC
@@ -79393,7 +79421,7 @@ const Globe = createLucideIcon("globe", __iconNode$1p);
79393
79421
  */
79394
79422
 
79395
79423
 
79396
- const __iconNode$1o = [
79424
+ const __iconNode$1p = [
79397
79425
  [
79398
79426
  "path",
79399
79427
  {
@@ -79404,7 +79432,7 @@ const __iconNode$1o = [
79404
79432
  ["path", { d: "M22 10v6", key: "1lu8f3" }],
79405
79433
  ["path", { d: "M6 12.5V16a6 3 0 0 0 12 0v-3.5", key: "1r8lef" }]
79406
79434
  ];
79407
- const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1o);
79435
+ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1p);
79408
79436
 
79409
79437
  /**
79410
79438
  * @license lucide-react v0.528.0 - ISC
@@ -79414,7 +79442,7 @@ const GraduationCap = createLucideIcon("graduation-cap", __iconNode$1o);
79414
79442
  */
79415
79443
 
79416
79444
 
79417
- const __iconNode$1n = [
79445
+ const __iconNode$1o = [
79418
79446
  ["path", { d: "M14 18a2 2 0 0 0-4 0", key: "1v8fkw" }],
79419
79447
  [
79420
79448
  "path",
@@ -79427,7 +79455,7 @@ const __iconNode$1n = [
79427
79455
  ["circle", { cx: "17", cy: "18", r: "3", key: "82mm0e" }],
79428
79456
  ["circle", { cx: "7", cy: "18", r: "3", key: "lvkj7j" }]
79429
79457
  ];
79430
- const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1n);
79458
+ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1o);
79431
79459
 
79432
79460
  /**
79433
79461
  * @license lucide-react v0.528.0 - ISC
@@ -79437,13 +79465,13 @@ const HatGlasses = createLucideIcon("hat-glasses", __iconNode$1n);
79437
79465
  */
79438
79466
 
79439
79467
 
79440
- const __iconNode$1m = [
79468
+ const __iconNode$1n = [
79441
79469
  ["path", { d: "M4 12h8", key: "17cfdx" }],
79442
79470
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
79443
79471
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
79444
79472
  ["path", { d: "m17 12 3-2v8", key: "1hhhft" }]
79445
79473
  ];
79446
- const Heading1 = createLucideIcon("heading-1", __iconNode$1m);
79474
+ const Heading1 = createLucideIcon("heading-1", __iconNode$1n);
79447
79475
 
79448
79476
  /**
79449
79477
  * @license lucide-react v0.528.0 - ISC
@@ -79453,13 +79481,13 @@ const Heading1 = createLucideIcon("heading-1", __iconNode$1m);
79453
79481
  */
79454
79482
 
79455
79483
 
79456
- const __iconNode$1l = [
79484
+ const __iconNode$1m = [
79457
79485
  ["path", { d: "M4 12h8", key: "17cfdx" }],
79458
79486
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
79459
79487
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
79460
79488
  ["path", { d: "M21 18h-4c0-4 4-3 4-6 0-1.5-2-2.5-4-1", key: "9jr5yi" }]
79461
79489
  ];
79462
- const Heading2 = createLucideIcon("heading-2", __iconNode$1l);
79490
+ const Heading2 = createLucideIcon("heading-2", __iconNode$1m);
79463
79491
 
79464
79492
  /**
79465
79493
  * @license lucide-react v0.528.0 - ISC
@@ -79469,14 +79497,14 @@ const Heading2 = createLucideIcon("heading-2", __iconNode$1l);
79469
79497
  */
79470
79498
 
79471
79499
 
79472
- const __iconNode$1k = [
79500
+ const __iconNode$1l = [
79473
79501
  ["path", { d: "M4 12h8", key: "17cfdx" }],
79474
79502
  ["path", { d: "M4 18V6", key: "1rz3zl" }],
79475
79503
  ["path", { d: "M12 18V6", key: "zqpxq5" }],
79476
79504
  ["path", { d: "M17.5 10.5c1.7-1 3.5 0 3.5 1.5a2 2 0 0 1-2 2", key: "68ncm8" }],
79477
79505
  ["path", { d: "M17 17.5c2 1.5 4 .3 4-1.5a2 2 0 0 0-2-2", key: "1ejuhz" }]
79478
79506
  ];
79479
- const Heading3 = createLucideIcon("heading-3", __iconNode$1k);
79507
+ const Heading3 = createLucideIcon("heading-3", __iconNode$1l);
79480
79508
 
79481
79509
  /**
79482
79510
  * @license lucide-react v0.528.0 - ISC
@@ -79486,12 +79514,12 @@ const Heading3 = createLucideIcon("heading-3", __iconNode$1k);
79486
79514
  */
79487
79515
 
79488
79516
 
79489
- const __iconNode$1j = [
79517
+ const __iconNode$1k = [
79490
79518
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
79491
79519
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }],
79492
79520
  ["path", { d: "M12 7v5l4 2", key: "1fdv2h" }]
79493
79521
  ];
79494
- const History = createLucideIcon("history", __iconNode$1j);
79522
+ const History = createLucideIcon("history", __iconNode$1k);
79495
79523
 
79496
79524
  /**
79497
79525
  * @license lucide-react v0.528.0 - ISC
@@ -79501,12 +79529,12 @@ const History = createLucideIcon("history", __iconNode$1j);
79501
79529
  */
79502
79530
 
79503
79531
 
79504
- const __iconNode$1i = [
79532
+ const __iconNode$1j = [
79505
79533
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", ry: "2", key: "1m3agn" }],
79506
79534
  ["circle", { cx: "9", cy: "9", r: "2", key: "af1f0g" }],
79507
79535
  ["path", { d: "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21", key: "1xmnt7" }]
79508
79536
  ];
79509
- const Image$3 = createLucideIcon("image", __iconNode$1i);
79537
+ const Image$3 = createLucideIcon("image", __iconNode$1j);
79510
79538
 
79511
79539
  /**
79512
79540
  * @license lucide-react v0.528.0 - ISC
@@ -79516,7 +79544,7 @@ const Image$3 = createLucideIcon("image", __iconNode$1i);
79516
79544
  */
79517
79545
 
79518
79546
 
79519
- const __iconNode$1h = [
79547
+ const __iconNode$1i = [
79520
79548
  ["polyline", { points: "22 12 16 12 14 15 10 15 8 12 2 12", key: "o97t9d" }],
79521
79549
  [
79522
79550
  "path",
@@ -79526,7 +79554,7 @@ const __iconNode$1h = [
79526
79554
  }
79527
79555
  ]
79528
79556
  ];
79529
- const Inbox = createLucideIcon("inbox", __iconNode$1h);
79557
+ const Inbox = createLucideIcon("inbox", __iconNode$1i);
79530
79558
 
79531
79559
  /**
79532
79560
  * @license lucide-react v0.528.0 - ISC
@@ -79536,12 +79564,12 @@ const Inbox = createLucideIcon("inbox", __iconNode$1h);
79536
79564
  */
79537
79565
 
79538
79566
 
79539
- const __iconNode$1g = [
79567
+ const __iconNode$1h = [
79540
79568
  ["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
79541
79569
  ["path", { d: "M12 16v-4", key: "1dtifu" }],
79542
79570
  ["path", { d: "M12 8h.01", key: "e9boi3" }]
79543
79571
  ];
79544
- const Info$3 = createLucideIcon("info", __iconNode$1g);
79572
+ const Info$3 = createLucideIcon("info", __iconNode$1h);
79545
79573
 
79546
79574
  /**
79547
79575
  * @license lucide-react v0.528.0 - ISC
@@ -79551,12 +79579,12 @@ const Info$3 = createLucideIcon("info", __iconNode$1g);
79551
79579
  */
79552
79580
 
79553
79581
 
79554
- const __iconNode$1f = [
79582
+ const __iconNode$1g = [
79555
79583
  ["line", { x1: "19", x2: "10", y1: "4", y2: "4", key: "15jd3p" }],
79556
79584
  ["line", { x1: "14", x2: "5", y1: "20", y2: "20", key: "bu0au3" }],
79557
79585
  ["line", { x1: "15", x2: "9", y1: "4", y2: "20", key: "uljnxc" }]
79558
79586
  ];
79559
- const Italic$1 = createLucideIcon("italic", __iconNode$1f);
79587
+ const Italic$1 = createLucideIcon("italic", __iconNode$1g);
79560
79588
 
79561
79589
  /**
79562
79590
  * @license lucide-react v0.528.0 - ISC
@@ -79566,7 +79594,7 @@ const Italic$1 = createLucideIcon("italic", __iconNode$1f);
79566
79594
  */
79567
79595
 
79568
79596
 
79569
- const __iconNode$1e = [
79597
+ const __iconNode$1f = [
79570
79598
  [
79571
79599
  "path",
79572
79600
  {
@@ -79576,7 +79604,7 @@ const __iconNode$1e = [
79576
79604
  ],
79577
79605
  ["circle", { cx: "16.5", cy: "7.5", r: ".5", fill: "currentColor", key: "w0ekpg" }]
79578
79606
  ];
79579
- const KeyRound = createLucideIcon("key-round", __iconNode$1e);
79607
+ const KeyRound = createLucideIcon("key-round", __iconNode$1f);
79580
79608
 
79581
79609
  /**
79582
79610
  * @license lucide-react v0.528.0 - ISC
@@ -79586,7 +79614,7 @@ const KeyRound = createLucideIcon("key-round", __iconNode$1e);
79586
79614
  */
79587
79615
 
79588
79616
 
79589
- const __iconNode$1d = [
79617
+ const __iconNode$1e = [
79590
79618
  ["path", { d: "M10 18v-7", key: "wt116b" }],
79591
79619
  [
79592
79620
  "path",
@@ -79600,7 +79628,7 @@ const __iconNode$1d = [
79600
79628
  ["path", { d: "M3 22h18", key: "8prr45" }],
79601
79629
  ["path", { d: "M6 18v-7", key: "1ivflk" }]
79602
79630
  ];
79603
- const Landmark = createLucideIcon("landmark", __iconNode$1d);
79631
+ const Landmark = createLucideIcon("landmark", __iconNode$1e);
79604
79632
 
79605
79633
  /**
79606
79634
  * @license lucide-react v0.528.0 - ISC
@@ -79610,7 +79638,7 @@ const Landmark = createLucideIcon("landmark", __iconNode$1d);
79610
79638
  */
79611
79639
 
79612
79640
 
79613
- const __iconNode$1c = [
79641
+ const __iconNode$1d = [
79614
79642
  [
79615
79643
  "path",
79616
79644
  {
@@ -79633,7 +79661,7 @@ const __iconNode$1c = [
79633
79661
  }
79634
79662
  ]
79635
79663
  ];
79636
- const Layers = createLucideIcon("layers", __iconNode$1c);
79664
+ const Layers = createLucideIcon("layers", __iconNode$1d);
79637
79665
 
79638
79666
  /**
79639
79667
  * @license lucide-react v0.528.0 - ISC
@@ -79643,12 +79671,12 @@ const Layers = createLucideIcon("layers", __iconNode$1c);
79643
79671
  */
79644
79672
 
79645
79673
 
79646
- const __iconNode$1b = [
79674
+ const __iconNode$1c = [
79647
79675
  ["path", { d: "M9 17H7A5 5 0 0 1 7 7h2", key: "8i5ue5" }],
79648
79676
  ["path", { d: "M15 7h2a5 5 0 1 1 0 10h-2", key: "1b9ql8" }],
79649
79677
  ["line", { x1: "8", x2: "16", y1: "12", y2: "12", key: "1jonct" }]
79650
79678
  ];
79651
- const Link2 = createLucideIcon("link-2", __iconNode$1b);
79679
+ const Link2 = createLucideIcon("link-2", __iconNode$1c);
79652
79680
 
79653
79681
  /**
79654
79682
  * @license lucide-react v0.528.0 - ISC
@@ -79658,11 +79686,11 @@ const Link2 = createLucideIcon("link-2", __iconNode$1b);
79658
79686
  */
79659
79687
 
79660
79688
 
79661
- const __iconNode$1a = [
79689
+ const __iconNode$1b = [
79662
79690
  ["path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71", key: "1cjeqo" }],
79663
79691
  ["path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71", key: "19qd67" }]
79664
79692
  ];
79665
- const Link$1 = createLucideIcon("link", __iconNode$1a);
79693
+ const Link$1 = createLucideIcon("link", __iconNode$1b);
79666
79694
 
79667
79695
  /**
79668
79696
  * @license lucide-react v0.528.0 - ISC
@@ -79672,7 +79700,7 @@ const Link$1 = createLucideIcon("link", __iconNode$1a);
79672
79700
  */
79673
79701
 
79674
79702
 
79675
- const __iconNode$19 = [
79703
+ const __iconNode$1a = [
79676
79704
  ["path", { d: "M10 12h11", key: "6m4ad9" }],
79677
79705
  ["path", { d: "M10 18h11", key: "11hvi2" }],
79678
79706
  ["path", { d: "M10 6h11", key: "c7qv1k" }],
@@ -79680,7 +79708,7 @@ const __iconNode$19 = [
79680
79708
  ["path", { d: "M4 6h1v4", key: "cnovpq" }],
79681
79709
  ["path", { d: "M6 18H4c0-1 2-2 2-3s-1-1.5-2-1", key: "m9a95d" }]
79682
79710
  ];
79683
- const ListOrdered = createLucideIcon("list-ordered", __iconNode$19);
79711
+ const ListOrdered = createLucideIcon("list-ordered", __iconNode$1a);
79684
79712
 
79685
79713
  /**
79686
79714
  * @license lucide-react v0.528.0 - ISC
@@ -79690,7 +79718,7 @@ const ListOrdered = createLucideIcon("list-ordered", __iconNode$19);
79690
79718
  */
79691
79719
 
79692
79720
 
79693
- const __iconNode$18 = [
79721
+ const __iconNode$19 = [
79694
79722
  ["path", { d: "M3 12h.01", key: "nlz23k" }],
79695
79723
  ["path", { d: "M3 18h.01", key: "1tta3j" }],
79696
79724
  ["path", { d: "M3 6h.01", key: "1rqtza" }],
@@ -79698,7 +79726,7 @@ const __iconNode$18 = [
79698
79726
  ["path", { d: "M8 18h13", key: "1lx6n3" }],
79699
79727
  ["path", { d: "M8 6h13", key: "ik3vkj" }]
79700
79728
  ];
79701
- const List$1 = createLucideIcon("list", __iconNode$18);
79729
+ const List$1 = createLucideIcon("list", __iconNode$19);
79702
79730
 
79703
79731
  /**
79704
79732
  * @license lucide-react v0.528.0 - ISC
@@ -79708,8 +79736,8 @@ const List$1 = createLucideIcon("list", __iconNode$18);
79708
79736
  */
79709
79737
 
79710
79738
 
79711
- const __iconNode$17 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
79712
- const LoaderCircle = createLucideIcon("loader-circle", __iconNode$17);
79739
+ const __iconNode$18 = [["path", { d: "M21 12a9 9 0 1 1-6.219-8.56", key: "13zald" }]];
79740
+ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$18);
79713
79741
 
79714
79742
  /**
79715
79743
  * @license lucide-react v0.528.0 - ISC
@@ -79719,11 +79747,11 @@ const LoaderCircle = createLucideIcon("loader-circle", __iconNode$17);
79719
79747
  */
79720
79748
 
79721
79749
 
79722
- const __iconNode$16 = [
79750
+ const __iconNode$17 = [
79723
79751
  ["rect", { width: "18", height: "11", x: "3", y: "11", rx: "2", ry: "2", key: "1w4ew1" }],
79724
79752
  ["path", { d: "M7 11V7a5 5 0 0 1 10 0v4", key: "fwvmzm" }]
79725
79753
  ];
79726
- const Lock = createLucideIcon("lock", __iconNode$16);
79754
+ const Lock = createLucideIcon("lock", __iconNode$17);
79727
79755
 
79728
79756
  /**
79729
79757
  * @license lucide-react v0.528.0 - ISC
@@ -79733,11 +79761,11 @@ const Lock = createLucideIcon("lock", __iconNode$16);
79733
79761
  */
79734
79762
 
79735
79763
 
79736
- const __iconNode$15 = [
79764
+ const __iconNode$16 = [
79737
79765
  ["path", { d: "m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7", key: "132q7q" }],
79738
79766
  ["rect", { x: "2", y: "4", width: "20", height: "16", rx: "2", key: "izxlao" }]
79739
79767
  ];
79740
- const Mail = createLucideIcon("mail", __iconNode$15);
79768
+ const Mail = createLucideIcon("mail", __iconNode$16);
79741
79769
 
79742
79770
  /**
79743
79771
  * @license lucide-react v0.528.0 - ISC
@@ -79747,10 +79775,10 @@ const Mail = createLucideIcon("mail", __iconNode$15);
79747
79775
  */
79748
79776
 
79749
79777
 
79750
- const __iconNode$14 = [
79778
+ const __iconNode$15 = [
79751
79779
  ["path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z", key: "1lielz" }]
79752
79780
  ];
79753
- const MessageSquare = createLucideIcon("message-square", __iconNode$14);
79781
+ const MessageSquare = createLucideIcon("message-square", __iconNode$15);
79754
79782
 
79755
79783
  /**
79756
79784
  * @license lucide-react v0.528.0 - ISC
@@ -79760,12 +79788,12 @@ const MessageSquare = createLucideIcon("message-square", __iconNode$14);
79760
79788
  */
79761
79789
 
79762
79790
 
79763
- const __iconNode$13 = [
79791
+ const __iconNode$14 = [
79764
79792
  ["path", { d: "M12 19v3", key: "npa21l" }],
79765
79793
  ["path", { d: "M19 10v2a7 7 0 0 1-14 0v-2", key: "1vc78b" }],
79766
79794
  ["rect", { x: "9", y: "2", width: "6", height: "13", rx: "3", key: "s6n7sd" }]
79767
79795
  ];
79768
- const Mic = createLucideIcon("mic", __iconNode$13);
79796
+ const Mic = createLucideIcon("mic", __iconNode$14);
79769
79797
 
79770
79798
  /**
79771
79799
  * @license lucide-react v0.528.0 - ISC
@@ -79775,12 +79803,12 @@ const Mic = createLucideIcon("mic", __iconNode$13);
79775
79803
  */
79776
79804
 
79777
79805
 
79778
- const __iconNode$12 = [
79806
+ const __iconNode$13 = [
79779
79807
  ["rect", { width: "20", height: "14", x: "2", y: "3", rx: "2", key: "48i651" }],
79780
79808
  ["line", { x1: "8", x2: "16", y1: "21", y2: "21", key: "1svkeh" }],
79781
79809
  ["line", { x1: "12", x2: "12", y1: "17", y2: "21", key: "vw1qmm" }]
79782
79810
  ];
79783
- const Monitor = createLucideIcon("monitor", __iconNode$12);
79811
+ const Monitor = createLucideIcon("monitor", __iconNode$13);
79784
79812
 
79785
79813
  /**
79786
79814
  * @license lucide-react v0.528.0 - ISC
@@ -79790,7 +79818,7 @@ const Monitor = createLucideIcon("monitor", __iconNode$12);
79790
79818
  */
79791
79819
 
79792
79820
 
79793
- const __iconNode$11 = [
79821
+ const __iconNode$12 = [
79794
79822
  [
79795
79823
  "path",
79796
79824
  {
@@ -79799,7 +79827,7 @@ const __iconNode$11 = [
79799
79827
  }
79800
79828
  ]
79801
79829
  ];
79802
- const Paperclip = createLucideIcon("paperclip", __iconNode$11);
79830
+ const Paperclip = createLucideIcon("paperclip", __iconNode$12);
79803
79831
 
79804
79832
  /**
79805
79833
  * @license lucide-react v0.528.0 - ISC
@@ -79809,7 +79837,7 @@ const Paperclip = createLucideIcon("paperclip", __iconNode$11);
79809
79837
  */
79810
79838
 
79811
79839
 
79812
- const __iconNode$10 = [
79840
+ const __iconNode$11 = [
79813
79841
  ["path", { d: "M13 21h8", key: "1jsn5i" }],
79814
79842
  [
79815
79843
  "path",
@@ -79819,7 +79847,7 @@ const __iconNode$10 = [
79819
79847
  }
79820
79848
  ]
79821
79849
  ];
79822
- const PenLine = createLucideIcon("pen-line", __iconNode$10);
79850
+ const PenLine = createLucideIcon("pen-line", __iconNode$11);
79823
79851
 
79824
79852
  /**
79825
79853
  * @license lucide-react v0.528.0 - ISC
@@ -79829,7 +79857,7 @@ const PenLine = createLucideIcon("pen-line", __iconNode$10);
79829
79857
  */
79830
79858
 
79831
79859
 
79832
- const __iconNode$$ = [
79860
+ const __iconNode$10 = [
79833
79861
  [
79834
79862
  "path",
79835
79863
  {
@@ -79838,7 +79866,7 @@ const __iconNode$$ = [
79838
79866
  }
79839
79867
  ]
79840
79868
  ];
79841
- const Pen = createLucideIcon("pen", __iconNode$$);
79869
+ const Pen = createLucideIcon("pen", __iconNode$10);
79842
79870
 
79843
79871
  /**
79844
79872
  * @license lucide-react v0.528.0 - ISC
@@ -79848,7 +79876,7 @@ const Pen = createLucideIcon("pen", __iconNode$$);
79848
79876
  */
79849
79877
 
79850
79878
 
79851
- const __iconNode$_ = [
79879
+ const __iconNode$$ = [
79852
79880
  [
79853
79881
  "path",
79854
79882
  {
@@ -79858,7 +79886,7 @@ const __iconNode$_ = [
79858
79886
  ],
79859
79887
  ["path", { d: "m15 5 4 4", key: "1mk7zo" }]
79860
79888
  ];
79861
- const Pencil = createLucideIcon("pencil", __iconNode$_);
79889
+ const Pencil = createLucideIcon("pencil", __iconNode$$);
79862
79890
 
79863
79891
  /**
79864
79892
  * @license lucide-react v0.528.0 - ISC
@@ -79868,7 +79896,7 @@ const Pencil = createLucideIcon("pencil", __iconNode$_);
79868
79896
  */
79869
79897
 
79870
79898
 
79871
- const __iconNode$Z = [
79899
+ const __iconNode$_ = [
79872
79900
  [
79873
79901
  "path",
79874
79902
  {
@@ -79877,7 +79905,7 @@ const __iconNode$Z = [
79877
79905
  }
79878
79906
  ]
79879
79907
  ];
79880
- const Play = createLucideIcon("play", __iconNode$Z);
79908
+ const Play = createLucideIcon("play", __iconNode$_);
79881
79909
 
79882
79910
  /**
79883
79911
  * @license lucide-react v0.528.0 - ISC
@@ -79887,11 +79915,11 @@ const Play = createLucideIcon("play", __iconNode$Z);
79887
79915
  */
79888
79916
 
79889
79917
 
79890
- const __iconNode$Y = [
79918
+ const __iconNode$Z = [
79891
79919
  ["path", { d: "M5 12h14", key: "1ays0h" }],
79892
79920
  ["path", { d: "M12 5v14", key: "s699le" }]
79893
79921
  ];
79894
- const Plus = createLucideIcon("plus", __iconNode$Y);
79922
+ const Plus = createLucideIcon("plus", __iconNode$Z);
79895
79923
 
79896
79924
  /**
79897
79925
  * @license lucide-react v0.528.0 - ISC
@@ -79901,12 +79929,12 @@ const Plus = createLucideIcon("plus", __iconNode$Y);
79901
79929
  */
79902
79930
 
79903
79931
 
79904
- const __iconNode$X = [
79932
+ const __iconNode$Y = [
79905
79933
  ["path", { d: "M2 3h20", key: "91anmk" }],
79906
79934
  ["path", { d: "M21 3v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V3", key: "2k9sn8" }],
79907
79935
  ["path", { d: "m7 21 5-5 5 5", key: "bip4we" }]
79908
79936
  ];
79909
- const Presentation = createLucideIcon("presentation", __iconNode$X);
79937
+ const Presentation = createLucideIcon("presentation", __iconNode$Y);
79910
79938
 
79911
79939
  /**
79912
79940
  * @license lucide-react v0.528.0 - ISC
@@ -79916,7 +79944,7 @@ const Presentation = createLucideIcon("presentation", __iconNode$X);
79916
79944
  */
79917
79945
 
79918
79946
 
79919
- const __iconNode$W = [
79947
+ const __iconNode$X = [
79920
79948
  [
79921
79949
  "path",
79922
79950
  {
@@ -79925,7 +79953,7 @@ const __iconNode$W = [
79925
79953
  }
79926
79954
  ]
79927
79955
  ];
79928
- const Puzzle = createLucideIcon("puzzle", __iconNode$W);
79956
+ const Puzzle = createLucideIcon("puzzle", __iconNode$X);
79929
79957
 
79930
79958
  /**
79931
79959
  * @license lucide-react v0.528.0 - ISC
@@ -79935,7 +79963,7 @@ const Puzzle = createLucideIcon("puzzle", __iconNode$W);
79935
79963
  */
79936
79964
 
79937
79965
 
79938
- const __iconNode$V = [
79966
+ const __iconNode$W = [
79939
79967
  [
79940
79968
  "path",
79941
79969
  {
@@ -79951,7 +79979,7 @@ const __iconNode$V = [
79951
79979
  }
79952
79980
  ]
79953
79981
  ];
79954
- const Quote = createLucideIcon("quote", __iconNode$V);
79982
+ const Quote = createLucideIcon("quote", __iconNode$W);
79955
79983
 
79956
79984
  /**
79957
79985
  * @license lucide-react v0.528.0 - ISC
@@ -79961,14 +79989,14 @@ const Quote = createLucideIcon("quote", __iconNode$V);
79961
79989
  */
79962
79990
 
79963
79991
 
79964
- const __iconNode$U = [
79992
+ const __iconNode$V = [
79965
79993
  ["path", { d: "M16.247 7.761a6 6 0 0 1 0 8.478", key: "1fwjs5" }],
79966
79994
  ["path", { d: "M19.075 4.933a10 10 0 0 1 0 14.134", key: "ehdyv1" }],
79967
79995
  ["path", { d: "M4.925 19.067a10 10 0 0 1 0-14.134", key: "1q22gi" }],
79968
79996
  ["path", { d: "M7.753 16.239a6 6 0 0 1 0-8.478", key: "r2q7qm" }],
79969
79997
  ["circle", { cx: "12", cy: "12", r: "2", key: "1c9p78" }]
79970
79998
  ];
79971
- const Radio$1 = createLucideIcon("radio", __iconNode$U);
79999
+ const Radio$1 = createLucideIcon("radio", __iconNode$V);
79972
80000
 
79973
80001
  /**
79974
80002
  * @license lucide-react v0.528.0 - ISC
@@ -79978,13 +80006,13 @@ const Radio$1 = createLucideIcon("radio", __iconNode$U);
79978
80006
  */
79979
80007
 
79980
80008
 
79981
- const __iconNode$T = [
80009
+ const __iconNode$U = [
79982
80010
  ["path", { d: "M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8", key: "v9h5vc" }],
79983
80011
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }],
79984
80012
  ["path", { d: "M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16", key: "3uifl3" }],
79985
80013
  ["path", { d: "M8 16H3v5", key: "1cv678" }]
79986
80014
  ];
79987
- const RefreshCw = createLucideIcon("refresh-cw", __iconNode$T);
80015
+ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$U);
79988
80016
 
79989
80017
  /**
79990
80018
  * @license lucide-react v0.528.0 - ISC
@@ -79994,13 +80022,13 @@ const RefreshCw = createLucideIcon("refresh-cw", __iconNode$T);
79994
80022
  */
79995
80023
 
79996
80024
 
79997
- const __iconNode$S = [
80025
+ const __iconNode$T = [
79998
80026
  ["path", { d: "m17 2 4 4-4 4", key: "nntrym" }],
79999
80027
  ["path", { d: "M3 11v-1a4 4 0 0 1 4-4h14", key: "84bu3i" }],
80000
80028
  ["path", { d: "m7 22-4-4 4-4", key: "1wqhfi" }],
80001
80029
  ["path", { d: "M21 13v1a4 4 0 0 1-4 4H3", key: "1rx37r" }]
80002
80030
  ];
80003
- const Repeat = createLucideIcon("repeat", __iconNode$S);
80031
+ const Repeat = createLucideIcon("repeat", __iconNode$T);
80004
80032
 
80005
80033
  /**
80006
80034
  * @license lucide-react v0.528.0 - ISC
@@ -80010,11 +80038,11 @@ const Repeat = createLucideIcon("repeat", __iconNode$S);
80010
80038
  */
80011
80039
 
80012
80040
 
80013
- const __iconNode$R = [
80041
+ const __iconNode$S = [
80014
80042
  ["path", { d: "M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8", key: "1357e3" }],
80015
80043
  ["path", { d: "M3 3v5h5", key: "1xhq8a" }]
80016
80044
  ];
80017
- const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$R);
80045
+ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$S);
80018
80046
 
80019
80047
  /**
80020
80048
  * @license lucide-react v0.528.0 - ISC
@@ -80024,11 +80052,11 @@ const RotateCcw = createLucideIcon("rotate-ccw", __iconNode$R);
80024
80052
  */
80025
80053
 
80026
80054
 
80027
- const __iconNode$Q = [
80055
+ const __iconNode$R = [
80028
80056
  ["path", { d: "M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8", key: "1p45f6" }],
80029
80057
  ["path", { d: "M21 3v5h-5", key: "1q7to0" }]
80030
80058
  ];
80031
- const RotateCw = createLucideIcon("rotate-cw", __iconNode$Q);
80059
+ const RotateCw = createLucideIcon("rotate-cw", __iconNode$R);
80032
80060
 
80033
80061
  /**
80034
80062
  * @license lucide-react v0.528.0 - ISC
@@ -80038,12 +80066,12 @@ const RotateCw = createLucideIcon("rotate-cw", __iconNode$Q);
80038
80066
  */
80039
80067
 
80040
80068
 
80041
- const __iconNode$P = [
80069
+ const __iconNode$Q = [
80042
80070
  ["circle", { cx: "6", cy: "19", r: "3", key: "1kj8tv" }],
80043
80071
  ["path", { d: "M9 19h8.5a3.5 3.5 0 0 0 0-7h-11a3.5 3.5 0 0 1 0-7H15", key: "1d8sl" }],
80044
80072
  ["circle", { cx: "18", cy: "5", r: "3", key: "gq8acd" }]
80045
80073
  ];
80046
- const Route = createLucideIcon("route", __iconNode$P);
80074
+ const Route = createLucideIcon("route", __iconNode$Q);
80047
80075
 
80048
80076
  /**
80049
80077
  * @license lucide-react v0.528.0 - ISC
@@ -80053,7 +80081,7 @@ const Route = createLucideIcon("route", __iconNode$P);
80053
80081
  */
80054
80082
 
80055
80083
 
80056
- const __iconNode$O = [
80084
+ const __iconNode$P = [
80057
80085
  [
80058
80086
  "path",
80059
80087
  {
@@ -80064,7 +80092,7 @@ const __iconNode$O = [
80064
80092
  ["path", { d: "M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7", key: "1ydtos" }],
80065
80093
  ["path", { d: "M7 3v4a1 1 0 0 0 1 1h7", key: "t51u73" }]
80066
80094
  ];
80067
- const Save = createLucideIcon("save", __iconNode$O);
80095
+ const Save = createLucideIcon("save", __iconNode$P);
80068
80096
 
80069
80097
  /**
80070
80098
  * @license lucide-react v0.528.0 - ISC
@@ -80074,7 +80102,7 @@ const Save = createLucideIcon("save", __iconNode$O);
80074
80102
  */
80075
80103
 
80076
80104
 
80077
- const __iconNode$N = [
80105
+ const __iconNode$O = [
80078
80106
  ["path", { d: "M14 22v-4a2 2 0 1 0-4 0v4", key: "hhkicm" }],
80079
80107
  [
80080
80108
  "path",
@@ -80088,7 +80116,7 @@ const __iconNode$N = [
80088
80116
  ["path", { d: "M6 5v17", key: "1xfsm0" }],
80089
80117
  ["circle", { cx: "12", cy: "9", r: "2", key: "1092wv" }]
80090
80118
  ];
80091
- const School = createLucideIcon("school", __iconNode$N);
80119
+ const School = createLucideIcon("school", __iconNode$O);
80092
80120
 
80093
80121
  /**
80094
80122
  * @license lucide-react v0.528.0 - ISC
@@ -80098,14 +80126,14 @@ const School = createLucideIcon("school", __iconNode$N);
80098
80126
  */
80099
80127
 
80100
80128
 
80101
- const __iconNode$M = [
80129
+ const __iconNode$N = [
80102
80130
  ["path", { d: "M13 3H4a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-3", key: "i8wdob" }],
80103
80131
  ["path", { d: "M8 21h8", key: "1ev6f3" }],
80104
80132
  ["path", { d: "M12 17v4", key: "1riwvh" }],
80105
80133
  ["path", { d: "m17 8 5-5", key: "fqif7o" }],
80106
80134
  ["path", { d: "M17 3h5v5", key: "1o3tu8" }]
80107
80135
  ];
80108
- const ScreenShare = createLucideIcon("screen-share", __iconNode$M);
80136
+ const ScreenShare = createLucideIcon("screen-share", __iconNode$N);
80109
80137
 
80110
80138
  /**
80111
80139
  * @license lucide-react v0.528.0 - ISC
@@ -80115,7 +80143,7 @@ const ScreenShare = createLucideIcon("screen-share", __iconNode$M);
80115
80143
  */
80116
80144
 
80117
80145
 
80118
- const __iconNode$L = [
80146
+ const __iconNode$M = [
80119
80147
  ["path", { d: "M15 12h-5", key: "r7krc0" }],
80120
80148
  ["path", { d: "M15 8h-5", key: "1khuty" }],
80121
80149
  ["path", { d: "M19 17V5a2 2 0 0 0-2-2H4", key: "zz82l3" }],
@@ -80127,7 +80155,7 @@ const __iconNode$L = [
80127
80155
  }
80128
80156
  ]
80129
80157
  ];
80130
- const ScrollText = createLucideIcon("scroll-text", __iconNode$L);
80158
+ const ScrollText = createLucideIcon("scroll-text", __iconNode$M);
80131
80159
 
80132
80160
  /**
80133
80161
  * @license lucide-react v0.528.0 - ISC
@@ -80137,11 +80165,11 @@ const ScrollText = createLucideIcon("scroll-text", __iconNode$L);
80137
80165
  */
80138
80166
 
80139
80167
 
80140
- const __iconNode$K = [
80168
+ const __iconNode$L = [
80141
80169
  ["path", { d: "m21 21-4.34-4.34", key: "14j7rj" }],
80142
80170
  ["circle", { cx: "11", cy: "11", r: "8", key: "4ej97u" }]
80143
80171
  ];
80144
- const Search = createLucideIcon("search", __iconNode$K);
80172
+ const Search = createLucideIcon("search", __iconNode$L);
80145
80173
 
80146
80174
  /**
80147
80175
  * @license lucide-react v0.528.0 - ISC
@@ -80151,7 +80179,7 @@ const Search = createLucideIcon("search", __iconNode$K);
80151
80179
  */
80152
80180
 
80153
80181
 
80154
- const __iconNode$J = [
80182
+ const __iconNode$K = [
80155
80183
  [
80156
80184
  "path",
80157
80185
  {
@@ -80161,7 +80189,7 @@ const __iconNode$J = [
80161
80189
  ],
80162
80190
  ["path", { d: "m21.854 2.147-10.94 10.939", key: "12cjpa" }]
80163
80191
  ];
80164
- const Send = createLucideIcon("send", __iconNode$J);
80192
+ const Send = createLucideIcon("send", __iconNode$K);
80165
80193
 
80166
80194
  /**
80167
80195
  * @license lucide-react v0.528.0 - ISC
@@ -80171,13 +80199,13 @@ const Send = createLucideIcon("send", __iconNode$J);
80171
80199
  */
80172
80200
 
80173
80201
 
80174
- const __iconNode$I = [
80202
+ const __iconNode$J = [
80175
80203
  ["rect", { width: "20", height: "8", x: "2", y: "2", rx: "2", ry: "2", key: "ngkwjq" }],
80176
80204
  ["rect", { width: "20", height: "8", x: "2", y: "14", rx: "2", ry: "2", key: "iecqi9" }],
80177
80205
  ["line", { x1: "6", x2: "6.01", y1: "6", y2: "6", key: "16zg32" }],
80178
80206
  ["line", { x1: "6", x2: "6.01", y1: "18", y2: "18", key: "nzw8ys" }]
80179
80207
  ];
80180
- const Server = createLucideIcon("server", __iconNode$I);
80208
+ const Server = createLucideIcon("server", __iconNode$J);
80181
80209
 
80182
80210
  /**
80183
80211
  * @license lucide-react v0.528.0 - ISC
@@ -80187,13 +80215,13 @@ const Server = createLucideIcon("server", __iconNode$I);
80187
80215
  */
80188
80216
 
80189
80217
 
80190
- const __iconNode$H = [
80218
+ const __iconNode$I = [
80191
80219
  ["path", { d: "M14 17H5", key: "gfn3mx" }],
80192
80220
  ["path", { d: "M19 7h-9", key: "6i9tg" }],
80193
80221
  ["circle", { cx: "17", cy: "17", r: "3", key: "18b49y" }],
80194
80222
  ["circle", { cx: "7", cy: "7", r: "3", key: "dfmy0x" }]
80195
80223
  ];
80196
- const Settings2 = createLucideIcon("settings-2", __iconNode$H);
80224
+ const Settings2 = createLucideIcon("settings-2", __iconNode$I);
80197
80225
 
80198
80226
  /**
80199
80227
  * @license lucide-react v0.528.0 - ISC
@@ -80203,7 +80231,7 @@ const Settings2 = createLucideIcon("settings-2", __iconNode$H);
80203
80231
  */
80204
80232
 
80205
80233
 
80206
- const __iconNode$G = [
80234
+ const __iconNode$H = [
80207
80235
  [
80208
80236
  "path",
80209
80237
  {
@@ -80213,7 +80241,7 @@ const __iconNode$G = [
80213
80241
  ],
80214
80242
  ["circle", { cx: "12", cy: "12", r: "3", key: "1v7zrd" }]
80215
80243
  ];
80216
- const Settings = createLucideIcon("settings", __iconNode$G);
80244
+ const Settings = createLucideIcon("settings", __iconNode$H);
80217
80245
 
80218
80246
  /**
80219
80247
  * @license lucide-react v0.528.0 - ISC
@@ -80223,14 +80251,14 @@ const Settings = createLucideIcon("settings", __iconNode$G);
80223
80251
  */
80224
80252
 
80225
80253
 
80226
- const __iconNode$F = [
80254
+ const __iconNode$G = [
80227
80255
  ["circle", { cx: "18", cy: "5", r: "3", key: "gq8acd" }],
80228
80256
  ["circle", { cx: "6", cy: "12", r: "3", key: "w7nqdw" }],
80229
80257
  ["circle", { cx: "18", cy: "19", r: "3", key: "1xt0gg" }],
80230
80258
  ["line", { x1: "8.59", x2: "15.42", y1: "13.51", y2: "17.49", key: "47mynk" }],
80231
80259
  ["line", { x1: "15.41", x2: "8.59", y1: "6.51", y2: "10.49", key: "1n3mei" }]
80232
80260
  ];
80233
- const Share2 = createLucideIcon("share-2", __iconNode$F);
80261
+ const Share2 = createLucideIcon("share-2", __iconNode$G);
80234
80262
 
80235
80263
  /**
80236
80264
  * @license lucide-react v0.528.0 - ISC
@@ -80240,7 +80268,7 @@ const Share2 = createLucideIcon("share-2", __iconNode$F);
80240
80268
  */
80241
80269
 
80242
80270
 
80243
- const __iconNode$E = [
80271
+ const __iconNode$F = [
80244
80272
  [
80245
80273
  "path",
80246
80274
  {
@@ -80251,7 +80279,7 @@ const __iconNode$E = [
80251
80279
  ["path", { d: "M12 8v4", key: "1got3b" }],
80252
80280
  ["path", { d: "M12 16h.01", key: "1drbdi" }]
80253
80281
  ];
80254
- const ShieldAlert = createLucideIcon("shield-alert", __iconNode$E);
80282
+ const ShieldAlert = createLucideIcon("shield-alert", __iconNode$F);
80255
80283
 
80256
80284
  /**
80257
80285
  * @license lucide-react v0.528.0 - ISC
@@ -80261,7 +80289,7 @@ const ShieldAlert = createLucideIcon("shield-alert", __iconNode$E);
80261
80289
  */
80262
80290
 
80263
80291
 
80264
- const __iconNode$D = [
80292
+ const __iconNode$E = [
80265
80293
  [
80266
80294
  "path",
80267
80295
  {
@@ -80271,7 +80299,7 @@ const __iconNode$D = [
80271
80299
  ],
80272
80300
  ["path", { d: "m9 12 2 2 4-4", key: "dzmm74" }]
80273
80301
  ];
80274
- const ShieldCheck = createLucideIcon("shield-check", __iconNode$D);
80302
+ const ShieldCheck = createLucideIcon("shield-check", __iconNode$E);
80275
80303
 
80276
80304
  /**
80277
80305
  * @license lucide-react v0.528.0 - ISC
@@ -80281,7 +80309,7 @@ const ShieldCheck = createLucideIcon("shield-check", __iconNode$D);
80281
80309
  */
80282
80310
 
80283
80311
 
80284
- const __iconNode$C = [
80312
+ const __iconNode$D = [
80285
80313
  [
80286
80314
  "path",
80287
80315
  {
@@ -80290,7 +80318,7 @@ const __iconNode$C = [
80290
80318
  }
80291
80319
  ]
80292
80320
  ];
80293
- const Shield = createLucideIcon("shield", __iconNode$C);
80321
+ const Shield = createLucideIcon("shield", __iconNode$D);
80294
80322
 
80295
80323
  /**
80296
80324
  * @license lucide-react v0.528.0 - ISC
@@ -80300,7 +80328,7 @@ const Shield = createLucideIcon("shield", __iconNode$C);
80300
80328
  */
80301
80329
 
80302
80330
 
80303
- const __iconNode$B = [
80331
+ const __iconNode$C = [
80304
80332
  ["path", { d: "M16 10a4 4 0 0 1-8 0", key: "1ltviw" }],
80305
80333
  ["path", { d: "M3.103 6.034h17.794", key: "awc11p" }],
80306
80334
  [
@@ -80311,7 +80339,7 @@ const __iconNode$B = [
80311
80339
  }
80312
80340
  ]
80313
80341
  ];
80314
- const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$B);
80342
+ const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$C);
80315
80343
 
80316
80344
  /**
80317
80345
  * @license lucide-react v0.528.0 - ISC
@@ -80321,14 +80349,14 @@ const ShoppingBag = createLucideIcon("shopping-bag", __iconNode$B);
80321
80349
  */
80322
80350
 
80323
80351
 
80324
- const __iconNode$A = [
80352
+ const __iconNode$B = [
80325
80353
  ["path", { d: "m18 14 4 4-4 4", key: "10pe0f" }],
80326
80354
  ["path", { d: "m18 2 4 4-4 4", key: "pucp1d" }],
80327
80355
  ["path", { d: "M2 18h1.973a4 4 0 0 0 3.3-1.7l5.454-8.6a4 4 0 0 1 3.3-1.7H22", key: "1ailkh" }],
80328
80356
  ["path", { d: "M2 6h1.972a4 4 0 0 1 3.6 2.2", key: "km57vx" }],
80329
80357
  ["path", { d: "M22 18h-6.041a4 4 0 0 1-3.3-1.8l-.359-.45", key: "os18l9" }]
80330
80358
  ];
80331
- const Shuffle = createLucideIcon("shuffle", __iconNode$A);
80359
+ const Shuffle = createLucideIcon("shuffle", __iconNode$B);
80332
80360
 
80333
80361
  /**
80334
80362
  * @license lucide-react v0.528.0 - ISC
@@ -80338,7 +80366,7 @@ const Shuffle = createLucideIcon("shuffle", __iconNode$A);
80338
80366
  */
80339
80367
 
80340
80368
 
80341
- const __iconNode$z = [
80369
+ const __iconNode$A = [
80342
80370
  ["line", { x1: "21", x2: "14", y1: "4", y2: "4", key: "obuewd" }],
80343
80371
  ["line", { x1: "10", x2: "3", y1: "4", y2: "4", key: "1q6298" }],
80344
80372
  ["line", { x1: "21", x2: "12", y1: "12", y2: "12", key: "1iu8h1" }],
@@ -80349,7 +80377,7 @@ const __iconNode$z = [
80349
80377
  ["line", { x1: "8", x2: "8", y1: "10", y2: "14", key: "1i6ji0" }],
80350
80378
  ["line", { x1: "16", x2: "16", y1: "18", y2: "22", key: "1lctlv" }]
80351
80379
  ];
80352
- const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$z);
80380
+ const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$A);
80353
80381
 
80354
80382
  /**
80355
80383
  * @license lucide-react v0.528.0 - ISC
@@ -80359,11 +80387,11 @@ const SlidersHorizontal = createLucideIcon("sliders-horizontal", __iconNode$z);
80359
80387
  */
80360
80388
 
80361
80389
 
80362
- const __iconNode$y = [
80390
+ const __iconNode$z = [
80363
80391
  ["rect", { width: "14", height: "20", x: "5", y: "2", rx: "2", ry: "2", key: "1yt0o3" }],
80364
80392
  ["path", { d: "M12 18h.01", key: "mhygvu" }]
80365
80393
  ];
80366
- const Smartphone = createLucideIcon("smartphone", __iconNode$y);
80394
+ const Smartphone = createLucideIcon("smartphone", __iconNode$z);
80367
80395
 
80368
80396
  /**
80369
80397
  * @license lucide-react v0.528.0 - ISC
@@ -80373,7 +80401,7 @@ const Smartphone = createLucideIcon("smartphone", __iconNode$y);
80373
80401
  */
80374
80402
 
80375
80403
 
80376
- const __iconNode$x = [
80404
+ const __iconNode$y = [
80377
80405
  [
80378
80406
  "path",
80379
80407
  {
@@ -80385,7 +80413,7 @@ const __iconNode$x = [
80385
80413
  ["path", { d: "M22 4h-4", key: "gwowj6" }],
80386
80414
  ["circle", { cx: "4", cy: "20", r: "2", key: "6kqj1y" }]
80387
80415
  ];
80388
- const Sparkles = createLucideIcon("sparkles", __iconNode$x);
80416
+ const Sparkles = createLucideIcon("sparkles", __iconNode$y);
80389
80417
 
80390
80418
  /**
80391
80419
  * @license lucide-react v0.528.0 - ISC
@@ -80395,7 +80423,7 @@ const Sparkles = createLucideIcon("sparkles", __iconNode$x);
80395
80423
  */
80396
80424
 
80397
80425
 
80398
- const __iconNode$w = [
80426
+ const __iconNode$x = [
80399
80427
  ["path", { d: "M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7", key: "1m0v6g" }],
80400
80428
  [
80401
80429
  "path",
@@ -80405,7 +80433,7 @@ const __iconNode$w = [
80405
80433
  }
80406
80434
  ]
80407
80435
  ];
80408
- const SquarePen = createLucideIcon("square-pen", __iconNode$w);
80436
+ const SquarePen = createLucideIcon("square-pen", __iconNode$x);
80409
80437
 
80410
80438
  /**
80411
80439
  * @license lucide-react v0.528.0 - ISC
@@ -80415,10 +80443,10 @@ const SquarePen = createLucideIcon("square-pen", __iconNode$w);
80415
80443
  */
80416
80444
 
80417
80445
 
80418
- const __iconNode$v = [
80446
+ const __iconNode$w = [
80419
80447
  ["rect", { width: "18", height: "18", x: "3", y: "3", rx: "2", key: "afitv7" }]
80420
80448
  ];
80421
- const Square$1 = createLucideIcon("square", __iconNode$v);
80449
+ const Square$1 = createLucideIcon("square", __iconNode$w);
80422
80450
 
80423
80451
  /**
80424
80452
  * @license lucide-react v0.528.0 - ISC
@@ -80428,7 +80456,7 @@ const Square$1 = createLucideIcon("square", __iconNode$v);
80428
80456
  */
80429
80457
 
80430
80458
 
80431
- const __iconNode$u = [
80459
+ const __iconNode$v = [
80432
80460
  [
80433
80461
  "path",
80434
80462
  {
@@ -80437,7 +80465,7 @@ const __iconNode$u = [
80437
80465
  }
80438
80466
  ]
80439
80467
  ];
80440
- const Star$1 = createLucideIcon("star", __iconNode$u);
80468
+ const Star$1 = createLucideIcon("star", __iconNode$v);
80441
80469
 
80442
80470
  /**
80443
80471
  * @license lucide-react v0.528.0 - ISC
@@ -80447,14 +80475,14 @@ const Star$1 = createLucideIcon("star", __iconNode$u);
80447
80475
  */
80448
80476
 
80449
80477
 
80450
- const __iconNode$t = [
80478
+ const __iconNode$u = [
80451
80479
  ["path", { d: "M11 2v2", key: "1539x4" }],
80452
80480
  ["path", { d: "M5 2v2", key: "1yf1q8" }],
80453
80481
  ["path", { d: "M5 3H4a2 2 0 0 0-2 2v4a6 6 0 0 0 12 0V5a2 2 0 0 0-2-2h-1", key: "rb5t3r" }],
80454
80482
  ["path", { d: "M8 15a6 6 0 0 0 12 0v-3", key: "x18d4x" }],
80455
80483
  ["circle", { cx: "20", cy: "10", r: "2", key: "ts1r5v" }]
80456
80484
  ];
80457
- const Stethoscope = createLucideIcon("stethoscope", __iconNode$t);
80485
+ const Stethoscope = createLucideIcon("stethoscope", __iconNode$u);
80458
80486
 
80459
80487
  /**
80460
80488
  * @license lucide-react v0.528.0 - ISC
@@ -80464,11 +80492,11 @@ const Stethoscope = createLucideIcon("stethoscope", __iconNode$t);
80464
80492
  */
80465
80493
 
80466
80494
 
80467
- const __iconNode$s = [
80495
+ const __iconNode$t = [
80468
80496
  ["path", { d: "M16 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2V8Z", key: "qazsjp" }],
80469
80497
  ["path", { d: "M15 3v4a2 2 0 0 0 2 2h4", key: "40519r" }]
80470
80498
  ];
80471
- const StickyNote = createLucideIcon("sticky-note", __iconNode$s);
80499
+ const StickyNote = createLucideIcon("sticky-note", __iconNode$t);
80472
80500
 
80473
80501
  /**
80474
80502
  * @license lucide-react v0.528.0 - ISC
@@ -80478,7 +80506,7 @@ const StickyNote = createLucideIcon("sticky-note", __iconNode$s);
80478
80506
  */
80479
80507
 
80480
80508
 
80481
- const __iconNode$r = [
80509
+ const __iconNode$s = [
80482
80510
  ["path", { d: "m2 7 4.41-4.41A2 2 0 0 1 7.83 2h8.34a2 2 0 0 1 1.42.59L22 7", key: "ztvudi" }],
80483
80511
  ["path", { d: "M4 12v8a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-8", key: "1b2hhj" }],
80484
80512
  ["path", { d: "M15 22v-4a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v4", key: "2ebpfo" }],
@@ -80491,7 +80519,7 @@ const __iconNode$r = [
80491
80519
  }
80492
80520
  ]
80493
80521
  ];
80494
- const Store$1 = createLucideIcon("store", __iconNode$r);
80522
+ const Store$1 = createLucideIcon("store", __iconNode$s);
80495
80523
 
80496
80524
  /**
80497
80525
  * @license lucide-react v0.528.0 - ISC
@@ -80501,7 +80529,7 @@ const Store$1 = createLucideIcon("store", __iconNode$r);
80501
80529
  */
80502
80530
 
80503
80531
 
80504
- const __iconNode$q = [
80532
+ const __iconNode$r = [
80505
80533
  [
80506
80534
  "path",
80507
80535
  {
@@ -80511,7 +80539,7 @@ const __iconNode$q = [
80511
80539
  ],
80512
80540
  ["circle", { cx: "7.5", cy: "7.5", r: ".5", fill: "currentColor", key: "kqv944" }]
80513
80541
  ];
80514
- const Tag = createLucideIcon("tag", __iconNode$q);
80542
+ const Tag = createLucideIcon("tag", __iconNode$r);
80515
80543
 
80516
80544
  /**
80517
80545
  * @license lucide-react v0.528.0 - ISC
@@ -80521,7 +80549,7 @@ const Tag = createLucideIcon("tag", __iconNode$q);
80521
80549
  */
80522
80550
 
80523
80551
 
80524
- const __iconNode$p = [
80552
+ const __iconNode$q = [
80525
80553
  ["path", { d: "m15 5 6.3 6.3a2.4 2.4 0 0 1 0 3.4L17 19", key: "1cbfv1" }],
80526
80554
  [
80527
80555
  "path",
@@ -80532,7 +80560,7 @@ const __iconNode$p = [
80532
80560
  ],
80533
80561
  ["circle", { cx: "6.5", cy: "9.5", r: ".5", fill: "currentColor", key: "5pm5xn" }]
80534
80562
  ];
80535
- const Tags = createLucideIcon("tags", __iconNode$p);
80563
+ const Tags = createLucideIcon("tags", __iconNode$q);
80536
80564
 
80537
80565
  /**
80538
80566
  * @license lucide-react v0.528.0 - ISC
@@ -80542,11 +80570,11 @@ const Tags = createLucideIcon("tags", __iconNode$p);
80542
80570
  */
80543
80571
 
80544
80572
 
80545
- const __iconNode$o = [
80573
+ const __iconNode$p = [
80546
80574
  ["path", { d: "M12 19h8", key: "baeox8" }],
80547
80575
  ["path", { d: "m4 17 6-6-6-6", key: "1yngyt" }]
80548
80576
  ];
80549
- const Terminal = createLucideIcon("terminal", __iconNode$o);
80577
+ const Terminal = createLucideIcon("terminal", __iconNode$p);
80550
80578
 
80551
80579
  /**
80552
80580
  * @license lucide-react v0.528.0 - ISC
@@ -80556,7 +80584,7 @@ const Terminal = createLucideIcon("terminal", __iconNode$o);
80556
80584
  */
80557
80585
 
80558
80586
 
80559
- const __iconNode$n = [
80587
+ const __iconNode$o = [
80560
80588
  ["path", { d: "M17 14V2", key: "8ymqnk" }],
80561
80589
  [
80562
80590
  "path",
@@ -80566,7 +80594,7 @@ const __iconNode$n = [
80566
80594
  }
80567
80595
  ]
80568
80596
  ];
80569
- const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$n);
80597
+ const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$o);
80570
80598
 
80571
80599
  /**
80572
80600
  * @license lucide-react v0.528.0 - ISC
@@ -80576,7 +80604,7 @@ const ThumbsDown = createLucideIcon("thumbs-down", __iconNode$n);
80576
80604
  */
80577
80605
 
80578
80606
 
80579
- const __iconNode$m = [
80607
+ const __iconNode$n = [
80580
80608
  ["path", { d: "M7 10v12", key: "1qc93n" }],
80581
80609
  [
80582
80610
  "path",
@@ -80586,7 +80614,7 @@ const __iconNode$m = [
80586
80614
  }
80587
80615
  ]
80588
80616
  ];
80589
- const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$m);
80617
+ const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$n);
80590
80618
 
80591
80619
  /**
80592
80620
  * @license lucide-react v0.528.0 - ISC
@@ -80596,14 +80624,14 @@ const ThumbsUp = createLucideIcon("thumbs-up", __iconNode$m);
80596
80624
  */
80597
80625
 
80598
80626
 
80599
- const __iconNode$l = [
80627
+ const __iconNode$m = [
80600
80628
  ["path", { d: "M10 11v6", key: "nco0om" }],
80601
80629
  ["path", { d: "M14 11v6", key: "outv1u" }],
80602
80630
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
80603
80631
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
80604
80632
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
80605
80633
  ];
80606
- const Trash2 = createLucideIcon("trash-2", __iconNode$l);
80634
+ const Trash2 = createLucideIcon("trash-2", __iconNode$m);
80607
80635
 
80608
80636
  /**
80609
80637
  * @license lucide-react v0.528.0 - ISC
@@ -80613,12 +80641,26 @@ const Trash2 = createLucideIcon("trash-2", __iconNode$l);
80613
80641
  */
80614
80642
 
80615
80643
 
80616
- const __iconNode$k = [
80644
+ const __iconNode$l = [
80617
80645
  ["path", { d: "M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6", key: "miytrc" }],
80618
80646
  ["path", { d: "M3 6h18", key: "d0wm0j" }],
80619
80647
  ["path", { d: "M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2", key: "e791ji" }]
80620
80648
  ];
80621
- const Trash = createLucideIcon("trash", __iconNode$k);
80649
+ const Trash = createLucideIcon("trash", __iconNode$l);
80650
+
80651
+ /**
80652
+ * @license lucide-react v0.528.0 - ISC
80653
+ *
80654
+ * This source code is licensed under the ISC license.
80655
+ * See the LICENSE file in the root directory of this source tree.
80656
+ */
80657
+
80658
+
80659
+ const __iconNode$k = [
80660
+ ["path", { d: "M16 7h6v6", key: "box55l" }],
80661
+ ["path", { d: "m22 7-8.5 8.5-5-5L2 17", key: "1t1m79" }]
80662
+ ];
80663
+ const TrendingUp = createLucideIcon("trending-up", __iconNode$k);
80622
80664
 
80623
80665
  /**
80624
80666
  * @license lucide-react v0.528.0 - ISC
@@ -185540,7 +185582,7 @@ function MultiSearchSelect({ labels, selected, onSelect, onRemove, searchTerm, o
185540
185582
  */
185541
185583
  function useAgentSearch({ tenantKey, query, limit = 6, offset, starred, featured, category, subjects, llm, types, includeMainPublicMentors, orderDirection, skip = false, }) {
185542
185584
  var _a, _b, _c;
185543
- const { data, isLoading, isFetching, refetch } = useGetAiSearchMentorsQuery({
185585
+ const { data, isLoading, isFetching, isUninitialized, refetch } = useGetAiSearchMentorsQuery({
185544
185586
  platform_key: tenantKey,
185545
185587
  query: query || undefined,
185546
185588
  limit,
@@ -185564,6 +185606,7 @@ function useAgentSearch({ tenantKey, query, limit = 6, offset, starred, featured
185564
185606
  totalPages: (_c = data === null || data === void 0 ? void 0 : data.total_pages) !== null && _c !== void 0 ? _c : 0,
185565
185607
  isLoading,
185566
185608
  isFetching,
185609
+ isUninitialized,
185567
185610
  refetch,
185568
185611
  };
185569
185612
  }
@@ -194215,29 +194258,60 @@ function SpendLimitsSection({ tenantKey, labels: labelsOverride }) {
194215
194258
  return (jsxs(Fragment$1, { children: [jsxs("div", { "data-testid": "spend-limits-workspace-section", className: "rounded-lg border border-[#e5e5e5] bg-white shadow-[0_1px_2px_0_rgba(0,0,0,0.05)] dark:bg-zinc-900 dark:border-zinc-800", children: [jsx("div", { className: "flex flex-col gap-2 p-4 sm:flex-row sm:items-start sm:justify-between", children: jsxs("div", { className: "space-y-0.5", children: [jsx("h3", { className: "text-[16px] font-medium leading-6 text-[#101828] dark:text-gray-100", children: labels.tenantSections.workspace.title }), jsx("p", { className: "text-[13px] font-normal leading-5 text-[#4a5565] dark:text-gray-400", children: labels.tenantSections.workspace.description })] }) }), jsx("div", { className: "border-t border-[#e5e7eb] dark:border-zinc-800 px-4 py-3", children: isTenantCapLoading ? (jsx("div", { className: "flex items-center justify-center py-8", "data-testid": "tenant-cap-loading", children: jsx(Spinner, {}) })) : isTenantForbidden ? (jsxs("div", { className: "flex flex-col items-center gap-2 rounded-lg border border-gray-200 bg-gray-50 px-4 py-10 text-center", "data-testid": "spend-limits-denied", children: [jsx(ShieldAlert, { className: "h-6 w-6 text-gray-400" }), jsx("p", { className: "text-sm font-medium text-gray-900", children: labels.denied.title }), jsx("p", { className: "max-w-sm text-xs text-gray-600", children: labels.denied.description })] })) : (jsxs("div", { className: "space-y-4", children: [!tenantCap && (monthlySpend != null || totalSpend != null) && (jsxs("div", { className: "space-y-1", "data-testid": "workspace-actual-spend-stats", children: [jsxs("div", { className: "grid grid-cols-1 gap-4 sm:grid-cols-2", children: [monthlySpend != null && (jsxs("div", { className: "space-y-0.5", children: [jsx("p", { className: "text-[11px] font-medium uppercase tracking-wide text-[#6a7282] dark:text-gray-400", children: labels.tenantSections.noCapStats.spentThisMonth }), jsx("p", { className: "text-[18px] font-semibold leading-6 text-[#101828] dark:text-gray-100", "data-testid": "workspace-actual-spend-month", children: formatUsd$2(String(monthlySpend)) })] })), totalSpend != null && (jsxs("div", { className: "space-y-0.5", children: [jsx("p", { className: "text-[11px] font-medium uppercase tracking-wide text-[#6a7282] dark:text-gray-400", children: labels.tenantSections.noCapStats.spentAllTime }), jsx("p", { className: "text-[18px] font-semibold leading-6 text-[#101828] dark:text-gray-100", "data-testid": "workspace-actual-spend-total", children: formatUsd$2(String(totalSpend)) })] }))] }), jsx("p", { className: "text-[12px] font-normal leading-4 text-[#6a7282] dark:text-gray-500", children: labels.tenantSections.noCapStats.hint })] })), jsx(SpendCapForm, { labels: labels, cap: tenantCap, isSaving: isSavingTenantCap, isDeleting: isDeletingTenantCap, onSave: saveTenantCap, onDelete: () => setIsDeleteOpen(true), testId: "tenant-cap" })] })) })] }), jsx(Dialog, { open: isDeleteOpen, onOpenChange: () => setIsDeleteOpen(false), children: jsxs(DialogContent, { "aria-describedby": "tenant-cap-delete-description", "data-testid": "tenant-cap-delete-modal", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { className: "ibl-dialog-title", children: labels.deleteModal.title }) }), jsx("div", { className: "my-5", id: "tenant-cap-delete-description", children: jsx("p", { className: "text-sm text-[#646464]", children: labels.deleteModal.description }) }), jsxs(DialogFooter, { className: "gap-3", children: [jsx(Button$1, { variant: "outline", onClick: () => setIsDeleteOpen(false), children: labels.deleteModal.cancel }), jsx(Button$1, { className: "bg-gradient-to-r from-[#2563EB] to-[#93C5FD] text-white hover:opacity-90", onClick: handleConfirmDelete, disabled: isDeletingTenantCap, "data-testid": "tenant-cap-delete-confirm", children: isDeletingTenantCap ? labels.form.removing : labels.deleteModal.confirm })] })] }) })] }));
194216
194259
  }
194217
194260
 
194261
+ /** SPAs whose users have coursework, so the profile leads with a Gradebook tab. */
194262
+ const GRADEBOOK_SPAS = ['lms', 'skills'];
194263
+ /**
194264
+ * The customization `Profile` is opened with: whatever the host passed, with
194265
+ * the Gradebook tab defaulted from the SPA it runs in. An explicit
194266
+ * `showGradebookTab` always wins, so a host can force it either way.
194267
+ */
194268
+ function profileCustomization(customization, currentSPA) {
194269
+ var _a;
194270
+ return {
194271
+ ...customization,
194272
+ showGradebookTab: (_a = customization === null || customization === void 0 ? void 0 : customization.showGradebookTab) !== null && _a !== void 0 ? _a : GRADEBOOK_SPAS.includes((currentSPA !== null && currentSPA !== void 0 ? currentSPA : '').trim().toLowerCase()),
194273
+ };
194274
+ }
194218
194275
  /**
194219
194276
  * The shared `Profile` viewer in a dialog — the same modal the tenant
194220
194277
  * Management tab opens when a user row is clicked. Controlled variant for
194221
194278
  * hosts that trigger it from a whole table row.
194279
+ *
194280
+ * Radix portals the dialog into `document.body`, but a React portal still
194281
+ * bubbles its events through the React tree — so without the guard below, a
194282
+ * click *inside* the open profile would reach the row this dialog is rendered
194283
+ * from and fire its `onClick` (e.g. opening the enrollment progress modal
194284
+ * behind the profile). The wrapper is `display: contents`, so it adds nothing
194285
+ * to the host's layout.
194222
194286
  */
194223
- function UserProfileDialog({ tenantKey, username, isOpen, onClose }) {
194287
+ function UserProfileDialog({ tenantKey, username, isOpen, onClose, customization, currentSPA, }) {
194224
194288
  const t = useT();
194225
194289
  if (!isOpen)
194226
194290
  return null;
194227
- return (jsx(Dialog, { open: true, onOpenChange: onClose, children: jsxs(DialogContent, { autoFocus: false, className: "profile-component-dialog max-w-7xl w-[85vw] gap-0 overflow-hidden bg-white p-0", style: { height: '85vh', display: 'flex', flexDirection: 'column' }, "data-testid": "user-profile-link-dialog", children: [jsx(DialogTitle, { className: "sr-only", children: t('tabsUserstab.profileDialogTitle') }), jsx(DialogDescription, { className: "sr-only", children: t('tabsUserstab.profileDialogDescription') }), jsx(Profile, { tenant: tenantKey, tenants: [], username: username, onClose: onClose })] }) }));
194291
+ return (jsx("span", { className: "contents", onClick: (event) => event.stopPropagation(), onMouseDown: (event) => event.stopPropagation(), onKeyDown: (event) => event.stopPropagation(), children: jsx(Dialog, { open: true, onOpenChange: onClose, children: jsxs(DialogContent, { autoFocus: false, className: "profile-component-dialog max-w-7xl w-[85vw] gap-0 overflow-hidden bg-white p-0", style: { height: '85vh', display: 'flex', flexDirection: 'column' }, "data-testid": "user-profile-link-dialog", children: [jsx(DialogTitle, { className: "sr-only", children: t('tabsUserstab.profileDialogTitle') }), jsx(DialogDescription, { className: "sr-only", children: t('tabsUserstab.profileDialogDescription') }), jsx(Profile, { tenant: tenantKey, tenants: [], username: username, onClose: onClose, customization: profileCustomization(customization, currentSPA), currentSPA: currentSPA })] }) }) }));
194228
194292
  }
194229
194293
  /**
194230
194294
  * Clickable user identity that opens the shared `Profile` viewer in a dialog
194231
194295
  * — the same modal the tenant Management tab opens when a user row is
194232
- * clicked. Used by the per-user limits table and the user-limit modal.
194296
+ * clicked. `Profile` drops into preview (read-only) mode on its own for anyone
194297
+ * but the signed-in user. Used by the spend-cap tables and every analytics
194298
+ * surface that names a user; safe inside clickable rows and cards, since
194299
+ * neither its clicks nor its key presses reach the host's handlers.
194233
194300
  */
194234
- function UserProfileLink({ tenantKey, username, display, className, testId, }) {
194301
+ function UserProfileLink({ tenantKey, username, display, className, testId, customization, currentSPA, }) {
194235
194302
  const t = useT();
194236
194303
  const [isOpen, setIsOpen] = React__default.useState(false);
194304
+ if (!username) {
194305
+ // `inline-block`, or `truncate`'s `overflow: hidden` has nothing to clip:
194306
+ // an inline box takes its width from its own text.
194307
+ return (jsx("span", { className: cn('inline-block max-w-full truncate', className), "data-testid": testId, children: display }));
194308
+ }
194237
194309
  return (jsxs(Fragment$1, { children: [jsx("button", { type: "button", onClick: (event) => {
194238
194310
  event.stopPropagation();
194239
194311
  setIsOpen(true);
194240
- }, className: cn('max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none', className), "aria-label": t('tabsUserstab.viewProfileAriaLabel', { name: display }), "data-testid": testId, children: display }), jsx(UserProfileDialog, { tenantKey: tenantKey, username: username, isOpen: isOpen, onClose: () => setIsOpen(false) })] }));
194312
+ },
194313
+ // Rows that open on Enter/Space would otherwise swallow the key press.
194314
+ onKeyDown: (event) => event.stopPropagation(), className: cn('max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none', className), "aria-label": t('tabsUserstab.viewProfileAriaLabel', { name: display }), "data-testid": testId, children: display }), jsx(UserProfileDialog, { tenantKey: tenantKey, username: username, isOpen: isOpen, onClose: () => setIsOpen(false), customization: customization, currentSPA: currentSPA })] }));
194241
194315
  }
194242
194316
 
194243
194317
  /**
@@ -229624,6 +229698,13 @@ const AnalyticsScopeProvider = AnalyticsScopeContext.Provider;
229624
229698
  function useAnalyticsScope() {
229625
229699
  return useContext(AnalyticsScopeContext);
229626
229700
  }
229701
+ /**
229702
+ * The scope setter, or `undefined` where the page can't be re-scoped — no
229703
+ * provider, or a provider with no picker on screen.
229704
+ */
229705
+ function useAnalyticsScopeSetter() {
229706
+ return useContext(AnalyticsScopeContext).setScopedMentor;
229707
+ }
229627
229708
  /**
229628
229709
  * The agent a container should report on, in precedence order:
229629
229710
  *
@@ -229695,12 +229776,12 @@ const xAxisProps = (xKey) => ({
229695
229776
  interval: 'preserveStartEnd',
229696
229777
  minTickGap: 28,
229697
229778
  });
229698
- const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = false, }) => ({
229779
+ const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = false, yAxisWidth = 44, }) => ({
229699
229780
  tick: AXIS_TICK,
229700
229781
  axisLine: false,
229701
229782
  tickLine: false,
229702
229783
  tickMargin: 8,
229703
- width: 44,
229784
+ width: yAxisWidth,
229704
229785
  tickCount: yTickCount,
229705
229786
  allowDecimals,
229706
229787
  domain: yDomain,
@@ -229708,15 +229789,15 @@ const yAxisProps = ({ yTickFormatter, yDomain, yTickCount = 5, allowDecimals = f
229708
229789
  });
229709
229790
  /** Change over time: 2px monotone line over a soft gradient wash, crosshair +
229710
229791
  * ring marker on hover. */
229711
- function AnalyticsAreaChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, width, height, }) {
229792
+ function AnalyticsAreaChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, yAxisWidth, width, height, }) {
229712
229793
  const gradientId = React__default.useId();
229713
229794
  const tooltip = useChartTooltip({ dataKey, tooltipLabel, tooltipValue, tooltipAriaLabel });
229714
- return (jsxs(AreaChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, children: [jsx("defs", { children: jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [jsx("stop", { offset: "0%", stopColor: color, stopOpacity: 0.2 }), jsx("stop", { offset: "100%", stopColor: color, stopOpacity: 0 })] }) }), jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals }) }), jsx(Tooltip, { content: tooltip, cursor: { stroke: color, strokeWidth: 1, strokeDasharray: '4 4', opacity: 0.55 }, wrapperStyle: { outline: 'none' } }), jsx(Area, { type: "monotone", dataKey: dataKey, stroke: color, strokeWidth: 2, fill: `url(#${gradientId})`, dot: false, activeDot: { r: 5, fill: '#ffffff', stroke: color, strokeWidth: 2.5 } })] }));
229795
+ return (jsxs(AreaChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, children: [jsx("defs", { children: jsxs("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [jsx("stop", { offset: "0%", stopColor: color, stopOpacity: 0.2 }), jsx("stop", { offset: "100%", stopColor: color, stopOpacity: 0 })] }) }), jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals, yAxisWidth }) }), jsx(Tooltip, { content: tooltip, cursor: { stroke: color, strokeWidth: 1, strokeDasharray: '4 4', opacity: 0.55 }, wrapperStyle: { outline: 'none' } }), jsx(Area, { type: "monotone", dataKey: dataKey, stroke: color, strokeWidth: 2, fill: `url(#${gradientId})`, dot: false, activeDot: { r: 5, fill: '#ffffff', stroke: color, strokeWidth: 2.5 } })] }));
229715
229796
  }
229716
229797
  /** Magnitude per period: 4px-rounded bar tops anchored to the baseline. */
229717
- function AnalyticsBarChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, width, height, }) {
229798
+ function AnalyticsBarChart({ data, xKey = 'date', dataKey = 'value', color = CHART_SINGLE_SERIES_COLOR, tooltipLabel, yTickFormatter, tooltipValue, tooltipAriaLabel, yDomain, yTickCount, allowDecimals, yAxisWidth, width, height, }) {
229718
229799
  const tooltip = useChartTooltip({ dataKey, tooltipLabel, tooltipValue, tooltipAriaLabel });
229719
- return (jsxs(BarChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, barCategoryGap: "28%", children: [jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals }) }), jsx(Tooltip, { content: tooltip, cursor: { fill: 'rgba(0, 0, 0, 0.04)' }, wrapperStyle: { outline: 'none' } }), jsx(Bar, { dataKey: dataKey, fill: color, radius: [4, 4, 0, 0], maxBarSize: 22 })] }));
229800
+ return (jsxs(BarChart, { width: width, height: height, data: data, margin: { top: 12, right: 12, left: 0, bottom: 4 }, barCategoryGap: "28%", children: [jsx(CartesianGrid, { stroke: GRID_INK, vertical: false }), jsx(XAxis, { ...xAxisProps(xKey) }), jsx(YAxis, { ...yAxisProps({ yTickFormatter, yDomain, yTickCount, allowDecimals, yAxisWidth }) }), jsx(Tooltip, { content: tooltip, cursor: { fill: 'rgba(0, 0, 0, 0.04)' }, wrapperStyle: { outline: 'none' } }), jsx(Bar, { dataKey: dataKey, fill: color, radius: [4, 4, 0, 0], maxBarSize: 22 })] }));
229720
229801
  }
229721
229802
  /**
229722
229803
  * Identity ranked by magnitude, as rows rather than a rotated bar chart:
@@ -229757,6 +229838,26 @@ const AGENTS_PAGE_SIZE = 20;
229757
229838
  const SEARCH_DEBOUNCE_MS$1 = 300;
229758
229839
  /** cmdk needs a non-empty value; the handler treats this one as "clear". */
229759
229840
  const ALL_AGENTS_VALUE = '__all_agents__';
229841
+ /**
229842
+ * The scope an agent-search result stands for, or `null` when the result has
229843
+ * no `unique_id` — that is what the analytics endpoints filter on, so a
229844
+ * selection without one would silently report on everything.
229845
+ *
229846
+ * Shared with {@link AnalyticsLayout}, which runs the same search to fill in
229847
+ * the `dbId` for a scope set by clicking an agent's name in a stats row.
229848
+ */
229849
+ function toScopedMentor(agent) {
229850
+ if (!agent.unique_id)
229851
+ return null;
229852
+ return {
229853
+ uniqueId: agent.unique_id,
229854
+ // Search returns the DB id as a number, but every consumer downstream
229855
+ // types it as a string.
229856
+ dbId: String(agent.id),
229857
+ name: agent.name,
229858
+ profileImage: agent.profile_image,
229859
+ };
229860
+ }
229760
229861
  function useDebouncedValue$1(value, delay) {
229761
229862
  const [debounced, setDebounced] = useState(value);
229762
229863
  useEffect(() => {
@@ -229787,10 +229888,9 @@ function AnalyticsAgentPicker({ tenantKey, value, onChange, className, }) {
229787
229888
  limit: AGENTS_PAGE_SIZE,
229788
229889
  skip: !open,
229789
229890
  });
229790
- const results = useMemo(
229791
- // `unique_id` is what the analytics endpoints filter on. A result without
229792
- // one would produce a selection that silently reports on everything.
229793
- () => agents.filter((agent) => !!agent.unique_id), [agents]);
229891
+ const results = useMemo(() => agents
229892
+ .map((agent) => ({ agent, scope: toScopedMentor(agent) }))
229893
+ .filter((entry) => Boolean(entry.scope)), [agents]);
229794
229894
  const handleSelect = (mentor) => {
229795
229895
  onChange(mentor);
229796
229896
  setOpen(false);
@@ -229806,19 +229906,15 @@ function AnalyticsAgentPicker({ tenantKey, value, onChange, className, }) {
229806
229906
  variant: "ghost", role: "combobox", "aria-expanded": open, "aria-label": t('analyticsAnalyticsAgentPicker.analyticsScope'), className: cn(
229807
229907
  // Capped so a long agent name ellipsizes instead of pushing the tab
229808
229908
  // strip along; the label below is what actually truncates.
229809
- 'h-9 max-w-[220px] justify-between bg-transparent pl-2 font-normal', className), children: [jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [value ? (jsxs(Avatar, { className: "h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: value.profileImage, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: value.name.charAt(0).toUpperCase() })] })) : (jsx(Globe, { className: "h-4 w-4 shrink-0 opacity-70", "aria-hidden": "true" })), jsx("span", { className: "min-w-0 truncate", children: value ? value.name : t('analyticsAnalyticsAgentPicker.allAgents') })] }), jsx(ChevronDown, { className: "h-4 w-4 shrink-0 opacity-50", "aria-hidden": "true" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsAnalyticsAgentPicker.searchAgents') }), jsxs(CommandList, { children: [jsx(CommandGroup, { children: jsxs(CommandItem, { value: ALL_AGENTS_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), jsx(Globe, { className: "mr-2 h-4 w-4 opacity-70", "aria-hidden": "true" }), t('analyticsAnalyticsAgentPicker.allAgents')] }) }), results.length > 0 && (jsx(CommandGroup, { heading: t('analyticsAnalyticsAgentPicker.agents'), children: results.map((agent) => {
229909
+ 'h-9 max-w-[220px] justify-between bg-transparent pl-2 font-normal', className), children: [jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [value ? (jsxs(Avatar, { className: "h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: value.profileImage, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: value.name.charAt(0).toUpperCase() })] })) : (jsx(Globe, { className: "h-4 w-4 shrink-0 opacity-70", "aria-hidden": "true" })), jsx("span", { className: "min-w-0 truncate", children: value ? value.name : t('analyticsAnalyticsAgentPicker.allAgents') })] }), jsx(ChevronDown, { className: "h-4 w-4 shrink-0 opacity-50", "aria-hidden": "true" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsAnalyticsAgentPicker.searchAgents') }), jsxs(CommandList, { children: [jsx(CommandGroup, { children: jsxs(CommandItem, { value: ALL_AGENTS_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), jsx(Globe, { className: "mr-2 h-4 w-4 opacity-70", "aria-hidden": "true" }), t('analyticsAnalyticsAgentPicker.allAgents')] }) }), results.length > 0 && (jsx(CommandGroup, { heading: t('analyticsAnalyticsAgentPicker.agents'), children: results.map(({ agent, scope }) => {
229810
229910
  var _a;
229811
- const uniqueId = agent.unique_id;
229812
229911
  return (jsxs(CommandItem, {
229912
+ // A long name wraps rather than ellipsizing, so the whole
229913
+ // name is readable in a 280px popover; the check and
229914
+ // avatar stay on its first line.
229915
+ className: "items-start",
229813
229916
  // cmdk keys items by value; the search itself is server-side.
229814
- value: uniqueId, onSelect: () => handleSelect({
229815
- uniqueId,
229816
- // Search returns the DB id as a number, but every
229817
- // consumer downstream types it as a string.
229818
- dbId: String(agent.id),
229819
- name: agent.name,
229820
- profileImage: agent.profile_image,
229821
- }), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', (value === null || value === void 0 ? void 0 : value.uniqueId) === uniqueId ? 'opacity-100' : 'opacity-0') }), jsxs(Avatar, { className: "mr-2 h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: agent.profile_image, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: (_a = agent.name) === null || _a === void 0 ? void 0 : _a.charAt(0).toUpperCase() })] }), jsx("span", { className: "truncate", children: agent.name })] }, uniqueId));
229917
+ value: scope.uniqueId, onSelect: () => handleSelect(scope), children: [jsx(Check, { className: cn('mt-0.5 mr-2 h-4 w-4', (value === null || value === void 0 ? void 0 : value.uniqueId) === scope.uniqueId ? 'opacity-100' : 'opacity-0') }), jsxs(Avatar, { className: "mr-2 h-5 w-5 shrink-0", children: [jsx(AvatarImage, { src: agent.profile_image, alt: "" }), jsx(AvatarFallback, { className: "text-[10px]", children: (_a = agent.name) === null || _a === void 0 ? void 0 : _a.charAt(0).toUpperCase() })] }), jsx("span", { className: "min-w-0 flex-1 break-words whitespace-normal", children: agent.name })] }, scope.uniqueId));
229822
229918
  }) })), isFetching && results.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsAnalyticsAgentPicker.loading') })), !isFetching && results.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsAnalyticsAgentPicker.noAgentsFound') }))] })] }) })] }));
229823
229919
  }
229824
229920
 
@@ -229937,6 +230033,12 @@ const defaultTabs = [
229937
230033
  value: 'monetization',
229938
230034
  },*/
229939
230035
  ];
230036
+ /**
230037
+ * How many results the `dbId` lookup asks for. The query is the agent's own
230038
+ * `unique_id`, so the match is normally first; a handful of rows covers a
230039
+ * backend that treats the term as a loose text search.
230040
+ */
230041
+ const SCOPE_LOOKUP_LIMIT = 5;
229940
230042
  const className = 'inline-flex h-7 shrink-0 items-center justify-center whitespace-nowrap rounded-[5px] px-2 sm:px-2.5 py-0 text-sm text-gray-500 ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:text-blue-600 data-[state=active]:font-semibold font-medium data-[state=active]:bg-[#f5f7fb] data-[state=active]:shadow-none cursor-pointer';
229941
230043
  function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs = defaultTabs, activeTabClassName = '', beforeDataReports, excludeTabs = [], showPicker = false, tenantKey, scopedMentor, onScopedMentorChange, }) {
229942
230044
  var _a, _b;
@@ -229950,17 +230052,59 @@ function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs =
229950
230052
  const [internalScopedMentor, setInternalScopedMentor] = useState(null);
229951
230053
  const isScopeControlled = onScopedMentorChange !== undefined;
229952
230054
  const activeScopedMentor = (_a = (isScopeControlled ? scopedMentor : internalScopedMentor)) !== null && _a !== void 0 ? _a : null;
229953
- const handleScopedMentorChange = useCallback((mentor) => {
230055
+ const pickerTenantKey = (_b = tenantKey !== null && tenantKey !== void 0 ? tenantKey : currentTenant === null || currentTenant === void 0 ? void 0 : currentTenant.key) !== null && _b !== void 0 ? _b : '';
230056
+ const publishScopedMentor = useCallback((mentor) => {
229954
230057
  if (isScopeControlled) {
229955
230058
  onScopedMentorChange === null || onScopedMentorChange === void 0 ? void 0 : onScopedMentorChange(mentor);
229956
230059
  return;
229957
230060
  }
229958
230061
  setInternalScopedMentor(mentor);
229959
230062
  }, [isScopeControlled, onScopedMentorChange]);
230063
+ // A scope set by clicking an agent's name in a stats row carries the
230064
+ // `unique_id` alone — those payloads hold nothing else. Reports filters by
230065
+ // the database id, so publishing that straight through would leave the
230066
+ // Reports tab listing every report while the picker names one agent, and
230067
+ // would hand a controlling host a half-filled value to mirror. Resolve the
230068
+ // missing id first, through the same search the picker itself runs.
230069
+ const [pendingScopedMentor, setPendingScopedMentor] = useState(null);
230070
+ const { agents: scopeLookupResults, isFetching: isLookingUpScope, isUninitialized: isScopeLookupIdle, } = useAgentSearch({
230071
+ tenantKey: pickerTenantKey,
230072
+ query: pendingScopedMentor === null || pendingScopedMentor === void 0 ? void 0 : pendingScopedMentor.uniqueId,
230073
+ limit: SCOPE_LOOKUP_LIMIT,
230074
+ skip: !pendingScopedMentor,
230075
+ });
230076
+ useEffect(() => {
230077
+ if (!pendingScopedMentor || isLookingUpScope || isScopeLookupIdle)
230078
+ return;
230079
+ const match = scopeLookupResults.find((agent) => agent.unique_id === pendingScopedMentor.uniqueId);
230080
+ // A lookup that comes back empty still scopes the page: every stats tab
230081
+ // needs only the `unique_id`, and a click that did nothing at all would be
230082
+ // worse than a Reports tab that stays unfiltered.
230083
+ publishScopedMentor((match && toScopedMentor(match)) || pendingScopedMentor);
230084
+ setPendingScopedMentor(null);
230085
+ }, [
230086
+ pendingScopedMentor,
230087
+ isLookingUpScope,
230088
+ isScopeLookupIdle,
230089
+ scopeLookupResults,
230090
+ publishScopedMentor,
230091
+ ]);
230092
+ const handleScopedMentorChange = useCallback((mentor) => {
230093
+ if (mentor && !mentor.dbId) {
230094
+ setPendingScopedMentor(mentor);
230095
+ return;
230096
+ }
230097
+ setPendingScopedMentor(null);
230098
+ publishScopedMentor(mentor);
230099
+ }, [publishScopedMentor]);
229960
230100
  const scopeValue = useMemo(
229961
230101
  // Only a rendered picker may scope the page — otherwise a host that stops
229962
- // showing it would leave a stale agent filtering every chart.
229963
- () => ({ scopedMentor: showPicker ? activeScopedMentor : null }), [showPicker, activeScopedMentor]);
230102
+ // showing it would leave a stale agent filtering every chart, and an agent
230103
+ // name clicked in a table would re-scope with nothing on screen saying so.
230104
+ () => ({
230105
+ scopedMentor: showPicker ? activeScopedMentor : null,
230106
+ setScopedMentor: showPicker ? handleScopedMentorChange : undefined,
230107
+ }), [showPicker, activeScopedMentor, handleScopedMentorChange]);
229964
230108
  // Only a pure watcher narrows the tab strip — everyone else keeps whatever
229965
230109
  // the caller passed, custom tabs included.
229966
230110
  const isRestricted = isPureWatcher(rbacPermissions, currentTenant);
@@ -230035,7 +230179,7 @@ function AnalyticsLayout({ children, currentPath, basePath, onTabChange, tabs =
230035
230179
  .map((tab) => {
230036
230180
  const isActive = activeTab === tab.value;
230037
230181
  return (jsx(TabsTrigger, { value: tab.value, className: cn(className, isActive && activeTabClassName), onClick: () => handleTabClick(tab.value), children: tab.label }, tab.value));
230038
- }) }) }) }) }), jsx("div", { className: "flex w-full shrink-0 items-center justify-end gap-3 sm:w-auto", children: canAccessTab('reports') && (jsx(Tabs, { className: "bg-[#f5f7fb]", value: activeTab, children: jsx(TabsList, { className: "bg-[#f5f7fb]", children: jsx(TabsTrigger, { value: "reports", className: cn(className, activeTab === 'reports' && activeTabClassName), onClick: () => handleTabClick('reports'), children: "Data Reports" }) }) })) })] }), jsxs(AnalyticsControlBar, { className: "mb-4 sm:mb-4", children: [showPicker && (jsx(AnalyticsAgentPicker, { tenantKey: (_b = tenantKey !== null && tenantKey !== void 0 ? tenantKey : currentTenant === null || currentTenant === void 0 ? void 0 : currentTenant.key) !== null && _b !== void 0 ? _b : '', value: activeScopedMentor, onChange: handleScopedMentorChange })), beforeDataReports] })] }), jsx("div", { className: "flex-1 overflow-auto overscroll-contain scrollbar-none px-6 pb-6 pt-0", children: isActiveTabAllowed ? children : null })] }) }) }));
230182
+ }) }) }) }) }), jsx("div", { className: "flex w-full shrink-0 items-center justify-end gap-3 sm:w-auto", children: canAccessTab('reports') && (jsx(Tabs, { className: "bg-[#f5f7fb]", value: activeTab, children: jsx(TabsList, { className: "bg-[#f5f7fb]", children: jsx(TabsTrigger, { value: "reports", className: cn(className, activeTab === 'reports' && activeTabClassName), onClick: () => handleTabClick('reports'), children: "Data Reports" }) }) })) })] }), jsxs(AnalyticsControlBar, { className: "mb-4 sm:mb-4", children: [showPicker && (jsx(AnalyticsAgentPicker, { tenantKey: pickerTenantKey, value: activeScopedMentor, onChange: handleScopedMentorChange })), beforeDataReports] })] }), jsx("div", { className: "flex-1 overflow-auto overscroll-contain scrollbar-none px-6 pb-6 pt-0", children: isActiveTabAllowed ? children : null })] }) }) }));
230039
230183
  }
230040
230184
 
230041
230185
  const accessTimeData = [
@@ -230254,7 +230398,7 @@ const formatRelativeTime$1 = (dateString, t) => {
230254
230398
  return t('analyticsAnalyticsUsersStats.daysAgo', { count: diffInDays });
230255
230399
  return date.toLocaleDateString();
230256
230400
  };
230257
- function AnalyticsUsersStats({ tenantKey, mentorId, selectedMentorId, usergroupIds, }) {
230401
+ function AnalyticsUsersStats({ tenantKey, currentSPA, mentorId, selectedMentorId, usergroupIds, }) {
230258
230402
  var _a, _b, _c, _d, _e, _f, _g;
230259
230403
  const t = useT();
230260
230404
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
@@ -230262,7 +230406,7 @@ function AnalyticsUsersStats({ tenantKey, mentorId, selectedMentorId, usergroupI
230262
230406
  return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.usersLoggedInNow'), value: (currentlyActiveUsers === null || currentlyActiveUsers === void 0 ? void 0 : currentlyActiveUsers.count) || 0, loading: isLoadingCurrentlyActiveUsers, description: t('analyticsAnalyticsUsersStats.usersLoggedInNowDescription') }), jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.usersLoggedInPast30Days'), value: (activeUsers30D === null || activeUsers30D === void 0 ? void 0 : activeUsers30D.count) || 0, loading: isLoadingActiveUsers30D, description: t('analyticsAnalyticsUsersStats.usersLoggedInPast30DaysDescription') }), jsx(StatCard, { title: t('analyticsAnalyticsUsersStats.totalRegisteredUsers'), value: (registeredUsers === null || registeredUsers === void 0 ? void 0 : registeredUsers.count) || 0, loading: isLoadingRegisteredUsers, description: t('analyticsAnalyticsUsersStats.totalRegisteredUsersDescription') })] }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-5", children: [jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.activeUsersTitle'), label: t('analyticsAnalyticsUsersStats.activeUsersLabel'), filters: activeUsersStatsDateFilter, setOutsideFilters: setActiveUsersStatsDateFilter, description: t('analyticsAnalyticsUsersStats.activeUsersChartDescription'), children: isLoadingActiveUsers ? (jsx(ChartLoading, {})) : ((_a = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _a === void 0 ? void 0 : _a.length) && ((_b = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _b === void 0 ? void 0 : _b.length) > 0 ? (jsx(AnalyticsBarChart, { data: (_c = activeUsers === null || activeUsers === void 0 ? void 0 : activeUsers.points) === null || _c === void 0 ? void 0 : _c.map((point) => ({
230263
230407
  date: formatDateToShortFormat$2(point.date, activeUsersStatsDateFilter.activeFilter === 'today'),
230264
230408
  value: point.value,
230265
- })), tooltipLabel: t('analyticsAnalyticsUsersStats.activeUsersLabel'), tooltipAriaLabel: (label) => t('analyticsAnalyticsUsersStats.activeUsersAriaLabel', { label }) })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.accessTimesTitle'), label: t('analyticsAnalyticsUsersStats.accessTimesLabel'), filters: accessTimeHeatmapDateFilter, setOutsideFilters: setAccessTimeHeatmapDateFilter, description: t('analyticsAnalyticsUsersStats.accessTimesDescription'), children: jsx(AccessTimeHeatmap, { loading: isLoadingAccessTimeHeatmap, accessTimeData: accessTimeHeatmap }) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.userDetailsTitle'), label: t('analyticsAnalyticsUsersStats.userDetailsLabel'), filters: userDetailsStatsDateFilter, setOutsideFilters: setUserDetailsStatsDateFilter, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsUsersStats.userDetailsDescription'), children: jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-user", type: "text", placeholder: t('analyticsAnalyticsUsersStats.searchPlaceholder'), value: userDetailsStatsSearch, onChange: handleSearchInputChange, required: true, className: `pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11` })] }), jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[200px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUsername') }), jsx(TableHead, { children: t('analyticsAnalyticsUsersStats.tableHeaderMessages') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsUsersStats.tableHeaderLastActive') })] }) }), jsx(TableBody, { children: (_d = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _d === void 0 ? void 0 : _d.map((user, index) => (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: user.email || t('analyticsAnalyticsUsersStats.anonymous') }) }), jsx(TableCell, { children: user.full_name || '' }), jsx(TableCell, { children: user.messages }), jsx(TableCell, { className: "text-right", children: user.last_activity ? formatRelativeTime$1(user.last_activity, t) : '-' })] }, index))) })] }) }), isLoadingUserDetailsStats && (jsx("div", { className: "flex items-center justify-center py-4", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsUsersStats.loading') }) })), !isLoadingUserDetailsStats &&
230409
+ })), tooltipLabel: t('analyticsAnalyticsUsersStats.activeUsersLabel'), tooltipAriaLabel: (label) => t('analyticsAnalyticsUsersStats.activeUsersAriaLabel', { label }) })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.accessTimesTitle'), label: t('analyticsAnalyticsUsersStats.accessTimesLabel'), filters: accessTimeHeatmapDateFilter, setOutsideFilters: setAccessTimeHeatmapDateFilter, description: t('analyticsAnalyticsUsersStats.accessTimesDescription'), children: jsx(AccessTimeHeatmap, { loading: isLoadingAccessTimeHeatmap, accessTimeData: accessTimeHeatmap }) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsUsersStats.userDetailsTitle'), label: t('analyticsAnalyticsUsersStats.userDetailsLabel'), filters: userDetailsStatsDateFilter, setOutsideFilters: setUserDetailsStatsDateFilter, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsUsersStats.userDetailsDescription'), children: jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-user", type: "text", placeholder: t('analyticsAnalyticsUsersStats.searchPlaceholder'), value: userDetailsStatsSearch, onChange: handleSearchInputChange, required: true, className: `pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11` })] }), jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[200px]", children: t('analyticsAnalyticsUsersStats.tableHeaderUsername') }), jsx(TableHead, { children: t('analyticsAnalyticsUsersStats.tableHeaderMessages') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsUsersStats.tableHeaderLastActive') })] }) }), jsx(TableBody, { children: (_d = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _d === void 0 ? void 0 : _d.map((user, index) => (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: user.email ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: user.username, display: user.email })) : (t('analyticsAnalyticsUsersStats.anonymous')) }) }), jsx(TableCell, { children: user.full_name ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: user.username, display: user.full_name })) : null }), jsx(TableCell, { children: user.messages }), jsx(TableCell, { className: "text-right", children: user.last_activity ? formatRelativeTime$1(user.last_activity, t) : '-' })] }, index))) })] }) }), isLoadingUserDetailsStats && (jsx("div", { className: "flex items-center justify-center py-4", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsUsersStats.loading') }) })), !isLoadingUserDetailsStats &&
230266
230410
  (!((_e = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _e === void 0 ? void 0 : _e.length) || ((_f = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _f === void 0 ? void 0 : _f.length) === 0) && (jsx(EmptyStats, {})), (userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.pagination) && ((_g = userDetailsStats === null || userDetailsStats === void 0 ? void 0 : userDetailsStats.results) === null || _g === void 0 ? void 0 : _g.length) > 0 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setUserDetailsStatsPage(1), disabled: !userDetailsStats.pagination.has_previous, children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsUsersStats.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setUserDetailsStatsPage(userDetailsStats.pagination.page - 1), disabled: !userDetailsStats.pagination.has_previous, children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsUsersStats.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: userDetailsStats.pagination.total_pages }, (_, i) => i + 1)
230267
230411
  .filter((page) => {
230268
230412
  const current = userDetailsStats.pagination.page;
@@ -230744,6 +230888,15 @@ const SELF_VALUE = '__self__';
230744
230888
  * whose memories would then come back 403.
230745
230889
  */
230746
230890
  const MEMORY_LIST_ACTION = 'Ibl.Mentor/Memory/list';
230891
+ /** Most recognizable label first: full name, then email, then username. */
230892
+ const primaryLabel = (user) => { var _a, _b; return ((_a = user.name) === null || _a === void 0 ? void 0 : _a.trim()) || ((_b = user.email) === null || _b === void 0 ? void 0 : _b.trim()) || user.username; };
230893
+ /** The next identifier down, so two users sharing a name stay distinguishable. */
230894
+ const secondaryLabel = (user) => {
230895
+ var _a, _b, _c;
230896
+ if ((_a = user.name) === null || _a === void 0 ? void 0 : _a.trim())
230897
+ return ((_b = user.email) === null || _b === void 0 ? void 0 : _b.trim()) || user.username;
230898
+ return ((_c = user.email) === null || _c === void 0 ? void 0 : _c.trim()) ? user.username : '';
230899
+ };
230747
230900
  function useDebouncedValue(value, delay) {
230748
230901
  const [debounced, setDebounced] = useState(value);
230749
230902
  useEffect(() => {
@@ -230769,13 +230922,16 @@ function UserFilterSelect({ tenantKey, currentUsername, value, onChange, showSel
230769
230922
  const t = useT();
230770
230923
  const [open, setOpen] = useState(false);
230771
230924
  const [search, setSearch] = useState('');
230925
+ // The filter value is only a username, so the picked row is kept to label
230926
+ // the trigger with its name or email.
230927
+ const [selectedUser, setSelectedUser] = useState(null);
230772
230928
  const debouncedSearch = useDebouncedValue(search, SEARCH_DEBOUNCE_MS);
230773
230929
  const { currentTenant } = useCurrentTenant();
230774
230930
  const rbacPermissions = useSelector(selectRbacPermissions);
230775
230931
  const isWatcher = isPureWatcher(rbacPermissions, currentTenant);
230776
- // Only fetched once the dropdown is open — the trigger shows the selected
230777
- // username, which is the filter value itself, so nothing needs looking up
230778
- // first.
230932
+ // Only fetched once the dropdown is open — the trigger labels the selection
230933
+ // from the row that was picked, falling back to the username value itself,
230934
+ // so nothing needs looking up first.
230779
230935
  const { data, isFetching: isFetchingPlatformUsers } = usePlatformUsersQuery({
230780
230936
  platform_key: tenantKey,
230781
230937
  platform_org: tenantKey,
@@ -230832,16 +230988,22 @@ function UserFilterSelect({ tenantKey, currentUsername, value, onChange, showSel
230832
230988
  // them at the top of the list.
230833
230989
  (user) => !!user.username && !(showSelfOption && user.username === currentUsername));
230834
230990
  }, [isWatcher, accessibleUsers, data, currentUsername, showSelfOption]);
230835
- const handleSelect = (username) => {
230836
- onChange(username);
230991
+ const handleSelect = (user) => {
230992
+ var _a;
230993
+ setSelectedUser(user);
230994
+ onChange((_a = user === null || user === void 0 ? void 0 : user.username) !== null && _a !== void 0 ? _a : '');
230837
230995
  setOpen(false);
230838
230996
  };
230839
- return (jsxs(Popover, { open: open, onOpenChange: setOpen, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button$1, { variant: "outline", role: "combobox", "aria-expanded": open, "aria-label": t('analyticsUserFilterSelect.filterByUser'), className: cn('h-9 w-full justify-between bg-white font-normal', className), children: [jsx("span", { className: "truncate", children: value ||
230997
+ // A value set from outside (e.g. the Cost table's "View traces" hand-off)
230998
+ // has no picked row; it resolves once the list holds it, else stays a username.
230999
+ const selectedLabelUser = (selectedUser === null || selectedUser === void 0 ? void 0 : selectedUser.username) === value ? selectedUser : users.find((user) => user.username === value);
231000
+ const triggerLabel = value ? (selectedLabelUser ? primaryLabel(selectedLabelUser) : value) : '';
231001
+ return (jsxs(Popover, { open: open, onOpenChange: setOpen, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button$1, { variant: "outline", role: "combobox", "aria-expanded": open, "aria-label": t('analyticsUserFilterSelect.filterByUser'), className: cn('h-9 w-full justify-between bg-white font-normal', className), children: [jsx("span", { className: "truncate", children: triggerLabel ||
230840
231002
  t(showSelfOption
230841
231003
  ? 'analyticsUserFilterSelect.you'
230842
- : 'analyticsUserFilterSelect.allUsers') }), jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsUserFilterSelect.searchPlaceholder') }), jsxs(CommandList, { children: [jsxs(CommandGroup, { children: [showSelfOption && (jsxs(CommandItem, { value: SELF_VALUE, onSelect: () => handleSelect(''), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), t('analyticsUserFilterSelect.you')] })), users.map((user) => (jsxs(CommandItem, {
231004
+ : 'analyticsUserFilterSelect.allUsers') }), jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), jsx(PopoverContent, { "data-iblai-dialog-interaction-layer": true, className: "z-[60] w-[280px] p-0", align: "start", children: jsxs(Command, { shouldFilter: false, children: [jsx(CommandInput, { value: search, onValueChange: setSearch, placeholder: t('analyticsUserFilterSelect.searchPlaceholder') }), jsxs(CommandList, { children: [jsxs(CommandGroup, { children: [showSelfOption && (jsxs(CommandItem, { value: SELF_VALUE, onSelect: () => handleSelect(null), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value ? 'opacity-0' : 'opacity-100') }), t('analyticsUserFilterSelect.you')] })), users.map((user) => (jsxs(CommandItem, {
230843
231005
  // cmdk keys items by value; the search itself is server-side.
230844
- value: user.username, onSelect: () => handleSelect(user.username), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value === user.username ? 'opacity-100' : 'opacity-0') }), jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx("span", { className: "truncate font-medium", children: user.name || user.username }), jsx("span", { className: "truncate text-xs text-gray-500", children: user.email || user.username })] })] }, user.key)))] }), isFetching && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.loadingUsers') })), !isFetching && users.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.noUsersFound') }))] })] }) })] }));
231006
+ value: user.username, onSelect: () => handleSelect(user), children: [jsx(Check, { className: cn('mr-2 h-4 w-4', value === user.username ? 'opacity-100' : 'opacity-0') }), jsxs("div", { className: "flex min-w-0 flex-col", children: [jsx("span", { className: "truncate font-medium", children: primaryLabel(user) }), secondaryLabel(user) && (jsx("span", { className: "truncate text-xs text-gray-500", children: secondaryLabel(user) }))] })] }, user.key)))] }), isFetching && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.loadingUsers') })), !isFetching && users.length === 0 && (jsx("div", { className: "px-3 py-4 text-center text-sm text-gray-500", children: t('analyticsUserFilterSelect.noUsersFound') }))] })] }) })] }));
230845
231007
  }
230846
231008
 
230847
231009
  const CELL$1 = 'p-3 text-[#646464]';
@@ -230887,7 +231049,7 @@ function ObservationRow({ observation, traceStart, traceDuration, }) {
230887
231049
  background: colorForSeries(observation.name || observation.type || ''),
230888
231050
  } }) }), jsx("div", { className: "w-[52px] shrink-0 text-right text-xs text-[#646464] tabular-nums", children: seconds !== undefined ? `${seconds.toFixed(2)}s` : '—' }), jsx("div", { className: "w-[58px] shrink-0 text-right text-xs text-[#646464] tabular-nums", children: tokens !== undefined ? tokens.toLocaleString() : '—' }), jsx("div", { className: "w-[64px] shrink-0 text-right text-xs font-semibold text-[#484848] tabular-nums", children: formatCost(cost) })] }));
230889
231051
  }
230890
- function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOpenTranscript, }) {
231052
+ function TraceDetail({ tenantKey, currentSPA, trace, observations, isLoadingObservations, onClose, onOpenTranscript, }) {
230891
231053
  var _a;
230892
231054
  const t = useT();
230893
231055
  const { traceStart, traceDuration } = useMemo(() => {
@@ -230903,7 +231065,12 @@ function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOp
230903
231065
  }, [observations]);
230904
231066
  const totalCost = (_a = trace.totalCost) !== null && _a !== void 0 ? _a : observations.reduce((sum, o) => { var _a, _b; return sum + ((_b = (_a = o.calculatedTotalCost) !== null && _a !== void 0 ? _a : o.totalCost) !== null && _b !== void 0 ? _b : 0); }, 0);
230905
231067
  const meta = [
230906
- [t('analyticsTraces.detailUser'), trace.userId || '—'],
231068
+ [
231069
+ t('analyticsTraces.detailUser'),
231070
+ trace.userId ? (
231071
+ // Langfuse's userId is the platform username the traces filter sends.
231072
+ jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: trace.userId, display: trace.userId })) : ('—'),
231073
+ ],
230907
231074
  [t('analyticsTraces.detailSession'), trace.sessionId || '—'],
230908
231075
  [t('analyticsTraces.detailEnvironment'), trace.environment || '—'],
230909
231076
  [t('analyticsTraces.detailStarted'), formatTime(trace.timestamp)],
@@ -230915,7 +231082,7 @@ function TraceDetail({ trace, observations, isLoadingObservations, onClose, onOp
230915
231082
  * observations as a waterfall. Ranked totals stay on the Spend sub-tab; this
230916
231083
  * surface answers "what actually happened on that call".
230917
231084
  */
230918
- function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initialUsername, }) {
231085
+ function AnalyticsTraces({ tenantKey, currentSPA, mentorId, filters, onOpenTranscript, initialUsername, }) {
230919
231086
  var _a;
230920
231087
  const t = useT();
230921
231088
  const { traces, meta, isLoadingTraces, isTracesUnavailable, isForbidden, page, setPage, username, traceName, setFilter, selectedTraceId, setSelectedTraceId, selectedTrace, observations, isLoadingObservations, } = useLlmTraces({
@@ -230939,7 +231106,7 @@ function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initi
230939
231106
  count: meta.totalItems.toLocaleString(),
230940
231107
  }) }))] }), isLoadingTraces ? (jsx("div", { className: "flex w-full items-center justify-center py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : traces.length === 0 ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsTraces.noTraces') }) })) : (jsx("div", { className: "overflow-x-auto", children: jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colStarted') }), jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colService') }), jsx(TableHead, { className: HEAD$1, children: t('analyticsTraces.colUser') }), jsx(TableHead, { className: cn(HEAD$1, 'text-right'), children: t('analyticsTraces.colLatency') }), jsx(TableHead, { className: cn(HEAD$1, 'text-right'), children: t('analyticsTraces.colCost') }), jsx(TableHead, { className: "w-[36px] p-3" })] }) }), jsx(TableBody, { children: traces.map((trace) => {
230941
231108
  const selected = trace.id === selectedTraceId;
230942
- return (jsxs(TableRow, { "aria-selected": selected, className: cn('cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0', selected ? 'bg-blue-50' : 'hover:bg-gray-50'), onClick: () => setSelectedTraceId(selected ? '' : trace.id), children: [jsx(TableCell, { className: cn(CELL$1, 'whitespace-nowrap tabular-nums'), children: formatTime(trace.timestamp) }), jsx(TableCell, { className: CELL$1, children: jsx(ServiceTag, { name: trace.name || '—' }) }), jsx(TableCell, { className: cn(CELL$1, 'max-w-[180px] truncate', selected && 'font-medium text-[#484848]'), children: trace.userId || t('analyticsTraces.anonymous') }), jsx(TableCell, { className: cn(CELL$1, 'text-right tabular-nums'), children: trace.latency !== undefined
231109
+ return (jsxs(TableRow, { "aria-selected": selected, className: cn('cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0', selected ? 'bg-blue-50' : 'hover:bg-gray-50'), onClick: () => setSelectedTraceId(selected ? '' : trace.id), children: [jsx(TableCell, { className: cn(CELL$1, 'whitespace-nowrap tabular-nums'), children: formatTime(trace.timestamp) }), jsx(TableCell, { className: CELL$1, children: jsx(ServiceTag, { name: trace.name || '—' }) }), jsx(TableCell, { className: cn(CELL$1, 'max-w-[180px] truncate', selected && 'font-medium text-[#484848]'), children: trace.userId ? (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: trace.userId, display: trace.userId })) : (t('analyticsTraces.anonymous')) }), jsx(TableCell, { className: cn(CELL$1, 'text-right tabular-nums'), children: trace.latency !== undefined
230943
231110
  ? `${Number(trace.latency).toFixed(2)}s`
230944
231111
  : '—' }), jsx(TableCell, { className: cn(CELL$1, 'text-right font-semibold text-[#484848] tabular-nums'), children: formatCost(trace.totalCost) }), jsx(TableCell, { className: "p-3 text-right text-gray-400", children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] }, trace.id));
230945
231112
  }) })] }) })), totalPages > 1 && (jsxs("div", { className: "flex items-center justify-between border-t border-[oklch(0.922_0_0)] px-4 py-3", children: [jsx("span", { className: "text-[13px] text-[#898989] tabular-nums", children: t('analyticsTraces.pageOf', { page, totalPages }) }), jsxs("div", { className: "flex items-center gap-1.5", children: [jsx(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-0", disabled: page <= 1, "aria-label": t('analyticsTraces.previousPage'), onClick: () => {
@@ -230948,13 +231115,27 @@ function AnalyticsTraces({ tenantKey, mentorId, filters, onOpenTranscript, initi
230948
231115
  }, children: jsx(ChevronLeft, { className: "h-4 w-4", "aria-hidden": "true" }) }), jsx(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-0", disabled: page >= totalPages, "aria-label": t('analyticsTraces.nextPage'), onClick: () => {
230949
231116
  setSelectedTraceId('');
230950
231117
  setPage(page + 1);
230951
- }, children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }))] }), selectedTraceId && selectedTrace && (jsx(TraceDetail, { trace: selectedTrace, observations: observations, isLoadingObservations: isLoadingObservations, onClose: () => setSelectedTraceId(''), onOpenTranscript: onOpenTranscript }))] }), mentorId && (jsx(AnalyticsNotice, { tone: "gray", title: t('analyticsTraces.mentorScopeTitle'), children: t('analyticsTraces.mentorScopeBody') }))] }));
231118
+ }, children: jsx(ChevronRight, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }))] }), selectedTraceId && selectedTrace && (jsx(TraceDetail, { tenantKey: tenantKey, currentSPA: currentSPA, trace: selectedTrace, observations: observations, isLoadingObservations: isLoadingObservations, onClose: () => setSelectedTraceId(''), onOpenTranscript: onOpenTranscript }))] }), mentorId && (jsx(AnalyticsNotice, { tone: "gray", title: t('analyticsTraces.mentorScopeTitle'), children: t('analyticsTraces.mentorScopeBody') }))] }));
230952
231119
  }
230953
231120
 
230954
231121
  /** An unreachable cost store must never render as $0.00 — it renders as this. */
230955
231122
  const COST_UNAVAILABLE = '\u2014';
230956
231123
  const hasCostValue = (value, isError) => !isError && value !== undefined && value !== null;
230957
231124
  const costValue = (value, isError) => hasCostValue(value, isError) ? Number(value).toFixed(2) : COST_UNAVAILABLE;
231125
+ /**
231126
+ * A dollar amount as a y-axis tick. Ticks land on round numbers, so trailing
231127
+ * zeros only widen the labels ("$12.000" overflowed the axis) — but a tenant
231128
+ * whose whole range sits below a hundredth of a cent would get a column of
231129
+ * identical "$0"s at fixed precision, so amounts under that keep two
231130
+ * significant digits instead.
231131
+ */
231132
+ const costTick = (value) => {
231133
+ if (value === 0)
231134
+ return '0';
231135
+ if (Math.abs(value) >= 0.0001)
231136
+ return String(parseFloat(value.toFixed(4)));
231137
+ return String(Number(value.toPrecision(2)));
231138
+ };
230958
231139
  /**
230959
231140
  * The spend side of the unified cost surface: billing totals, ranked per-user
230960
231141
  * history, provider and model breakdowns — all from the ClickHouse
@@ -230962,7 +231143,7 @@ const costValue = (value, isError) => hasCostValue(value, isError) ? Number(valu
230962
231143
  * family is deprecated), with the daily spend series from Langfuse, the only
230963
231144
  * backend with a bucketed cost series.
230964
231145
  */
230965
- function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTraces, }) {
231146
+ function SpendTab({ tenantKey, currentSPA, mentorId: currentMentorId, userId, onOpenUserTraces, }) {
230966
231147
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
230967
231148
  const t = useT();
230968
231149
  const { weeklyCostData, isLoadingWeeklyCostData, isErrorWeeklyCostData, monthlyCostData, isLoadingMonthlyCostData, isErrorMonthlyCostData, totalCostData, isLoadingTotalCostData, isErrorTotalCostData, detailedCostPerDayData, isLoadingDetailedCostPerDayData, detailedCostPerDayFilters, setDetailedCostPerDayFilters, detailedCostPerProviderData, isLoadingDetailedCostPerProviderData, detailedCostPerProviderFilters, setDetailedCostPerProviderFilters, detailedCostPerUserData, isLoadingDetailedCostPerUserData, detailedCostPerUserFilters, setDetailedCostPerUserFilters, costPerUserPage, setCostPerUserPage, costPerUserLimit, providerColors, detailedLLMCostData, isLoadingDetailedLLMCostData, detailedLLMCostFilters, setDetailedLLMCostFilters, } = useFinancial({ tenantKey, mentorId: currentMentorId, userId });
@@ -231034,7 +231215,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
231034
231215
  ((_e = detailedCostPerDayData === null || detailedCostPerDayData === void 0 ? void 0 : detailedCostPerDayData.overtime) === null || _e === void 0 ? void 0 : _e.length) > 0 ? (jsx(AnalyticsBarChart, { data: detailedCostPerDayData.overtime.map((item) => ({
231035
231216
  date: formatDateToShortFormat$2(item.date, detailedCostPerDayFilters.activeFilter === 'today'),
231036
231217
  value: item.value,
231037
- })), tooltipLabel: t('analyticsAnalyticsFinancialStats.costPerDayLabel'), tooltipValue: (point) => `$${(Number(point.value) || 0).toFixed(3)}`, tooltipAriaLabel: (label) => t('analyticsAnalyticsFinancialStats.costDetailsAriaLabel', { label }), yTickFormatter: (value) => `$${value.toFixed(3)}`, allowDecimals: true })) : (jsx(EmptyStats, {})) }) }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-5", children: [jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costByProviderTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costByProviderLabel'), filters: detailedCostPerProviderFilters, setOutsideFilters: setDetailedCostPerProviderFilters, description: t('analyticsAnalyticsFinancialStats.costByProviderDescription'), children: isLoadingDetailedCostPerProviderData ? (jsx(ChartLoading, {})) : ((_f = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _f === void 0 ? void 0 : _f.length) &&
231218
+ })), tooltipLabel: t('analyticsAnalyticsFinancialStats.costPerDayLabel'), tooltipValue: (point) => `$${(Number(point.value) || 0).toFixed(3)}`, tooltipAriaLabel: (label) => t('analyticsAnalyticsFinancialStats.costDetailsAriaLabel', { label }), yTickFormatter: (value) => `$${costTick(value)}`, yAxisWidth: 60, allowDecimals: true })) : (jsx(EmptyStats, {})) }) }), jsxs("div", { className: "grid grid-cols-1 lg:grid-cols-2 gap-5", children: [jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costByProviderTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costByProviderLabel'), filters: detailedCostPerProviderFilters, setOutsideFilters: setDetailedCostPerProviderFilters, description: t('analyticsAnalyticsFinancialStats.costByProviderDescription'), children: isLoadingDetailedCostPerProviderData ? (jsx(ChartLoading, {})) : ((_f = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _f === void 0 ? void 0 : _f.length) &&
231038
231219
  ((_g = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _g === void 0 ? void 0 : _g.length) > 0 ? (jsxs(PieChart, { children: [jsx(Pie, { data: (_h = detailedCostPerProviderData === null || detailedCostPerProviderData === void 0 ? void 0 : detailedCostPerProviderData.rows) === null || _h === void 0 ? void 0 : _h.map((item) => ({
231039
231220
  name: item.provider,
231040
231221
  value: item.total_cost,
@@ -231048,7 +231229,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
231048
231229
  const data = (_a = payload[0]) === null || _a === void 0 ? void 0 : _a.payload;
231049
231230
  return (jsxs("div", { className: "bg-background border border-border rounded-md p-3 shadow-lg z-[99999999]", style: { borderColor: 'oklch(.922 0 0)' }, role: "tooltip", "aria-label": t('analyticsAnalyticsFinancialStats.providerCostDetailsAriaLabel', {
231050
231231
  label,
231051
- }), tabIndex: -1, children: [jsx("div", { className: "font-medium text-foreground mb-2 text-base", children: label }), jsx("div", { className: "space-y-2 text-sm", children: jsxs("div", { className: "flex justify-between items-center", children: [jsxs("span", { className: "text-muted-foreground", children: [data === null || data === void 0 ? void 0 : data.name, ":"] }), jsxs("span", { className: "font-medium text-foreground", children: ["$", (_b = data === null || data === void 0 ? void 0 : data.value) === null || _b === void 0 ? void 0 : _b.toFixed(2)] })] }) })] }));
231232
+ }), tabIndex: -1, children: [jsx("div", { className: "font-medium text-foreground mb-2 text-base", children: label }), jsx("div", { className: "space-y-2 text-sm", children: jsxs("div", { className: "flex justify-between items-center", children: [jsxs("span", { className: "text-muted-foreground", children: [data === null || data === void 0 ? void 0 : data.name, ": "] }), jsxs("span", { className: "font-medium text-foreground", children: ["$", (_b = data === null || data === void 0 ? void 0 : data.value) === null || _b === void 0 ? void 0 : _b.toFixed(2)] })] }) })] }));
231052
231233
  }, wrapperStyle: { outline: 'none' } })] })) : (jsx(EmptyStats, {})) }), jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costByLLMTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costByLLMLabel'), filters: detailedLLMCostFilters, setOutsideFilters: setDetailedLLMCostFilters, description: t('analyticsAnalyticsFinancialStats.costByLLMDescription'), overflowAuto: true, children: isLoadingDetailedLLMCostData ? (jsx(ChartLoading, {})) : ((_k = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _k === void 0 ? void 0 : _k.length) && ((_l = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _l === void 0 ? void 0 : _l.length) > 0 ? (jsx(RankedBars, { items: [...((_m = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) !== null && _m !== void 0 ? _m : [])]
231053
231234
  .sort((a, b) => Number(b.total_cost) - Number(a.total_cost))
231054
231235
  .map((item, index) => ({
@@ -231059,9 +231240,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
231059
231240
  shown: (_p = (_o = detailedLLMCostData === null || detailedLLMCostData === void 0 ? void 0 : detailedLLMCostData.rows) === null || _o === void 0 ? void 0 : _o.length) !== null && _p !== void 0 ? _p : 0,
231060
231241
  }) })) : (jsx(EmptyStats, {})) })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsFinancialStats.costPerUserTitle'), source: "clickhouse", label: t('analyticsAnalyticsFinancialStats.costPerUserLabel'), filters: detailedCostPerUserFilters, setOutsideFilters: setDetailedCostPerUserFilters, overflowAuto: true, height: "450px", description: t('analyticsAnalyticsFinancialStats.costPerUserDescription'), children: jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "rounded-md", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "w-[250px]", children: t('analyticsAnalyticsFinancialStats.tableHeaderUserEmail') }), jsx(TableHead, { className: "w-[120px]", children: t('analyticsAnalyticsFinancialStats.tableHeaderTotalCost') }), hasSessions && (jsx(TableHead, { children: t('analyticsAnalyticsFinancialStats.tableHeaderSessions') })), hasLastActive && (jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsFinancialStats.tableHeaderLastActive') })), onOpenUserTraces && jsx(TableHead, { className: "w-[90px]" })] }) }), jsx(TableBody, { children: (_q = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _q === void 0 ? void 0 : _q.map((user, index) => {
231061
231242
  var _a;
231062
- return (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: (user === null || user === void 0 ? void 0 : user.email) ||
231063
- (user === null || user === void 0 ? void 0 : user.username) ||
231064
- t('analyticsAnalyticsFinancialStats.anonymous') }) }), jsxs(TableCell, { className: "font-medium", children: ["$", Number(user.total_cost || 0).toFixed(2)] }), hasSessions && jsx(TableCell, { children: (_a = user.sessions) !== null && _a !== void 0 ? _a : '\u2014' }), hasLastActive && (jsx(TableCell, { className: "text-right", children: user.last_active ? formatRelativeTime$2(user.last_active) : '-' })), onOpenUserTraces && (jsx(TableCell, { className: "text-right", children: (user === null || user === void 0 ? void 0 : user.username) || (user === null || user === void 0 ? void 0 : user.email) ? (jsx("button", { type: "button", className: "cursor-pointer text-sm font-semibold text-blue-600 hover:text-blue-700 hover:underline", onClick: () => onOpenUserTraces(String(user.username || user.email)), children: t('analyticsAnalyticsFinancialStats.viewTraces') })) : null }))] }, index));
231243
+ return (jsxs(TableRow, { className: cn(index % 2 === 0 ? 'bg-gray-50' : '', 'h-[48px]'), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("div", { className: "flex items-center", children: (user === null || user === void 0 ? void 0 : user.email) || (user === null || user === void 0 ? void 0 : user.username) ? (jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: user.username, display: String(user.email || user.username) })) : (t('analyticsAnalyticsFinancialStats.anonymous')) }) }), jsxs(TableCell, { className: "font-medium", children: ["$", Number(user.total_cost || 0).toFixed(2)] }), hasSessions && jsx(TableCell, { children: (_a = user.sessions) !== null && _a !== void 0 ? _a : '\u2014' }), hasLastActive && (jsx(TableCell, { className: "text-right", children: user.last_active ? formatRelativeTime$2(user.last_active) : '-' })), onOpenUserTraces && (jsx(TableCell, { className: "text-right", children: (user === null || user === void 0 ? void 0 : user.username) || (user === null || user === void 0 ? void 0 : user.email) ? (jsx("button", { type: "button", className: "cursor-pointer text-sm font-semibold text-blue-600 hover:text-blue-700 hover:underline", onClick: () => onOpenUserTraces(String(user.username || user.email)), children: t('analyticsAnalyticsFinancialStats.viewTraces') })) : null }))] }, index));
231065
231244
  }) })] }) }), isLoadingDetailedCostPerUserData && (jsx("div", { className: "h-[60px]", children: jsx(ChartLoading, {}) })), !isLoadingDetailedCostPerUserData &&
231066
231245
  (!((_r = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _r === void 0 ? void 0 : _r.length) ||
231067
231246
  ((_s = detailedCostPerUserData === null || detailedCostPerUserData === void 0 ? void 0 : detailedCostPerUserData.rows) === null || _s === void 0 ? void 0 : _s.length) === 0) && (jsx("div", { className: "h-[60px]", children: jsx(EmptyStats, {}) })), detailedCostPerUserData && detailedCostPerUserData.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-between py-3", children: [jsx("div", { className: "text-sm text-gray-700", children: t('analyticsAnalyticsFinancialStats.paginationShowing', {
@@ -231077,7 +231256,7 @@ function SpendTab({ tenantKey, mentorId: currentMentorId, userId, onOpenUserTrac
231077
231256
  * (tokens, latency percentiles, per-call drill-down). Every card names its
231078
231257
  * source so a number is never read against the wrong question.
231079
231258
  */
231080
- function AnalyticsFinancialStats({ tenantKey, mentorId, selectedMentorId, userId, onOpenTranscript, }) {
231259
+ function AnalyticsFinancialStats({ tenantKey, currentSPA, mentorId, selectedMentorId, userId, onOpenTranscript, }) {
231081
231260
  var _a, _b;
231082
231261
  const t = useT();
231083
231262
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
@@ -231106,9 +231285,9 @@ function AnalyticsFinancialStats({ tenantKey, mentorId, selectedMentorId, userId
231106
231285
  }, className: cn('relative h-[38px] cursor-pointer whitespace-nowrap px-px text-sm transition-colors', active
231107
231286
  ? 'font-semibold text-[#484848]'
231108
231287
  : 'font-medium text-gray-500 hover:text-gray-700'), children: [tab.label, active && (jsx("span", { className: "absolute inset-x-0 -bottom-px h-0.5 rounded-sm bg-blue-600" }))] }, tab.value));
231109
- }) }), subTab === 'spend' && (jsx(SpendTab, { tenantKey: tenantKey, mentorId: currentMentorId, userId: currentUserId, onOpenUserTraces: openUserTraces })), subTab === 'usage' && (jsx(AnalyticsLlmUsageStats, { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters })), subTab === 'traces' && (jsx(AnalyticsTraces
231288
+ }) }), subTab === 'spend' && (jsx(SpendTab, { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: currentMentorId, userId: currentUserId, onOpenUserTraces: openUserTraces })), subTab === 'usage' && (jsx(AnalyticsLlmUsageStats, { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters })), subTab === 'traces' && (jsx(AnalyticsTraces
231110
231289
  // Remount when the hand-off user changes so the seeded filter takes.
231111
- , { tenantKey: tenantKey, mentorId: currentMentorId, filters: llmFilters, onOpenTranscript: onOpenTranscript, initialUsername: tracesUsername || undefined }, tracesUsername || 'all'))] }));
231290
+ , { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: currentMentorId, filters: llmFilters, onOpenTranscript: onOpenTranscript, initialUsername: tracesUsername || undefined }, tracesUsername || 'all'))] }));
231112
231291
  }
231113
231292
 
231114
231293
  const useTranscripts = ({ tenantKey, mentorId, usergroupIds, }) => {
@@ -231186,6 +231365,37 @@ const useTranscripts = ({ tenantKey, mentorId, usergroupIds, }) => {
231186
231365
  };
231187
231366
  };
231188
231367
 
231368
+ /**
231369
+ * An agent named in a stats row, clickable to re-scope the whole analytics
231370
+ * page to that agent — the same thing the control bar's picker does, reached
231371
+ * from the data instead of from a search box.
231372
+ *
231373
+ * It renders as plain text wherever re-scoping is impossible or pointless: on
231374
+ * per-agent pages (no picker, so nothing would visibly change), and on rows
231375
+ * whose agent the payload identifies by name alone. Safe inside clickable rows
231376
+ * and cards — neither its clicks nor its key presses reach their handlers.
231377
+ */
231378
+ function AgentScopeLink({ uniqueId, name, fallback = '-', onScoped, className, testId, }) {
231379
+ const t = useT();
231380
+ const setScopedMentor = useAnalyticsScopeSetter();
231381
+ const { scopedMentor } = useAnalyticsScope();
231382
+ const display = name || uniqueId || fallback;
231383
+ if (!setScopedMentor || !uniqueId) {
231384
+ return (jsx("span", { className: className, "data-testid": testId, children: display }));
231385
+ }
231386
+ const isCurrent = (scopedMentor === null || scopedMentor === void 0 ? void 0 : scopedMentor.uniqueId) === uniqueId;
231387
+ return (jsx("button", { type: "button", onClick: (event) => {
231388
+ event.stopPropagation();
231389
+ // No `dbId`: these payloads carry the `unique_id` only. AnalyticsLayout
231390
+ // resolves the rest before the scope reaches anyone — see
231391
+ // AnalyticsScopedMentor.
231392
+ setScopedMentor({ uniqueId, name: name || uniqueId });
231393
+ onScoped === null || onScoped === void 0 ? void 0 : onScoped();
231394
+ },
231395
+ // Rows that open on Enter/Space would otherwise swallow the key press.
231396
+ onKeyDown: (event) => event.stopPropagation(), className: cn('max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none', isCurrent && 'font-medium text-blue-600', className), "aria-label": t('analyticsAgentScopeLink.scopeToAgent', { name: display }), "aria-current": isCurrent ? 'true' : undefined, "data-testid": testId, children: display }));
231397
+ }
231398
+
231189
231399
  /**
231190
231400
  * Attachments on a transcript turn. A turn can carry files with no text at
231191
231401
  * all (an uploaded image and nothing else), so the bubble renders these even
@@ -231245,8 +231455,8 @@ const getMessageContent = (content) => {
231245
231455
  * name / username stand in behind it.
231246
231456
  */
231247
231457
  const identifyUser = (...candidates) => candidates.find((candidate) => !!candidate) || '-';
231248
- function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, usergroupIds, }) {
231249
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
231458
+ function AnalyticsTranscriptsStats({ tenantKey, currentSPA, mentorId, selectedMentorId, usergroupIds, }) {
231459
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
231250
231460
  const t = useT();
231251
231461
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
231252
231462
  const [isModalOpen, setIsModalOpen] = useState(false);
@@ -231355,14 +231565,14 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
231355
231565
  };
231356
231566
  // Transcript Detail Component (reusable for both desktop and mobile)
231357
231567
  const TranscriptDetail = ({ className = '' }) => {
231358
- var _a, _b, _c, _d, _e, _f, _g, _h;
231568
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
231359
231569
  return (jsx("div", { className: cn('h-full flex flex-col', className), children: !selectedTranscript ? (jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(ArrowLeft, { className: "h-6 w-6 mx-auto mb-2" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.selectConversation') })] }) })) : isLoadingTranscriptsMessagesDetailsData ? (
231360
231570
  /* Loading state */
231361
231571
  jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500 mx-auto mb-3", "aria-hidden": "true" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.loadingTranscript') })] }) })) : isErrorTranscriptsMessagesDetailsData || !transcriptsMessagesDetailsData ? (
231362
231572
  /* Error or no data state */
231363
231573
  jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(X$1, { className: "h-6 w-6 mx-auto mb-2 text-red-400" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noTranscriptDetails') }), jsx("p", { className: "text-sm mt-1", children: t('analyticsAnalyticsTranscriptsStats.unableToLoadTranscript') })] }) })) : (
231364
231574
  /* Data loaded successfully */
231365
- jsxs(Fragment$1, { children: [jsxs("div", { className: "mb-4 flex-shrink-0", children: [jsx("h2", { className: "text-lg font-semibold mb-2", children: t('analyticsAnalyticsTranscriptsStats.conversationTranscript') }), jsxs("div", { className: "text-sm text-gray-500", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', identifyUser((_a = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _a === void 0 ? void 0 : _a.email, (_b = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _b === void 0 ? void 0 : _b.name)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', identifyUser((_c = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _c === void 0 ? void 0 : _c.email, (_d = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _d === void 0 ? void 0 : _d.username)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', ((_e = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _e === void 0 ? void 0 : _e.mentor) || '-'] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_f = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _f === void 0 ? void 0 : _f.model) || '-'] })] })] }), jsx("div", { className: "flex-1 overflow-y-auto space-y-4 min-h-0", children: ((_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _g === void 0 ? void 0 : _g.length) > 0 ? ((_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _h === void 0 ? void 0 : _h.map((message, index) => {
231575
+ jsxs(Fragment$1, { children: [jsxs("div", { className: "mb-4 flex-shrink-0", children: [jsx("h2", { className: "text-lg font-semibold mb-2", children: t('analyticsAnalyticsTranscriptsStats.conversationTranscript') }), jsxs("div", { className: "text-sm text-gray-500", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_a = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _a === void 0 ? void 0 : _a.username, display: identifyUser((_b = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _b === void 0 ? void 0 : _b.email, (_c = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _c === void 0 ? void 0 : _c.name) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_d = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _d === void 0 ? void 0 : _d.username, display: identifyUser((_e = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _e === void 0 ? void 0 : _e.email, (_f = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _f === void 0 ? void 0 : _f.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: (_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _g === void 0 ? void 0 : _g.mentor_unique_id, name: (_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _h === void 0 ? void 0 : _h.mentor })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_j = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _j === void 0 ? void 0 : _j.model) || '-'] })] })] }), jsx("div", { className: "flex-1 overflow-y-auto space-y-4 min-h-0", children: ((_k = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _k === void 0 ? void 0 : _k.length) > 0 ? ((_l = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _l === void 0 ? void 0 : _l.map((message, index) => {
231366
231576
  var _a, _b;
231367
231577
  return (jsxs(React__default.Fragment, { children: [((message === null || message === void 0 ? void 0 : message.human) || !!((_a = message === null || message === void 0 ? void 0 : message.human_files) === null || _a === void 0 ? void 0 : _a.length)) && (jsxs("div", { className: `p-3 rounded-lg bg-blue-100 ml-4`, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleUser') }) }), message.human && (jsx("p", { className: "text-sm", children: getMessageContent(message.human) })), jsx(TranscriptFiles, { files: message.human_files })] }, `${index}-human`)), ((message === null || message === void 0 ? void 0 : message.ai) || !!((_b = message === null || message === void 0 ? void 0 : message.ai_files) === null || _b === void 0 ? void 0 : _b.length)) && (jsxs("div", { className: `p-3 rounded-lg bg-white mr-4`, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleAgent') }) }), message.ai && jsx(Markdown, { children: getMessageContent(message.ai) }), jsx(TranscriptFiles, { files: message.ai_files })] }, `${index}-ai`))] }, index));
231368
231578
  })) : (jsx("div", { className: "text-center text-gray-500 py-8", children: jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noMessages') }) })) })] })) }));
@@ -231386,7 +231596,7 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
231386
231596
  ? t('analyticsAnalyticsTranscriptsStats.sentimentNegative')
231387
231597
  : transcript.sentiment === 'positive'
231388
231598
  ? t('analyticsAnalyticsTranscriptsStats.sentimentPositive')
231389
- : t('analyticsAnalyticsTranscriptsStats.sentimentNeutral'), ' ', t('analyticsAnalyticsTranscriptsStats.userSentiment')] })] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUser'), ' ', identifyUser(transcript === null || transcript === void 0 ? void 0 : transcript.email, transcript === null || transcript === void 0 ? void 0 : transcript.name, transcript === null || transcript === void 0 ? void 0 : transcript.username)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', (transcript === null || transcript === void 0 ? void 0 : transcript.mentor) || '-'] })] }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModelCard'), ' ', (transcript === null || transcript === void 0 ? void 0 : transcript.model) || '-'] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUserId'), ' ', identifyUser(transcript === null || transcript === void 0 ? void 0 : transcript.email, transcript === null || transcript === void 0 ? void 0 : transcript.username)] })] }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500", children: [jsxs("div", { children: [transcript.message_count, " ", t('analyticsAnalyticsTranscriptsStats.messages')] }), jsx("div", { children: "\u2022" }), jsxs("div", { children: ["$", Number((transcript === null || transcript === void 0 ? void 0 : transcript.cost) || 0).toFixed(2), ' ', t('analyticsAnalyticsTranscriptsStats.estimatedCost')] }), (transcript === null || transcript === void 0 ? void 0 : transcript.created_at) && (jsxs(Fragment$1, { children: [jsx("div", { children: "\u2022" }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.created'), ' ', formatRelativeTime(transcript.created_at, t)] })] }))] })] }, transcript.session));
231599
+ : t('analyticsAnalyticsTranscriptsStats.sentimentNeutral'), ' ', t('analyticsAnalyticsTranscriptsStats.userSentiment')] })] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUser'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: transcript === null || transcript === void 0 ? void 0 : transcript.username, display: identifyUser(transcript === null || transcript === void 0 ? void 0 : transcript.email, transcript === null || transcript === void 0 ? void 0 : transcript.name, transcript === null || transcript === void 0 ? void 0 : transcript.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: transcript === null || transcript === void 0 ? void 0 : transcript.mentor_unique_id, name: transcript === null || transcript === void 0 ? void 0 : transcript.mentor })] })] }), jsx("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500 mb-2", children: jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModelCard'), ' ', (transcript === null || transcript === void 0 ? void 0 : transcript.model) || '-'] }) }), jsxs("div", { className: "flex flex-wrap gap-x-6 gap-y-2 text-xs text-gray-500", children: [jsxs("div", { children: [transcript.message_count, " ", t('analyticsAnalyticsTranscriptsStats.messages')] }), jsx("div", { children: "\u2022" }), jsxs("div", { children: ["$", Number((transcript === null || transcript === void 0 ? void 0 : transcript.cost) || 0).toFixed(2), ' ', t('analyticsAnalyticsTranscriptsStats.estimatedCost')] }), (transcript === null || transcript === void 0 ? void 0 : transcript.created_at) && (jsxs(Fragment$1, { children: [jsx("div", { children: "\u2022" }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.created'), ' ', formatRelativeTime(transcript.created_at, t)] })] }))] })] }, transcript.session));
231390
231600
  })) : (
231391
231601
  // Empty state
231392
231602
  jsx("div", { className: "text-center py-12", children: jsx("p", { className: "text-gray-500", children: filters.topicSearch || filters.userSearch || filters.rating
@@ -231422,7 +231632,7 @@ function AnalyticsTranscriptsStats({ tenantKey, mentorId, selectedMentorId, user
231422
231632
  /* Error or no data state */
231423
231633
  jsx("div", { className: "flex items-center justify-center h-full text-gray-400", children: jsxs("div", { className: "text-center", children: [jsx(X$1, { className: "h-6 w-6 mx-auto mb-2 text-red-400" }), jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noTranscriptDetails') }), jsx("p", { className: "text-sm mt-1", children: t('analyticsAnalyticsTranscriptsStats.unableToLoadTranscript') })] }) })) : (
231424
231634
  /* Data loaded successfully */
231425
- jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "mb-4", children: jsxs("div", { className: "text-sm text-gray-500 space-y-1", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', identifyUser((_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _g === void 0 ? void 0 : _g.email, (_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _h === void 0 ? void 0 : _h.name)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', identifyUser((_j = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _j === void 0 ? void 0 : _j.email, (_k = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _k === void 0 ? void 0 : _k.username)] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', ((_l = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _l === void 0 ? void 0 : _l.mentor) || '-'] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_m = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _m === void 0 ? void 0 : _m.model) || '-'] })] }) }), jsx("div", { className: "space-y-4 pb-4", children: ((_o = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _o === void 0 ? void 0 : _o.length) > 0 ? ((_p = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _p === void 0 ? void 0 : _p.map((message, index) => {
231635
+ jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "mb-4", children: jsxs("div", { className: "text-sm text-gray-500 space-y-1", children: [jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelFullName'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_g = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _g === void 0 ? void 0 : _g.username, display: identifyUser((_h = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _h === void 0 ? void 0 : _h.email, (_j = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _j === void 0 ? void 0 : _j.name) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelUsername'), ' ', jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: (_k = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _k === void 0 ? void 0 : _k.username, display: identifyUser((_l = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _l === void 0 ? void 0 : _l.email, (_m = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _m === void 0 ? void 0 : _m.username) })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelAgent'), ' ', jsx(AgentScopeLink, { uniqueId: (_o = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _o === void 0 ? void 0 : _o.mentor_unique_id, name: (_p = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _p === void 0 ? void 0 : _p.mentor })] }), jsxs("div", { children: [t('analyticsAnalyticsTranscriptsStats.labelModel'), ' ', ((_q = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.summary) === null || _q === void 0 ? void 0 : _q.model) || '-'] })] }) }), jsx("div", { className: "space-y-4 pb-4", children: ((_r = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _r === void 0 ? void 0 : _r.length) > 0 ? ((_s = transcriptsMessagesDetailsData === null || transcriptsMessagesDetailsData === void 0 ? void 0 : transcriptsMessagesDetailsData.messages) === null || _s === void 0 ? void 0 : _s.map((message, index) => {
231426
231636
  var _a, _b;
231427
231637
  return (jsxs(React__default.Fragment, { children: [((message === null || message === void 0 ? void 0 : message.human) || !!((_a = message === null || message === void 0 ? void 0 : message.human_files) === null || _a === void 0 ? void 0 : _a.length)) && (jsxs("div", { className: "p-3 rounded-lg bg-blue-100 ml-4", children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleUser') }) }), message.human && (jsx("p", { className: "text-sm", children: getMessageContent(message.human) })), jsx(TranscriptFiles, { files: message.human_files })] })), ((message === null || message === void 0 ? void 0 : message.ai) || !!((_b = message === null || message === void 0 ? void 0 : message.ai_files) === null || _b === void 0 ? void 0 : _b.length)) && (jsxs("div", { className: "p-3 rounded-lg bg-white mr-4 border", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx("div", { className: "flex justify-between items-start mb-1", children: jsx("span", { className: "font-medium text-sm", children: t('analyticsAnalyticsTranscriptsStats.roleAgent') }) }), message.ai && jsx(Markdown, { children: getMessageContent(message.ai) }), jsx(TranscriptFiles, { files: message.ai_files })] }))] }, index));
231428
231638
  })) : (jsx("div", { className: "text-center text-gray-500 py-8", children: jsx("p", { children: t('analyticsAnalyticsTranscriptsStats.noMessages') }) })) })] })) })] }) }))] }));
@@ -232439,6 +232649,8 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
232439
232649
  mentor_unique_id: mentorId,
232440
232650
  limit: coursesListLimit,
232441
232651
  page: coursesListPage,
232652
+ // Busiest courses first — this list reads as a leaderboard.
232653
+ sort_by: 'active_enrollments',
232442
232654
  ...(debouncedSearch && { search: debouncedSearch }),
232443
232655
  });
232444
232656
  }, [
@@ -232477,11 +232689,31 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
232477
232689
  debouncedCourseEnrollmentsSearch,
232478
232690
  ]);
232479
232691
  // Query for courses list and summary
232480
- const { data: contentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
232692
+ const { data: contentAnalyticsData, currentData: currentContentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
232481
232693
  // Query for course details (only when courseId is provided)
232482
- const { data: courseDetailsData, isLoading: isLoadingCourseDetails, isFetching: isFetchingCourseDetails, } = useGetContentAnalyticsDetailsQuery(courseDetailsParams, {
232694
+ const { data: courseDetailsData, currentData: currentCourseDetailsData, isLoading: isLoadingCourseDetails, isFetching: isFetchingCourseDetails, } = useGetContentAnalyticsDetailsQuery(courseDetailsParams, {
232483
232695
  skip: !courseDetailsParams,
232484
232696
  });
232697
+ // Searching the table re-runs the one request the summary cards and the chart
232698
+ // also read from. RTK keeps the previous arguments' response in `data` while
232699
+ // the new one is in flight, so those sections never blank mid-search — but
232700
+ // `currentData` alone can't tell a search apart from an agent or date change,
232701
+ // which those sections *do* vary with. Comparing their own inputs does: while
232702
+ // they differ from the last settled response, the sections report loading
232703
+ // rather than showing the previous scope's numbers with nothing saying so.
232704
+ const statsKey = JSON.stringify({ tenantKey, mentorId, enrollmentStatsDateFilter });
232705
+ const settledStatsKey = React__default.useRef(statsKey);
232706
+ if (currentContentAnalyticsData)
232707
+ settledStatsKey.current = statsKey;
232708
+ const detailStatsKey = JSON.stringify({
232709
+ courseId,
232710
+ tenantKey,
232711
+ mentorId,
232712
+ timeSpentStatsDateFilter,
232713
+ });
232714
+ const settledDetailStatsKey = React__default.useRef(detailStatsKey);
232715
+ if (currentCourseDetailsData)
232716
+ settledDetailStatsKey.current = detailStatsKey;
232485
232717
  // Map content analytics data to courseStats
232486
232718
  const courseStats = useMemo(() => {
232487
232719
  if (!contentAnalyticsData) {
@@ -232576,8 +232808,21 @@ const useCourses = ({ tenantKey, mentorId, courseId, }) => {
232576
232808
  isFetchingContentAnalytics ||
232577
232809
  isLoadingCourseDetails ||
232578
232810
  isFetchingCourseDetails;
232811
+ // Loading for the sections that don't vary with the table search — see
232812
+ // `statsKey` above for why the key comparison is what distinguishes a search
232813
+ // from a change those sections do have to redraw for.
232814
+ const isStatsLoading = isLoadingContentAnalytics ||
232815
+ (isFetchingContentAnalytics &&
232816
+ currentContentAnalyticsData === undefined &&
232817
+ settledStatsKey.current !== statsKey);
232818
+ const isDetailStatsLoading = isLoadingCourseDetails ||
232819
+ (isFetchingCourseDetails &&
232820
+ currentCourseDetailsData === undefined &&
232821
+ settledDetailStatsKey.current !== detailStatsKey);
232579
232822
  return {
232580
232823
  courseStats,
232824
+ isStatsLoading,
232825
+ isDetailStatsLoading,
232581
232826
  isLoading,
232582
232827
  enrollmentStats,
232583
232828
  enrollmentStatsDateFilter,
@@ -232626,30 +232871,40 @@ const formatSecondsToTime$1 = (seconds) => {
232626
232871
  const formatSecondsToHours$1 = (seconds) => {
232627
232872
  return Math.round((seconds / 3600) * 10) / 10;
232628
232873
  };
232629
- function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = '', }) {
232874
+ function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = '', getCourseURL, }) {
232630
232875
  var _a, _b, _c;
232631
232876
  const t = useT();
232632
232877
  const router = useRouter();
232633
232878
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
232634
- const { courseStats, isLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, coursesList, setCoursesListPage, coursesListSearch, handleSearchInputChange, coursesPagination, } = useCourses({ tenantKey, mentorId: currentMentorId });
232879
+ const { courseStats, isLoading, isStatsLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, coursesList, setCoursesListPage, coursesListSearch, handleSearchInputChange, coursesPagination, } = useCourses({ tenantKey, mentorId: currentMentorId });
232635
232880
  const handleCourseClick = (courseId) => {
232636
232881
  router.push(`${basePath}/courses/${courseId}`);
232637
232882
  };
232638
232883
  const hasEnrollmentStatsPoints = Number((_a = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _a === void 0 ? void 0 : _a.length) > 0;
232639
- return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourses.activeCourses'), value: courseStats.active_courses, percentage: courseStats.active_courses_percentage, description: t('analyticsAnalyticsCourses.activeCoursesDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourses.totalCourses'), value: courseStats.total_courses, percentage: courseStats.total_courses_percentage, description: t('analyticsAnalyticsCourses.totalCoursesDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourses.enrollments'), value: courseStats.enrollments, percentage: courseStats.enrollments_percentage, description: t('analyticsAnalyticsCourses.enrollmentsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourses.totalLearners'), value: courseStats.total_learners,
232884
+ return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.activeCourses'), value: courseStats.active_courses, percentage: courseStats.active_courses_percentage, description: t('analyticsAnalyticsCourses.activeCoursesDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.totalCourses'), value: courseStats.total_courses, percentage: courseStats.total_courses_percentage, description: t('analyticsAnalyticsCourses.totalCoursesDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.enrollments'), value: courseStats.enrollments, percentage: courseStats.enrollments_percentage, description: t('analyticsAnalyticsCourses.enrollmentsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsCourses.totalLearners'), value: courseStats.total_learners,
232640
232885
  //percentage={courseStats.enrollments_percentage}
232641
- description: t('analyticsAnalyticsCourses.totalLearnersDescription') })] }), (isLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsCourses.courseOvertime'), label: t('analyticsAnalyticsCourses.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsCourses.courseOvertimeDescription'), children: isLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
232886
+ description: t('analyticsAnalyticsCourses.totalLearnersDescription') })] }), (isStatsLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsCourses.courseOvertime'), label: t('analyticsAnalyticsCourses.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsCourses.courseOvertimeDescription'), children: isStatsLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
232642
232887
  date: formatDateToShortFormat$1(point.date, enrollmentStatsDateFilter.activeFilter === 'today'),
232643
232888
  value: formatSecondsToHours$1(point.value),
232644
232889
  rawSeconds: point.value,
232645
- }))) || [], tooltipLabel: t('analyticsAnalyticsCourses.tooltipTimeSpentLabel'), tooltipValue: (point) => formatSecondsToTime$1(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsCourses.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourses.coursesTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourses.coursesHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourses.coursesHeading'), description: t('analyticsAnalyticsCourses.coursesTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-course", type: "text", placeholder: t('analyticsAnalyticsCourses.searchPlaceholder'), value: coursesListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourses.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourses.loading') }) })) : ((_c = coursesList === null || coursesList === void 0 ? void 0 : coursesList.courses) === null || _c === void 0 ? void 0 : _c.length) && coursesList.courses.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourses.colEnrollments') })] }) }), jsx(TableBody, { children: coursesList.courses.map((course, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`, onClick: () => handleCourseClick(course.id), role: "button", tabIndex: 0, onKeyDown: (e) => {
232646
- if (e.key === 'Enter' || e.key === ' ') {
232647
- e.preventDefault();
232648
- handleCourseClick(course.id);
232649
- }
232650
- }, "aria-label": t('analyticsAnalyticsCourses.viewCourseAriaLabel', {
232651
- name: course.name,
232652
- }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: course.name }), jsx(TableCell, { className: "text-muted-foreground", children: course.id }), jsx(TableCell, { className: "text-right", children: course.enrollments.toLocaleString() })] }, course.id))) })] }) }), coursesPagination && coursesPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.current_page - 1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: coursesPagination.total_pages }, (_, i) => i + 1)
232890
+ }))) || [], tooltipLabel: t('analyticsAnalyticsCourses.tooltipTimeSpentLabel'), tooltipValue: (point) => formatSecondsToTime$1(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsCourses.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourses.coursesTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourses.coursesHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourses.coursesHeading'), description: t('analyticsAnalyticsCourses.coursesTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-course", type: "text", placeholder: t('analyticsAnalyticsCourses.searchPlaceholder'), value: coursesListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourses.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourses.loading') }) })) : ((_c = coursesList === null || coursesList === void 0 ? void 0 : coursesList.courses) === null || _c === void 0 ? void 0 : _c.length) && coursesList.courses.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourses.colCourseId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourses.colEnrollments') })] }) }), jsx(TableBody, { children: coursesList.courses.map((course, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
232891
+ // Mouse shortcut only; the id cell may hold a link,
232892
+ // so the row itself must not be a button —
232893
+ // interactive content inside one is invalid, and
232894
+ // the row's label would rename the link. Keyboard
232895
+ // and screen-reader users open the detail page
232896
+ // through the course name below.
232897
+ onClick: () => handleCourseClick(course.id), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("button", { type: "button", className: "max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", onClick: (e) => {
232898
+ e.stopPropagation();
232899
+ handleCourseClick(course.id);
232900
+ }, "aria-label": t('analyticsAnalyticsCourses.viewCourseAriaLabel', {
232901
+ name: course.name,
232902
+ }), children: course.name }) }), jsx(TableCell, { className: "text-muted-foreground", children: getCourseURL ? (jsx("a", { href: getCourseURL(course.id), target: "_blank", rel: "noopener noreferrer",
232903
+ // The row navigates to the analytics detail
232904
+ // page; this link goes to the course itself.
232905
+ onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), className: "cursor-pointer hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", "aria-label": t('analyticsAnalyticsCourses.openCourseAriaLabel', {
232906
+ id: course.id,
232907
+ }), children: course.id })) : (course.id) }), jsx(TableCell, { className: "text-right", children: course.enrollments.toLocaleString() })] }, course.id))) })] }) }), coursesPagination && coursesPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.current_page - 1), disabled: coursesPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourses.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: coursesPagination.total_pages }, (_, i) => i + 1)
232653
232908
  .filter((page) => {
232654
232909
  const current = coursesPagination.current_page;
232655
232910
  const total = coursesPagination.total_pages;
@@ -232668,11 +232923,11 @@ function AnalyticsCourses({ tenantKey, mentorId, selectedMentorId, basePath = ''
232668
232923
  }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.current_page + 1), disabled: coursesPagination.current_page === coursesPagination.total_pages, "aria-label": t('analyticsAnalyticsCourses.goToNextPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToNextPage') }), jsx(ChevronRight, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCoursesListPage(coursesPagination.total_pages), disabled: coursesPagination.current_page === coursesPagination.total_pages, "aria-label": t('analyticsAnalyticsCourses.goToLastPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourses.goToLastPage') }), jsx(ChevronsRight, { className: "h-4 w-4" })] })] }))] })) : (jsx(EmptyStats, { title: t('analyticsAnalyticsCourses.noCoursesAvailable') }))] })] }) }) })] }));
232669
232924
  }
232670
232925
 
232671
- function AnalyticsCourseDetail({ tenantKey, mentorId, selectedMentorId, courseId, courseName, showCourseTitle = true, onBack, }) {
232926
+ function AnalyticsCourseDetail({ tenantKey, currentSPA, mentorId, selectedMentorId, courseId, courseName, showCourseTitle = true, onBack, }) {
232672
232927
  var _a, _b;
232673
232928
  const t = useT();
232674
232929
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
232675
- const { courseDetailStats, isLoading, courseEnrollments, courseEnrollmentsSearch, handleCourseEnrollmentsSearchInputChange, setCourseEnrollmentsPage, courseEnrollmentsPagination, courseInfo, } = useCourses({
232930
+ const { courseDetailStats, isLoading, isDetailStatsLoading, courseEnrollments, courseEnrollmentsSearch, handleCourseEnrollmentsSearchInputChange, setCourseEnrollmentsPage, courseEnrollmentsPagination, courseInfo, } = useCourses({
232676
232931
  tenantKey,
232677
232932
  mentorId: currentMentorId,
232678
232933
  courseId,
@@ -232680,17 +232935,23 @@ function AnalyticsCourseDetail({ tenantKey, mentorId, selectedMentorId, courseId
232680
232935
  const [selectedEnrollment, setSelectedEnrollment] = useState(null);
232681
232936
  const resolvedCourseName = courseName || (courseInfo === null || courseInfo === void 0 ? void 0 : courseInfo.name);
232682
232937
  const showTitle = showCourseTitle && !!resolvedCourseName;
232683
- return (jsxs("div", { className: "space-y-8", children: [(onBack || showTitle) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsCourseDetail.goBackAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), showTitle && (jsx("h2", { className: "flex-1 text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedCourseName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourseDetail.activeEnrollments'), value: courseDetailStats.active_enrollments, percentage: courseDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.activeEnrollmentsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsCourseDetail.completedEnrollments'), value: courseDetailStats.completed_enrollments, percentage: courseDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.completedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourseDetail.courseEnrollmentsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourseDetail.enrolledUsers') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourseDetail.enrolledUsers'), description: t('analyticsAnalyticsCourseDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsCourseDetail.searchPlaceholder'), value: courseEnrollmentsSearch, onChange: handleCourseEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourseDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourseDetail.loadingLabel') }) })) : ((_a = courseEnrollments === null || courseEnrollments === void 0 ? void 0 : courseEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
232684
- courseEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnLastActiveOn') })] }) }), jsx(TableBody, { children: courseEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`, onClick: () => setSelectedEnrollment(enrollment), role: "button", tabIndex: 0, onKeyDown: (e) => {
232685
- if (e.key === 'Enter' || e.key === ' ') {
232686
- e.preventDefault();
232687
- setSelectedEnrollment(enrollment);
232688
- }
232689
- }, "aria-label": t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', { name: enrollment.name }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
232938
+ return (jsxs("div", { className: "space-y-8", children: [(onBack || showTitle) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsCourseDetail.goBackAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), showTitle && (jsx("h2", { className: "flex-1 text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedCourseName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-6", children: [jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsCourseDetail.activeEnrollments'), value: courseDetailStats.active_enrollments, percentage: courseDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.activeEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsCourseDetail.completedEnrollments'), value: courseDetailStats.completed_enrollments, percentage: courseDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsCourseDetail.completedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsCourseDetail.courseEnrollmentsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsCourseDetail.enrolledUsers') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsCourseDetail.enrolledUsers'), description: t('analyticsAnalyticsCourseDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsCourseDetail.searchPlaceholder'), value: courseEnrollmentsSearch, onChange: handleCourseEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsCourseDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsCourseDetail.loadingLabel') }) })) : ((_a = courseEnrollments === null || courseEnrollments === void 0 ? void 0 : courseEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
232939
+ courseEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsCourseDetail.columnEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsCourseDetail.columnLastActiveOn') }), jsx(TableHead, { className: "w-[1%] text-right whitespace-nowrap", children: t('analyticsAnalyticsCourseDetail.columnProgress') })] }) }), jsx(TableBody, { children: courseEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
232940
+ // Mouse shortcut only; the name and email cells hold profile
232941
+ // links, so keyboard and screen-reader users reach the
232942
+ // progress modal through the Progress column's button.
232943
+ onClick: () => setSelectedEnrollment(enrollment), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.name })) }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.email })) }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
232690
232944
  ? new Date(enrollment.enrollment_date).toLocaleDateString()
232691
232945
  : '—' }), jsx(TableCell, { className: "text-right", children: enrollment.last_active_on
232692
232946
  ? new Date(enrollment.last_active_on).toLocaleDateString()
232693
- : '—' })] }, index))) })] }) }), courseEnrollmentsPagination && courseEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(courseEnrollmentsPagination.current_page - 1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: courseEnrollmentsPagination.total_pages }, (_, i) => i + 1)
232947
+ : '—' }), jsx(TableCell, { className: "text-right", children: jsx(Button$1, { variant: "ghost", size: "icon", className: "h-8 w-8 text-gray-500 hover:text-blue-600", onClick: (e) => {
232948
+ e.stopPropagation();
232949
+ setSelectedEnrollment(enrollment);
232950
+ }, "aria-label": t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', {
232951
+ name: enrollment.name || enrollment.email,
232952
+ }), title: t('analyticsAnalyticsCourseDetail.viewCourseProgressAriaLabel', {
232953
+ name: enrollment.name || enrollment.email,
232954
+ }), children: jsx(TrendingUp, { className: "h-4 w-4", "aria-hidden": "true" }) }) })] }, index))) })] }) }), courseEnrollmentsPagination && courseEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setCourseEnrollmentsPage(courseEnrollmentsPagination.current_page - 1), disabled: courseEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsCourseDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsCourseDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: courseEnrollmentsPagination.total_pages }, (_, i) => i + 1)
232694
232955
  .filter((page) => {
232695
232956
  const current = courseEnrollmentsPagination.current_page;
232696
232957
  const total = courseEnrollmentsPagination.total_pages;
@@ -232785,6 +233046,8 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
232785
233046
  mentor_unique_id: mentorId,
232786
233047
  limit: programsListLimit,
232787
233048
  page: programsListPage,
233049
+ // Busiest programs first — this list reads as a leaderboard.
233050
+ sort_by: 'active_enrollments',
232788
233051
  ...(debouncedSearch && { search: debouncedSearch }),
232789
233052
  });
232790
233053
  }, [
@@ -232825,11 +233088,31 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
232825
233088
  debouncedProgramEnrollmentsSearch,
232826
233089
  ]);
232827
233090
  // Query for programs list and summary
232828
- const { data: contentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
233091
+ const { data: contentAnalyticsData, currentData: currentContentAnalyticsData, isLoading: isLoadingContentAnalytics, isFetching: isFetchingContentAnalytics, } = useGetContentAnalyticsQuery(contentAnalyticsParams);
232829
233092
  // Query for program details (only when programId is provided)
232830
- const { data: programDetailsData, isLoading: isLoadingProgramDetails, isFetching: isFetchingProgramDetails, } = useGetContentAnalyticsDetailsQuery(programDetailsParams, {
233093
+ const { data: programDetailsData, currentData: currentProgramDetailsData, isLoading: isLoadingProgramDetails, isFetching: isFetchingProgramDetails, } = useGetContentAnalyticsDetailsQuery(programDetailsParams, {
232831
233094
  skip: !programDetailsParams,
232832
233095
  });
233096
+ // Searching the table re-runs the one request the summary cards and the chart
233097
+ // also read from. RTK keeps the previous arguments' response in `data` while
233098
+ // the new one is in flight, so those sections never blank mid-search — but
233099
+ // `currentData` alone can't tell a search apart from an agent or date change,
233100
+ // which those sections *do* vary with. Comparing their own inputs does: while
233101
+ // they differ from the last settled response, the sections report loading
233102
+ // rather than showing the previous scope's numbers with nothing saying so.
233103
+ const statsKey = JSON.stringify({ tenantKey, mentorId, enrollmentStatsDateFilter });
233104
+ const settledStatsKey = React__default.useRef(statsKey);
233105
+ if (currentContentAnalyticsData)
233106
+ settledStatsKey.current = statsKey;
233107
+ const detailStatsKey = JSON.stringify({
233108
+ programId,
233109
+ tenantKey,
233110
+ mentorId,
233111
+ timeSpentStatsDateFilter,
233112
+ });
233113
+ const settledDetailStatsKey = React__default.useRef(detailStatsKey);
233114
+ if (currentProgramDetailsData)
233115
+ settledDetailStatsKey.current = detailStatsKey;
232833
233116
  // Map content analytics data to programStats
232834
233117
  const programStats = useMemo(() => {
232835
233118
  if (!contentAnalyticsData) {
@@ -232869,6 +233152,7 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
232869
233152
  id: program.id,
232870
233153
  name: program.name,
232871
233154
  enrollments: program.analytics.enrollments || 0,
233155
+ program_id: program.program_id,
232872
233156
  })),
232873
233157
  total: contentAnalyticsData.pagination.count,
232874
233158
  };
@@ -232924,8 +233208,21 @@ const usePrograms = ({ tenantKey, mentorId, programId, }) => {
232924
233208
  isFetchingContentAnalytics ||
232925
233209
  isLoadingProgramDetails ||
232926
233210
  isFetchingProgramDetails;
233211
+ // Loading for the sections that don't vary with the table search — see
233212
+ // `statsKey` above for why the key comparison is what distinguishes a search
233213
+ // from a change those sections do have to redraw for.
233214
+ const isStatsLoading = isLoadingContentAnalytics ||
233215
+ (isFetchingContentAnalytics &&
233216
+ currentContentAnalyticsData === undefined &&
233217
+ settledStatsKey.current !== statsKey);
233218
+ const isDetailStatsLoading = isLoadingProgramDetails ||
233219
+ (isFetchingProgramDetails &&
233220
+ currentProgramDetailsData === undefined &&
233221
+ settledDetailStatsKey.current !== detailStatsKey);
232927
233222
  return {
232928
233223
  programStats,
233224
+ isStatsLoading,
233225
+ isDetailStatsLoading,
232929
233226
  isLoading,
232930
233227
  enrollmentStats,
232931
233228
  enrollmentStatsDateFilter,
@@ -232974,30 +233271,40 @@ const formatSecondsToTime = (seconds) => {
232974
233271
  const formatSecondsToHours = (seconds) => {
232975
233272
  return Math.round((seconds / 3600) * 10) / 10;
232976
233273
  };
232977
- function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '', }) {
233274
+ function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '', getProgramURL, }) {
232978
233275
  var _a, _b, _c;
232979
233276
  const t = useT();
232980
233277
  const router = useRouter();
232981
233278
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
232982
- const { programStats, isLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, programsList, setProgramsListPage, programsListSearch, handleSearchInputChange, programsPagination, } = usePrograms({ tenantKey, mentorId: currentMentorId });
233279
+ const { programStats, isLoading, isStatsLoading, enrollmentStats, enrollmentStatsDateFilter, setEnrollmentStatsDateFilter, programsList, setProgramsListPage, programsListSearch, handleSearchInputChange, programsPagination, } = usePrograms({ tenantKey, mentorId: currentMentorId });
232983
233280
  const handleProgramClick = (programId) => {
232984
233281
  router.push(`${basePath}/programs/${programId}`);
232985
233282
  };
232986
233283
  const hasEnrollmentStatsPoints = Number((_a = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _a === void 0 ? void 0 : _a.length) > 0;
232987
- return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsPrograms.activePrograms'), value: programStats.active_programs, percentage: programStats.active_programs_percentage, description: t('analyticsAnalyticsPrograms.activeProgramsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsPrograms.totalPrograms'), value: programStats.total_programs, percentage: programStats.total_programs_percentage, description: t('analyticsAnalyticsPrograms.totalProgramsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsPrograms.enrollments'), value: programStats.enrollments, percentage: programStats.enrollments_percentage, description: t('analyticsAnalyticsPrograms.enrollmentsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsPrograms.totalLearners'), value: programStats.total_learners,
233284
+ return (jsxs("div", { className: "space-y-8", children: [jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 mb-6", children: [jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.activePrograms'), value: programStats.active_programs, percentage: programStats.active_programs_percentage, description: t('analyticsAnalyticsPrograms.activeProgramsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.totalPrograms'), value: programStats.total_programs, percentage: programStats.total_programs_percentage, description: t('analyticsAnalyticsPrograms.totalProgramsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.enrollments'), value: programStats.enrollments, percentage: programStats.enrollments_percentage, description: t('analyticsAnalyticsPrograms.enrollmentsDescription') }), jsx(StatCard, { loading: isStatsLoading, title: t('analyticsAnalyticsPrograms.totalLearners'), value: programStats.total_learners,
232988
233285
  //percentage={programStats.enrollments_percentage}
232989
- description: t('analyticsAnalyticsPrograms.totalLearnersDescription') })] }), (isLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsPrograms.programOvertime'), label: t('analyticsAnalyticsPrograms.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsPrograms.programOvertimeDescription'), children: isLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
233286
+ description: t('analyticsAnalyticsPrograms.totalLearnersDescription') })] }), (isStatsLoading || hasEnrollmentStatsPoints) && (jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(ChartCardWrapper, { title: t('analyticsAnalyticsPrograms.programOvertime'), label: t('analyticsAnalyticsPrograms.timeSpent'), filters: enrollmentStatsDateFilter, setOutsideFilters: setEnrollmentStatsDateFilter, description: t('analyticsAnalyticsPrograms.programOvertimeDescription'), children: isStatsLoading ? (jsx(ChartLoading, {})) : (jsx(AnalyticsAreaChart, { data: ((_b = enrollmentStats === null || enrollmentStats === void 0 ? void 0 : enrollmentStats.points) === null || _b === void 0 ? void 0 : _b.map((point) => ({
232990
233287
  date: formatDateToShortFormat(point.date, enrollmentStatsDateFilter.activeFilter === 'today'),
232991
233288
  value: formatSecondsToHours(point.value),
232992
233289
  rawSeconds: point.value,
232993
- }))) || [], tooltipLabel: t('analyticsAnalyticsPrograms.timeSpent'), tooltipValue: (point) => formatSecondsToTime(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsPrograms.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsPrograms.programsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsPrograms.programs') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsPrograms.programs'), description: t('analyticsAnalyticsPrograms.programsTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-program", type: "text", placeholder: t('analyticsAnalyticsPrograms.searchPlaceholder'), value: programsListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsPrograms.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsPrograms.loading') }) })) : ((_c = programsList === null || programsList === void 0 ? void 0 : programsList.programs) === null || _c === void 0 ? void 0 : _c.length) && programsList.programs.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsPrograms.enrollments') })] }) }), jsx(TableBody, { children: programsList.programs.map((program, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`, onClick: () => handleProgramClick(program.id), role: "button", tabIndex: 0, onKeyDown: (e) => {
232994
- if (e.key === 'Enter' || e.key === ' ') {
232995
- e.preventDefault();
232996
- handleProgramClick(program.id);
232997
- }
232998
- }, "aria-label": t('analyticsAnalyticsPrograms.viewDetailsAriaLabel', {
232999
- name: program.name,
233000
- }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: program.name }), jsx(TableCell, { className: "text-muted-foreground", children: program.id }), jsx(TableCell, { className: "text-right", children: program.enrollments.toLocaleString() })] }, program.id))) })] }) }), programsPagination && programsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.current_page - 1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programsPagination.total_pages }, (_, i) => i + 1)
233290
+ }))) || [], tooltipLabel: t('analyticsAnalyticsPrograms.timeSpent'), tooltipValue: (point) => formatSecondsToTime(Number(point.rawSeconds) || 0), tooltipAriaLabel: (label) => t('analyticsAnalyticsPrograms.tooltipAriaLabel', { label }), yTickFormatter: (value) => `${value}h` })) }) })), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsPrograms.programsTableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsPrograms.programs') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsPrograms.programs'), description: t('analyticsAnalyticsPrograms.programsTableDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-program", type: "text", placeholder: t('analyticsAnalyticsPrograms.searchPlaceholder'), value: programsListSearch, onChange: handleSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsPrograms.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsPrograms.loading') }) })) : ((_c = programsList === null || programsList === void 0 ? void 0 : programsList.programs) === null || _c === void 0 ? void 0 : _c.length) && programsList.programs.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsPrograms.programId') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsPrograms.enrollments') })] }) }), jsx(TableBody, { children: programsList.programs.map((program, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
233291
+ // Mouse shortcut only; the id cell may hold a link,
233292
+ // so the row itself must not be a button —
233293
+ // interactive content inside one is invalid, and
233294
+ // the row's label would rename the link. Keyboard
233295
+ // and screen-reader users open the detail page
233296
+ // through the program name below.
233297
+ onClick: () => handleProgramClick(program.id), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: jsx("button", { type: "button", className: "max-w-full cursor-pointer truncate text-left hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", onClick: (e) => {
233298
+ e.stopPropagation();
233299
+ handleProgramClick(program.id);
233300
+ }, "aria-label": t('analyticsAnalyticsPrograms.viewDetailsAriaLabel', {
233301
+ name: program.name,
233302
+ }), children: program.name }) }), jsx(TableCell, { className: "text-muted-foreground", children: getProgramURL && program.program_id ? (jsx("a", { href: getProgramURL(program.program_id), target: "_blank", rel: "noopener noreferrer",
233303
+ // The row navigates to the analytics detail
233304
+ // page; this link goes to the program itself.
233305
+ onClick: (e) => e.stopPropagation(), onKeyDown: (e) => e.stopPropagation(), className: "cursor-pointer hover:text-blue-600 hover:underline focus:text-blue-600 focus:outline-none", "aria-label": t('analyticsAnalyticsPrograms.openProgramAriaLabel', {
233306
+ id: program.program_id,
233307
+ }), children: program.id })) : (program.id) }), jsx(TableCell, { className: "text-right", children: program.enrollments.toLocaleString() })] }, program.id))) })] }) }), programsPagination && programsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.current_page - 1), disabled: programsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsPrograms.goToPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programsPagination.total_pages }, (_, i) => i + 1)
233001
233308
  .filter((page) => {
233002
233309
  const current = programsPagination.current_page;
233003
233310
  const total = programsPagination.total_pages;
@@ -233016,28 +233323,34 @@ function AnalyticsPrograms({ tenantKey, mentorId, selectedMentorId, basePath = '
233016
233323
  }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.current_page + 1), disabled: programsPagination.current_page === programsPagination.total_pages, "aria-label": t('analyticsAnalyticsPrograms.goToNextPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToNextPage') }), jsx(ChevronRight, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramsListPage(programsPagination.total_pages), disabled: programsPagination.current_page === programsPagination.total_pages, "aria-label": t('analyticsAnalyticsPrograms.goToLastPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPrograms.goToLastPage') }), jsx(ChevronsRight, { className: "h-4 w-4" })] })] }))] })) : (jsx(EmptyStats, { title: t('analyticsAnalyticsPrograms.noProgramsAvailable') }))] })] }) }) })] }));
233017
233324
  }
233018
233325
 
233019
- function AnalyticsProgramDetail({ tenantKey, mentorId, selectedMentorId, programId, programName, onBack, }) {
233326
+ function AnalyticsProgramDetail({ tenantKey, currentSPA, mentorId, selectedMentorId, programId, programName, onBack, }) {
233020
233327
  var _a, _b;
233021
233328
  const t = useT();
233022
233329
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
233023
- const { programDetailStats, isLoading, programEnrollments, programEnrollmentsSearch, handleProgramEnrollmentsSearchInputChange, setProgramEnrollmentsPage, programEnrollmentsPagination, programInfo, } = usePrograms({
233330
+ const { programDetailStats, isLoading, isDetailStatsLoading, programEnrollments, programEnrollmentsSearch, handleProgramEnrollmentsSearchInputChange, setProgramEnrollmentsPage, programEnrollmentsPagination, programInfo, } = usePrograms({
233024
233331
  tenantKey,
233025
233332
  mentorId: currentMentorId,
233026
233333
  programId,
233027
233334
  });
233028
233335
  const [selectedEnrollment, setSelectedEnrollment] = useState(null);
233029
233336
  const resolvedProgramName = programName || (programInfo === null || programInfo === void 0 ? void 0 : programInfo.name);
233030
- return (jsxs("div", { className: "space-y-8", children: [(onBack || resolvedProgramName) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsProgramDetail.backAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), resolvedProgramName && (jsx("h2", { className: "flex-1 truncate text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedProgramName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsProgramDetail.statTotalEnrollments'), value: programDetailStats.enrollments, percentage: programDetailStats.enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statTotalEnrollmentsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsProgramDetail.statActiveEnrollments'), value: programDetailStats.active_enrollments, percentage: programDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statActiveEnrollmentsDescription') }), jsx(StatCard, { loading: isLoading, title: t('analyticsAnalyticsProgramDetail.statCompletedEnrollments'), value: programDetailStats.completed_enrollments, percentage: programDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statCompletedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsProgramDetail.tableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading'), description: t('analyticsAnalyticsProgramDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsProgramDetail.searchPlaceholder'), value: programEnrollmentsSearch, onChange: handleProgramEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsProgramDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsProgramDetail.loadingLabel') }) })) : ((_a = programEnrollments === null || programEnrollments === void 0 ? void 0 : programEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
233031
- programEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colLastActiveOn') })] }) }), jsx(TableBody, { children: programEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`, onClick: () => setSelectedEnrollment(enrollment), role: "button", tabIndex: 0, onKeyDown: (e) => {
233032
- if (e.key === 'Enter' || e.key === ' ') {
233033
- e.preventDefault();
233034
- setSelectedEnrollment(enrollment);
233035
- }
233036
- }, "aria-label": t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', { name: enrollment.name }), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
233337
+ return (jsxs("div", { className: "space-y-8", children: [(onBack || resolvedProgramName) && (jsxs("div", { className: "mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:gap-4", children: [jsx("div", { className: "flex flex-1 justify-start", children: onBack && (jsx(Button$1, { variant: "ghost", size: "icon", onClick: onBack, "aria-label": t('analyticsAnalyticsProgramDetail.backAriaLabel'), className: "h-8 w-8 rounded-full bg-gray-100 text-gray-700 hover:bg-gray-200 hover:text-gray-900 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700 dark:hover:text-white", children: jsx(ArrowLeft, { className: "h-4 w-4" }) })) }), resolvedProgramName && (jsx("h2", { className: "flex-1 truncate text-left text-2xl font-medium text-gray-700 sm:text-center", children: resolvedProgramName })), jsx("div", { className: "hidden flex-1 sm:block" })] })), jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-4 mb-6", children: [jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statTotalEnrollments'), value: programDetailStats.enrollments, percentage: programDetailStats.enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statTotalEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statActiveEnrollments'), value: programDetailStats.active_enrollments, percentage: programDetailStats.active_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statActiveEnrollmentsDescription') }), jsx(StatCard, { loading: isDetailStatsLoading, title: t('analyticsAnalyticsProgramDetail.statCompletedEnrollments'), value: programDetailStats.completed_enrollments, percentage: programDetailStats.completed_enrollments_percentage, description: t('analyticsAnalyticsProgramDetail.statCompletedEnrollmentsDescription') })] }), jsx("div", { className: "grid grid-cols-1 gap-6", children: jsx(Card, { className: "w-full bg-white shadow-xs", style: { borderColor: 'oklch(.922 0 0)' }, children: jsxs(CardContent, { className: "p-4", "aria-label": t('analyticsAnalyticsProgramDetail.tableAriaLabel'), children: [jsxs("div", { className: "flex items-center gap-1 mb-4", children: [jsx("h3", { className: "text-base font-medium text-gray-700", children: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading') }), jsx(CardInfoIcon, { title: t('analyticsAnalyticsProgramDetail.enrolledUsersHeading'), description: t('analyticsAnalyticsProgramDetail.enrolledUsersDescription') })] }), jsxs("div", { className: "space-y-4", children: [jsxs("div", { className: "relative flex-1 w-full", children: [jsx(Search, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-gray-400" }), jsx(Input, { id: "search-enrolled-user", type: "text", placeholder: t('analyticsAnalyticsProgramDetail.searchPlaceholder'), value: programEnrollmentsSearch, onChange: handleProgramEnrollmentsSearchInputChange, className: "pl-9 border-gray-300 focus:bg-transparent focus:color-transparent h-11", "aria-label": t('analyticsAnalyticsProgramDetail.searchAriaLabel') })] }), isLoading ? (jsx("div", { className: "flex items-center justify-center py-8", children: jsx("div", { className: "text-sm text-gray-500", children: t('analyticsAnalyticsProgramDetail.loadingLabel') }) })) : ((_a = programEnrollments === null || programEnrollments === void 0 ? void 0 : programEnrollments.enrollments) === null || _a === void 0 ? void 0 : _a.length) &&
233338
+ programEnrollments.enrollments.length > 0 ? (jsxs(Fragment$1, { children: [jsx("div", { className: "rounded-md overflow-x-auto", style: { borderColor: 'oklch(.922 0 0)', borderWidth: '1px' }, children: jsxs(Table, { children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "h-[48px]", style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colName') }), jsx(TableHead, { className: "text-left", children: t('analyticsAnalyticsProgramDetail.colEmail') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colEnrollmentDate') }), jsx(TableHead, { className: "text-right", children: t('analyticsAnalyticsProgramDetail.colLastActiveOn') }), jsx(TableHead, { className: "w-[1%] text-right whitespace-nowrap", children: t('analyticsAnalyticsProgramDetail.colProgress') })] }) }), jsx(TableBody, { children: programEnrollments.enrollments.map((enrollment, index) => (jsxs(TableRow, { className: `cursor-pointer hover:bg-muted/50 h-[48px] ${index % 2 === 0 ? 'bg-gray-50' : ''}`,
233339
+ // Mouse shortcut only; the name and email cells hold profile
233340
+ // links, so keyboard and screen-reader users reach the
233341
+ // progress modal through the Progress column's button.
233342
+ onClick: () => setSelectedEnrollment(enrollment), style: { borderColor: 'oklch(.922 0 0)' }, children: [jsx(TableCell, { className: "font-medium", children: enrollment.name && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.name })) }), jsx(TableCell, { className: "text-muted-foreground", children: enrollment.email && (jsx(UserProfileLink, { currentSPA: currentSPA, tenantKey: tenantKey, username: enrollment.username, display: enrollment.email })) }), jsx(TableCell, { className: "text-right", children: enrollment.enrollment_date
233037
233343
  ? new Date(enrollment.enrollment_date).toLocaleDateString()
233038
233344
  : '—' }), jsx(TableCell, { className: "text-right", children: enrollment.last_active_on
233039
233345
  ? new Date(enrollment.last_active_on).toLocaleDateString()
233040
- : '—' })] }, index))) })] }) }), programEnrollmentsPagination && programEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(programEnrollmentsPagination.current_page - 1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programEnrollmentsPagination.total_pages }, (_, i) => i + 1)
233346
+ : '—' }), jsx(TableCell, { className: "text-right", children: jsx(Button$1, { variant: "ghost", size: "icon", className: "h-8 w-8 text-gray-500 hover:text-blue-600", onClick: (e) => {
233347
+ e.stopPropagation();
233348
+ setSelectedEnrollment(enrollment);
233349
+ }, "aria-label": t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', {
233350
+ name: enrollment.name || enrollment.email,
233351
+ }), title: t('analyticsAnalyticsProgramDetail.viewProgramProgressAriaLabel', {
233352
+ name: enrollment.name || enrollment.email,
233353
+ }), children: jsx(TrendingUp, { className: "h-4 w-4", "aria-hidden": "true" }) }) })] }, index))) })] }) }), programEnrollmentsPagination && programEnrollmentsPagination.total_pages > 1 && (jsxs("div", { className: "flex items-center justify-center space-x-2 py-4", children: [jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationFirstPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationFirstPage') }), jsx(ChevronsLeft, { className: "h-4 w-4" })] }), jsxs(Button$1, { variant: "outline", size: "sm", className: "h-8 w-8 p-2 !w-auto !inline-flex bg-transparent", onClick: () => setProgramEnrollmentsPage(programEnrollmentsPagination.current_page - 1), disabled: programEnrollmentsPagination.current_page === 1, "aria-label": t('analyticsAnalyticsProgramDetail.paginationPreviousPage'), children: [jsx("span", { className: "sr-only", children: t('analyticsAnalyticsProgramDetail.paginationPreviousPage') }), jsx(ChevronLeft, { className: "h-4 w-4" })] }), Array.from({ length: programEnrollmentsPagination.total_pages }, (_, i) => i + 1)
233041
233354
  .filter((page) => {
233042
233355
  const current = programEnrollmentsPagination.current_page;
233043
233356
  const total = programEnrollmentsPagination.total_pages;
@@ -233628,14 +233941,14 @@ function DetailRow({ label, value }) {
233628
233941
  * decided by the `event_type === null` branch: CRUD entries get the field-level
233629
233942
  * `changes` diff, manual events get their `metadata`.
233630
233943
  */
233631
- function PlatformAuditLogDetailSheet({ entry, open, onOpenChange, timeZone, }) {
233944
+ function PlatformAuditLogDetailSheet({ entry, open, onOpenChange, timeZone, platformKey, currentSPA, }) {
233632
233945
  const t = useT();
233633
233946
  const { eventTypeLabel, actionLabel } = usePlatformAuditLabels();
233634
233947
  const isCrudEntry = entry ? entry.event_type === null : false;
233635
233948
  const placeholder = t('analyticsPlatformAuditLogDetailSheet.notAvailable');
233636
233949
  return (jsx(Sheet, { open: open, onOpenChange: onOpenChange, children: jsxs(SheetContent, { side: "right", className: "w-full overflow-y-auto sm:max-w-xl", "data-testid": "platform-audit-detail", children: [jsxs(SheetHeader, { children: [jsx(SheetTitle, { children: t('analyticsPlatformAuditLogDetailSheet.title') }), jsx(SheetDescription, { children: t('analyticsPlatformAuditLogDetailSheet.description') })] }), entry && (jsxs("div", { className: "space-y-6 px-4 pb-6", children: [jsxs("dl", { className: "divide-y divide-gray-100", children: [jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.timestamp'), value: formatAuditTimestamp(entry.timestamp, timeZone) }), jsx(DetailRow, { label: isCrudEntry
233637
233950
  ? t('analyticsPlatformAuditLogDetailSheet.action')
233638
- : t('analyticsPlatformAuditLogDetailSheet.event'), value: isCrudEntry ? actionLabel(entry.action) : eventTypeLabel(String(entry.event_type)) }), !isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.action'), value: actionLabel(entry.action) })), jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.actor'), value: entry.actor_username || entry.actor_email ? (jsxs("span", { className: "flex flex-col", children: [entry.actor_username && jsx("span", { children: entry.actor_username }), entry.actor_email && (jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email }))] })) : (placeholder) }), isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.resource'), value: entry.resource_type || entry.resource_repr ? (jsxs("span", { className: "flex flex-col", children: [entry.resource_repr && jsx("span", { children: entry.resource_repr }), jsx("span", { className: "text-xs text-gray-500", children: [
233951
+ : t('analyticsPlatformAuditLogDetailSheet.event'), value: isCrudEntry ? actionLabel(entry.action) : eventTypeLabel(String(entry.event_type)) }), !isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.action'), value: actionLabel(entry.action) })), jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.actor'), value: entry.actor_username || entry.actor_email ? (jsxs("span", { className: "flex flex-col items-start", children: [entry.actor_username && (jsx(UserProfileLink, { tenantKey: platformKey !== null && platformKey !== void 0 ? platformKey : '', currentSPA: currentSPA, username: platformKey ? entry.actor_username : null, display: entry.actor_username })), entry.actor_email && (jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email }))] })) : (placeholder) }), isCrudEntry && (jsx(DetailRow, { label: t('analyticsPlatformAuditLogDetailSheet.resource'), value: entry.resource_type || entry.resource_repr ? (jsxs("span", { className: "flex flex-col", children: [entry.resource_repr && jsx("span", { children: entry.resource_repr }), jsx("span", { className: "text-xs text-gray-500", children: [
233639
233952
  entry.resource_type ? humanizeAuditToken(entry.resource_type) : null,
233640
233953
  entry.resource_id ? `#${entry.resource_id}` : null,
233641
233954
  ]
@@ -233783,12 +234096,12 @@ const SKELETON_ROW_KEYS = ['a', 'b', 'c', 'd', 'e'];
233783
234096
  function isCrudEntry(entry) {
233784
234097
  return entry.event_type === null;
233785
234098
  }
233786
- function formatActor(entry, placeholder) {
234099
+ function formatActor(entry, placeholder, platformKey, currentSPA) {
233787
234100
  if (!entry.actor_username && !entry.actor_email)
233788
234101
  return null;
233789
- return (jsxs("span", { className: "flex flex-col", children: [jsx("span", { className: "font-medium text-gray-700", children: entry.actor_username || placeholder }), entry.actor_email && jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email })] }));
234102
+ return (jsxs("span", { className: "flex flex-col items-start", children: [jsx(UserProfileLink, { tenantKey: platformKey, currentSPA: currentSPA, username: entry.actor_username, display: entry.actor_username || placeholder, className: "font-medium text-gray-700" }), entry.actor_email && jsx("span", { className: "text-xs text-gray-500", children: entry.actor_email })] }));
233790
234103
  }
233791
- function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
234104
+ function AnalyticsPlatformAuditLog({ platformKey, timezone, currentSPA, }) {
233792
234105
  var _a, _b, _c;
233793
234106
  const t = useT();
233794
234107
  const [selectedEntry, setSelectedEntry] = useState(null);
@@ -233815,7 +234128,7 @@ function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
233815
234128
  timezone: timeZoneLabel,
233816
234129
  }) }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colEvent') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colActor') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colResource') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsPlatformAuditLog.colIpAddress') }), jsx(TableHead, { className: "p-3 text-right text-sm whitespace-nowrap text-[#646464]", children: jsx("span", { className: "sr-only", children: t('analyticsAnalyticsPlatformAuditLog.colDetails') }) })] }) }), jsx(TableBody, { children: results.map((entry) => {
233817
234130
  const crud = isCrudEntry(entry);
233818
- const actor = formatActor(entry, placeholder);
234131
+ const actor = formatActor(entry, placeholder, platformKey, currentSPA);
233819
234132
  return (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatAuditTimestamp(entry.timestamp, timeZone) }), jsx(TableCell, { className: "p-3 text-[#646464]", children: jsxs("span", { className: "flex flex-col", children: [jsx("span", { className: "font-medium text-gray-700", children: crud
233820
234133
  ? actionLabel(entry.action)
233821
234134
  : eventTypeLabel(String(entry.event_type)) }), jsx("span", { className: "text-xs text-gray-500", children: crud
@@ -233827,7 +234140,7 @@ function AnalyticsPlatformAuditLog({ platformKey, timezone, }) {
233827
234140
  }) })), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isFetching }), jsx(PlatformAuditLogDetailSheet, { entry: selectedEntry, open: selectedEntry !== null, onOpenChange: (open) => {
233828
234141
  if (!open)
233829
234142
  setSelectedEntry(null);
233830
- }, timeZone: timeZone })] }));
234143
+ }, timeZone: timeZone, platformKey: platformKey, currentSPA: currentSPA })] }));
233831
234144
  }
233832
234145
 
233833
234146
  const ACTION_LABELS = {
@@ -233978,7 +234291,7 @@ function summarizeChanges(entry) {
233978
234291
  return `${action} ${target}`;
233979
234292
  }
233980
234293
  /** The per-agent change log — the original audit view, unchanged. */
233981
- function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, }) {
234294
+ function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, currentSPA, }) {
233982
234295
  var _a;
233983
234296
  const t = useT();
233984
234297
  const currentMentorId = useScopedMentorId(selectedMentorId, mentorId);
@@ -234016,9 +234329,9 @@ function AgentAuditLogView({ tenantKey, mentorId, userId, selectedMentorId, }) {
234016
234329
  }, numberOfMonths: 2 }) })] }), jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: actionFilter !== undefined ? String(actionFilter) : 'all', onValueChange: (val) => {
234017
234330
  setActionFilter(val === 'all' ? undefined : Number(val));
234018
234331
  setPage(1);
234019
- }, children: [jsx(SelectTrigger, { className: "w-full font-normal bg-white h-9", children: jsx(SelectValue, { placeholder: t('analyticsAnalyticsAuditLogStats.allActions') }) }), jsx(SelectContent, { children: ACTION_FILTER_OPTIONS.map((opt) => (jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) })] }) }), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex items-center justify-center w-full py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error && !is403 ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.loadError') })) : !((_a = data === null || data === void 0 ? void 0 : data.results) === null || _a === void 0 ? void 0 : _a.length) ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsAuditLogStats.noEntries') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colUser') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colAction') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colTime') })] }) }), jsx(TableBody, { children: data.results.map((entry) => (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: entry.actor_email }), jsx(TableCell, { className: "min-w-[250px] p-3 text-[#646464]", children: summarizeChanges(entry) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatDistanceToNow(new Date(entry.timestamp), { addSuffix: true }) })] }, entry.id))) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading })] }));
234332
+ }, children: [jsx(SelectTrigger, { className: "w-full font-normal bg-white h-9", children: jsx(SelectValue, { placeholder: t('analyticsAnalyticsAuditLogStats.allActions') }) }), jsx(SelectContent, { children: ACTION_FILTER_OPTIONS.map((opt) => (jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }) })] }) }), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex items-center justify-center w-full py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error && !is403 ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.loadError') })) : !((_a = data === null || data === void 0 ? void 0 : data.results) === null || _a === void 0 ? void 0 : _a.length) ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsAuditLogStats.noEntries') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colUser') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colAction') }), jsx(TableHead, { className: "p-3 text-left text-sm whitespace-nowrap text-[#646464]", children: t('analyticsAnalyticsAuditLogStats.colTime') })] }) }), jsx(TableBody, { children: data.results.map((entry) => (jsxs(TableRow, { className: "border-b border-[oklch(0.922_0_0)] last:border-0", children: [jsx(TableCell, { className: "p-3 font-medium whitespace-nowrap text-[#646464]", children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: entry.actor_username, display: entry.actor_email || entry.actor_username }) }), jsx(TableCell, { className: "min-w-[250px] p-3 text-[#646464]", children: summarizeChanges(entry) }), jsx(TableCell, { className: "p-3 whitespace-nowrap text-[#646464]", children: formatDistanceToNow(new Date(entry.timestamp), { addSuffix: true }) })] }, entry.id))) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading })] }));
234020
234333
  }
234021
- function AnalyticsAuditLogStats({ tenantKey, mentorId, userId, selectedMentorId, defaultScope = 'agent', timezone, canViewPlatformAudit, }) {
234334
+ function AnalyticsAuditLogStats({ tenantKey, currentSPA, mentorId, userId, selectedMentorId, defaultScope = 'agent', timezone, canViewPlatformAudit, }) {
234022
234335
  const t = useT();
234023
234336
  const { currentTenant } = useCurrentTenant();
234024
234337
  const rbacPermissions = useSelector(selectRbacPermissions);
@@ -234041,28 +234354,7 @@ function AnalyticsAuditLogStats({ tenantKey, mentorId, userId, selectedMentorId,
234041
234354
  : 'font-medium text-gray-500 hover:text-gray-700'), children: [tab.label, active && (jsx("span", { className: "absolute inset-x-0 -bottom-px h-0.5 rounded-sm bg-blue-600" }))] }, tab.value));
234042
234355
  }) }), jsx("p", { className: "hidden pb-2 text-xs text-gray-500 sm:block", children: activeScope === 'agent'
234043
234356
  ? t('analyticsAnalyticsAuditLogStats.scopeAgentHint')
234044
- : t('analyticsAnalyticsAuditLogStats.scopePlatformHint') })] })), activeScope === 'platform' ? (jsx(AnalyticsPlatformAuditLog, { platformKey: tenantKey, timezone: timezone })) : (jsx(AgentAuditLogView, { tenantKey: tenantKey, mentorId: mentorId, userId: userId, selectedMentorId: selectedMentorId }))] }));
234045
- }
234046
-
234047
- function MentorSelectionGrid({ selectedMentorIds, onMentorSelect, searchQuery, onSearchChange, tenantKey, itemsPerPage = 8, showSearch = true, minHeight = '400px', }) {
234048
- const t = useT();
234049
- const { agents: mentors, isLoading: isMentorsLoading, isFetching: isMentorsFetching, currentPage, totalPages, setSearchQuery: setMentorSearch, handlePageChange, } = useAgentSearchWithPagination({ tenantKey, itemsPerPage });
234050
- // Update search query with debounce effect handled by the hook
234051
- React__default.useEffect(() => {
234052
- setMentorSearch(searchQuery);
234053
- }, [searchQuery]);
234054
- const isMentorSelected = (mentorId) => {
234055
- return selectedMentorIds.includes(mentorId);
234056
- };
234057
- return (jsxs("div", { className: "space-y-4", children: [showSearch && (jsxs("div", { className: "relative", children: [isMentorsFetching ? (jsx(Spinner, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })) : (jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })), jsx(Input, { placeholder: t('mentorsMentorSelectionGrid.searchAgentsPlaceholder'), value: searchQuery, onChange: (e) => onSearchChange(e.target.value), className: "h-10 border-gray-200 pl-10 focus:border-blue-500 focus:ring-0" })] })), jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "grid max-h-96 auto-rows-min grid-cols-1 items-start gap-3 overflow-y-auto rounded-lg border border-gray-200 p-4 md:max-h-none md:grid-cols-2", style: { minHeight }, children: isMentorsLoading ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.loadingAgents') })) : mentors.length === 0 ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.noAgentsFound') })) : (mentors.map((mentor) => {
234058
- const isSelected = isMentorSelected(mentor.unique_id || '');
234059
- const isAlreadyAdded = selectedMentorIds.includes(mentor.unique_id || '');
234060
- return (jsxs("button", { onClick: () => onMentorSelect(mentor), className: `flex cursor-pointer items-center gap-3 rounded-lg border-2 p-3 transition-all ${isSelected
234061
- ? 'border-blue-500 bg-blue-50'
234062
- : isAlreadyAdded
234063
- ? 'bg-blue-25 border-blue-300'
234064
- : 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'}`, children: [jsxs(Avatar, { className: "h-12 w-12 flex-shrink-0", children: [jsx(AvatarImage, { src: mentor.profile_image || '/placeholder.svg', alt: mentor.name }), jsx(AvatarFallback, { children: mentor.name.substring(0, 2) })] }), jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-start text-left", children: [jsx("h4", { className: "truncate text-sm font-medium text-gray-900", children: mentor.name }), jsx("p", { className: "line-clamp-2 text-xs text-gray-600", children: mentor.description })] }), isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-600", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) })), isAlreadyAdded && !isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-400", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) }))] }, mentor.unique_id));
234065
- })) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: handlePageChange, disabled: isMentorsFetching || isMentorsLoading })] })] }));
234357
+ : t('analyticsAnalyticsAuditLogStats.scopePlatformHint') })] })), activeScope === 'platform' ? (jsx(AnalyticsPlatformAuditLog, { platformKey: tenantKey, timezone: timezone, currentSPA: currentSPA })) : (jsx(AgentAuditLogView, { tenantKey: tenantKey, currentSPA: currentSPA, mentorId: mentorId, userId: userId, selectedMentorId: selectedMentorId }))] }));
234066
234358
  }
234067
234359
 
234068
234360
  /**
@@ -234085,6 +234377,7 @@ function toRowFromMentorMemory(memory) {
234085
234377
  categoryName: (_b = (_a = memory.category) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : null,
234086
234378
  categorySlug: (_d = (_c = memory.category) === null || _c === void 0 ? void 0 : _c.slug) !== null && _d !== void 0 ? _d : null,
234087
234379
  learner: memory.email || memory.username,
234380
+ username: memory.username,
234088
234381
  email: memory.email || null,
234089
234382
  mentorId: (_e = memory.mentor_id) !== null && _e !== void 0 ? _e : null,
234090
234383
  mentorName: 'mentor_name' in memory ? ((_f = memory.mentor_name) !== null && _f !== void 0 ? _f : null) : null,
@@ -234100,6 +234393,7 @@ function toRowFromGlobalMemory(memory) {
234100
234393
  categoryName: null,
234101
234394
  categorySlug: null,
234102
234395
  learner: memory.username,
234396
+ username: memory.username,
234103
234397
  email: null,
234104
234398
  mentorId: null,
234105
234399
  mentorName: null,
@@ -234109,50 +234403,40 @@ function toRowFromGlobalMemory(memory) {
234109
234403
  };
234110
234404
  }
234111
234405
  /**
234112
- * Backs the analytics Memory tab. Owns scope selection (including an agent
234113
- * picked through the dropdown's search), the shared filter state, and
234114
- * pagination, and normalizes the three differently-shaped memory endpoints
234115
- * into a single row type.
234406
+ * Backs the analytics Memory tab. Owns scope selection, the shared filter
234407
+ * state and pagination, and normalizes the three differently-shaped memory
234408
+ * endpoints into a single row type.
234116
234409
  *
234117
234410
  * All three list queries are always mounted (RTK Query hooks can't be called
234118
234411
  * conditionally); `skip` keeps only the active scope's request in flight.
234119
234412
  */
234120
234413
  const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234121
- const [searchedMentor, setSearchedMentor] = useState(null);
234122
- // An agent picked from the scope dropdown's search stands in for the route
234123
- // agent, so admins can inspect any agent's memories without leaving the tab.
234124
- const activeMentorId = (searchedMentor === null || searchedMentor === void 0 ? void 0 : searchedMentor.id) || mentorId;
234125
- const hasMentor = !!activeMentorId;
234414
+ const hasMentor = !!mentorId;
234126
234415
  // Global (agent-independent) memories lead: they are the ones that hold for
234127
234416
  // the user everywhere, so the tab opens on them and the dropdown lists them
234128
- // first.
234129
- const availableScopes = useMemo(() => (hasMentor ? ['global', 'mentor', 'all-mentors'] : ['global', 'all-mentors']), [hasMentor]);
234417
+ // first. The agent dimension is whatever the analytics agent picker resolved
234418
+ // to — one agent or all of them — never both, so the tab can't disagree with
234419
+ // the picker about which agents are on screen.
234420
+ const availableScopes = useMemo(() => (hasMentor ? ['global', 'mentor'] : ['global', 'all-mentors']), [hasMentor]);
234130
234421
  const [scope, setScope] = useState('global');
234131
234422
  const [page, setPage] = useState(1);
234132
234423
  const [learnerFilter, setLearnerFilter] = useState('');
234133
234424
  const [categoryFilter, setCategoryFilter] = useState(ALL_CATEGORIES);
234134
234425
  const [contentFilter, setContentFilter] = useState('');
234135
234426
  const [dateRange, setDateRange] = useState(undefined);
234136
- const selectSearchedMentor = useCallback((mentor) => {
234137
- setSearchedMentor(mentor);
234138
- // Categories belong to a single agent, so a slug carried over from the
234139
- // previous one would filter the new agent's memories down to nothing.
234140
- setCategoryFilter(ALL_CATEGORIES);
234141
- if (mentor)
234142
- setScope('mentor');
234143
- }, []);
234144
- // Picking an agent in the analytics switcher is the more explicit choice, so
234145
- // it drops whatever the tab's own search had pinned.
234427
+ // Categories belong to a single agent, so a slug carried over from the
234428
+ // previous one would filter the new agent's memories down to nothing.
234146
234429
  useEffect(() => {
234147
- setSearchedMentor(null);
234148
234430
  setCategoryFilter(ALL_CATEGORIES);
234149
234431
  }, [mentorId]);
234150
- // The agent scope disappears when the analytics page has no agent selected;
234151
- // fall back rather than leaving the tab stuck on an unqueryable scope.
234432
+ // Whichever agent scope the picker just took off the menu, move to the one it
234433
+ // put there — staying put would leave the tab on a scope it no longer offers
234434
+ // (and, for `mentor` without an agent, one it can't even query).
234152
234435
  useEffect(() => {
234153
- if (!hasMentor && scope === 'mentor') {
234436
+ if (!hasMentor && scope === 'mentor')
234154
234437
  setScope('all-mentors');
234155
- }
234438
+ if (hasMentor && scope === 'all-mentors')
234439
+ setScope('mentor');
234156
234440
  }, [hasMentor, scope]);
234157
234441
  // Only the agent-scoped endpoint takes a `category`, and the category list is
234158
234442
  // that agent's. Drop the selection anywhere else so a filter the UI no longer
@@ -234181,7 +234465,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234181
234465
  ...(endDate ? { end_date: endDate } : {}),
234182
234466
  ...(myMemory ? { my_memory: true } : {}),
234183
234467
  }), [page, categoryFilter, learnerFilter, startDate, endDate, myMemory]);
234184
- const { data: mentorList, isLoading: isLoadingMentorList, isFetching: isFetchingMentorList, error: mentorListError, } = useGetMentorMemoriesListQuery({ org: tenantKey, userId, mentorId: activeMentorId !== null && activeMentorId !== void 0 ? activeMentorId : '', params: mentorListParams }, { skip: !hasIdentity || !isMentorScope });
234468
+ const { data: mentorList, isLoading: isLoadingMentorList, isFetching: isFetchingMentorList, error: mentorListError, } = useGetMentorMemoriesListQuery({ org: tenantKey, userId, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '', params: mentorListParams }, { skip: !hasIdentity || !isMentorScope });
234185
234469
  // Unpaginated, grouped-by-category companion to the list above. It honors the
234186
234470
  // same filters, so it's the only place we can source aggregates that describe
234187
234471
  // the whole filtered set instead of just the visible page.
@@ -234191,7 +234475,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234191
234475
  ...(endDate ? { end_date: endDate } : {}),
234192
234476
  ...(myMemory ? { my_memory: true } : {}),
234193
234477
  }), [learnerFilter, startDate, endDate, myMemory]);
234194
- const { data: mentorGrouped, isLoading: isLoadingMentorGrouped } = useGetMentorMemoriesQuery({ org: tenantKey, userId, mentorId: activeMentorId !== null && activeMentorId !== void 0 ? activeMentorId : '', params: mentorSnapshotParams }, { skip: !hasIdentity || !isMentorScope });
234478
+ const { data: mentorGrouped, isLoading: isLoadingMentorGrouped } = useGetMentorMemoriesQuery({ org: tenantKey, userId, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '', params: mentorSnapshotParams }, { skip: !hasIdentity || !isMentorScope });
234195
234479
  // Deliberately unfiltered by mentor — the point of this scope is to span
234196
234480
  // every agent. Per-agent numbers come from the `mentor` scope instead.
234197
234481
  const allMentorsParams = useMemo(() => ({
@@ -234211,7 +234495,7 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234211
234495
  ...(endDate ? { end_date: endDate } : {}),
234212
234496
  }), [page, learnerFilter, contentFilter, startDate, endDate]);
234213
234497
  const { data: globalMemories, isLoading: isLoadingGlobal, isFetching: isFetchingGlobal, error: globalError, } = useGetGlobalMemoriesQuery({ org: tenantKey, userId, params: globalParams }, { skip: !hasIdentity || !isGlobalScope });
234214
- const { data: adminCategories } = useGetMemoryCategoriesAdminQuery({ org: tenantKey, mentorId: activeMentorId !== null && activeMentorId !== void 0 ? activeMentorId : '' }, { skip: !tenantKey || !hasMentor });
234498
+ const { data: adminCategories } = useGetMemoryCategoriesAdminQuery({ org: tenantKey, mentorId: mentorId !== null && mentorId !== void 0 ? mentorId : '' }, { skip: !tenantKey || !hasMentor });
234215
234499
  const rows = useMemo(() => {
234216
234500
  var _a, _b, _c;
234217
234501
  if (isMentorScope)
@@ -234275,8 +234559,6 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234275
234559
  scope,
234276
234560
  setScope,
234277
234561
  availableScopes,
234278
- searchedMentor,
234279
- selectSearchedMentor,
234280
234562
  rows,
234281
234563
  aggregates,
234282
234564
  totalCount,
@@ -234302,59 +234584,48 @@ const useMemory = ({ tenantKey, userId, mentorId, myMemory = false, }) => {
234302
234584
 
234303
234585
  const CELL = 'p-3 text-[#646464]';
234304
234586
  const HEAD = 'p-3 text-left text-sm whitespace-nowrap text-[#646464]';
234305
- /**
234306
- * Action items that share the scope dropdown. Radix rejects empty values and
234307
- * matches the trigger label by value, so these are sentinels the change handler
234308
- * intercepts rather than selectable scopes.
234309
- */
234310
- const SEARCH_AGENTS_ACTION = '__search-agents__';
234311
- const CLEAR_AGENT_ACTION = '__clear-agent__';
234312
- function MemoryDetailDialog({ memory, onClose, scope, }) {
234587
+ function MemoryDetailDialog({ memory, onClose, scope, tenantKey, currentSPA, }) {
234313
234588
  const t = useT();
234314
- return (jsx(Dialog, { open: !!memory, onOpenChange: (open) => !open && onClose(), children: jsxs(DialogContent, { className: "max-w-lg", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.detailTitle') }) }), memory && (jsxs("div", { className: "space-y-4", children: [jsx("p", { className: "text-sm whitespace-pre-wrap text-gray-700", children: memory.content }), jsxs("dl", { className: "grid grid-cols-2 gap-3 border-t border-gray-100 pt-3 text-xs", children: [jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailUser') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: memory.learner })] }), memory.categoryName && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCategory') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.categoryName })] })), scope === 'all-mentors' && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailAgent') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: memory.mentorName || memory.mentorId || '—' })] })), jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailSource') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.isAutoGenerated
234589
+ return (jsx(Dialog, { open: !!memory, onOpenChange: (open) => !open && onClose(), children: jsxs(DialogContent, { className: "max-w-lg", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.detailTitle') }) }), memory && (jsxs("div", { className: "space-y-4", children: [jsx("p", { className: "text-sm whitespace-pre-wrap text-gray-700", children: memory.content }), jsxs("dl", { className: "grid grid-cols-2 gap-3 border-t border-gray-100 pt-3 text-xs", children: [jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailUser') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: memory.username, display: memory.learner }) })] }), memory.categoryName && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCategory') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.categoryName })] })), scope === 'all-mentors' && (jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailAgent') }), jsx("dd", { className: "mt-0.5 font-medium break-all text-gray-800", children: jsx(AgentScopeLink, { uniqueId: memory.mentorId, name: memory.mentorName, fallback: "\u2014",
234590
+ // Re-scoping reloads the table underneath; this dialog
234591
+ // would otherwise stay open on a memory that the new
234592
+ // scope may not even list.
234593
+ onScoped: onClose }) })] })), jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailSource') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: memory.isAutoGenerated
234315
234594
  ? t('analyticsAnalyticsMemoryStats.sourceAuto')
234316
234595
  : t('analyticsAnalyticsMemoryStats.sourceManual') })] }), jsxs("div", { children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailCaptured') }), jsx("dd", { className: "mt-0.5 font-medium text-gray-800", children: format$1(new Date(memory.createdAt), "MMM dd, yyyy 'at' h:mm a") })] }), memory.sourceSessionId && (jsxs("div", { className: "col-span-2", children: [jsx("dt", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.detailSession') }), jsx("dd", { className: "mt-0.5 font-mono text-[11px] break-all text-gray-800", children: memory.sourceSessionId })] }))] })] }))] }) }));
234317
234596
  }
234318
- function AgentSearchDialog({ tenantKey, open, onClose, selectedMentorId, onSelect, }) {
234319
- const t = useT();
234320
- const [query, setQuery] = useState('');
234321
- return (jsx(Dialog, { open: open, onOpenChange: (next) => !next && onClose(), children: jsxs(DialogContent, { className: "max-w-2xl", children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: t('analyticsAnalyticsMemoryStats.searchAgentsTitle') }) }), jsx(MentorSelectionGrid, { tenantKey: tenantKey, searchQuery: query, onSearchChange: setQuery, selectedMentorIds: selectedMentorId ? [selectedMentorId] : [], itemsPerPage: 6, minHeight: "240px", onMentorSelect: (mentor) => {
234322
- if (!(mentor === null || mentor === void 0 ? void 0 : mentor.unique_id))
234323
- return;
234324
- onSelect({ id: mentor.unique_id, name: mentor.name });
234325
- onClose();
234326
- } })] }) }));
234327
- }
234328
234597
  /**
234329
234598
  * Analytics "Memory" tab. Surfaces the memories memsearch captures while users
234330
- * chat with agents, across three scopes: the selected agent, every agent in the
234331
- * tenant, and global (agent-independent) memories. The scope dropdown also
234332
- * offers an agent search, so any agent's memories can be pulled up without
234333
- * leaving the tab.
234599
+ * chat with agents.
234600
+ *
234601
+ * The scope dropdown is a single choice between global (agent-independent)
234602
+ * memories and the agent dimension, which follows the control bar's agent
234603
+ * picker rather than repeating it: with an agent picked it reads "This Agent"
234604
+ * (named), and with none it reads "All Agents".
234334
234605
  *
234335
234606
  * Hosts are expected to gate this behind `GET .../memsearch-status/`; the
234336
234607
  * component itself only handles the per-request permission failure (403).
234337
234608
  */
234338
- function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, myMemory = false, }) {
234609
+ function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, myMemory = false, currentSPA, }) {
234339
234610
  const t = useT();
234340
234611
  const scopedMentorId = useScopedMentorId(selectedMentorId, mentorId);
234612
+ const { scopedMentor } = useAnalyticsScope();
234341
234613
  const [selectedMemory, setSelectedMemory] = useState(null);
234342
- const [agentSearchOpen, setAgentSearchOpen] = useState(false);
234343
234614
  // The content search is committed on Enter/blur rather than per-keystroke so
234344
234615
  // we don't fire a request (and reset pagination) on every character typed.
234345
234616
  const [contentInput, setContentInput] = useState('');
234346
- const { scope, setScope, availableScopes, searchedMentor, selectSearchedMentor, rows, aggregates, categories, isLoading, error, isForbidden, page, setPage, totalPages, learnerFilter, setLearnerFilter, categoryFilter, setCategoryFilter, setContentFilter, dateRange, setDateRange, } = useMemory({
234617
+ const { scope, setScope, availableScopes, rows, aggregates, categories, isLoading, error, isForbidden, page, setPage, totalPages, learnerFilter, setLearnerFilter, categoryFilter, setCategoryFilter, setContentFilter, dateRange, setDateRange, } = useMemory({
234347
234618
  tenantKey,
234348
234619
  userId,
234349
- // The agent scope picker feeds the same slot the route agent would, so the
234350
- // tab's own agent search still overrides it (`searchedMentor || mentorId`)
234351
- // rather than the two controls fighting over the scope.
234620
+ // The only agent input: whatever the control bar's picker (or the route)
234621
+ // resolved to. The tab no longer picks an agent of its own.
234352
234622
  mentorId: scopedMentorId,
234353
234623
  myMemory,
234354
234624
  });
234355
234625
  const scopeLabels = {
234356
- // A searched agent takes over the agent scope, so name it in the trigger.
234357
- mentor: (searchedMentor === null || searchedMentor === void 0 ? void 0 : searchedMentor.name) || t('analyticsAnalyticsMemoryStats.scopeMentor'),
234626
+ // Name the picked agent where the picker knows it, so the trigger says
234627
+ // which agent "This Agent" means.
234628
+ mentor: (scopedMentor === null || scopedMentor === void 0 ? void 0 : scopedMentor.name) || t('analyticsAnalyticsMemoryStats.scopeMentor'),
234358
234629
  'all-mentors': t('analyticsAnalyticsMemoryStats.scopeAllMentors'),
234359
234630
  global: t('analyticsAnalyticsMemoryStats.scopeGlobal'),
234360
234631
  };
@@ -234366,19 +234637,7 @@ function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, m
234366
234637
  if (isForbidden) {
234367
234638
  return (jsx(Card, { className: "rounded-lg border border-gray-100 bg-white shadow-sm", children: jsx(CardContent, { className: "p-8 text-center", children: jsx("p", { className: "text-gray-500", children: t('analyticsAnalyticsMemoryStats.noPermission') }) }) }));
234368
234639
  }
234369
- return (jsxs("div", { className: "space-y-6", children: [jsx("div", { className: "rounded-lg border border-[oklch(0.922_0_0)] bg-white p-4", children: jsxs("div", { className: "flex flex-col gap-3 lg:flex-row", children: [jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: scope, onValueChange: (value) => {
234370
- // The trailing items are actions, not scopes — the Select stays
234371
- // on whatever scope is currently active.
234372
- if (value === SEARCH_AGENTS_ACTION) {
234373
- setAgentSearchOpen(true);
234374
- return;
234375
- }
234376
- if (value === CLEAR_AGENT_ACTION) {
234377
- selectSearchedMentor(null);
234378
- return;
234379
- }
234380
- setScope(value);
234381
- }, children: [jsx(SelectTrigger, { className: "h-9 w-full bg-white font-normal", "aria-label": t('analyticsAnalyticsMemoryStats.scopeLabel'), children: jsx(SelectValue, {}) }), jsxs(SelectContent, { children: [availableScopes.map((value) => (jsx(SelectItem, { value: value, children: scopeLabels[value] }, value))), jsx(SelectSeparator, {}), jsx(SelectItem, { value: SEARCH_AGENTS_ACTION, children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(Search, { className: "h-3.5 w-3.5" }), t('analyticsAnalyticsMemoryStats.searchAgents')] }) }), searchedMentor && (jsx(SelectItem, { value: CLEAR_AGENT_ACTION, children: jsxs("span", { className: "flex items-center gap-2", children: [jsx(X$1, { className: "h-3.5 w-3.5" }), t('analyticsAnalyticsMemoryStats.clearAgentSearch')] }) }))] })] }) }), jsx("div", { className: "min-w-[200px] flex-1", children: jsx(UserFilterSelect, { tenantKey: tenantKey, currentUsername: userId, value: learnerFilter, onChange: setLearnerFilter }) }), scope === 'global' && (jsx("form", { className: "min-w-[180px] flex-1", onSubmit: (event) => {
234640
+ return (jsxs("div", { className: "space-y-6", children: [jsx("div", { className: "rounded-lg border border-[oklch(0.922_0_0)] bg-white p-4", children: jsxs("div", { className: "flex flex-col gap-3 lg:flex-row", children: [jsx("div", { className: "min-w-[160px]", children: jsxs(Select$1, { value: scope, onValueChange: (value) => setScope(value), children: [jsx(SelectTrigger, { className: "h-9 w-full bg-white font-normal", "aria-label": t('analyticsAnalyticsMemoryStats.scopeLabel'), children: jsx(SelectValue, {}) }), jsx(SelectContent, { children: availableScopes.map((value) => (jsx(SelectItem, { value: value, children: scopeLabels[value] }, value))) })] }) }), jsx("div", { className: "min-w-[200px] flex-1", children: jsx(UserFilterSelect, { tenantKey: tenantKey, currentUsername: userId, value: learnerFilter, onChange: setLearnerFilter }) }), scope === 'global' && (jsx("form", { className: "min-w-[180px] flex-1", onSubmit: (event) => {
234382
234641
  event.preventDefault();
234383
234642
  setContentFilter(contentInput.trim());
234384
234643
  }, children: jsx(Input, { value: contentInput, onChange: (event) => setContentInput(event.target.value), onBlur: () => setContentFilter(contentInput.trim()), placeholder: t('analyticsAnalyticsMemoryStats.contentPlaceholder'), "aria-label": t('analyticsAnalyticsMemoryStats.contentPlaceholder'), className: "h-9 bg-white" }) })), jsxs(Popover, { modal: true, children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button$1, { variant: "outline", className: "flex h-9 w-full items-center gap-2 bg-white font-normal whitespace-nowrap lg:w-auto", children: [jsx(Calendar$1, { className: "h-4 w-4" }), (dateRange === null || dateRange === void 0 ? void 0 : dateRange.from) && (dateRange === null || dateRange === void 0 ? void 0 : dateRange.to)
@@ -234393,8 +234652,8 @@ function AnalyticsMemoryStats({ tenantKey, mentorId, userId, selectedMentorId, m
234393
234652
  }) })] }), jsx("div", { className: "h-2 w-full overflow-hidden rounded-full bg-gray-100", children: jsx("div", { className: "h-full rounded-full bg-blue-600", style: { width: `${percent}%` } }) })] }, category.slug));
234394
234653
  }) })] })), jsx("div", { className: "overflow-hidden rounded-md border border-[oklch(0.922_0_0)] bg-white", children: jsx("div", { className: "overflow-x-auto", children: jsx("div", { className: "inline-block min-w-full align-middle", children: isLoading ? (jsx("div", { className: "flex w-full items-center justify-center py-10", children: jsx("div", { className: "h-6 w-6 animate-spin rounded-full border-2 border-blue-600 border-t-transparent" }) })) : error ? (jsx("div", { className: "py-8 text-center text-[#646464]", children: t('analyticsAnalyticsMemoryStats.loadError') })) : rows.length === 0 ? (jsx("div", { className: "h-[120px]", children: jsx(EmptyStats, { title: t('analyticsAnalyticsMemoryStats.noMemories') }) })) : (jsxs(Table, { className: "min-w-full", children: [jsx(TableHeader, { children: jsxs(TableRow, { className: "bg-muted/50 border-b border-[oklch(0.922_0_0)]", children: [jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colUser') }), jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colMemory') }), showAgentColumn && (jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colAgent') })), showCategoryColumn && (jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colCategory') })), jsx(TableHead, { className: HEAD, children: t('analyticsAnalyticsMemoryStats.colCaptured') })] }) }), jsx(TableBody, { children: rows.map((row) => {
234395
234654
  var _a;
234396
- return (jsxs(TableRow, { onClick: () => setSelectedMemory(row), className: "cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0 hover:bg-gray-50", children: [jsx(TableCell, { className: cn(CELL, 'font-medium whitespace-nowrap'), children: row.learner }), jsx(TableCell, { className: cn(CELL, 'min-w-[280px]'), children: jsx("span", { className: "line-clamp-2", children: row.content }) }), showAgentColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: row.mentorName || row.mentorId || '—' })), showCategoryColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: row.categoryName ? (jsx("span", { className: "rounded-md bg-blue-100 px-2 py-1 text-xs text-blue-700", children: row.categoryName })) : ('—') })), jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: formatDistanceToNow(new Date(row.createdAt), { addSuffix: true }) })] }, `${(_a = row.mentorId) !== null && _a !== void 0 ? _a : 'global'}-${row.id}`));
234397
- }) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading }), jsx(MemoryDetailDialog, { memory: selectedMemory, scope: scope, onClose: () => setSelectedMemory(null) }), agentSearchOpen && (jsx(AgentSearchDialog, { open: true, tenantKey: tenantKey, selectedMentorId: searchedMentor === null || searchedMentor === void 0 ? void 0 : searchedMentor.id, onSelect: selectSearchedMentor, onClose: () => setAgentSearchOpen(false) }))] }));
234655
+ return (jsxs(TableRow, { onClick: () => setSelectedMemory(row), className: "cursor-pointer border-b border-[oklch(0.922_0_0)] last:border-0 hover:bg-gray-50", children: [jsx(TableCell, { className: cn(CELL, 'font-medium whitespace-nowrap'), children: jsx(UserProfileLink, { tenantKey: tenantKey, currentSPA: currentSPA, username: row.username, display: row.learner }) }), jsx(TableCell, { className: cn(CELL, 'min-w-[280px]'), children: jsx("span", { className: "line-clamp-2", children: row.content }) }), showAgentColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: jsx(AgentScopeLink, { uniqueId: row.mentorId, name: row.mentorName, fallback: "\u2014" }) })), showCategoryColumn && (jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: row.categoryName ? (jsx("span", { className: "rounded-md bg-blue-100 px-2 py-1 text-xs text-blue-700", children: row.categoryName })) : ('—') })), jsx(TableCell, { className: cn(CELL, 'whitespace-nowrap'), children: formatDistanceToNow(new Date(row.createdAt), { addSuffix: true }) })] }, `${(_a = row.mentorId) !== null && _a !== void 0 ? _a : 'global'}-${row.id}`));
234656
+ }) })] })) }) }) }), jsx(IblPagination, { currentPage: page, totalPages: totalPages, onPageChange: setPage, disabled: isLoading }), jsx(MemoryDetailDialog, { memory: selectedMemory, scope: scope, tenantKey: tenantKey, currentSPA: currentSPA, onClose: () => setSelectedMemory(null) })] }));
234398
234657
  }
234399
234658
 
234400
234659
  const SkeletonMultiplier = ({ Skeleton, multiplier }) => {
@@ -241337,6 +241596,27 @@ var minimumMentorAlert = /*#__PURE__*/Object.freeze({
241337
241596
  MinimumMentorAlert: MinimumMentorAlert
241338
241597
  });
241339
241598
 
241599
+ function MentorSelectionGrid({ selectedMentorIds, onMentorSelect, searchQuery, onSearchChange, tenantKey, itemsPerPage = 8, showSearch = true, minHeight = '400px', }) {
241600
+ const t = useT();
241601
+ const { agents: mentors, isLoading: isMentorsLoading, isFetching: isMentorsFetching, currentPage, totalPages, setSearchQuery: setMentorSearch, handlePageChange, } = useAgentSearchWithPagination({ tenantKey, itemsPerPage });
241602
+ // Update search query with debounce effect handled by the hook
241603
+ React__default.useEffect(() => {
241604
+ setMentorSearch(searchQuery);
241605
+ }, [searchQuery]);
241606
+ const isMentorSelected = (mentorId) => {
241607
+ return selectedMentorIds.includes(mentorId);
241608
+ };
241609
+ return (jsxs("div", { className: "space-y-4", children: [showSearch && (jsxs("div", { className: "relative", children: [isMentorsFetching ? (jsx(Spinner, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })) : (jsx(Search, { className: "absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2 transform text-gray-400" })), jsx(Input, { placeholder: t('mentorsMentorSelectionGrid.searchAgentsPlaceholder'), value: searchQuery, onChange: (e) => onSearchChange(e.target.value), className: "h-10 border-gray-200 pl-10 focus:border-blue-500 focus:ring-0" })] })), jsxs("div", { className: "space-y-4", children: [jsx("div", { className: "grid max-h-96 auto-rows-min grid-cols-1 items-start gap-3 overflow-y-auto rounded-lg border border-gray-200 p-4 md:max-h-none md:grid-cols-2", style: { minHeight }, children: isMentorsLoading ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.loadingAgents') })) : mentors.length === 0 ? (jsx("div", { className: "col-span-full py-8 text-center text-gray-500", children: t('mentorsMentorSelectionGrid.noAgentsFound') })) : (mentors.map((mentor) => {
241610
+ const isSelected = isMentorSelected(mentor.unique_id || '');
241611
+ const isAlreadyAdded = selectedMentorIds.includes(mentor.unique_id || '');
241612
+ return (jsxs("button", { onClick: () => onMentorSelect(mentor), className: `flex cursor-pointer items-center gap-3 rounded-lg border-2 p-3 transition-all ${isSelected
241613
+ ? 'border-blue-500 bg-blue-50'
241614
+ : isAlreadyAdded
241615
+ ? 'bg-blue-25 border-blue-300'
241616
+ : 'border-gray-200 hover:border-gray-300 hover:bg-gray-50'}`, children: [jsxs(Avatar, { className: "h-12 w-12 flex-shrink-0", children: [jsx(AvatarImage, { src: mentor.profile_image || '/placeholder.svg', alt: mentor.name }), jsx(AvatarFallback, { children: mentor.name.substring(0, 2) })] }), jsxs("div", { className: "flex min-w-0 flex-1 flex-col justify-start text-left", children: [jsx("h4", { className: "truncate text-sm font-medium text-gray-900", children: mentor.name }), jsx("p", { className: "line-clamp-2 text-xs text-gray-600", children: mentor.description })] }), isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-600", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) })), isAlreadyAdded && !isSelected && (jsx("div", { className: "flex-shrink-0", children: jsx("div", { className: "flex h-6 w-6 items-center justify-center rounded-full bg-blue-400", children: jsx(Check, { className: "h-4 w-4 text-white" }) }) }))] }, mentor.unique_id));
241617
+ })) }), jsx(IblPagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: handlePageChange, disabled: isMentorsFetching || isMentorsLoading })] })] }));
241618
+ }
241619
+
241340
241620
  function CreateProjectModal({ isOpen, onClose, tenantKey, username, navigateToMentorInProject, }) {
241341
241621
  const t = useT();
241342
241622
  const dispatch = useDispatch();
@@ -245812,5 +246092,5 @@ var trainOrDeleteModal = /*#__PURE__*/Object.freeze({
245812
246092
  TrainOrDeleteModal: TrainOrDeleteModal
245813
246093
  });
245814
246094
 
245815
- export { ACCESS_COURSE_LABEL, ALL_CATEGORIES, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentSkills, AlertsTab, AnalyticsAgentPicker, AnalyticsAreaChart, AnalyticsAuditLogStats, AnalyticsBarChart, AnalyticsControlBar, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsGlobalFiltersProvider, AnalyticsLayout, AnalyticsLlmUsageStats, AnalyticsMemoryStats, AnalyticsMonetizationStats, AnalyticsNotice, AnalyticsOverview, AnalyticsPlatformAuditLog, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsScopeProvider, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTraces, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, AuditLogChangesView, AuditLogJsonView, BUY_NOW_LABEL, BillingTab, CATALOGS, CHART_ORDINAL_RAMP, CHART_SERIES_COLORS, CHART_SINGLE_SERIES_COLOR, CREATE_AGENT_LABELS, CUA_DRIVER_REPO_URL, CUA_DRIVER_TAURI_COMMANDS, CUA_DRIVER_TAURI_EVENTS, CardInfoIcon, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChartTooltipCard, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_COWORK_REQUIRED_SIZE_GB, DEFAULT_LOCALE, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_LLM_CHANGED_EVENT, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, MEMORY_PAGE_SIZE, Markdown, MemoryAdminTab, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_FIELD_TYPES, ONBOARDING_SECTORS, OnboardingField, OnboardingShell, OnboardingWizard, PLATFORM_AUDIT_DEEP_PAGING_THRESHOLD, PLATFORM_AUDIT_PAGE_SIZE, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformAuditLogDetailSheet, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RankedBars, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SERVICE_COLOR_ORDER, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, SlashSkillPicker, SourceChip, Spinner, StatCard, StepHeader, SummerNoteTextEditor, TAURI_COMMANDS, TAURI_EVENTS, TRACES_PAGE_SIZE, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, TrendSparkline, USER_ONBOARDING_FORM_SLUG, USER_ONBOARDING_FORM_VERSION, USER_ONBOARDING_SUBMISSION_SLUG, UpgradePackageModal, UserAvatar, UserOnboardingWizard, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, areChartFiltersEqual, availablePlacementExams, buildOnboardingAgentPath, buildUserOnboardingFormMetadata, buildUserOnboardingSubmissionMetadata, coerceOnboardingAgent, coerceOnboardingAgents, coerceUserOnboardingForm, colorForRank, colorForSeries, emptyUserOnboardingForm, findLastResumeBlock, findOnboardingAgent, findSequentialParent, flattenVerticalBlocks, formatAuditTimestamp, formatCompactNumber, formatLatencySeconds, formatTimeZoneLabel, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, granularityForFilter, hasOnboardingContent, humanizeAuditToken, inBrowserPrint, inIframe, initialCuaDriverInstallState, initialModelDownloadState, isCoworkEnabled, isLlmUsageForbidden, isLlmUsageUnavailable, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSlashCommandToken, isTauriApp, isValidLocale, isValidTimeZone, llmUsageDateArgs, components as markdownComponents, modelSupportsCowork, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, readUserOnboardingForm, readUserOnboardingSubmission, readUserOnboardingSubmissions, resolveAuditTimeZone, resolveCreateAgentLabels, sanitizeCss, setCoworkEnabled, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, smallestCoworkModel, useAnalyticsGlobalFilters, useAnalyticsScope, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useCuaDriver, useDiscover, useEdxIframe, useFinancial, useIframeMessageHandler, useLlmTraces, useLlmUsage, useLocalStorage, useMemory, useModelDownload, useMonetization, useOverview, usePlatformAuditLabels, usePlatformAuditLog, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useScopedMentorDbId, useScopedMentorId, useSelectedLocalModel, useSlashSkillPicker, useSlashSkills, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
246095
+ export { ACCESS_COURSE_LABEL, ALL_CATEGORIES, AccessTimeHeatmap, AccessiblePaginate, AddMentorToProjectModal, AddSkillDialog, Admin, AdvancedTab, AgentConfigPrompts, AgentScopeLink, AgentSkills, AlertsTab, AnalyticsAgentPicker, AnalyticsAreaChart, AnalyticsAuditLogStats, AnalyticsBarChart, AnalyticsControlBar, AnalyticsCourseDetail, AnalyticsCourses, AnalyticsFinancialStats, AnalyticsGlobalFiltersProvider, AnalyticsLayout, AnalyticsLlmUsageStats, AnalyticsMemoryStats, AnalyticsMonetizationStats, AnalyticsNotice, AnalyticsOverview, AnalyticsPlatformAuditLog, AnalyticsProgramDetail, AnalyticsPrograms, AnalyticsReportDownload, AnalyticsReports, AnalyticsScopeProvider, AnalyticsSettingsProvider, AnalyticsTopicsStats, AnalyticsTraces, AnalyticsTranscriptsStats, AnalyticsUsersStats, AppleRestrictionModal, ApplyWizard, AuditLogChangesView, AuditLogJsonView, BUY_NOW_LABEL, BillingTab, CATALOGS, CHART_ORDINAL_RAMP, CHART_SERIES_COLORS, CHART_SINGLE_SERIES_COLOR, CREATE_AGENT_LABELS, CUA_DRIVER_REPO_URL, CUA_DRIVER_TAURI_COMMANDS, CUA_DRIVER_TAURI_EVENTS, CardInfoIcon, CategorizedDropdownMenu, ChartCardWrapper, ChartFiltersProvider, ChartLoading, ChartTooltipCard, ChatContext, ChatPrivacyToggle, ChatProvider, CompanyDialog, ConnectorManagementDialog, CopyButtonIcon, CourseAccessGuard, CourseCardSkeleton, CourseContentLoading, CourseOutline, CourseOutlineContext, CourseOutlineDrawer, CreateAgentForm, CreateAgentModal, CreateProjectModal, CreateWorkflowModal, CredentialBox, CredentialMiniBoxSkeleton, CredentialsList, CreditBalance, CustomDateRangePicker, CustomTooltip, DEFAULT_COWORK_REQUIRED_SIZE_GB, DEFAULT_LOCALE, DefaultEmptyBox, DeleteProjectModal, DeleteWorkflowModal, DiscoverContentCard, DiscoverFacetsFilter, DiscoverFilterDrawer, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, ENROLL_NOW_COURSE_STARTING_SOON_LABEL, ENROLL_NOW_LABEL, EditAlertDialog, EducationBox, EducationDialog, EducationTab, EdxIframeContext, EmptyStats, ExperienceBox, ExperienceDialog, ExperienceTab, FacetFilterContext, Footer, GradebookTab, GroupsFilterDropdown, INVITATION_ONLY_LABEL, InstitutionDialog, IntegrationsTab, InviteUserContent, InviteUserDialog, InvitedUsersDialog, LOCAL_LLM_CHANGED_EVENT, LOCAL_MODELS, Loader, LocalLLMTab, LocalModelsContent, LoginButton, MACOS_PERMISSIONS_COMMANDS, MEMORY_PAGE_SIZE, Markdown, MemoryAdminTab, MinimumMentorAlert, MonetizationTab, NotificationDisplay, NotificationDropdown, ONBOARDING_FIELD_TYPES, ONBOARDING_SECTORS, OnboardingField, OnboardingShell, OnboardingWizard, PLATFORM_AUDIT_DEEP_PAGING_THRESHOLD, PLATFORM_AUDIT_PAGE_SIZE, PaywallModal, PlacementExam, PlacementExamsDropdown, PlatformAuditLogDetailSheet, PlatformNavbar, PlatformNavbarSearch, Profile, ProfileTimeChart, ProgressDots, ProjectActionButtons, ProjectFilesModal, ProjectInstructionsModal, ProjectLandingPage, ProjectMentorsList, ProjectsPage, REQUEST_ACCESS_COURSE_STARTING_SOON_LABEL, REQUEST_ACCESS_LABEL, RankedBars, RenameProjectModal, ResumeBox, ResumeTab, RichTextEditor, SERVICE_COLOR_ORDER, SUPPORTED_LOCALES, SandboxConfig, SearchableMultiSelect, SendNotificationDialog, SignupButton, SkeletonActivityStatBox, SkeletonAddSkillsLoading, SkeletonCreatePathwaySearchList, SkeletonDiscoverFilterBox, SkeletonEducationBox, SkeletonMultiplier, SkeletonPathwayBox, SkeletonProfileInfoCard, SkeletonSkillBox, SkillBox, SkillDetailModal, SkillLeaderboardChart, SkillsBox, SkillsList, SlashSkillPicker, SourceChip, Spinner, StatCard, StepHeader, SummerNoteTextEditor, TAURI_COMMANDS, TAURI_EVENTS, TRACES_PAGE_SIZE, TenantSwitcher, TimeFilter, TimeTrackingProvider, TimedExam, ToolDialogs, TopBanner, TrendSparkline, USER_ONBOARDING_FORM_SLUG, USER_ONBOARDING_FORM_VERSION, USER_ONBOARDING_SUBMISSION_SLUG, UpgradePackageModal, UserAvatar, UserOnboardingWizard, Version, WebContainersI18nProvider, WorkflowSidebar, addBookmarksTab, areChartFiltersEqual, availablePlacementExams, buildOnboardingAgentPath, buildUserOnboardingFormMetadata, buildUserOnboardingSubmissionMetadata, coerceOnboardingAgent, coerceOnboardingAgents, coerceUserOnboardingForm, colorForRank, colorForSeries, emptyUserOnboardingForm, findLastResumeBlock, findOnboardingAgent, findSequentialParent, flattenVerticalBlocks, formatAuditTimestamp, formatCompactNumber, formatLatencySeconds, formatTimeZoneLabel, getCatalog, getFirstAvailableUnit, getLocalLLMModel, getLocalLLMToolSupport, getNextUnitIframe, getOrg, getParentBlockById, getParentsInfosFromSublessonId, getPreviousUnitIframe, getRandomCourseImage, getSectorById, getTenant, getUnitToIframe, getUserId, getUserName, granularityForFilter, hasOnboardingContent, humanizeAuditToken, inBrowserPrint, inIframe, initialCuaDriverInstallState, initialModelDownloadState, isCoworkEnabled, isLlmUsageForbidden, isLlmUsageUnavailable, isLocalLLMEnabled, isPlatformNavbarCreditBalanceVisible, isSlashCommandToken, isTauriApp, isValidLocale, isValidTimeZone, llmUsageDateArgs, components as markdownComponents, modelSupportsCowork, onboardingPrimaryButtonClass, onboardingSecondaryButtonClass, readUserOnboardingForm, readUserOnboardingSubmission, readUserOnboardingSubmissions, resolveAuditTimeZone, resolveCreateAgentLabels, sanitizeCss, setCoworkEnabled, setLocalLLMEnabled, setLocalLLMModel, setLocalLLMToolSupport, smallestCoworkModel, useAnalyticsGlobalFilters, useAnalyticsScope, useAnalyticsSettings, useAuditLog, useCatalogSearch, useChartFilters, useChatPrivacy, useChatState, useCourseDetail, useCourseMetadata, useCourses, useCuaDriver, useDiscover, useEdxIframe, useFinancial, useIframeMessageHandler, useLlmTraces, useLlmUsage, useLocalStorage, useMemory, useModelDownload, useMonetization, useOverview, usePlatformAuditLabels, usePlatformAuditLog, useProfileActivityStats, useProfileCredentials, useProfilePathways, useProfilePrograms, useProfileSkills, useProfileTimeSpent, usePrograms, useReports, useScopedMentorDbId, useScopedMentorId, useSelectedLocalModel, useSlashSkillPicker, useSlashSkills, useT, useTauri, useTimeTracking, useTopics, useTranscripts, useUserCourses, useUserMetadata, useUsers, useWebContainersI18n, useWebContainersLocale };
245816
246096
  //# sourceMappingURL=index.esm.js.map