Signing you back in…
+The previous one-time login callback was already used. Hermes is starting a fresh sign-in automatically.
+ Continue now + {{else}} +{{.StatusCode}} {{.Title}}
+ {{if .Message}}{{.Message}}
{{end}} + Sign in again + {{end}} +diff --git a/services/hermes/agent-configmap.yaml b/services/hermes/agent-configmap.yaml index f4752a3ab..ee41489af 100644 --- a/services/hermes/agent-configmap.yaml +++ b/services/hermes/agent-configmap.yaml @@ -37,20 +37,28 @@ data: platform_toolsets: cli: + - browser - clarify + - delegation - file + - memory - session_search - skills - terminal - todo + - vision - web api_server: + - browser - clarify + - delegation - file + - memory - session_search - skills - terminal - todo + - vision - web gateway: @@ -145,6 +153,11 @@ data: risk analysis, and independent review. Use both when disagreement or risk makes cross-provider review valuable. Never exceed xhigh effort. + Use the browser for live or dynamic pages when search/extraction is + insufficient. Use terminal and file tools for direct engineering work; use + Herdr workers when an objective benefits from persistent Codex or Claude + Code execution, parallel review, or cross-provider fallback. + Local Jetson inference is the first provider-independent fallback. Use it for bounded classification, summaries, and continuity when hosted capacity is constrained. Do not silently treat a local fallback as equivalent to a diff --git a/services/hermes/agent-deployment.yaml b/services/hermes/agent-deployment.yaml index aee3b2c03..f4122d488 100644 --- a/services/hermes/agent-deployment.yaml +++ b/services/hermes/agent-deployment.yaml @@ -24,7 +24,7 @@ spec: ai.bstein.dev/execution: Herdr-supervised Codex and Claude Code ai.bstein.dev/model-policy: Jetson-assisted AUTO routing, low through xhigh, cross-provider fallback ai.bstein.dev/placement: rpi5 preferred; Jetson deferred until state storage is available - ai.bstein.dev/config-rev: "20260809-agent-tool-budget" + ai.bstein.dev/config-rev: "20260809-browser-delegation-tools" vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: hermes-agent vault.hashicorp.com/agent-inject-secret-anthropic-token: kv/data/atlas/hermes/agent-tokens diff --git a/services/hermes/chat-configmap.yaml b/services/hermes/chat-configmap.yaml index f8a310ec9..57fe1da21 100644 --- a/services/hermes/chat-configmap.yaml +++ b/services/hermes/chat-configmap.yaml @@ -39,8 +39,8 @@ data: enabled: true ttl_hours: 1 platform_toolsets: - cli: [clarify, delegation, file, memory, python_sandbox, session_search, skills, todo, web] - api_server: [clarify, delegation, file, memory, python_sandbox, session_search, skills, todo, web] + cli: [browser, clarify, delegation, file, memory, python_sandbox, session_search, skills, todo, vision, web] + api_server: [browser, clarify, delegation, file, memory, python_sandbox, session_search, skills, todo, vision, web] dashboard: public_url: https://chat.hermes.bstein.dev display: @@ -63,7 +63,9 @@ data: You are a high-quality private AI chat assistant. Help the current person with questions, writing, research, planning, and learning. Be direct, thoughtful, and careful. Use public web research when freshness matters, - extract the most relevant primary pages, and cite the sources used. + extract the most relevant primary pages, and cite the sources used. If a + search result or static extractor cannot retrieve a dynamic page, continue + with the isolated browser instead of giving up or asking the user to check. Complete complex work instead of stopping after a preflight. For involved research or analysis, make a short internal plan, delegate independent @@ -71,6 +73,9 @@ data: statistics/probability/simulation, check the result, and synthesize one coherent answer. State assumptions and uncertainty where exact inputs are unavailable. Never tell the user to enable a tool that is already present. + Save requested deliverables under `/opt/data/workspace`, verify them by + reading them back, and give the relative path. The user can preview and + download those outputs from the Files shortcut in the WebUI. This is a personal sandbox. You may read and write files only in this user's private workspace and may use this user's private memory, skills, @@ -85,7 +90,7 @@ data: This runtime belongs to one authenticated Keycloak identity and one private persistent volume. Provide conversational help with the private workspace, memory, skills, profiles, task list, session search, public web tools, and - the separate per-tenant Python sandbox. Use delegation selectively for + the separate per-tenant browser and Python sandbox. Use delegation selectively for independent research or verification, then present a single final answer. Do not claim access to Kubernetes, Vault, Gitea, Brad's projects, other users, the agent coordinator, or automated triage. diff --git a/services/hermes/chat-router.yaml b/services/hermes/chat-router.yaml index de63b23f5..909f2f294 100644 --- a/services/hermes/chat-router.yaml +++ b/services/hermes/chat-router.yaml @@ -20,7 +20,7 @@ spec: app: hermes-chat-router annotations: ai.bstein.dev/role: privacy-preserving-chat-tenant-router - ai.bstein.dev/config-rev: "20260809-private-workspace-files" + ai.bstein.dev/config-rev: "20260809-private-file-browser" vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/agent-pre-populate-only: "true" vault.hashicorp.com/agent-init-first: "true" @@ -62,7 +62,7 @@ spec: values: [rpi5] containers: - name: router - image: registry.bstein.dev/bstein/hermes-chat-router@sha256:165dd52fd1ff6da9f857517e9394d0c61a888311a88ba4be0aaea89315073d90 + image: registry.bstein.dev/bstein/hermes-chat-router@sha256:882f9c3af7268618a19424765536f4cf6c37e8d380e515780baf4104e5b2931e imagePullPolicy: IfNotPresent ports: - {name: http, containerPort: 8080, protocol: TCP} diff --git a/services/hermes/chat-statefulset.yaml b/services/hermes/chat-statefulset.yaml index 778ebf6eb..03d039756 100644 --- a/services/hermes/chat-statefulset.yaml +++ b/services/hermes/chat-statefulset.yaml @@ -28,7 +28,7 @@ spec: ai.bstein.dev/role: isolated-user-chat ai.bstein.dev/isolation: one Hermes process and PVC per Keycloak subject ai.bstein.dev/model-policy: uniform automatic policy with per-user overrides - ai.bstein.dev/config-rev: "20260809-tool-loop-budgets" + ai.bstein.dev/config-rev: "20260809-browser-files-auth-refresh" vault.hashicorp.com/agent-inject: "true" vault.hashicorp.com/role: hermes-chat vault.hashicorp.com/agent-inject-secret-anthropic-token: kv/data/atlas/hermes/agent-tokens @@ -180,7 +180,7 @@ spec: - {name: api, containerPort: 8642, protocol: TCP} env: - {name: HERMES_HOME, value: /opt/data} - - {name: HERMES_AUTH_FILE, value: /opt/data/auth.json} + - {name: HERMES_AUTH_FILE, value: /shared-auth/auth.json} - {name: HOME, value: /opt/data/home} - {name: TERMINAL_CWD, value: /opt/data/workspace} - {name: HERMES_WRITE_SAFE_ROOT, value: /opt/data/workspace} @@ -192,7 +192,7 @@ spec: - {name: API_SERVER_CORS_ORIGINS, value: https://chat.hermes.bstein.dev} volumeMounts: - {name: home, mountPath: /opt/data} - - {name: provider-auth, mountPath: /opt/data/auth.json, subPath: auth.json, readOnly: true} + - {name: provider-auth, mountPath: /shared-auth, readOnly: true} - {name: auth-patch, mountPath: /opt/hermes/hermes_cli/auth.py, subPath: auth.py} readinessProbe: tcpSocket: {port: api} @@ -228,7 +228,7 @@ spec: - {name: webui, containerPort: 8787, protocol: TCP} env: - {name: HERMES_HOME, value: /opt/data} - - {name: HERMES_AUTH_FILE, value: /opt/data/auth.json} + - {name: HERMES_AUTH_FILE, value: /shared-auth/auth.json} - {name: HOME, value: /opt/data/home} - {name: HERMES_WEBUI_AGENT_DIR, value: /opt/hermes} - {name: HERMES_WEBUI_HOST, value: 0.0.0.0} @@ -245,7 +245,7 @@ spec: - {name: HERMES_WEBUI_TRUST_FORWARDED_PROTO, value: "1"} volumeMounts: - {name: home, mountPath: /opt/data} - - {name: provider-auth, mountPath: /opt/data/auth.json, subPath: auth.json, readOnly: true} + - {name: provider-auth, mountPath: /shared-auth, readOnly: true} - {name: tmp, mountPath: /tmp} readinessProbe: httpGet: {path: /health, port: webui} diff --git a/services/hermes/oauth2-proxy.yaml b/services/hermes/oauth2-proxy.yaml index 252fae0ef..668a4a196 100644 --- a/services/hermes/oauth2-proxy.yaml +++ b/services/hermes/oauth2-proxy.yaml @@ -9,6 +9,43 @@ data: brad@bstein.dev --- apiVersion: v1 +kind: ConfigMap +metadata: + name: hermes-chat-oauth-templates + namespace: hermes +data: + error.html: | + {{define "error.html"}} + + +
+ + +The previous one-time login callback was already used. Hermes is starting a fresh sign-in automatically.
+ Continue now + {{else}} +{{.Message}}
{{end}} + Sign in again + {{end}} +Codes expire after 10 minutes. Only direct messages are accepted; group messages are ignored.