From 704eeba3d625bb7d68e54f2af19fb53a03e68e66 Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 12:00:47 +0100 Subject: [PATCH 1/6] fix: ingress ui's Signed-off-by: Rafael Silva (rafaelsi) --- casa-explorer-ui/src/components/mas/index.ts | 1 - .../mas/mas-details/mas-apps-table.tsx | 20 +++++++------ casa-explorer-ui/src/hooks/use-traces.ts | 1 + casa-explorer-ui/src/router/router.tsx | 28 +++++++++++-------- casa-explorer-ui/vite.config.ts | 22 +++++++++++++++ demo/helm/values.yaml | 8 ++++++ deployments/helm/casa-runtime/values.yaml | 6 +++- 7 files changed, 63 insertions(+), 23 deletions(-) diff --git a/casa-explorer-ui/src/components/mas/index.ts b/casa-explorer-ui/src/components/mas/index.ts index 7103f82b..be56047d 100644 --- a/casa-explorer-ui/src/components/mas/index.ts +++ b/casa-explorer-ui/src/components/mas/index.ts @@ -16,4 +16,3 @@ export {MASTable, MASDataTable, createMASColumns} from './mas-list'; export {MASInfoTab, MASAppsTab, MASScopesTab, MASTracesTab, MASDenyConditionsTab, MASAppsTable} from './mas-details'; -export {MASGraphView} from './mas-graph'; diff --git a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx index 577a8207..5668ca82 100644 --- a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx +++ b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import {useCallback, useMemo, useState} from 'react'; +import {lazy, Suspense, useCallback, useMemo, useState} from 'react'; import type React from 'react'; import {useNavigate} from 'react-router-dom'; import {PATHS} from '@/router/paths'; @@ -42,7 +42,7 @@ import {Button} from '@/components/ui/button'; import {Card} from '@/components/ui/card'; import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle} from '@/components/ui/dialog'; import {Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetClose} from '@/components/ui/sheet'; -import {MASGraphView} from '@/components/mas/mas-graph'; +const MASGraphView = lazy(() => import('@/components/mas/mas-graph/mas-graph-view').then(m => ({default: m.MASGraphView}))); import {toast} from 'sonner'; import type {MAS} from '@/types/mas.types'; import type {App, AppType, Tool} from '@/types/app.types'; @@ -348,13 +348,15 @@ export function MASAppsTable({mas, apps}: MASAppsTableProps) { {view === 'graph' && (
- + + +
)} diff --git a/casa-explorer-ui/src/hooks/use-traces.ts b/casa-explorer-ui/src/hooks/use-traces.ts index 5793323b..40f92dcc 100644 --- a/casa-explorer-ui/src/hooks/use-traces.ts +++ b/casa-explorer-ui/src/hooks/use-traces.ts @@ -24,6 +24,7 @@ export const useTraces = (params: TraceQueryParams = {}, live = false, enabled = queryFn: () => traceService.getTraces(params), refetchInterval: live ? 1000 : false, placeholderData: keepPreviousData, + staleTime: live ? 0 : 30_000, enabled }); }; diff --git a/casa-explorer-ui/src/router/router.tsx b/casa-explorer-ui/src/router/router.tsx index 9d908228..17461bad 100644 --- a/casa-explorer-ui/src/router/router.tsx +++ b/casa-explorer-ui/src/router/router.tsx @@ -14,27 +14,31 @@ * limitations under the License. */ +import {lazy, Suspense} from 'react'; import {createBrowserRouter} from 'react-router-dom'; import {AppLayout} from '@/components/app-layout'; -import {DashboardPage} from '@/pages/dashboard-page'; -import {MASPage} from '@/pages/mas/mas-page'; -import {MASDetailPage} from '@/pages/mas/mas-detail-page'; -import {AuthRequestsPage} from '@/pages/auth-requests/auth-requests-page'; -import {AuthRequestDetailPage} from '@/pages/auth-requests/auth-request-detail-page'; -import {NotFoundPage} from '@/pages/not-found-page'; import {PATHS} from './paths'; +const DashboardPage = lazy(() => import('@/pages/dashboard-page').then(m => ({default: m.DashboardPage}))); +const MASPage = lazy(() => import('@/pages/mas/mas-page').then(m => ({default: m.MASPage}))); +const MASDetailPage = lazy(() => import('@/pages/mas/mas-detail-page').then(m => ({default: m.MASDetailPage}))); +const AuthRequestsPage = lazy(() => import('@/pages/auth-requests/auth-requests-page').then(m => ({default: m.AuthRequestsPage}))); +const AuthRequestDetailPage = lazy(() => import('@/pages/auth-requests/auth-request-detail-page').then(m => ({default: m.AuthRequestDetailPage}))); +const NotFoundPage = lazy(() => import('@/pages/not-found-page').then(m => ({default: m.NotFoundPage}))); + +const S = ({children}: {children: React.ReactNode}) => {children}; + export const router = createBrowserRouter([ { path: PATHS.dashboard, element: , children: [ - {index: true, element: }, - {path: PATHS.mas.list, element: }, - {path: PATHS.mas.detailPattern, element: }, - {path: PATHS.authRequests.list, element: }, - {path: PATHS.authRequests.detailPattern, element: }, - {path: '*', element: } + {index: true, element: }, + {path: PATHS.mas.list, element: }, + {path: PATHS.mas.detailPattern, element: }, + {path: PATHS.authRequests.list, element: }, + {path: PATHS.authRequests.detailPattern, element: }, + {path: '*', element: } ] } ]); diff --git a/casa-explorer-ui/vite.config.ts b/casa-explorer-ui/vite.config.ts index 57a63a53..2c2760bb 100644 --- a/casa-explorer-ui/vite.config.ts +++ b/casa-explorer-ui/vite.config.ts @@ -27,6 +27,28 @@ export default defineConfig({ '@': path.resolve(__dirname, './src') } }, + build: { + chunkSizeWarningLimit: 1600, + rollupOptions: { + output: { + manualChunks(id) { + if (!id.includes('node_modules')) return; + if (id.includes('elkjs') || id.includes('@xyflow')) return 'vendor-flow'; + if (id.includes('recharts') || id.includes('/d3-') || id.includes('/d3/')) return 'vendor-charts'; + if (id.includes('@dnd-kit')) return 'vendor-dnd'; + if (id.includes('@tanstack')) return 'vendor-query'; + if (id.includes('@tabler') || id.includes('lucide-react')) return 'vendor-icons'; + if (id.includes('react-hook-form') || id.includes('@hookform') || id.includes('/zod/')) return 'vendor-forms'; + if ( + id.includes('@radix-ui') || id.includes('radix-ui') || + id.includes('/cmdk/') || id.includes('/vaul/') + ) return 'vendor-radix'; + // react core last — Rollup resolves transitive deps from other chunks into this one + if (id.includes('react-router') || id.includes('react-dom') || id.match(/\/react\//) || id.includes('/sonner/') || id.includes('next-themes')) return 'vendor-react'; + } + } + } + }, server: { port: 1234, open: true diff --git a/demo/helm/values.yaml b/demo/helm/values.yaml index 0be6c8ab..d1c63b5b 100644 --- a/demo/helm/values.yaml +++ b/demo/helm/values.yaml @@ -60,6 +60,10 @@ chatUis: domainPrefix: "chat-safe" annotations: cert-manager.io/cluster-issuer: letsencrypt + nginx.ingress.kubernetes.io/proxy-buffering: "off" + nginx.ingress.kubernetes.io/proxy-body-size: "50m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" - name: compromised docker: registry: ghcr.io/outshift-open @@ -73,6 +77,10 @@ chatUis: domainPrefix: "chat-compromised" annotations: cert-manager.io/cluster-issuer: letsencrypt + nginx.ingress.kubernetes.io/proxy-buffering: "off" + nginx.ingress.kubernetes.io/proxy-body-size: "50m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" llmCredentials: apiBaseUrl: "" diff --git a/deployments/helm/casa-runtime/values.yaml b/deployments/helm/casa-runtime/values.yaml index c6ddf975..d235c029 100644 --- a/deployments/helm/casa-runtime/values.yaml +++ b/deployments/helm/casa-runtime/values.yaml @@ -99,7 +99,11 @@ uiExplorer: className: "" apiDomainName: "" domainPrefix: "casa" - annotations: {} + annotations: + nginx.ingress.kubernetes.io/proxy-buffering: "off" + nginx.ingress.kubernetes.io/proxy-body-size: "50m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" nginx: # When true, nginx proxies /api/ → auth-service (port 8000). # Build the UI image with VITE_API_BASE_URL=/api when this is enabled. From 37779c0152963fb49ef5db3dfeceffb49d52f6da Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 12:02:38 +0100 Subject: [PATCH 2/6] Revert "fix: ingress ui's" This reverts commit 704eeba3d625bb7d68e54f2af19fb53a03e68e66. --- casa-explorer-ui/src/components/mas/index.ts | 1 + .../mas/mas-details/mas-apps-table.tsx | 20 ++++++------- casa-explorer-ui/src/hooks/use-traces.ts | 1 - casa-explorer-ui/src/router/router.tsx | 28 ++++++++----------- casa-explorer-ui/vite.config.ts | 22 --------------- demo/helm/values.yaml | 8 ------ deployments/helm/casa-runtime/values.yaml | 6 +--- 7 files changed, 23 insertions(+), 63 deletions(-) diff --git a/casa-explorer-ui/src/components/mas/index.ts b/casa-explorer-ui/src/components/mas/index.ts index be56047d..7103f82b 100644 --- a/casa-explorer-ui/src/components/mas/index.ts +++ b/casa-explorer-ui/src/components/mas/index.ts @@ -16,3 +16,4 @@ export {MASTable, MASDataTable, createMASColumns} from './mas-list'; export {MASInfoTab, MASAppsTab, MASScopesTab, MASTracesTab, MASDenyConditionsTab, MASAppsTable} from './mas-details'; +export {MASGraphView} from './mas-graph'; diff --git a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx index 5668ca82..577a8207 100644 --- a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx +++ b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import {lazy, Suspense, useCallback, useMemo, useState} from 'react'; +import {useCallback, useMemo, useState} from 'react'; import type React from 'react'; import {useNavigate} from 'react-router-dom'; import {PATHS} from '@/router/paths'; @@ -42,7 +42,7 @@ import {Button} from '@/components/ui/button'; import {Card} from '@/components/ui/card'; import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle} from '@/components/ui/dialog'; import {Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetClose} from '@/components/ui/sheet'; -const MASGraphView = lazy(() => import('@/components/mas/mas-graph/mas-graph-view').then(m => ({default: m.MASGraphView}))); +import {MASGraphView} from '@/components/mas/mas-graph'; import {toast} from 'sonner'; import type {MAS} from '@/types/mas.types'; import type {App, AppType, Tool} from '@/types/app.types'; @@ -348,15 +348,13 @@ export function MASAppsTable({mas, apps}: MASAppsTableProps) { {view === 'graph' && (
- - - +
)} diff --git a/casa-explorer-ui/src/hooks/use-traces.ts b/casa-explorer-ui/src/hooks/use-traces.ts index 40f92dcc..5793323b 100644 --- a/casa-explorer-ui/src/hooks/use-traces.ts +++ b/casa-explorer-ui/src/hooks/use-traces.ts @@ -24,7 +24,6 @@ export const useTraces = (params: TraceQueryParams = {}, live = false, enabled = queryFn: () => traceService.getTraces(params), refetchInterval: live ? 1000 : false, placeholderData: keepPreviousData, - staleTime: live ? 0 : 30_000, enabled }); }; diff --git a/casa-explorer-ui/src/router/router.tsx b/casa-explorer-ui/src/router/router.tsx index 17461bad..9d908228 100644 --- a/casa-explorer-ui/src/router/router.tsx +++ b/casa-explorer-ui/src/router/router.tsx @@ -14,31 +14,27 @@ * limitations under the License. */ -import {lazy, Suspense} from 'react'; import {createBrowserRouter} from 'react-router-dom'; import {AppLayout} from '@/components/app-layout'; +import {DashboardPage} from '@/pages/dashboard-page'; +import {MASPage} from '@/pages/mas/mas-page'; +import {MASDetailPage} from '@/pages/mas/mas-detail-page'; +import {AuthRequestsPage} from '@/pages/auth-requests/auth-requests-page'; +import {AuthRequestDetailPage} from '@/pages/auth-requests/auth-request-detail-page'; +import {NotFoundPage} from '@/pages/not-found-page'; import {PATHS} from './paths'; -const DashboardPage = lazy(() => import('@/pages/dashboard-page').then(m => ({default: m.DashboardPage}))); -const MASPage = lazy(() => import('@/pages/mas/mas-page').then(m => ({default: m.MASPage}))); -const MASDetailPage = lazy(() => import('@/pages/mas/mas-detail-page').then(m => ({default: m.MASDetailPage}))); -const AuthRequestsPage = lazy(() => import('@/pages/auth-requests/auth-requests-page').then(m => ({default: m.AuthRequestsPage}))); -const AuthRequestDetailPage = lazy(() => import('@/pages/auth-requests/auth-request-detail-page').then(m => ({default: m.AuthRequestDetailPage}))); -const NotFoundPage = lazy(() => import('@/pages/not-found-page').then(m => ({default: m.NotFoundPage}))); - -const S = ({children}: {children: React.ReactNode}) => {children}; - export const router = createBrowserRouter([ { path: PATHS.dashboard, element: , children: [ - {index: true, element: }, - {path: PATHS.mas.list, element: }, - {path: PATHS.mas.detailPattern, element: }, - {path: PATHS.authRequests.list, element: }, - {path: PATHS.authRequests.detailPattern, element: }, - {path: '*', element: } + {index: true, element: }, + {path: PATHS.mas.list, element: }, + {path: PATHS.mas.detailPattern, element: }, + {path: PATHS.authRequests.list, element: }, + {path: PATHS.authRequests.detailPattern, element: }, + {path: '*', element: } ] } ]); diff --git a/casa-explorer-ui/vite.config.ts b/casa-explorer-ui/vite.config.ts index 2c2760bb..57a63a53 100644 --- a/casa-explorer-ui/vite.config.ts +++ b/casa-explorer-ui/vite.config.ts @@ -27,28 +27,6 @@ export default defineConfig({ '@': path.resolve(__dirname, './src') } }, - build: { - chunkSizeWarningLimit: 1600, - rollupOptions: { - output: { - manualChunks(id) { - if (!id.includes('node_modules')) return; - if (id.includes('elkjs') || id.includes('@xyflow')) return 'vendor-flow'; - if (id.includes('recharts') || id.includes('/d3-') || id.includes('/d3/')) return 'vendor-charts'; - if (id.includes('@dnd-kit')) return 'vendor-dnd'; - if (id.includes('@tanstack')) return 'vendor-query'; - if (id.includes('@tabler') || id.includes('lucide-react')) return 'vendor-icons'; - if (id.includes('react-hook-form') || id.includes('@hookform') || id.includes('/zod/')) return 'vendor-forms'; - if ( - id.includes('@radix-ui') || id.includes('radix-ui') || - id.includes('/cmdk/') || id.includes('/vaul/') - ) return 'vendor-radix'; - // react core last — Rollup resolves transitive deps from other chunks into this one - if (id.includes('react-router') || id.includes('react-dom') || id.match(/\/react\//) || id.includes('/sonner/') || id.includes('next-themes')) return 'vendor-react'; - } - } - } - }, server: { port: 1234, open: true diff --git a/demo/helm/values.yaml b/demo/helm/values.yaml index d1c63b5b..0be6c8ab 100644 --- a/demo/helm/values.yaml +++ b/demo/helm/values.yaml @@ -60,10 +60,6 @@ chatUis: domainPrefix: "chat-safe" annotations: cert-manager.io/cluster-issuer: letsencrypt - nginx.ingress.kubernetes.io/proxy-buffering: "off" - nginx.ingress.kubernetes.io/proxy-body-size: "50m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" - name: compromised docker: registry: ghcr.io/outshift-open @@ -77,10 +73,6 @@ chatUis: domainPrefix: "chat-compromised" annotations: cert-manager.io/cluster-issuer: letsencrypt - nginx.ingress.kubernetes.io/proxy-buffering: "off" - nginx.ingress.kubernetes.io/proxy-body-size: "50m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" llmCredentials: apiBaseUrl: "" diff --git a/deployments/helm/casa-runtime/values.yaml b/deployments/helm/casa-runtime/values.yaml index d235c029..c6ddf975 100644 --- a/deployments/helm/casa-runtime/values.yaml +++ b/deployments/helm/casa-runtime/values.yaml @@ -99,11 +99,7 @@ uiExplorer: className: "" apiDomainName: "" domainPrefix: "casa" - annotations: - nginx.ingress.kubernetes.io/proxy-buffering: "off" - nginx.ingress.kubernetes.io/proxy-body-size: "50m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + annotations: {} nginx: # When true, nginx proxies /api/ → auth-service (port 8000). # Build the UI image with VITE_API_BASE_URL=/api when this is enabled. From c63c0c5114730dbd365203e8d5c10e1d39a89f0e Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 15:01:35 +0100 Subject: [PATCH 3/6] fix: ingress ui's and nginx config Signed-off-by: Rafael Silva (rafaelsi) --- casa-explorer-ui/src/components/mas/index.ts | 1 - .../mas/mas-details/mas-apps-table.tsx | 20 +++++++------ casa-explorer-ui/src/router/router.tsx | 28 +++++++++++-------- casa-explorer-ui/vite.config.ts | 21 ++++++++++++++ demo/helm/values.yaml | 12 ++++++++ .../templates/ui-explorer/configmap.yaml | 1 + deployments/helm/casa-runtime/values.yaml | 15 ++++++++-- scripts/dev/local-setup-standalone.sh | 17 +++++++---- .../telemetry/tracer_repository.py | 8 +++++- 9 files changed, 92 insertions(+), 31 deletions(-) diff --git a/casa-explorer-ui/src/components/mas/index.ts b/casa-explorer-ui/src/components/mas/index.ts index 7103f82b..be56047d 100644 --- a/casa-explorer-ui/src/components/mas/index.ts +++ b/casa-explorer-ui/src/components/mas/index.ts @@ -16,4 +16,3 @@ export {MASTable, MASDataTable, createMASColumns} from './mas-list'; export {MASInfoTab, MASAppsTab, MASScopesTab, MASTracesTab, MASDenyConditionsTab, MASAppsTable} from './mas-details'; -export {MASGraphView} from './mas-graph'; diff --git a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx index 577a8207..5668ca82 100644 --- a/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx +++ b/casa-explorer-ui/src/components/mas/mas-details/mas-apps-table.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import {useCallback, useMemo, useState} from 'react'; +import {lazy, Suspense, useCallback, useMemo, useState} from 'react'; import type React from 'react'; import {useNavigate} from 'react-router-dom'; import {PATHS} from '@/router/paths'; @@ -42,7 +42,7 @@ import {Button} from '@/components/ui/button'; import {Card} from '@/components/ui/card'; import {Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle} from '@/components/ui/dialog'; import {Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetClose} from '@/components/ui/sheet'; -import {MASGraphView} from '@/components/mas/mas-graph'; +const MASGraphView = lazy(() => import('@/components/mas/mas-graph/mas-graph-view').then(m => ({default: m.MASGraphView}))); import {toast} from 'sonner'; import type {MAS} from '@/types/mas.types'; import type {App, AppType, Tool} from '@/types/app.types'; @@ -348,13 +348,15 @@ export function MASAppsTable({mas, apps}: MASAppsTableProps) { {view === 'graph' && (
- + + +
)} diff --git a/casa-explorer-ui/src/router/router.tsx b/casa-explorer-ui/src/router/router.tsx index 9d908228..17461bad 100644 --- a/casa-explorer-ui/src/router/router.tsx +++ b/casa-explorer-ui/src/router/router.tsx @@ -14,27 +14,31 @@ * limitations under the License. */ +import {lazy, Suspense} from 'react'; import {createBrowserRouter} from 'react-router-dom'; import {AppLayout} from '@/components/app-layout'; -import {DashboardPage} from '@/pages/dashboard-page'; -import {MASPage} from '@/pages/mas/mas-page'; -import {MASDetailPage} from '@/pages/mas/mas-detail-page'; -import {AuthRequestsPage} from '@/pages/auth-requests/auth-requests-page'; -import {AuthRequestDetailPage} from '@/pages/auth-requests/auth-request-detail-page'; -import {NotFoundPage} from '@/pages/not-found-page'; import {PATHS} from './paths'; +const DashboardPage = lazy(() => import('@/pages/dashboard-page').then(m => ({default: m.DashboardPage}))); +const MASPage = lazy(() => import('@/pages/mas/mas-page').then(m => ({default: m.MASPage}))); +const MASDetailPage = lazy(() => import('@/pages/mas/mas-detail-page').then(m => ({default: m.MASDetailPage}))); +const AuthRequestsPage = lazy(() => import('@/pages/auth-requests/auth-requests-page').then(m => ({default: m.AuthRequestsPage}))); +const AuthRequestDetailPage = lazy(() => import('@/pages/auth-requests/auth-request-detail-page').then(m => ({default: m.AuthRequestDetailPage}))); +const NotFoundPage = lazy(() => import('@/pages/not-found-page').then(m => ({default: m.NotFoundPage}))); + +const S = ({children}: {children: React.ReactNode}) => {children}; + export const router = createBrowserRouter([ { path: PATHS.dashboard, element: , children: [ - {index: true, element: }, - {path: PATHS.mas.list, element: }, - {path: PATHS.mas.detailPattern, element: }, - {path: PATHS.authRequests.list, element: }, - {path: PATHS.authRequests.detailPattern, element: }, - {path: '*', element: } + {index: true, element: }, + {path: PATHS.mas.list, element: }, + {path: PATHS.mas.detailPattern, element: }, + {path: PATHS.authRequests.list, element: }, + {path: PATHS.authRequests.detailPattern, element: }, + {path: '*', element: } ] } ]); diff --git a/casa-explorer-ui/vite.config.ts b/casa-explorer-ui/vite.config.ts index 57a63a53..ac5c7fc9 100644 --- a/casa-explorer-ui/vite.config.ts +++ b/casa-explorer-ui/vite.config.ts @@ -27,6 +27,27 @@ export default defineConfig({ '@': path.resolve(__dirname, './src') } }, + build: { + chunkSizeWarningLimit: 1600, + rollupOptions: { + output: { + manualChunks(id) { + if (!id.includes('node_modules')) return; + if (id.includes('elkjs') || id.includes('@xyflow')) return 'vendor-flow'; + if (id.includes('recharts') || id.includes('/d3-') || id.includes('/d3/')) return 'vendor-charts'; + if (id.includes('@dnd-kit')) return 'vendor-dnd'; + if (id.includes('@tanstack')) return 'vendor-query'; + if (id.includes('@tabler') || id.includes('lucide-react')) return 'vendor-icons'; + if (id.includes('react-hook-form') || id.includes('@hookform') || id.includes('/zod/')) return 'vendor-forms'; + if ( + id.includes('@radix-ui') || id.includes('radix-ui') || + id.includes('/cmdk/') || id.includes('/vaul/') + ) return 'vendor-radix'; + if (id.includes('react-router') || id.includes('react-dom') || id.match(/\/react\//) || id.includes('/sonner/') || id.includes('next-themes')) return 'vendor-react'; + } + } + } + }, server: { port: 1234, open: true diff --git a/demo/helm/values.yaml b/demo/helm/values.yaml index 0be6c8ab..8d0ddbe3 100644 --- a/demo/helm/values.yaml +++ b/demo/helm/values.yaml @@ -60,6 +60,12 @@ chatUis: domainPrefix: "chat-safe" annotations: cert-manager.io/cluster-issuer: letsencrypt + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" + nginx.ingress.kubernetes.io/proxy-buffers-number: "8" + nginx.ingress.kubernetes.io/proxy-body-size: "20m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" - name: compromised docker: registry: ghcr.io/outshift-open @@ -73,6 +79,12 @@ chatUis: domainPrefix: "chat-compromised" annotations: cert-manager.io/cluster-issuer: letsencrypt + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" + nginx.ingress.kubernetes.io/proxy-buffers-number: "8" + nginx.ingress.kubernetes.io/proxy-body-size: "20m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" llmCredentials: apiBaseUrl: "" diff --git a/deployments/helm/casa-runtime/templates/ui-explorer/configmap.yaml b/deployments/helm/casa-runtime/templates/ui-explorer/configmap.yaml index 8bd5b9b0..9a054dfc 100644 --- a/deployments/helm/casa-runtime/templates/ui-explorer/configmap.yaml +++ b/deployments/helm/casa-runtime/templates/ui-explorer/configmap.yaml @@ -51,6 +51,7 @@ data: location /api/ { proxy_pass {{ include "casa-runtime.authServiceUrl" . }}/; proxy_http_version 1.1; + proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; diff --git a/deployments/helm/casa-runtime/values.yaml b/deployments/helm/casa-runtime/values.yaml index c6ddf975..17a39b97 100644 --- a/deployments/helm/casa-runtime/values.yaml +++ b/deployments/helm/casa-runtime/values.yaml @@ -38,7 +38,12 @@ authService: className: "" apiDomainName: "" domainPrefix: "auth" - annotations: {} + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/proxy-buffering: "off" + nginx.ingress.kubernetes.io/proxy-buffer-size: "128k" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" env: # When empty, defaults to the in-cluster auth-service URL via _helpers.tpl authServerUrl: "" @@ -99,7 +104,13 @@ uiExplorer: className: "" apiDomainName: "" domainPrefix: "casa" - annotations: {} + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" + nginx.ingress.kubernetes.io/proxy-buffers-number: "8" + nginx.ingress.kubernetes.io/proxy-body-size: "20m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "300" + nginx.ingress.kubernetes.io/proxy-send-timeout: "300" nginx: # When true, nginx proxies /api/ → auth-service (port 8000). # Build the UI image with VITE_API_BASE_URL=/api when this is enabled. diff --git a/scripts/dev/local-setup-standalone.sh b/scripts/dev/local-setup-standalone.sh index 17621e5d..00844567 100755 --- a/scripts/dev/local-setup-standalone.sh +++ b/scripts/dev/local-setup-standalone.sh @@ -111,7 +111,9 @@ log "Step 4 — Build control plane images" docker build -f deployments/docker/Dockerfile -t casa-auth-server:local . docker build -f deployments/docker/Dockerfile.keycloak -t casa-auth-server-keycloak:local deployments/docker docker build -f deployments/docker/Dockerfile.operator -t casa-operator:local . -docker build --no-cache -f deployments/docker/Dockerfile.ui -t casa-auth-server-ui:local . +docker build --no-cache -f deployments/docker/Dockerfile.ui \ + --build-arg VITE_API_BASE_URL=http://api.casa.outshift.ai \ + -t casa-auth-server-ui:local . docker build -f deployments/docker/Dockerfile.extauth -t ext-auth-service:local . log "Step 4 — Build demo images" @@ -164,7 +166,11 @@ helm upgrade --install casa-dev \ --set uiExplorer.ingress.className=nginx \ --set uiExplorer.ingress.apiDomainName=casa.outshift.ai \ --set uiExplorer.ingress.domainPrefix=explorer \ - --set-string 'uiExplorer.ingress.annotations.nginx\.ingress\.kubernetes\.io/ssl-redirect=false' \ + --set uiExplorer.nginx.apiProxyEnabled=false \ + --set authService.ingress.enabled=true \ + --set authService.ingress.className=nginx \ + --set authService.ingress.apiDomainName=casa.outshift.ai \ + --set authService.ingress.domainPrefix=api \ --set keycloak.image.repository=casa-auth-server-keycloak \ --set keycloak.image.tag=local \ --set keycloak.image.pullPolicy=Never \ @@ -233,7 +239,6 @@ helm upgrade --install casa-demo \ --set 'chatUis[0].ingress.className=nginx' \ --set 'chatUis[0].ingress.apiDomainName=casa.outshift.ai' \ --set 'chatUis[0].ingress.domainPrefix=chat-safe' \ - --set-string 'chatUis[0].ingress.annotations.nginx\.ingress\.kubernetes\.io/ssl-redirect=false' \ --set 'chatUis[1].name=compromised' \ --set 'chatUis[1].docker.registry=' \ --set 'chatUis[1].docker.image=demo-chat-ui' \ @@ -243,7 +248,6 @@ helm upgrade --install casa-demo \ --set 'chatUis[1].ingress.className=nginx' \ --set 'chatUis[1].ingress.apiDomainName=casa.outshift.ai' \ --set 'chatUis[1].ingress.domainPrefix=chat-compromised' \ - --set-string 'chatUis[1].ingress.annotations.nginx\.ingress\.kubernetes\.io/ssl-redirect=false' \ --set "llmCredentials.apiBaseUrl=${CASA_LLM_API_BASE_URL}" \ --set "llmCredentials.apiKey=${CASA_LLM_API_KEY}" \ --set 'masSafe.name=CASA Demo Safe' \ @@ -297,7 +301,7 @@ kubectl port-forward -n "$NAMESPACE" svc/jaeger 16686:16686 & sudo -n kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 80:80 & log "Step 8 — Updating /etc/hosts for ingress hostnames" -HOSTS_LINE="127.0.0.1 explorer.casa.outshift.ai chat-safe.casa.outshift.ai chat-compromised.casa.outshift.ai" +HOSTS_LINE="127.0.0.1 explorer.casa.outshift.ai api.casa.outshift.ai chat-safe.casa.outshift.ai chat-compromised.casa.outshift.ai" if grep -q "casa.outshift.ai" /etc/hosts; then sudo sed -i '' '/casa\.outshift\.ai/d' /etc/hosts fi @@ -311,7 +315,8 @@ echo " Keycloak → http://localhost:8080" echo " Jaeger traces → http://localhost:16686" echo "" echo "UIs available via nginx ingress:" -echo " Explorer UI → http://explorer.casa.outshift.ai" +echo " Explorer UI → http://explorer.casa.outshift.ai" +echo " Auth API → http://api.casa.outshift.ai" echo " Safe chat UI → http://chat-safe.casa.outshift.ai" echo " Compromised UI → http://chat-compromised.casa.outshift.ai" echo "" diff --git a/src/casa_auth_server/telemetry/tracer_repository.py b/src/casa_auth_server/telemetry/tracer_repository.py index 59246345..cced7709 100644 --- a/src/casa_auth_server/telemetry/tracer_repository.py +++ b/src/casa_auth_server/telemetry/tracer_repository.py @@ -21,7 +21,7 @@ from uuid import UUID, uuid4 from pydantic import BaseModel, ConfigDict -from sqlalchemy import DateTime, Integer, String, case, literal, union_all +from sqlalchemy import DateTime, Index, Integer, String, case, literal, text, union_all from sqlalchemy import cast as sa_cast from sqlmodel import JSON, Column, Field, Session, SQLModel, asc, desc, func, select @@ -49,6 +49,12 @@ class Trace(SQLModel, table=True): # type: ignore[call-arg] event_type: str event: dict[str, Any] = Field(sa_column=Column(JSON)) + __table_args__ = ( + Index("ix_trace_event_mas_id", text("(event->>'mas_id')")), + Index("ix_trace_created_at", "created_at"), + Index("ix_trace_event_type", "event_type"), + ) + class TraceList(BaseModel): """Paginated list of events.""" From e6318f77781c3da9868a2110fbf6ce4938f09f29 Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 15:28:02 +0100 Subject: [PATCH 4/6] fix: ingress ui's Signed-off-by: Rafael Silva (rafaelsi) --- scripts/dev/local-setup-standalone.sh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scripts/dev/local-setup-standalone.sh b/scripts/dev/local-setup-standalone.sh index 00844567..7a997585 100755 --- a/scripts/dev/local-setup-standalone.sh +++ b/scripts/dev/local-setup-standalone.sh @@ -261,6 +261,18 @@ helm upgrade --install casa-demo \ --set 'masCompromised.enabledToolChecks[2]=AI_POWERED_TOOL_MATCH' \ --set "masCompromised.llm_host=${CASA_LLM_HOST}" +log "Step 6 — Patching chat-ui ingress annotations" +kubectl annotate ingress \ + casa-demo-chat-ui-safe \ + casa-demo-chat-ui-compromised \ + -n "$NAMESPACE" \ + "nginx.ingress.kubernetes.io/ssl-redirect=false" \ + "nginx.ingress.kubernetes.io/proxy-buffering=off" \ + "nginx.ingress.kubernetes.io/proxy-buffer-size=128k" \ + "nginx.ingress.kubernetes.io/proxy-read-timeout=300" \ + "nginx.ingress.kubernetes.io/proxy-send-timeout=300" \ + --overwrite + # --------------------------------------------------------------------------- # 7. Verify # --------------------------------------------------------------------------- From 22908b3d70b2dea04753f94884f426ba01b91d1b Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 15:39:13 +0100 Subject: [PATCH 5/6] fix: update sh script --- demo/helm/values.yaml | 12 ----------- deployments/helm/casa-runtime/values.yaml | 18 ++++------------ scripts/dev/local-setup-standalone.sh | 25 +++++++++++++++++++++-- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/demo/helm/values.yaml b/demo/helm/values.yaml index 8d0ddbe3..0be6c8ab 100644 --- a/demo/helm/values.yaml +++ b/demo/helm/values.yaml @@ -60,12 +60,6 @@ chatUis: domainPrefix: "chat-safe" annotations: cert-manager.io/cluster-issuer: letsencrypt - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" - nginx.ingress.kubernetes.io/proxy-buffers-number: "8" - nginx.ingress.kubernetes.io/proxy-body-size: "20m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" - name: compromised docker: registry: ghcr.io/outshift-open @@ -79,12 +73,6 @@ chatUis: domainPrefix: "chat-compromised" annotations: cert-manager.io/cluster-issuer: letsencrypt - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" - nginx.ingress.kubernetes.io/proxy-buffers-number: "8" - nginx.ingress.kubernetes.io/proxy-body-size: "20m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" llmCredentials: apiBaseUrl: "" diff --git a/deployments/helm/casa-runtime/values.yaml b/deployments/helm/casa-runtime/values.yaml index 17a39b97..c549f8a0 100644 --- a/deployments/helm/casa-runtime/values.yaml +++ b/deployments/helm/casa-runtime/values.yaml @@ -38,12 +38,7 @@ authService: className: "" apiDomainName: "" domainPrefix: "auth" - annotations: - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/proxy-buffering: "off" - nginx.ingress.kubernetes.io/proxy-buffer-size: "128k" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + annotations: {} env: # When empty, defaults to the in-cluster auth-service URL via _helpers.tpl authServerUrl: "" @@ -104,17 +99,12 @@ uiExplorer: className: "" apiDomainName: "" domainPrefix: "casa" - annotations: - nginx.ingress.kubernetes.io/ssl-redirect: "false" - nginx.ingress.kubernetes.io/proxy-buffer-size: "256k" - nginx.ingress.kubernetes.io/proxy-buffers-number: "8" - nginx.ingress.kubernetes.io/proxy-body-size: "20m" - nginx.ingress.kubernetes.io/proxy-read-timeout: "300" - nginx.ingress.kubernetes.io/proxy-send-timeout: "300" + annotations: {} nginx: # When true, nginx proxies /api/ → auth-service (port 8000). # Build the UI image with VITE_API_BASE_URL=/api when this is enabled. - # When false, the UI image must be built with the full auth-service URL. + # When false (minikube), build with VITE_API_BASE_URL=http://api. and + # enable authService.ingress so the browser calls the auth-service directly. apiProxyEnabled: true # ─── PostgreSQL (auth-service backend) ─────────────────────────────────────── diff --git a/scripts/dev/local-setup-standalone.sh b/scripts/dev/local-setup-standalone.sh index 7a997585..c8fe3b9c 100755 --- a/scripts/dev/local-setup-standalone.sh +++ b/scripts/dev/local-setup-standalone.sh @@ -261,7 +261,28 @@ helm upgrade --install casa-demo \ --set 'masCompromised.enabledToolChecks[2]=AI_POWERED_TOOL_MATCH' \ --set "masCompromised.llm_host=${CASA_LLM_HOST}" -log "Step 6 — Patching chat-ui ingress annotations" +log "Step 6 — Patching ingress annotations (minikube-specific)" +kubectl annotate ingress \ + casa-dev-ui-explorer \ + -n "$NAMESPACE" \ + "nginx.ingress.kubernetes.io/ssl-redirect=false" \ + "nginx.ingress.kubernetes.io/proxy-buffer-size=256k" \ + "nginx.ingress.kubernetes.io/proxy-buffers-number=8" \ + "nginx.ingress.kubernetes.io/proxy-body-size=20m" \ + "nginx.ingress.kubernetes.io/proxy-read-timeout=300" \ + "nginx.ingress.kubernetes.io/proxy-send-timeout=300" \ + --overwrite + +kubectl annotate ingress \ + casa-dev-auth-service \ + -n "$NAMESPACE" \ + "nginx.ingress.kubernetes.io/ssl-redirect=false" \ + "nginx.ingress.kubernetes.io/proxy-buffering=off" \ + "nginx.ingress.kubernetes.io/proxy-buffer-size=128k" \ + "nginx.ingress.kubernetes.io/proxy-read-timeout=300" \ + "nginx.ingress.kubernetes.io/proxy-send-timeout=300" \ + --overwrite + kubectl annotate ingress \ casa-demo-chat-ui-safe \ casa-demo-chat-ui-compromised \ @@ -309,7 +330,7 @@ kubectl port-forward -n "$NAMESPACE" svc/casa-dev-postgres-auth 5432:5432 & kubectl port-forward -n "$NAMESPACE" svc/casa-dev-keycloak 8080:8080 & kubectl port-forward -n "$NAMESPACE" svc/jaeger 16686:16686 & -# nginx ingress controller — exposes all 3 UIs on port 80 (requires sudo on macOS) +# nginx ingress controller — exposes all UIs on port 80 (requires sudo on macOS) sudo -n kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 80:80 & log "Step 8 — Updating /etc/hosts for ingress hostnames" From 49033ed7a11c855e69a88c4c83d2a0066b820aa0 Mon Sep 17 00:00:00 2001 From: "Rafael Silva (rafaelsi)" Date: Thu, 21 May 2026 15:57:13 +0100 Subject: [PATCH 6/6] fix: step --- scripts/dev/local-setup-standalone.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/dev/local-setup-standalone.sh b/scripts/dev/local-setup-standalone.sh index c8fe3b9c..004ca335 100755 --- a/scripts/dev/local-setup-standalone.sh +++ b/scripts/dev/local-setup-standalone.sh @@ -261,7 +261,7 @@ helm upgrade --install casa-demo \ --set 'masCompromised.enabledToolChecks[2]=AI_POWERED_TOOL_MATCH' \ --set "masCompromised.llm_host=${CASA_LLM_HOST}" -log "Step 6 — Patching ingress annotations (minikube-specific)" +log "Step 6b. — Patching ingress annotations (minikube-specific)" kubectl annotate ingress \ casa-dev-ui-explorer \ -n "$NAMESPACE" \