agentmemory-python / plugin /scripts /auto_session_start.py
Yash030's picture
Fix auto_session_start: proper parsing of sessions list and upsert logic
2217e00
#!/usr/bin/env python3
"""
Auto-session start script - uses MCP tools to create/start session.
If session exists, it updates; if not, it creates new.
"""
import os
import sys
import json
import urllib.request
import uuid
from datetime import datetime, timezone
# Configuration from environment
AGENTMEMORY_URL = os.environ.get('AGENTMEMORY_URL', 'http://localhost:3111')
AGENTMEMORY_SECRET = os.environ.get('AGENTMEMORY_SECRET')
AGENTMEMORY_PROJECT = os.environ.get('AGENTMEMORY_PROJECT', os.path.basename(os.getcwd()))
AGENTMEMORY_CWD = os.environ.get('AGENTMEMORY_CWD', os.getcwd())
AGENTMEMORY_SESSION_ID = os.environ.get('AGENTMEMORY_SESSION_ID')
AGENTMEMORY_AGENT_ID = os.environ.get('AGENTMEMORY_AGENT_ID', 'claude-code')
def get_mcp_url():
"""Get MCP tools endpoint URL."""
base = AGENTMEMORY_URL.rstrip('/')
if not base.endswith('/agentmemory'):
base = f"{base}/agentmemory"
return f"{base}/mcp/tools"
def get_rest_url():
"""Get REST API base URL."""
base = AGENTMEMORY_URL.rstrip('/')
if not base.endswith('/agentmemory'):
base = f"{base}/agentmemory"
return base
def headers():
"""Build request headers."""
h = {"Content-Type": "application/json"}
if AGENTMEMORY_SECRET:
h["Authorization"] = f"Bearer {AGENTMEMORY_SECRET}"
return h
def call_mcp_tool(tool_name, arguments):
"""Call MCP tool and return response."""
payload = {"name": tool_name, "arguments": arguments}
req = urllib.request.Request(
get_mcp_url(),
data=json.dumps(payload).encode('utf-8'),
headers=headers(),
method="POST"
)
try:
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read().decode('utf-8'))
except Exception as e:
return {"error": str(e)}
def call_rest_api(path, method="GET", data=None):
"""Call REST API and return response."""
url = f"{get_rest_url()}/{path}"
req = urllib.request.Request(
url,
data=json.dumps(data).encode('utf-8') if data else None,
headers=headers(),
method=method
)
try:
with urllib.request.urlopen(req, timeout=10) as resp:
return json.loads(resp.read().decode('utf-8'))
except Exception as e:
return {"error": str(e)}
def start_session(session_id, project, cwd, agent_id=None):
"""Start or update session via MCP tools."""
# Get sessions list
sessions_result = call_mcp_tool("memory_sessions_list", {})
sessions = []
# Parse response: {"content": [{"text": "{\"sessions\": [...]}" }]}
try:
content_text = sessions_result.get('content', [{}])[0].get('text', '[]')
sessions_data = json.loads(content_text)
sessions = sessions_data.get('sessions', []) if isinstance(sessions_data, dict) else []
except Exception as e:
print(f"[auto_session_start] Error parsing sessions: {e}", file=sys.stderr)
sessions = []
# Check if session exists
existing_session = None
for s in sessions:
if s.get('id') == session_id:
existing_session = s
break
if existing_session:
# Session exists - update it by logging an observation
obs_result = call_mcp_tool("agent_observe", {
"sessionId": session_id,
"project": project,
"cwd": cwd,
"text": f"Session reactivated at {datetime.now(timezone.utc).isoformat()}Z",
"type": "thought",
"title": "Session Reactivated"
})
return {
"action": "updated",
"sessionId": session_id,
"message": "Session updated - reactivated via observation",
"observation": obs_result
}
else:
# Session doesn't exist - create via REST API
url = f"{get_rest_url()}/session/start"
payload = {
"sessionId": session_id,
"project": project,
"cwd": cwd,
"agentId": agent_id,
"title": f"Session started at {datetime.now(timezone.utc).isoformat()}Z"
}
req = urllib.request.Request(
url,
data=json.dumps(payload).encode('utf-8'),
headers=headers(),
method="POST"
)
try:
with urllib.request.urlopen(req, timeout=10) as resp:
result = json.loads(resp.read().decode('utf-8'))
return {
"action": "created",
"sessionId": session_id,
"result": result
}
except Exception as e:
return {
"action": "failed",
"sessionId": session_id,
"error": str(e)
}
def main():
# Get or generate session ID
session_id = AGENTMEMORY_SESSION_ID or f"claude-{uuid.uuid4().hex[:12]}"
result = start_session(
session_id=session_id,
project=AGENTMEMORY_PROJECT,
cwd=AGENTMEMORY_CWD,
agent_id=AGENTMEMORY_AGENT_ID
)
print(json.dumps({
"session_id": session_id,
"project": AGENTMEMORY_PROJECT,
"cwd": AGENTMEMORY_CWD,
"result": result
}))
if __name__ == "__main__":
main()