Pretor/frontend
朝夕 3a96f287c7
[Feature] Add frontend authentication page and 401 error interceptor (#21)
* feat: add frontend authentication page and 401 interceptor

Adds a new AuthPage component for user login and registration, integrates it into App.tsx to protect routes, and sets up an Axios interceptor to handle 401 Unauthorized responses by clearing local storage and reloading. Also fixes a missing logger attribute in WorkflowEngine for backend tests.

Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>

* fix: gracefully handle closed websockets

Updates the websocket endpoints in `pretor/api/cluster.py` and `pretor/api/workflow.py` to catch `RuntimeError` alongside `WebSocketDisconnect`. This prevents the application from crashing and spamming error logs when the frontend client unexpectedly closes the connection and the underlying TCP transport is closed.

Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>

* feat: add worker form and update global settings

Adds a new form in the Worker Individual Settings page to create custom worker individuals via the `/api/v1/agent/worker` endpoint. Also updates the System Settings page to remove the obsolete "Max Concurrent Workflows" setting and makes the system language and theme toggles functional by persisting to local storage and updating the document root class.

Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>
2026-04-24 18:22:39 +08:00
..
public [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
src [Feature] Add frontend authentication page and 401 error interceptor (#21) 2026-04-24 18:22:39 +08:00
.gitignore [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
README.md [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
eslint.config.js [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
index.html [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
package-lock.json [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
package.json [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
tsconfig.app.json [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
tsconfig.json [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
tsconfig.node.json [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00
vite.config.ts [feature integration] frontend dashboard and API endpoints (#19) 2026-04-24 09:12:12 +08:00

README.md

React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

React Compiler

The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see this documentation.

Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

export default defineConfig([
  globalIgnores(['dist']),
  {
    files: ['**/*.{ts,tsx}'],
    extends: [
      // Other configs...

      // Remove tseslint.configs.recommended and replace with this
      tseslint.configs.recommendedTypeChecked,
      // Alternatively, use this for stricter rules
      tseslint.configs.strictTypeChecked,
      // Optionally, add this for stylistic rules
      tseslint.configs.stylisticTypeChecked,

      // Other configs...
    ],
    languageOptions: {
      parserOptions: {
        project: ['./tsconfig.node.json', './tsconfig.app.json'],
        tsconfigRootDir: import.meta.dirname,
      },
      // other options...
    },
  },
])

You can also install eslint-plugin-react-x and eslint-plugin-react-dom for React-specific lint rules:

// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default defineConfig([
  globalIgnores(['dist']),
  {
    files: ['**/*.{ts,tsx}'],
    extends: [
      // Other configs...
      // Enable lint rules for React
      reactX.configs['recommended-typescript'],
      // Enable lint rules for React DOM
      reactDom.configs.recommended,
    ],
    languageOptions: {
      parserOptions: {
        project: ['./tsconfig.node.json', './tsconfig.app.json'],
        tsconfigRootDir: import.meta.dirname,
      },
      // other options...
    },
  },
])