import os, json, urllib.request, http.cookiejar
base = 'https://hermes-workspace.agentsolutions-mallorca.com'
password = os.environ.get('HERMES_PASSWORD') or os.environ.get('CLAUDE_PASSWORD')
if not password:
raise SystemExit('PASSWORD_MISSING')
jar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(jar))
def req(path, method='GET', payload=None):
data = None if payload is None else json.dumps(payload).encode()
r = urllib.request.Request(base + path, data=data, method=method)
if data is not None:
r.add_header('Content-Type', 'application/json')
try:
with opener.open(r, timeout=15) as x:
return x.status, x.read(4096)
except urllib.error.HTTPError as x:
return x.code, x.read(4096)
unauth_status, _ = req('/api/terminal-stream', 'POST', {'cwd':'~/.hermes','cols':80,'rows':24})
login_status, _ = req('/api/auth', 'POST', {'password': password})
check_status, check_body = req('/api/auth-check')
auth = False
try:
auth = bool(json.loads(check_body).get('authenticated'))
except Exception:
pass
tr = urllib.request.Request(base + '/api/terminal-stream', data=json.dumps({'cwd':'~/.hermes','cols':80,'rows':24}).encode(), method='POST')
tr.add_header('Content-Type', 'application/json')
try:
with opener.open(tr, timeout=15) as x:
terminal_status = x.status
terminal_body = x.read(1024)
except urllib.error.HTTPError as x:
terminal_status = x.code
terminal_body = x.read(1024)
except TimeoutError:
terminal_status = 'TIMEOUT_BEFORE_HEADERS'
terminal_body = b''
session_id = None
for line in terminal_body.splitlines():
if b'"sessionId"' in line:
try: session_id = json.loads(line.decode()).get('sessionId')
except Exception: pass
if session_id:
req('/api/terminal-close', 'POST', {'sessionId': session_id})
print(f'unauth_terminal={unauth_status} login={login_status} auth_check={check_status} authenticated={auth} terminal={terminal_status} session_closed={bool(session_id)}')