Add the Secrets and Alerts screens

Two backends that had no way in: secrets could only be set through the API,
and alerting could only be configured by hand-editing its file. Both are
engine-wide operator settings rather than personal ones, so they get sidebar
entries of their own instead of tabs under the per-user Settings — and the
missing-secret error now names the place the page actually is.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01H7LwYgJfpkbLCTeiAf8U4A
This commit is contained in:
2026-08-16 16:36:41 +02:00
co-authored by Claude Fable 5
parent f239c884b6
commit 45392d31d9
5 changed files with 798 additions and 100 deletions
+141 -99
View File
@@ -9,34 +9,29 @@
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
import { Route as rootRouteImport } from './routes/__root'
import { Route as SignupRouteImport } from './routes/signup'
import { Route as ResetPasswordRouteImport } from './routes/reset-password'
import { Route as RecoverPasswordRouteImport } from './routes/recover-password'
import { Route as LoginRouteImport } from './routes/login'
import { Route as LayoutRouteImport } from './routes/_layout'
import { Route as CanvasRouteImport } from './routes/_canvas'
import { Route as LayoutRouteImport } from './routes/_layout'
import { Route as LoginRouteImport } from './routes/login'
import { Route as RecoverPasswordRouteImport } from './routes/recover-password'
import { Route as ResetPasswordRouteImport } from './routes/reset-password'
import { Route as SignupRouteImport } from './routes/signup'
import { Route as LayoutIndexRouteImport } from './routes/_layout/index'
import { Route as OauthAuthorizeRouteImport } from './routes/oauth.authorize'
import { Route as LayoutSettingsRouteImport } from './routes/_layout/settings'
import { Route as LayoutAdminRouteImport } from './routes/_layout/admin'
import { Route as LayoutDashboardsIndexRouteImport } from './routes/_layout/dashboards/index'
import { Route as LayoutAlertsRouteImport } from './routes/_layout/alerts'
import { Route as LayoutSecretsRouteImport } from './routes/_layout/secrets'
import { Route as LayoutSettingsRouteImport } from './routes/_layout/settings'
import { Route as OauthAuthorizeRouteImport } from './routes/oauth.authorize'
import { Route as CanvasFlowsIndexRouteImport } from './routes/_canvas/flows/index'
import { Route as LayoutDashboardsNameRouteImport } from './routes/_layout/dashboards/$name'
import { Route as CanvasFlowsFlowNameRouteImport } from './routes/_canvas/flows/$flowName'
import { Route as LayoutDashboardsIndexRouteImport } from './routes/_layout/dashboards/index'
import { Route as LayoutDashboardsNameRouteImport } from './routes/_layout/dashboards/$name'
const SignupRoute = SignupRouteImport.update({
id: '/signup',
path: '/signup',
const CanvasRoute = CanvasRouteImport.update({
id: '/_canvas',
getParentRoute: () => rootRouteImport,
} as any)
const ResetPasswordRoute = ResetPasswordRouteImport.update({
id: '/reset-password',
path: '/reset-password',
getParentRoute: () => rootRouteImport,
} as any)
const RecoverPasswordRoute = RecoverPasswordRouteImport.update({
id: '/recover-password',
path: '/recover-password',
const LayoutRoute = LayoutRouteImport.update({
id: '/_layout',
getParentRoute: () => rootRouteImport,
} as any)
const LoginRoute = LoginRouteImport.update({
@@ -44,12 +39,19 @@ const LoginRoute = LoginRouteImport.update({
path: '/login',
getParentRoute: () => rootRouteImport,
} as any)
const LayoutRoute = LayoutRouteImport.update({
id: '/_layout',
const RecoverPasswordRoute = RecoverPasswordRouteImport.update({
id: '/recover-password',
path: '/recover-password',
getParentRoute: () => rootRouteImport,
} as any)
const CanvasRoute = CanvasRouteImport.update({
id: '/_canvas',
const ResetPasswordRoute = ResetPasswordRouteImport.update({
id: '/reset-password',
path: '/reset-password',
getParentRoute: () => rootRouteImport,
} as any)
const SignupRoute = SignupRouteImport.update({
id: '/signup',
path: '/signup',
getParentRoute: () => rootRouteImport,
} as any)
const LayoutIndexRoute = LayoutIndexRouteImport.update({
@@ -57,41 +59,51 @@ const LayoutIndexRoute = LayoutIndexRouteImport.update({
path: '/',
getParentRoute: () => LayoutRoute,
} as any)
const OauthAuthorizeRoute = OauthAuthorizeRouteImport.update({
id: '/oauth/authorize',
path: '/oauth/authorize',
getParentRoute: () => rootRouteImport,
const LayoutAdminRoute = LayoutAdminRouteImport.update({
id: '/admin',
path: '/admin',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutAlertsRoute = LayoutAlertsRouteImport.update({
id: '/alerts',
path: '/alerts',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutSecretsRoute = LayoutSecretsRouteImport.update({
id: '/secrets',
path: '/secrets',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutSettingsRoute = LayoutSettingsRouteImport.update({
id: '/settings',
path: '/settings',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutAdminRoute = LayoutAdminRouteImport.update({
id: '/admin',
path: '/admin',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutDashboardsIndexRoute = LayoutDashboardsIndexRouteImport.update({
id: '/dashboards/',
path: '/dashboards/',
getParentRoute: () => LayoutRoute,
const OauthAuthorizeRoute = OauthAuthorizeRouteImport.update({
id: '/oauth/authorize',
path: '/oauth/authorize',
getParentRoute: () => rootRouteImport,
} as any)
const CanvasFlowsIndexRoute = CanvasFlowsIndexRouteImport.update({
id: '/flows/',
path: '/flows/',
getParentRoute: () => CanvasRoute,
} as any)
const LayoutDashboardsNameRoute = LayoutDashboardsNameRouteImport.update({
id: '/dashboards/$name',
path: '/dashboards/$name',
getParentRoute: () => LayoutRoute,
} as any)
const CanvasFlowsFlowNameRoute = CanvasFlowsFlowNameRouteImport.update({
id: '/flows/$flowName',
path: '/flows/$flowName',
getParentRoute: () => CanvasRoute,
} as any)
const LayoutDashboardsIndexRoute = LayoutDashboardsIndexRouteImport.update({
id: '/dashboards/',
path: '/dashboards/',
getParentRoute: () => LayoutRoute,
} as any)
const LayoutDashboardsNameRoute = LayoutDashboardsNameRouteImport.update({
id: '/dashboards/$name',
path: '/dashboards/$name',
getParentRoute: () => LayoutRoute,
} as any)
export interface FileRoutesByFullPath {
'/': typeof LayoutIndexRoute
@@ -100,6 +112,8 @@ export interface FileRoutesByFullPath {
'/reset-password': typeof ResetPasswordRoute
'/signup': typeof SignupRoute
'/admin': typeof LayoutAdminRoute
'/alerts': typeof LayoutAlertsRoute
'/secrets': typeof LayoutSecretsRoute
'/settings': typeof LayoutSettingsRoute
'/oauth/authorize': typeof OauthAuthorizeRoute
'/flows/$flowName': typeof CanvasFlowsFlowNameRoute
@@ -114,6 +128,8 @@ export interface FileRoutesByTo {
'/reset-password': typeof ResetPasswordRoute
'/signup': typeof SignupRoute
'/admin': typeof LayoutAdminRoute
'/alerts': typeof LayoutAlertsRoute
'/secrets': typeof LayoutSecretsRoute
'/settings': typeof LayoutSettingsRoute
'/oauth/authorize': typeof OauthAuthorizeRoute
'/flows/$flowName': typeof CanvasFlowsFlowNameRoute
@@ -130,6 +146,8 @@ export interface FileRoutesById {
'/reset-password': typeof ResetPasswordRoute
'/signup': typeof SignupRoute
'/_layout/admin': typeof LayoutAdminRoute
'/_layout/alerts': typeof LayoutAlertsRoute
'/_layout/secrets': typeof LayoutSecretsRoute
'/_layout/settings': typeof LayoutSettingsRoute
'/oauth/authorize': typeof OauthAuthorizeRoute
'/_layout/': typeof LayoutIndexRoute
@@ -147,6 +165,8 @@ export interface FileRouteTypes {
| '/reset-password'
| '/signup'
| '/admin'
| '/alerts'
| '/secrets'
| '/settings'
| '/oauth/authorize'
| '/flows/$flowName'
@@ -161,6 +181,8 @@ export interface FileRouteTypes {
| '/reset-password'
| '/signup'
| '/admin'
| '/alerts'
| '/secrets'
| '/settings'
| '/oauth/authorize'
| '/flows/$flowName'
@@ -176,6 +198,8 @@ export interface FileRouteTypes {
| '/reset-password'
| '/signup'
| '/_layout/admin'
| '/_layout/alerts'
| '/_layout/secrets'
| '/_layout/settings'
| '/oauth/authorize'
| '/_layout/'
@@ -197,32 +221,11 @@ export interface RootRouteChildren {
declare module '@tanstack/react-router' {
interface FileRoutesByPath {
'/signup': {
id: '/signup'
path: '/signup'
fullPath: '/signup'
preLoaderRoute: typeof SignupRouteImport
parentRoute: typeof rootRouteImport
}
'/reset-password': {
id: '/reset-password'
path: '/reset-password'
fullPath: '/reset-password'
preLoaderRoute: typeof ResetPasswordRouteImport
parentRoute: typeof rootRouteImport
}
'/recover-password': {
id: '/recover-password'
path: '/recover-password'
fullPath: '/recover-password'
preLoaderRoute: typeof RecoverPasswordRouteImport
parentRoute: typeof rootRouteImport
}
'/login': {
id: '/login'
path: '/login'
fullPath: '/login'
preLoaderRoute: typeof LoginRouteImport
'/_canvas': {
id: '/_canvas'
path: ''
fullPath: '/'
preLoaderRoute: typeof CanvasRouteImport
parentRoute: typeof rootRouteImport
}
'/_layout': {
@@ -232,11 +235,32 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LayoutRouteImport
parentRoute: typeof rootRouteImport
}
'/_canvas': {
id: '/_canvas'
path: ''
fullPath: '/'
preLoaderRoute: typeof CanvasRouteImport
'/login': {
id: '/login'
path: '/login'
fullPath: '/login'
preLoaderRoute: typeof LoginRouteImport
parentRoute: typeof rootRouteImport
}
'/recover-password': {
id: '/recover-password'
path: '/recover-password'
fullPath: '/recover-password'
preLoaderRoute: typeof RecoverPasswordRouteImport
parentRoute: typeof rootRouteImport
}
'/reset-password': {
id: '/reset-password'
path: '/reset-password'
fullPath: '/reset-password'
preLoaderRoute: typeof ResetPasswordRouteImport
parentRoute: typeof rootRouteImport
}
'/signup': {
id: '/signup'
path: '/signup'
fullPath: '/signup'
preLoaderRoute: typeof SignupRouteImport
parentRoute: typeof rootRouteImport
}
'/_layout/': {
@@ -246,12 +270,26 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LayoutIndexRouteImport
parentRoute: typeof LayoutRoute
}
'/oauth/authorize': {
id: '/oauth/authorize'
path: '/oauth/authorize'
fullPath: '/oauth/authorize'
preLoaderRoute: typeof OauthAuthorizeRouteImport
parentRoute: typeof rootRouteImport
'/_layout/admin': {
id: '/_layout/admin'
path: '/admin'
fullPath: '/admin'
preLoaderRoute: typeof LayoutAdminRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/alerts': {
id: '/_layout/alerts'
path: '/alerts'
fullPath: '/alerts'
preLoaderRoute: typeof LayoutAlertsRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/secrets': {
id: '/_layout/secrets'
path: '/secrets'
fullPath: '/secrets'
preLoaderRoute: typeof LayoutSecretsRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/settings': {
id: '/_layout/settings'
@@ -260,19 +298,12 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof LayoutSettingsRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/admin': {
id: '/_layout/admin'
path: '/admin'
fullPath: '/admin'
preLoaderRoute: typeof LayoutAdminRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/dashboards/': {
id: '/_layout/dashboards/'
path: '/dashboards'
fullPath: '/dashboards/'
preLoaderRoute: typeof LayoutDashboardsIndexRouteImport
parentRoute: typeof LayoutRoute
'/oauth/authorize': {
id: '/oauth/authorize'
path: '/oauth/authorize'
fullPath: '/oauth/authorize'
preLoaderRoute: typeof OauthAuthorizeRouteImport
parentRoute: typeof rootRouteImport
}
'/_canvas/flows/': {
id: '/_canvas/flows/'
@@ -281,13 +312,6 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof CanvasFlowsIndexRouteImport
parentRoute: typeof CanvasRoute
}
'/_layout/dashboards/$name': {
id: '/_layout/dashboards/$name'
path: '/dashboards/$name'
fullPath: '/dashboards/$name'
preLoaderRoute: typeof LayoutDashboardsNameRouteImport
parentRoute: typeof LayoutRoute
}
'/_canvas/flows/$flowName': {
id: '/_canvas/flows/$flowName'
path: '/flows/$flowName'
@@ -295,6 +319,20 @@ declare module '@tanstack/react-router' {
preLoaderRoute: typeof CanvasFlowsFlowNameRouteImport
parentRoute: typeof CanvasRoute
}
'/_layout/dashboards/': {
id: '/_layout/dashboards/'
path: '/dashboards'
fullPath: '/dashboards/'
preLoaderRoute: typeof LayoutDashboardsIndexRouteImport
parentRoute: typeof LayoutRoute
}
'/_layout/dashboards/$name': {
id: '/_layout/dashboards/$name'
path: '/dashboards/$name'
fullPath: '/dashboards/$name'
preLoaderRoute: typeof LayoutDashboardsNameRouteImport
parentRoute: typeof LayoutRoute
}
}
}
@@ -313,6 +351,8 @@ const CanvasRouteWithChildren =
interface LayoutRouteChildren {
LayoutAdminRoute: typeof LayoutAdminRoute
LayoutAlertsRoute: typeof LayoutAlertsRoute
LayoutSecretsRoute: typeof LayoutSecretsRoute
LayoutSettingsRoute: typeof LayoutSettingsRoute
LayoutIndexRoute: typeof LayoutIndexRoute
LayoutDashboardsNameRoute: typeof LayoutDashboardsNameRoute
@@ -321,6 +361,8 @@ interface LayoutRouteChildren {
const LayoutRouteChildren: LayoutRouteChildren = {
LayoutAdminRoute: LayoutAdminRoute,
LayoutAlertsRoute: LayoutAlertsRoute,
LayoutSecretsRoute: LayoutSecretsRoute,
LayoutSettingsRoute: LayoutSettingsRoute,
LayoutIndexRoute: LayoutIndexRoute,
LayoutDashboardsNameRoute: LayoutDashboardsNameRoute,