WIP: refactor(hermes): rename chat and triage public hostnames #28

Closed
hermes-automation wants to merge 1 commits from feature/hermes-domain-rename-chat-triage into main
24 changed files with 122 additions and 122 deletions

View File

@ -1526,7 +1526,7 @@ function replaceOnce(source, before, after, label) {
it to the shared Hermes bot from your Telegram account.
</p>
<a
href="https://chat.hermes.bstein.dev/telegram"
href="https://hermes.bstein.dev/telegram"
className="mt-4 inline-flex rounded border border-current/30 px-4 py-2 text-sm font-medium text-midground hover:bg-midground/10"
>
Open Telegram setup

View File

@ -65,7 +65,7 @@ def _fetch_public(url: str) -> tuple[str, str, str]:
"""Fetch one public URL with redirect, size, MIME, and policy checks."""
current = url
headers = {
"User-Agent": "HermesPrivateChat/1.0 (+https://chat.hermes.bstein.dev)",
"User-Agent": "HermesPrivateChat/1.0 (+https://hermes.bstein.dev)",
"Accept": "text/html, text/plain;q=0.9, application/xhtml+xml;q=0.8",
}
with httpx.Client(follow_redirects=False, timeout=15.0, headers=headers) as client:

View File

@ -1,4 +1,4 @@
// Natural turn-taking for chat.hermes.bstein.dev using the private Jetsons.
// Natural turn-taking for hermes.bstein.dev using the private Jetsons.
(function(){
'use strict';

View File

@ -18,10 +18,10 @@ data:
192.168.22.9 call.live.bstein.dev
192.168.22.9 cd.bstein.dev
192.168.22.9 chat.ai.bstein.dev
192.168.22.9 chat.hermes.bstein.dev
192.168.22.9 ci.bstein.dev
192.168.22.9 cloud.bstein.dev
192.168.22.9 health.bstein.dev
192.168.22.9 hermes.bstein.dev
192.168.22.9 kit.live.bstein.dev
192.168.22.9 live.bstein.dev
192.168.22.9 logs.bstein.dev
@ -45,7 +45,7 @@ data:
192.168.22.9 stream.bstein.dev
192.168.22.9 wolf.bstein.dev
192.168.22.9 tasks.bstein.dev
192.168.22.9 triage.hermes.bstein.dev
192.168.22.9 triage.bstein.dev
192.168.22.9 vault.bstein.dev
fallthrough
}

View File

@ -4403,26 +4403,6 @@
"source": "bstein-dev-home"
}
},
{
"host": "chat.hermes.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",
"service": "oauth2-proxy-hermes-chat",
"port": "http",
"workloads": [
{
"kind": "Deployment",
"name": "oauth2-proxy-hermes-chat"
}
]
},
"via": {
"kind": "Ingress",
"name": "hermes-sites",
"source": "hermes"
}
},
{
"host": "ci.bstein.dev",
"path": "/",
@ -4483,6 +4463,26 @@
"source": "health"
}
},
{
"host": "hermes.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",
"service": "oauth2-proxy-hermes-chat",
"port": "http",
"workloads": [
{
"kind": "Deployment",
"name": "oauth2-proxy-hermes-chat"
}
]
},
"via": {
"kind": "Ingress",
"name": "hermes-sites",
"source": "hermes"
}
},
{
"host": "kit.live.bstein.dev",
"path": "/livekit/jwt",
@ -5164,7 +5164,7 @@
}
},
{
"host": "triage.hermes.bstein.dev",
"host": "triage.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",

View File

@ -2888,19 +2888,6 @@ http_endpoints:
kind: Ingress
name: bstein-dev-home
source: bstein-dev-home
- host: chat.hermes.bstein.dev
path: /
backend:
namespace: hermes
service: oauth2-proxy-hermes-chat
port: http
workloads:
- kind: Deployment
name: oauth2-proxy-hermes-chat
via:
kind: Ingress
name: hermes-sites
source: hermes
- host: ci.bstein.dev
path: /
backend:
@ -2940,6 +2927,19 @@ http_endpoints:
kind: Ingress
name: wger
source: health
- host: hermes.bstein.dev
path: /
backend:
namespace: hermes
service: oauth2-proxy-hermes-chat
port: http
workloads:
- kind: Deployment
name: oauth2-proxy-hermes-chat
via:
kind: Ingress
name: hermes-sites
source: hermes
- host: kit.live.bstein.dev
path: /livekit/jwt
backend:
@ -3361,7 +3361,7 @@ http_endpoints:
kind: Ingress
name: planka
source: planka
- host: triage.hermes.bstein.dev
- host: triage.bstein.dev
path: /
backend:
namespace: hermes

View File

@ -51,11 +51,6 @@ flowchart LR
host_chat_ai_bstein_dev --> svc_bstein_dev_home_chat_ai_gateway
wl_bstein_dev_home_chat_ai_gateway["bstein-dev-home/chat-ai-gateway (Deployment)"]
svc_bstein_dev_home_chat_ai_gateway --> wl_bstein_dev_home_chat_ai_gateway
host_chat_hermes_bstein_dev["chat.hermes.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Service)"]
host_chat_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_chat
wl_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Deployment)"]
svc_hermes_oauth2_proxy_hermes_chat --> wl_hermes_oauth2_proxy_hermes_chat
host_ci_bstein_dev["ci.bstein.dev"]
svc_jenkins_jenkins["jenkins/jenkins (Service)"]
host_ci_bstein_dev --> svc_jenkins_jenkins
@ -71,6 +66,11 @@ flowchart LR
host_health_bstein_dev --> svc_health_wger
wl_health_wger["health/wger (Deployment)"]
svc_health_wger --> wl_health_wger
host_hermes_bstein_dev["hermes.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Service)"]
host_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_chat
wl_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Deployment)"]
svc_hermes_oauth2_proxy_hermes_chat --> wl_hermes_oauth2_proxy_hermes_chat
host_kit_live_bstein_dev["kit.live.bstein.dev"]
svc_comms_livekit_token_service["comms/livekit-token-service (Service)"]
host_kit_live_bstein_dev --> svc_comms_livekit_token_service
@ -170,9 +170,9 @@ flowchart LR
host_tasks_bstein_dev --> svc_planka_planka
wl_planka_planka["planka/planka (Deployment)"]
svc_planka_planka --> wl_planka_planka
host_triage_hermes_bstein_dev["triage.hermes.bstein.dev"]
host_triage_bstein_dev["triage.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_triage["hermes/oauth2-proxy-hermes-triage (Service)"]
host_triage_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_triage
host_triage_bstein_dev --> svc_hermes_oauth2_proxy_hermes_triage
wl_hermes_oauth2_proxy_hermes_triage["hermes/oauth2-proxy-hermes-triage (Deployment)"]
svc_hermes_oauth2_proxy_hermes_triage --> wl_hermes_oauth2_proxy_hermes_triage
host_vault_bstein_dev["vault.bstein.dev"]

View File

@ -4403,26 +4403,6 @@
"source": "bstein-dev-home"
}
},
{
"host": "chat.hermes.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",
"service": "oauth2-proxy-hermes-chat",
"port": "http",
"workloads": [
{
"kind": "Deployment",
"name": "oauth2-proxy-hermes-chat"
}
]
},
"via": {
"kind": "Ingress",
"name": "hermes-sites",
"source": "hermes"
}
},
{
"host": "ci.bstein.dev",
"path": "/",
@ -4483,6 +4463,26 @@
"source": "health"
}
},
{
"host": "hermes.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",
"service": "oauth2-proxy-hermes-chat",
"port": "http",
"workloads": [
{
"kind": "Deployment",
"name": "oauth2-proxy-hermes-chat"
}
]
},
"via": {
"kind": "Ingress",
"name": "hermes-sites",
"source": "hermes"
}
},
{
"host": "kit.live.bstein.dev",
"path": "/livekit/jwt",
@ -5164,7 +5164,7 @@
}
},
{
"host": "triage.hermes.bstein.dev",
"host": "triage.bstein.dev",
"path": "/",
"backend": {
"namespace": "hermes",

View File

@ -2888,19 +2888,6 @@ http_endpoints:
kind: Ingress
name: bstein-dev-home
source: bstein-dev-home
- host: chat.hermes.bstein.dev
path: /
backend:
namespace: hermes
service: oauth2-proxy-hermes-chat
port: http
workloads:
- kind: Deployment
name: oauth2-proxy-hermes-chat
via:
kind: Ingress
name: hermes-sites
source: hermes
- host: ci.bstein.dev
path: /
backend:
@ -2940,6 +2927,19 @@ http_endpoints:
kind: Ingress
name: wger
source: health
- host: hermes.bstein.dev
path: /
backend:
namespace: hermes
service: oauth2-proxy-hermes-chat
port: http
workloads:
- kind: Deployment
name: oauth2-proxy-hermes-chat
via:
kind: Ingress
name: hermes-sites
source: hermes
- host: kit.live.bstein.dev
path: /livekit/jwt
backend:
@ -3361,7 +3361,7 @@ http_endpoints:
kind: Ingress
name: planka
source: planka
- host: triage.hermes.bstein.dev
- host: triage.bstein.dev
path: /
backend:
namespace: hermes

View File

@ -51,11 +51,6 @@ flowchart LR
host_chat_ai_bstein_dev --> svc_bstein_dev_home_chat_ai_gateway
wl_bstein_dev_home_chat_ai_gateway["bstein-dev-home/chat-ai-gateway (Deployment)"]
svc_bstein_dev_home_chat_ai_gateway --> wl_bstein_dev_home_chat_ai_gateway
host_chat_hermes_bstein_dev["chat.hermes.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Service)"]
host_chat_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_chat
wl_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Deployment)"]
svc_hermes_oauth2_proxy_hermes_chat --> wl_hermes_oauth2_proxy_hermes_chat
host_ci_bstein_dev["ci.bstein.dev"]
svc_jenkins_jenkins["jenkins/jenkins (Service)"]
host_ci_bstein_dev --> svc_jenkins_jenkins
@ -71,6 +66,11 @@ flowchart LR
host_health_bstein_dev --> svc_health_wger
wl_health_wger["health/wger (Deployment)"]
svc_health_wger --> wl_health_wger
host_hermes_bstein_dev["hermes.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Service)"]
host_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_chat
wl_hermes_oauth2_proxy_hermes_chat["hermes/oauth2-proxy-hermes-chat (Deployment)"]
svc_hermes_oauth2_proxy_hermes_chat --> wl_hermes_oauth2_proxy_hermes_chat
host_kit_live_bstein_dev["kit.live.bstein.dev"]
svc_comms_livekit_token_service["comms/livekit-token-service (Service)"]
host_kit_live_bstein_dev --> svc_comms_livekit_token_service
@ -170,9 +170,9 @@ flowchart LR
host_tasks_bstein_dev --> svc_planka_planka
wl_planka_planka["planka/planka (Deployment)"]
svc_planka_planka --> wl_planka_planka
host_triage_hermes_bstein_dev["triage.hermes.bstein.dev"]
host_triage_bstein_dev["triage.bstein.dev"]
svc_hermes_oauth2_proxy_hermes_triage["hermes/oauth2-proxy-hermes-triage (Service)"]
host_triage_hermes_bstein_dev --> svc_hermes_oauth2_proxy_hermes_triage
host_triage_bstein_dev --> svc_hermes_oauth2_proxy_hermes_triage
wl_hermes_oauth2_proxy_hermes_triage["hermes/oauth2-proxy-hermes-triage (Deployment)"]
svc_hermes_oauth2_proxy_hermes_triage --> wl_hermes_oauth2_proxy_hermes_triage
host_vault_bstein_dev["vault.bstein.dev"]

View File

@ -1,9 +1,9 @@
# Hermes on Atlas: operator guide
This is the mental model and demonstration script for the operator instance at
`triage.hermes.bstein.dev`. Read it once, then prove each section in the live UI. The
consumer instance at `chat.hermes.bstein.dev` is intentionally separate and is not the
place to perform infrastructure triage.
`triage.bstein.dev`. Read it once, then prove each section in the live UI. The
consumer instance at `hermes.bstein.dev` is intentionally separate and is not
the place to perform infrastructure triage.
`agent.hermes.bstein.dev` is the owner-only engineering control plane. Its root
serves the stock Hermes dashboard, including embedded chat/TUI and the native
@ -14,7 +14,7 @@ its conversation-first layout is a better fit.
## Consumer chat and Telegram
`chat.hermes.bstein.dev` uses the pinned Hermes WebUI rather than the operator
`hermes.bstein.dev` uses the pinned Hermes WebUI rather than the operator
dashboard. Keycloak still authenticates every browser request, and the tenant
router permanently assigns each Keycloak subject to one Hermes process and one
PVC. The four slots are an isolation pool, not a provider round robin: every

View File

@ -11,5 +11,5 @@ spec:
name: letsencrypt
dnsNames:
- agent.hermes.bstein.dev
- chat.hermes.bstein.dev
- triage.hermes.bstein.dev
- hermes.bstein.dev
- triage.bstein.dev

View File

@ -320,7 +320,7 @@ data:
cannot read Secrets, exec or attach to pods, create service-account tokens,
mutate workloads or RBAC, or reconcile Flux. Put every durable cluster
change on a reviewed titan-iac branch. Never expose credentials in chat or
logs. Triage belongs at triage.hermes.bstein.dev.
logs. Triage belongs at triage.bstein.dev.
## Atlas engineering access

View File

@ -88,11 +88,11 @@ spec:
tls:
- hosts:
- agent.hermes.bstein.dev
- chat.hermes.bstein.dev
- triage.hermes.bstein.dev
- hermes.bstein.dev
- triage.bstein.dev
secretName: hermes-sites-tls
rules:
- host: chat.hermes.bstein.dev
- host: hermes.bstein.dev
http:
paths:
- path: /
@ -102,7 +102,7 @@ spec:
name: oauth2-proxy-hermes-chat
port:
name: http
- host: triage.hermes.bstein.dev
- host: triage.bstein.dev
http:
paths:
- path: /

View File

@ -68,7 +68,7 @@ data:
atlas/manual/claude/opus: {provider: atlas-switchyard, model: atlas/manual/claude/opus}
atlas/manual/local/qwen-14b: {provider: atlas-switchyard, model: atlas/manual/local/qwen-14b}
dashboard:
public_url: https://chat.hermes.bstein.dev
public_url: https://hermes.bstein.dev
display:
compact: true
tool_progress: all

View File

@ -277,7 +277,7 @@ spec:
- {name: API_SERVER_ENABLED, value: "true"}
- {name: API_SERVER_HOST, value: 0.0.0.0}
- {name: API_SERVER_PORT, value: "8642"}
- {name: API_SERVER_CORS_ORIGINS, value: https://chat.hermes.bstein.dev}
- {name: API_SERVER_CORS_ORIGINS, value: https://hermes.bstein.dev}
- {name: HERMES_IMAGE_BROKER_URL, value: http://hermes-image-broker.hermes.svc.cluster.local:9002}
- {name: HERMES_IMAGE_BROKER_KEY_FILE, value: /runtime-access/chat-relay-key}
- {name: HERMES_AUTO_ROUTER_PROFILE, value: chat}
@ -345,7 +345,7 @@ spec:
# NetworkPolicy admits this port only from hermes-chat-router; the
# CIDR lets the WebUI validate that router's changing pod address.
- {name: HERMES_WEBUI_TRUSTED_PROXY_CIDRS, value: 10.42.0.0/16}
- {name: HERMES_WEBUI_ALLOWED_ORIGINS, value: https://chat.hermes.bstein.dev}
- {name: HERMES_WEBUI_ALLOWED_ORIGINS, value: https://hermes.bstein.dev}
- {name: HERMES_WEBUI_TRUST_FORWARDED_HOST, value: "1"}
- {name: HERMES_WEBUI_TRUST_FORWARDED_PROTO, value: "1"}
- {name: HERMES_ROUTER_PROFILE, value: chat}

View File

@ -83,7 +83,7 @@ data:
- "*kubectl describe secret*"
dashboard:
public_url: https://triage.hermes.bstein.dev
public_url: https://triage.bstein.dev
display:
compact: true
@ -111,10 +111,10 @@ data:
You are Hermes running inside the Titan Kubernetes cluster as a supervised
testing and operations triage assistant.
This is the dedicated triage appliance at triage.hermes.bstein.dev. Keep
automated Ariadne intake and testing conversations here. Project delivery
and coding orchestration belong to agent.hermes.bstein.dev; general user
chat belongs to chat.hermes.bstein.dev.
This is the dedicated triage appliance at triage.bstein.dev. Keep automated
Ariadne intake and testing conversations here. Project delivery and coding
orchestration belong to agent.hermes.bstein.dev; general user chat belongs
to hermes.bstein.dev.
Start in AUTO routing with a careful, intelligence-biased posture. Every
new request is classified locally before a hosted model is selected. The

View File

@ -284,7 +284,7 @@ spec:
- name: HERMES_DASHBOARD
value: "0"
- name: HERMES_DASHBOARD_PUBLIC_URL
value: https://triage.hermes.bstein.dev
value: https://triage.bstein.dev
- name: API_SERVER_ENABLED
value: "true"
- name: API_SERVER_HOST
@ -292,7 +292,7 @@ spec:
- name: API_SERVER_PORT
value: "8642"
- name: API_SERVER_CORS_ORIGINS
value: https://triage.hermes.bstein.dev
value: https://triage.bstein.dev
- name: VICTORIA_METRICS_URL
value: http://victoria-metrics-single-server.monitoring.svc.cluster.local:8428
- name: ARIADNE_BASE_URL
@ -405,7 +405,7 @@ spec:
- {name: HERMES_WEBUI_GATEWAY_USE_RUNS_API, value: "true"}
- {name: HERMES_WEBUI_SKIP_ONBOARDING, value: "1"}
- {name: HERMES_WEBUI_SECURE, value: "1"}
- {name: HERMES_WEBUI_ALLOWED_ORIGINS, value: https://triage.hermes.bstein.dev}
- {name: HERMES_WEBUI_ALLOWED_ORIGINS, value: https://triage.bstein.dev}
- {name: HERMES_WEBUI_TRUST_FORWARDED_HOST, value: "1"}
- {name: HERMES_WEBUI_TRUST_FORWARDED_PROTO, value: "1"}
- {name: HERMES_ROUTER_PROFILE, value: triage}

View File

@ -82,7 +82,7 @@ spec:
args:
- --provider=oidc
- --config=/vault/secrets/oidc-config
- --redirect-url=https://triage.hermes.bstein.dev/oauth2/callback
- --redirect-url=https://triage.bstein.dev/oauth2/callback
- --oidc-issuer-url=https://sso.bstein.dev/realms/atlas
- --user-id-claim=sub
- --code-challenge-method=S256
@ -181,7 +181,7 @@ spec:
args:
- --provider=oidc
- --config=/vault/secrets/oidc-config
- --redirect-url=https://chat.hermes.bstein.dev/oauth2/callback
- --redirect-url=https://hermes.bstein.dev/oauth2/callback
- --oidc-issuer-url=https://sso.bstein.dev/realms/atlas
- --user-id-claim=sub
- --code-challenge-method=S256

View File

@ -249,7 +249,7 @@ func (bot *telegramBot) handleUpdate(update telegramUpdate) {
command, args := commandParts(message.Text)
if command == "start" || command == "link" {
if len(args) == 0 {
_ = bot.sendText(message.Chat.ID, "Sign in to chat.hermes.bstein.dev, open Telegram, and create a one-time link code.")
_ = bot.sendText(message.Chat.ID, "Sign in to hermes.bstein.dev, open Telegram, and create a one-time link code.")
return
}
if _, err := bot.router.consumeLink(userID, args[0]); err != nil {
@ -273,7 +273,7 @@ func (bot *telegramBot) handleUpdate(update telegramUpdate) {
}
slot, linked := bot.router.telegramSlot(userID)
if !linked {
_ = bot.sendText(message.Chat.ID, "This Telegram account is not linked. Sign in to chat.hermes.bstein.dev and open Telegram to connect it.")
_ = bot.sendText(message.Chat.ID, "This Telegram account is not linked. Sign in to hermes.bstein.dev and open Telegram to connect it.")
return
}
if command == "topic" {

View File

@ -7,9 +7,9 @@ asserting health, placement, ownership, or current model availability.
| Surface | Purpose | Identity boundary | State and permissions |
| --- | --- | --- | --- |
| `triage.hermes.bstein.dev` | Brad's automated testing triage | Keycloak plus an outer oauth2-proxy exact-email allow-list for `brad@bstein.dev` | `hermes` namespace, its own PVC and service account; read-only cluster triage plus approved internal evidence endpoints |
| `triage.bstein.dev` | Brad's automated testing triage | Keycloak plus an outer oauth2-proxy exact-email allow-list for `brad@bstein.dev` | `hermes` namespace, its own PVC and service account; read-only cluster triage plus approved internal evidence endpoints |
| `agent.hermes.bstein.dev` | Brad's project coordinator | Keycloak plus an outer oauth2-proxy exact-email allow-list for `brad@bstein.dev` | `hermes` namespace and separate PVC; native Hermes delegates bounded work while Herdr preserves real Codex and Claude Code CLI sessions when needed |
| `chat.hermes.bstein.dev` | Private consumer chat and research through Hermes WebUI or a linked Telegram DM | Keycloak login plus one-time Telegram account link | One Hermes process and PVC per assigned Keycloak subject; no Kubernetes RBAC, terminal, or private-service access |
| `hermes.bstein.dev` | Private consumer chat and research through Hermes WebUI or a linked Telegram DM | Keycloak login plus one-time Telegram account link | One Hermes process and PVC per assigned Keycloak subject; no Kubernetes RBAC, terminal, or private-service access |
The instances do not share conversation state, credentials, profiles, skills
created on their PVCs, or Kubernetes identities. They share only the inference

View File

@ -327,8 +327,8 @@ ensure_telegram_config() {
}
ensure_hermes_owner
ensure_proxy_client "hermes-chat-proxy" "https://chat.hermes.bstein.dev" "hermes/chat-oidc"
ensure_proxy_client "hermes-chat-proxy" "https://hermes.bstein.dev" "hermes/chat-oidc"
ensure_proxy_client "hermes-agent-proxy" "https://agent.hermes.bstein.dev" "hermes/agent-oidc"
ensure_proxy_client "hermes-triage-proxy" "https://triage.hermes.bstein.dev" "hermes/triage-oidc"
ensure_proxy_client "hermes-triage-proxy" "https://triage.bstein.dev" "hermes/triage-oidc"
ensure_service_account_client "hermes-automation" "hermes/developer-keycloak"
ensure_telegram_config

View File

@ -555,7 +555,7 @@ spec:
# open the run that wrote it rather than taking "Proposed by
# Hermes" on trust.
- name: ARIADNE_HERMES_UI_URL
value: https://triage.hermes.bstein.dev
value: https://triage.bstein.dev
- name: ARIADNE_HERMES_SONAR_ENABLED
value: "true"
- name: ARIADNE_HERMES_SONAR_URL

View File

@ -27,8 +27,8 @@ data:
https://money.bstein.dev
https://health.bstein.dev
https://agent.hermes.bstein.dev
https://chat.hermes.bstein.dev
https://triage.hermes.bstein.dev
https://hermes.bstein.dev
https://triage.bstein.dev
https://cassandra.bstein.dev
https://veles.bstein.dev
https://matrix.live.bstein.dev