Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b5d3154d20 | ||
|
|
34d27f4f10 | ||
|
|
08b79961a2 |
@@ -1,9 +1,7 @@
|
|||||||
# Hesychia (`chat_web_app`)
|
# Chat Web App (`chat_web_app`)
|
||||||
|
|
||||||
Frontend for **[Hesychia](https://hesychia.ai)** — a React + TypeScript single-page
|
Frontend for [chat.aimloperations.com](https://chat.aimloperations.com) — a React +
|
||||||
app for a calm AI assistant experience (quiet, rest, stillness).
|
TypeScript single-page app for the AI ML Operations chat product.
|
||||||
|
|
||||||
Public product domain: **hesychia.ai** (replacing `chat.aimloperations.com`).
|
|
||||||
|
|
||||||
Companion backend: [chat_backend](https://git.aimloperations.com/ai_ml_operations/chat_backend)
|
Companion backend: [chat_backend](https://git.aimloperations.com/ai_ml_operations/chat_backend)
|
||||||
|
|
||||||
@@ -12,20 +10,7 @@ document root; the shared **web-static** nginx container from
|
|||||||
[server-infra](https://git.aimloperations.com/ai_ml_operations/server-infra) serves
|
[server-infra](https://git.aimloperations.com/ai_ml_operations/server-infra) serves
|
||||||
those assets. Same pattern as `dta_webapp`.
|
those assets. Same pattern as `dta_webapp`.
|
||||||
|
|
||||||
Android ships the same CRA `build/` via **Capacitor** (display name **Hesychia**;
|
Android ships the same CRA `build/` via **Capacitor** (see `llm-fe/ANDROID.md`).
|
||||||
see `llm-fe/ANDROID.md`).
|
|
||||||
|
|
||||||
## 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
|
## Stack
|
||||||
|
|
||||||
@@ -89,8 +74,8 @@ npm ci
|
|||||||
CRA loads mode-specific env files. Variables must be prefixed with `REACT_APP_`
|
CRA loads mode-specific env files. Variables must be prefixed with `REACT_APP_`
|
||||||
to be visible in the browser bundle.
|
to be visible in the browser bundle.
|
||||||
|
|
||||||
| File | Used when | Backend (current) |
|
| File | Used when | Backend |
|
||||||
|------|-----------|-------------------|
|
|------|-----------|---------|
|
||||||
| `.env.development` | `npm start` | `http://127.0.0.1:8001` |
|
| `.env.development` | `npm start` | `http://127.0.0.1:8001` |
|
||||||
| `.env.production` | `npm run build` / `build:prod` | `https://chatbackend.aimloperations.com` |
|
| `.env.production` | `npm run build` / `build:prod` | `https://chatbackend.aimloperations.com` |
|
||||||
| `.env.beta` | `npm run build:beta` | `https://beta.chatbackend.aimloperations.com` |
|
| `.env.beta` | `npm run build:beta` | `https://beta.chatbackend.aimloperations.com` |
|
||||||
@@ -156,7 +141,7 @@ Full signing / Play Store notes: [`llm-fe/ANDROID.md`](llm-fe/ANDROID.md).
|
|||||||
|
|
||||||
`build:prod` / `build:beta` are intended for deploy hosts (or a machine that can
|
`build:prod` / `build:beta` are intended for deploy hosts (or a machine that can
|
||||||
write those `/var/www/...` paths). Paths must match
|
write those `/var/www/...` paths). Paths must match
|
||||||
`server-infra` `app_catalog.chat_web_app.webroot_pattern` until renamed:
|
`server-infra` `app_catalog.chat_web_app.webroot_pattern`:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
/var/www/{env}.chat.aimloperations/html
|
/var/www/{env}.chat.aimloperations/html
|
||||||
@@ -194,7 +179,7 @@ Manual deploy from the control node:
|
|||||||
--app chat_web_app --env prod --ref <sha>
|
--app chat_web_app --env prod --ref <sha>
|
||||||
```
|
```
|
||||||
|
|
||||||
NPM (not managed by Ansible) should balance public Hesychia domains to:
|
NPM (not managed by Ansible) should balance public chat domains to:
|
||||||
|
|
||||||
- `adama:8082` + `roslin:8082` + `ai-server-4080:8082` (prod)
|
- `adama:8082` + `roslin:8082` + `ai-server-4080:8082` (prod)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,2 @@
|
|||||||
# 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_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/
|
REACT_APP_BACKEND_WS_API_BASE_URL=wss://beta.chatbackend.aimloperations.com/ws/chat_again/
|
||||||
|
|||||||
@@ -1,4 +1,2 @@
|
|||||||
# 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_REST_API_BASE_URL=https://chatbackend.aimloperations.com/api/
|
||||||
REACT_APP_BACKEND_WS_API_BASE_URL=wss://chatbackend.aimloperations.com/ws/chat_again/
|
REACT_APP_BACKEND_WS_API_BASE_URL=wss://chatbackend.aimloperations.com/ws/chat_again/
|
||||||
@@ -8,11 +8,7 @@
|
|||||||
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png" />
|
<link rel="icon" type="image/png" sizes="16x16" href="%PUBLIC_URL%/favicon-16x16.png" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta name="description" content="Hesychia — a calm AI assistant by AI ML Operations, LLC" />
|
<meta name="description" content="Chat app by AI ML Operations, LLC" />
|
||||||
<meta name="application-name" content="Hesychia" />
|
|
||||||
<meta property="og:title" content="Hesychia" />
|
|
||||||
<meta property="og:description" content="Hesychia — quiet, focused AI chat at hesychia.ai" />
|
|
||||||
<meta property="og:url" content="https://hesychia.ai" />
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png" />
|
<link rel="apple-touch-icon" sizes="180x180" href="%PUBLIC_URL%/apple-touch-icon.png" />
|
||||||
<!--
|
<!--
|
||||||
manifest.json provides metadata used when your web app is installed on a
|
manifest.json provides metadata used when your web app is installed on a
|
||||||
@@ -28,7 +24,7 @@
|
|||||||
work correctly both with client-side routing and a non-root public URL.
|
work correctly both with client-side routing and a non-root public URL.
|
||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
Learn how to configure a non-root public URL by running `npm run build`.
|
||||||
-->
|
-->
|
||||||
<title>Hesychia</title>
|
<title>Chat by AI ML Operations. LCC</title>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"short_name": "Hesychia",
|
"short_name": "Chat by AI ML Operations. LLC",
|
||||||
"name": "Hesychia",
|
"name": "Chat by AI ML Operations, LLC",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "favicon.ico",
|
"src": "favicon.ico",
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ const DashboardWrapperLayout = ({ children }: DashboardWrapperLayoutProps): JSX.
|
|||||||
<Sidenav
|
<Sidenav
|
||||||
color={sidenavColor}
|
color={sidenavColor}
|
||||||
brand={(transparentSidenav && !darkMode) || whiteSidenav ? brandDark : brandWhite}
|
brand={(transparentSidenav && !darkMode) || whiteSidenav ? brandDark : brandWhite}
|
||||||
brandName="Hesychia"
|
brandName="Chat by AI ML, Operations, LLC"
|
||||||
routes={[]} // {routes}
|
routes={[]} // {routes}
|
||||||
onMouseEnter={handleOnMouseEnter}
|
onMouseEnter={handleOnMouseEnter}
|
||||||
onMouseLeave={handleOnMouseLeave}
|
onMouseLeave={handleOnMouseLeave}
|
||||||
@@ -136,7 +136,7 @@ const DashboardWrapperLayout = ({ children }: DashboardWrapperLayoutProps): JSX.
|
|||||||
<Sidenav
|
<Sidenav
|
||||||
color={sidenavColor}
|
color={sidenavColor}
|
||||||
brand={(transparentSidenav && !darkMode) || whiteSidenav ? brandDark : brandWhite}
|
brand={(transparentSidenav && !darkMode) || whiteSidenav ? brandDark : brandWhite}
|
||||||
brandName="Hesychia"
|
brandName="AI ML, Operations, LLC"
|
||||||
routes={[]} // {routes}
|
routes={[]} // {routes}
|
||||||
onMouseEnter={handleOnMouseEnter}
|
onMouseEnter={handleOnMouseEnter}
|
||||||
onMouseLeave={handleOnMouseLeave}
|
onMouseLeave={handleOnMouseLeave}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ describe('Footer', () => {
|
|||||||
it('renders copyright and developer credit', () => {
|
it('renders copyright and developer credit', () => {
|
||||||
render(<Footer />);
|
render(<Footer />);
|
||||||
|
|
||||||
expect(screen.getByText(/© 2026 Hesychia/i)).toBeInTheDocument();
|
expect(screen.getByText(/© 2025 Chat/i)).toBeInTheDocument();
|
||||||
expect(screen.getByRole('link', { name: /AI ML Operations, LLC/i })).toHaveAttribute(
|
expect(screen.getByRole('link', { name: /AI ML Operations, LLC/i })).toHaveAttribute(
|
||||||
'href',
|
'href',
|
||||||
'https://www.aimloperations.com'
|
'www.aimloperations.com'
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ const Footer = (): JSX.Element => {
|
|||||||
return (
|
return (
|
||||||
|
|
||||||
<div className='continer-fluid'>
|
<div className='continer-fluid'>
|
||||||
<MDTypography>© 2026 Hesychia | Developed by <a href='https://www.aimloperations.com'>AI ML Operations, LLC</a></MDTypography>
|
<MDTypography>© 2025 Chat | Developed by <a href='www.aimloperations.com'>AI ML Operations, LLC</a></MDTypography>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ const Header = ({drawerWidth=0, handleDrawerToggle}: HeaderProps): JSX.Element =
|
|||||||
{isLargeScreen ? (
|
{isLargeScreen ? (
|
||||||
<>
|
<>
|
||||||
<Typography variant="h6" style={{ flexGrow: 1 }} className='text-white font-weight-bold'>
|
<Typography variant="h6" style={{ flexGrow: 1 }} className='text-white font-weight-bold'>
|
||||||
Hesychia
|
Chat | AI Ml Operations
|
||||||
</Typography >
|
</Typography >
|
||||||
<Button color="inherit" onClick={handleDashboardClick}>
|
<Button color="inherit" onClick={handleDashboardClick}>
|
||||||
Dashboard</Button>
|
Dashboard</Button>
|
||||||
@@ -81,7 +81,7 @@ const Header = ({drawerWidth=0, handleDrawerToggle}: HeaderProps): JSX.Element =
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<Typography variant="h6" style={{ flexGrow: 1 }} className='text-white font-weight-bold'>
|
<Typography variant="h6" style={{ flexGrow: 1 }} className='text-white font-weight-bold'>
|
||||||
Hesychia
|
Chat
|
||||||
</Typography >
|
</Typography >
|
||||||
<IconButton color="inherit" onClick={handleDashboardClick}>
|
<IconButton color="inherit" onClick={handleDashboardClick}>
|
||||||
<Dashboard />
|
<Dashboard />
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ const Header2 = ({ absolute = false, light = false, isMini = false }: Header2Pro
|
|||||||
return (
|
return (
|
||||||
<HeaderContainer>
|
<HeaderContainer>
|
||||||
<Logo onClick={() => navigate('/')}>
|
<Logo onClick={() => navigate('/')}>
|
||||||
<h4>Hesychia</h4>
|
<h4>Chat</h4>
|
||||||
|
|
||||||
</Logo>
|
</Logo>
|
||||||
|
|
||||||
|
|||||||
@@ -57,8 +57,8 @@ const SamplePage: React.FC = () => {
|
|||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<footer className="footer">
|
<footer className="footer">
|
||||||
<a href="https://hesychia.ai" target="_blank" rel="noopener noreferrer">
|
<a href="https://aimloperations.com" target="_blank" rel="noopener noreferrer">
|
||||||
Visit hesychia.ai
|
Visit AIMLOperations.com
|
||||||
</a>
|
</a>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ const TermsOfService = (): JSX.Element => {
|
|||||||
</CardContent>
|
</CardContent>
|
||||||
<Divider />
|
<Divider />
|
||||||
<MDTypography>
|
<MDTypography>
|
||||||
Welcome to Hesychia (hesychia.ai)! We're excited to have you on board. Before you start using our large language model, supplied by AI ML Operations, LLC, we need you to agree to our Terms of Service.
|
Welcome to chat.aimloperations.com! We're excited to have you on board. Before you start using our large language model, supplied by AI ML Operations, LLC, we need you to agree to our Terms of Service.
|
||||||
</MDTypography>
|
</MDTypography>
|
||||||
<MDTypography variant="h4">
|
<MDTypography variant="h4">
|
||||||
1. Acceptance of Terms
|
1. Acceptance of Terms
|
||||||
|
|||||||
Reference in New Issue
Block a user