diff --git a/README.md b/README.md index 65e5e82..26a728c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -# Chat Web App (`chat_web_app`) +# Hesychia (`chat_web_app`) -Frontend for [chat.aimloperations.com](https://chat.aimloperations.com) — a React + -TypeScript single-page app for the AI ML Operations chat product. +Frontend for **[Hesychia](https://hesychia.ai)** — a React + TypeScript single-page +app for a calm AI assistant experience (quiet, rest, stillness). + +Public product domain: **hesychia.ai** (replacing `chat.aimloperations.com`). Companion backend: [chat_backend](https://git.aimloperations.com/ai_ml_operations/chat_backend) @@ -10,13 +12,29 @@ document root; the shared **web-static** nginx container from [server-infra](https://git.aimloperations.com/ai_ml_operations/server-infra) serves those assets. Same pattern as `dta_webapp`. +Android Capacitor shell (display name **Hesychia**) lands via the Capacitor wrap +PR; branding strings there use Hesychia once that tree is on `master`. + +## Domain migration + +| Role | Current (still live) | Target | +|------|----------------------|--------| +| Web UI | `chat.aimloperations.com` | `hesychia.ai` | +| REST / WS API | `chatbackend.aimloperations.com` | TBD under hesychia.ai (infra cutover) | +| Deploy webroot | `/var/www/{env}.chat.aimloperations/html` | Keep until `server-infra` renames | + +Committed `.env.production` / `.env.beta` still point at the **current** +`*.aimloperations.com` API hosts so builds keep working. Flip those URLs (and +deploy webroots / NPM) when DNS and `server-infra` cut over to hesychia.ai. + ## Stack - **React 18**, **TypeScript**, **Create React App** (`react-scripts` 5) - **Material UI (MUI) 5** + Emotion for components and theming -- **React Router 6** for routing -- **Axios** for REST against `chat_backend` +- **React Router 6** for routing (`BrowserRouter` on web; `HashRouter` under Capacitor) +- **Axios** for REST against `chat_backend` (JWT `Authorization` header) - **WebSocket** for live chat (`REACT_APP_BACKEND_WS_API_BASE_URL`) +- **Capacitor 7** for Android (and later iOS) WebView shells - **Jest** + React Testing Library for unit tests ## Repository layout @@ -25,20 +43,21 @@ those assets. Same pattern as `dta_webapp`. chat_web_app/ ├── README.md ├── .gitea/workflows/ # Unit tests + deploy-prod / deploy-beta -└── llm-fe/ # CRA application (npm root) +└── llm-fe/ # CRA npm root (+ Capacitor when Android wrap merges) ├── package.json ├── .env.development # Local dev API/WS URLs ├── .env.beta ├── .env.production ├── public/ └── src/ - ├── axiosApi.js # Axios instances (JWT + CSRF) + ├── axiosApi.js # Axios instances (JWT Authorization) ├── App.tsx ├── index.tsx └── llm-fe/ ├── pages/ # Route-level views ├── components/ # Shared & feature UI ├── contexts/ # Auth, account, WebSocket, theme + ├── platform/ # Capacitor routing / native chrome └── ui-kit/ # MD* design-system wrappers ``` @@ -48,6 +67,7 @@ chat_web_app/ - **npm** (lockfile: `llm-fe/package-lock.json`) - Running [chat_backend](https://git.aimloperations.com/ai_ml_operations/chat_backend) locally for full chat/auth (default in `.env.development`: port **8001**) +- For Android (after Capacitor wrap merges): JDK 17+, Android Studio / SDK ## Local setup @@ -64,12 +84,11 @@ npm ci CRA loads mode-specific env files. Variables must be prefixed with `REACT_APP_` to be visible in the browser bundle. -| File | Used when | Backend | -|------|-----------|---------| +| File | Used when | Backend (current) | +|------|-----------|-------------------| | `.env.development` | `npm start` | `http://127.0.0.1:8001` | | `.env.production` | `npm run build` / `build:prod` | `https://chatbackend.aimloperations.com` | | `.env.beta` | `npm run build:beta` | `https://beta.chatbackend.aimloperations.com` | - Required keys (already set in the committed env files): ```env @@ -116,7 +135,7 @@ Open **http://localhost:3000**. `build:prod` / `build:beta` are intended for deploy hosts (or a machine that can write those `/var/www/...` paths). Paths must match -`server-infra` `app_catalog.chat_web_app.webroot_pattern`: +`server-infra` `app_catalog.chat_web_app.webroot_pattern` until renamed: ```text /var/www/{env}.chat.aimloperations/html @@ -154,7 +173,7 @@ Manual deploy from the control node: --app chat_web_app --env prod --ref ``` -NPM (not managed by Ansible) should balance public chat domains to: +NPM (not managed by Ansible) should balance public Hesychia domains to: - `adama:8082` + `roslin:8082` + `ai-server-4080:8082` (prod) diff --git a/llm-fe/.env.beta b/llm-fe/.env.beta index bfcd820..34f65ba 100644 --- a/llm-fe/.env.beta +++ b/llm-fe/.env.beta @@ -1,2 +1,4 @@ +# Beta API hosts (current). Target public product domain: hesychia.ai +# Flip these to hesychia.ai API hosts when server-infra / DNS cut over. REACT_APP_BACKEND_REST_API_BASE_URL=https://beta.chatbackend.aimloperations.com/api/ REACT_APP_BACKEND_WS_API_BASE_URL=wss://beta.chatbackend.aimloperations.com/ws/chat_again/ diff --git a/llm-fe/.env.production b/llm-fe/.env.production index 0860b66..c206eb4 100644 --- a/llm-fe/.env.production +++ b/llm-fe/.env.production @@ -1,2 +1,4 @@ +# Production API hosts (current). Target public product domain: hesychia.ai +# Flip these to hesychia.ai API hosts when server-infra / DNS cut over. REACT_APP_BACKEND_REST_API_BASE_URL=https://chatbackend.aimloperations.com/api/ -REACT_APP_BACKEND_WS_API_BASE_URL=wss://chatbackend.aimloperations.com/ws/chat_again/ \ No newline at end of file +REACT_APP_BACKEND_WS_API_BASE_URL=wss://chatbackend.aimloperations.com/ws/chat_again/ diff --git a/llm-fe/public/index.html b/llm-fe/public/index.html index da9f015..9dae05b 100644 --- a/llm-fe/public/index.html +++ b/llm-fe/public/index.html @@ -8,7 +8,11 @@ - + + + + + - Chat by AI ML Operations. LCC + Hesychia diff --git a/llm-fe/public/manifest.json b/llm-fe/public/manifest.json index 421d88e..a4c2576 100644 --- a/llm-fe/public/manifest.json +++ b/llm-fe/public/manifest.json @@ -1,6 +1,6 @@ { - "short_name": "Chat by AI ML Operations. LLC", - "name": "Chat by AI ML Operations, LLC", + "short_name": "Hesychia", + "name": "Hesychia", "icons": [ { "src": "favicon.ico", diff --git a/llm-fe/src/llm-fe/components/DashboardWrapperLayout/DashboardWrapperLayout.tsx b/llm-fe/src/llm-fe/components/DashboardWrapperLayout/DashboardWrapperLayout.tsx index b4015c0..2a046a1 100644 --- a/llm-fe/src/llm-fe/components/DashboardWrapperLayout/DashboardWrapperLayout.tsx +++ b/llm-fe/src/llm-fe/components/DashboardWrapperLayout/DashboardWrapperLayout.tsx @@ -115,7 +115,7 @@ const DashboardWrapperLayout = ({ children }: DashboardWrapperLayoutProps): JSX. { it('renders copyright and developer credit', () => { render(