feat: Agent Chat API backend - profiles, send, history
- GET /api/agents - list known profiles with online/offline status
- POST /api/agents/{profile}/send - send message via Hermes CLI subprocess
- GET /api/agents/{profile}/history - retrieve conversation history
- SQLite conversation store at ~/.hermes/kanban/boards/hermes-command-center/conversations.db
- Response cleanup to strip Hermes CLI wrapper formatting
- Auth-gated via existing Basic Auth middleware
This commit is contained in:
@@ -143,6 +143,42 @@ def _get_conversation_history(profile: str, limit: int = 50) -> list[dict]:
|
|||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
def _clean_agent_response(text: str) -> str:
|
||||||
|
"""Extract just the agent's reply from Hermes CLI wrapper output."""
|
||||||
|
lines = text.splitlines()
|
||||||
|
result_lines = []
|
||||||
|
in_box = False
|
||||||
|
for line in lines:
|
||||||
|
stripped = line.strip()
|
||||||
|
if stripped.startswith("Query:") or stripped.startswith("Initializing"):
|
||||||
|
continue
|
||||||
|
if stripped.startswith("╭─"):
|
||||||
|
in_box = True
|
||||||
|
continue
|
||||||
|
if stripped.startswith("╰─"):
|
||||||
|
in_box = False
|
||||||
|
continue
|
||||||
|
if in_box:
|
||||||
|
result_lines.append(stripped)
|
||||||
|
if stripped.startswith("Resume this session") \
|
||||||
|
or stripped.startswith("Session:") \
|
||||||
|
or stripped.startswith("Duration:") \
|
||||||
|
or stripped.startswith("Messages:"):
|
||||||
|
break
|
||||||
|
cleaned = "\n".join(result_lines).strip()
|
||||||
|
if cleaned:
|
||||||
|
return cleaned
|
||||||
|
if "╰─" in text:
|
||||||
|
parts = text.split("╰─")
|
||||||
|
before = parts[0]
|
||||||
|
if "╭─" in before:
|
||||||
|
for line in before.split("╭─", 1)[1].splitlines():
|
||||||
|
s = line.strip()
|
||||||
|
if s:
|
||||||
|
return s
|
||||||
|
return ""
|
||||||
|
|
||||||
|
|
||||||
_init_conversations_db()
|
_init_conversations_db()
|
||||||
|
|
||||||
app = FastAPI(title="Hermes Command Center")
|
app = FastAPI(title="Hermes Command Center")
|
||||||
@@ -729,6 +765,11 @@ async def agent_send(profile: str, request: Request):
|
|||||||
if not response_text:
|
if not response_text:
|
||||||
response_text = "(no response)"
|
response_text = "(no response)"
|
||||||
|
|
||||||
|
# Clean up CLI wrapper text — extract the actual agent response
|
||||||
|
cleaned = _clean_agent_response(response_text)
|
||||||
|
if cleaned:
|
||||||
|
response_text = cleaned
|
||||||
|
|
||||||
# Save agent response
|
# Save agent response
|
||||||
_save_message(profile, "agent", response_text)
|
_save_message(profile, "agent", response_text)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user