+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('Loading...') }}
+
+
+
+
+
+
+ {{ kpi.value }}
+
+
+ {{ $t(kpi.label) }}
+
+
+
+
+
+ {{ $t('Guardrails') }}
+
+
+
+
+
+ {{ $t('Guardrail outcomes') }}
+
+
+
+
+
+ {{ $t(emptyGuardrails) }}
+
+
+
+
+
+ {{ $t('Block rate by FlowGenie') }}
+
+
+
+
+
+ {{ $t(emptyBlocks) }}
+
+
+
+
+
+
+
+ {{ $t('Violations by kind') }}
+
+
+
+
+
+ {{ $t('No violations in this period.') }}
+
+
+
+
+
+ {{ $t('Where it fired') }}
+
+
+
+
+
+ {{ $t(emptyGuardrails) }}
+
+
+
+
+
+
+ {{ $t('Blocked vs redacted sessions') }}
+
+
+
+
+
+
+
+ {{ $t('Usage') }}
+
+
+
+
+
+ {{ $t('Tokens in vs out') }}
+
+
+
+
+
+ {{ $t(emptyTokens) }}
+
+
+
+
+
+ {{ $t('Tokens by FlowGenie') }}
+
+
+
+
+
+ {{ $t(emptyTokens) }}
+
+
+
+
+
+
+
+ {{ $t('Sessions per day') }}
+
+
+
+
+
+
+
+
+ {{ $t('Session status') }}
+
+
+
+
+
+ {{ $t('No sessions in this period.') }}
+
+
+
+
+
+
+ {{ $t('Top users by blocks') }}
+
+
+
+
+
+ | {{ $t('User') }} |
+ {{ $t('FlowGenie') }} |
+ {{ $t('Sessions') }} |
+ {{ $t('Blocks') }} |
+ {{ $t('Block rate') }} |
+
+
+
+
+ | {{ row.user }} |
+ {{ row.genie }} |
+ {{ row.sessions }} |
+ {{ row.blocks }} |
+ {{ formatRate(row.block_rate) }} |
+
+
+
+
+ {{ $t(emptyBlocks) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/js/admin/logs/components/Logs/Monitoring/index.js b/resources/js/admin/logs/components/Logs/Monitoring/index.js
new file mode 100644
index 0000000000..baa481f302
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/Monitoring/index.js
@@ -0,0 +1,2 @@
+// eslint-disable-next-line import/prefer-default-export
+export { default as MonitoringDashboard } from './MonitoringDashboard.vue';
diff --git a/resources/js/admin/logs/components/Logs/Sidebar/Sidebar.vue b/resources/js/admin/logs/components/Logs/Sidebar/Sidebar.vue
index a2276bbff7..6d947d71ca 100644
--- a/resources/js/admin/logs/components/Logs/Sidebar/Sidebar.vue
+++ b/resources/js/admin/logs/components/Logs/Sidebar/Sidebar.vue
@@ -104,7 +104,7 @@
:visible="isAgentsActive"
>
- FlowGenie Agents logs
+ {{ $t('Monitoring') }}
+
+
+ {{ $t('FlowGenie Agents logs') }}
@@ -153,13 +170,25 @@ export default {
isAgentsActive() {
return this.$route.path.startsWith("/agents");
},
+ isAgentsLogsActive() {
+ return this.$route.path === '/agents/design' || this.$route.path === '/agents/execution';
+ },
+ isMonitoringActive() {
+ return this.$route.path.startsWith('/agents/monitoring');
+ },
emailLinkClasses() {
- return this.isEmailActive
- ? "tw-bg-blue-50 tw-font-semibold tw-text-blue-500"
- : "tw-font-medium tw-text-zinc-700 hover:tw-bg-zinc-50";
+ return this.linkClasses(this.isEmailActive);
+ },
+ agentsLogsLinkClasses() {
+ return this.linkClasses(this.isAgentsLogsActive);
},
- agentsLinkClasses() {
- return this.isAgentsActive
+ monitoringLinkClasses() {
+ return this.linkClasses(this.isMonitoringActive);
+ },
+ },
+ methods: {
+ linkClasses(isActive) {
+ return isActive
? "tw-bg-blue-50 tw-font-semibold tw-text-blue-500"
: "tw-font-medium tw-text-zinc-700 hover:tw-bg-zinc-50";
},
diff --git a/resources/js/admin/logs/components/Logs/charts/BarChart.vue b/resources/js/admin/logs/components/Logs/charts/BarChart.vue
new file mode 100644
index 0000000000..fd46f8cb06
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/BarChart.vue
@@ -0,0 +1,38 @@
+
diff --git a/resources/js/admin/logs/components/Logs/charts/ChartFrame.vue b/resources/js/admin/logs/components/Logs/charts/ChartFrame.vue
new file mode 100644
index 0000000000..e010c4054f
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/ChartFrame.vue
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/resources/js/admin/logs/components/Logs/charts/DoughnutChart.vue b/resources/js/admin/logs/components/Logs/charts/DoughnutChart.vue
new file mode 100644
index 0000000000..5691a36bbd
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/DoughnutChart.vue
@@ -0,0 +1,38 @@
+
diff --git a/resources/js/admin/logs/components/Logs/charts/HorizontalBarChart.vue b/resources/js/admin/logs/components/Logs/charts/HorizontalBarChart.vue
new file mode 100644
index 0000000000..5ddcfa75b7
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/HorizontalBarChart.vue
@@ -0,0 +1,38 @@
+
diff --git a/resources/js/admin/logs/components/Logs/charts/LineChart.vue b/resources/js/admin/logs/components/Logs/charts/LineChart.vue
new file mode 100644
index 0000000000..fa8a6674e9
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/LineChart.vue
@@ -0,0 +1,38 @@
+
diff --git a/resources/js/admin/logs/components/Logs/charts/chartTheme.js b/resources/js/admin/logs/components/Logs/charts/chartTheme.js
new file mode 100644
index 0000000000..8ad3a3fa92
--- /dev/null
+++ b/resources/js/admin/logs/components/Logs/charts/chartTheme.js
@@ -0,0 +1,93 @@
+export const CHART_COLORS = {
+ pass: '#0CA442',
+ redact: '#EC8E00',
+ block: '#EC5962',
+ info: '#2773F3',
+ muted: '#728092',
+ completed: '#0CA442',
+ error: '#EC5962',
+};
+
+export const doughnutOptions = {
+ legend: {
+ display: true,
+ position: 'bottom',
+ },
+ maintainAspectRatio: false,
+ responsive: true,
+ cutoutPercentage: 60,
+ layout: {
+ padding: 4,
+ },
+};
+
+export const horizontalBarOptions = (valueSuffix = '') => ({
+ legend: {
+ display: false,
+ },
+ maintainAspectRatio: false,
+ responsive: true,
+ layout: {
+ padding: {
+ right: 12,
+ },
+ },
+ scales: {
+ xAxes: [{
+ ticks: {
+ beginAtZero: true,
+ callback: (value) => `${value}${valueSuffix}`,
+ },
+ }],
+ yAxes: [{
+ gridLines: {
+ display: false,
+ },
+ afterFit: (scale) => {
+ scale.width = Math.min(scale.width, 140);
+ },
+ }],
+ },
+});
+
+export const stackedBarOptions = {
+ legend: {
+ display: true,
+ position: 'bottom',
+ },
+ maintainAspectRatio: false,
+ responsive: true,
+ layout: {
+ padding: 4,
+ },
+ scales: {
+ xAxes: [{ stacked: true }],
+ yAxes: [{
+ stacked: true,
+ ticks: { beginAtZero: true },
+ }],
+ },
+};
+
+export const lineOptions = {
+ legend: {
+ display: true,
+ position: 'bottom',
+ },
+ maintainAspectRatio: false,
+ responsive: true,
+ layout: {
+ padding: 4,
+ },
+ scales: {
+ yAxes: [{
+ ticks: { beginAtZero: true },
+ }],
+ },
+};
+
+export const chartBoxStyles = {
+ width: '100%',
+ height: '220px',
+ position: 'relative',
+};
diff --git a/resources/js/admin/logs/components/Logs/routes.js b/resources/js/admin/logs/components/Logs/routes.js
index 398d462193..85443ea7d3 100644
--- a/resources/js/admin/logs/components/Logs/routes.js
+++ b/resources/js/admin/logs/components/Logs/routes.js
@@ -1,4 +1,5 @@
import { LogTable } from "./LogTable";
+import { MonitoringDashboard } from "./Monitoring";
export default {};
@@ -70,6 +71,18 @@ export const routes = [
path: "/agents",
redirect: "/agents/design",
},
+ {
+ name: "logs.agents.monitoring",
+ path: "/agents/monitoring",
+ component: MonitoringDashboard,
+ beforeEnter: (to, from, next) => {
+ if (!hasAiPackage()) {
+ next(hasEmailPackage() ? "/email/errors" : "/");
+ } else {
+ next();
+ }
+ },
+ },
{
name: "logs.agents",
path: "/agents/:logType",
From d9ca75dcf2ca89badf8d6effc4d7061b069f1ae0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Agust=C3=ADn=20Busso?=
<90727999+agustinbusso@users.noreply.github.com>
Date: Wed, 19 Aug 2026 12:44:48 -0300
Subject: [PATCH 3/3] Add monitoring i18n keys and use $t
Make monitoring UI strings translatable and add English entries. Moved range/execution options into computed properties so labels use this.$t, updated KPI labels to call $t, and replaced inline empty-message references with $t. Added many monitoring-related keys to resources/lang/en.json. Also fixed a small casing change for the LogContainer fallback title ('FlowGenie Agents logs').
---
.../Logs/LogContainer/LogContainer.vue | 2 +-
.../Logs/Monitoring/MonitoringDashboard.vue | 57 ++++++------
resources/lang/en.json | 93 ++++++++++++++++++-
3 files changed, 122 insertions(+), 30 deletions(-)
diff --git a/resources/js/admin/logs/components/Logs/LogContainer/LogContainer.vue b/resources/js/admin/logs/components/Logs/LogContainer/LogContainer.vue
index caa62040e7..491155762b 100644
--- a/resources/js/admin/logs/components/Logs/LogContainer/LogContainer.vue
+++ b/resources/js/admin/logs/components/Logs/LogContainer/LogContainer.vue
@@ -102,7 +102,7 @@ export default {
design: 'FlowGenie Studio Logs',
execution: 'Runtime Logs',
};
- return agentTitles[this.logType] ?? 'FlowGenie Agents Logs';
+ return agentTitles[this.logType] ?? 'FlowGenie Agents logs';
}
const titles = {
diff --git a/resources/js/admin/logs/components/Logs/Monitoring/MonitoringDashboard.vue b/resources/js/admin/logs/components/Logs/Monitoring/MonitoringDashboard.vue
index c304d2337c..dd45679a2c 100644
--- a/resources/js/admin/logs/components/Logs/Monitoring/MonitoringDashboard.vue
+++ b/resources/js/admin/logs/components/Logs/Monitoring/MonitoringDashboard.vue
@@ -12,7 +12,7 @@
: 'tw-text-zinc-700 hover:tw-bg-zinc-50'"
@click="setExecutionType(option.value)"
>
- {{ $t(option.label) }}
+ {{ option.label }}
@@ -26,7 +26,7 @@
: 'tw-text-zinc-700 hover:tw-bg-zinc-50'"
@click="setRange(option.value)"
>
- {{ $t(option.label) }}
+ {{ option.label }}