Yash030 commited on
Commit
2217e00
·
1 Parent(s): 354402f

Fix auto_session_start: proper parsing of sessions list and upsert logic

Browse files
Files changed (1) hide show
  1. plugin/scripts/auto_session_start.py +161 -0
plugin/scripts/auto_session_start.py ADDED
@@ -0,0 +1,161 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Auto-session start script - uses MCP tools to create/start session.
4
+ If session exists, it updates; if not, it creates new.
5
+ """
6
+ import os
7
+ import sys
8
+ import json
9
+ import urllib.request
10
+ import uuid
11
+ from datetime import datetime, timezone
12
+
13
+ # Configuration from environment
14
+ AGENTMEMORY_URL = os.environ.get('AGENTMEMORY_URL', 'http://localhost:3111')
15
+ AGENTMEMORY_SECRET = os.environ.get('AGENTMEMORY_SECRET')
16
+ AGENTMEMORY_PROJECT = os.environ.get('AGENTMEMORY_PROJECT', os.path.basename(os.getcwd()))
17
+ AGENTMEMORY_CWD = os.environ.get('AGENTMEMORY_CWD', os.getcwd())
18
+ AGENTMEMORY_SESSION_ID = os.environ.get('AGENTMEMORY_SESSION_ID')
19
+ AGENTMEMORY_AGENT_ID = os.environ.get('AGENTMEMORY_AGENT_ID', 'claude-code')
20
+
21
+ def get_mcp_url():
22
+ """Get MCP tools endpoint URL."""
23
+ base = AGENTMEMORY_URL.rstrip('/')
24
+ if not base.endswith('/agentmemory'):
25
+ base = f"{base}/agentmemory"
26
+ return f"{base}/mcp/tools"
27
+
28
+ def get_rest_url():
29
+ """Get REST API base URL."""
30
+ base = AGENTMEMORY_URL.rstrip('/')
31
+ if not base.endswith('/agentmemory'):
32
+ base = f"{base}/agentmemory"
33
+ return base
34
+
35
+ def headers():
36
+ """Build request headers."""
37
+ h = {"Content-Type": "application/json"}
38
+ if AGENTMEMORY_SECRET:
39
+ h["Authorization"] = f"Bearer {AGENTMEMORY_SECRET}"
40
+ return h
41
+
42
+ def call_mcp_tool(tool_name, arguments):
43
+ """Call MCP tool and return response."""
44
+ payload = {"name": tool_name, "arguments": arguments}
45
+ req = urllib.request.Request(
46
+ get_mcp_url(),
47
+ data=json.dumps(payload).encode('utf-8'),
48
+ headers=headers(),
49
+ method="POST"
50
+ )
51
+ try:
52
+ with urllib.request.urlopen(req, timeout=10) as resp:
53
+ return json.loads(resp.read().decode('utf-8'))
54
+ except Exception as e:
55
+ return {"error": str(e)}
56
+
57
+ def call_rest_api(path, method="GET", data=None):
58
+ """Call REST API and return response."""
59
+ url = f"{get_rest_url()}/{path}"
60
+ req = urllib.request.Request(
61
+ url,
62
+ data=json.dumps(data).encode('utf-8') if data else None,
63
+ headers=headers(),
64
+ method=method
65
+ )
66
+ try:
67
+ with urllib.request.urlopen(req, timeout=10) as resp:
68
+ return json.loads(resp.read().decode('utf-8'))
69
+ except Exception as e:
70
+ return {"error": str(e)}
71
+
72
+ def start_session(session_id, project, cwd, agent_id=None):
73
+ """Start or update session via MCP tools."""
74
+ # Get sessions list
75
+ sessions_result = call_mcp_tool("memory_sessions_list", {})
76
+ sessions = []
77
+
78
+ # Parse response: {"content": [{"text": "{\"sessions\": [...]}" }]}
79
+ try:
80
+ content_text = sessions_result.get('content', [{}])[0].get('text', '[]')
81
+ sessions_data = json.loads(content_text)
82
+ sessions = sessions_data.get('sessions', []) if isinstance(sessions_data, dict) else []
83
+ except Exception as e:
84
+ print(f"[auto_session_start] Error parsing sessions: {e}", file=sys.stderr)
85
+ sessions = []
86
+
87
+ # Check if session exists
88
+ existing_session = None
89
+ for s in sessions:
90
+ if s.get('id') == session_id:
91
+ existing_session = s
92
+ break
93
+
94
+ if existing_session:
95
+ # Session exists - update it by logging an observation
96
+ obs_result = call_mcp_tool("agent_observe", {
97
+ "sessionId": session_id,
98
+ "project": project,
99
+ "cwd": cwd,
100
+ "text": f"Session reactivated at {datetime.now(timezone.utc).isoformat()}Z",
101
+ "type": "thought",
102
+ "title": "Session Reactivated"
103
+ })
104
+ return {
105
+ "action": "updated",
106
+ "sessionId": session_id,
107
+ "message": "Session updated - reactivated via observation",
108
+ "observation": obs_result
109
+ }
110
+ else:
111
+ # Session doesn't exist - create via REST API
112
+ url = f"{get_rest_url()}/session/start"
113
+ payload = {
114
+ "sessionId": session_id,
115
+ "project": project,
116
+ "cwd": cwd,
117
+ "agentId": agent_id,
118
+ "title": f"Session started at {datetime.now(timezone.utc).isoformat()}Z"
119
+ }
120
+
121
+ req = urllib.request.Request(
122
+ url,
123
+ data=json.dumps(payload).encode('utf-8'),
124
+ headers=headers(),
125
+ method="POST"
126
+ )
127
+ try:
128
+ with urllib.request.urlopen(req, timeout=10) as resp:
129
+ result = json.loads(resp.read().decode('utf-8'))
130
+ return {
131
+ "action": "created",
132
+ "sessionId": session_id,
133
+ "result": result
134
+ }
135
+ except Exception as e:
136
+ return {
137
+ "action": "failed",
138
+ "sessionId": session_id,
139
+ "error": str(e)
140
+ }
141
+
142
+ def main():
143
+ # Get or generate session ID
144
+ session_id = AGENTMEMORY_SESSION_ID or f"claude-{uuid.uuid4().hex[:12]}"
145
+
146
+ result = start_session(
147
+ session_id=session_id,
148
+ project=AGENTMEMORY_PROJECT,
149
+ cwd=AGENTMEMORY_CWD,
150
+ agent_id=AGENTMEMORY_AGENT_ID
151
+ )
152
+
153
+ print(json.dumps({
154
+ "session_id": session_id,
155
+ "project": AGENTMEMORY_PROJECT,
156
+ "cwd": AGENTMEMORY_CWD,
157
+ "result": result
158
+ }))
159
+
160
+ if __name__ == "__main__":
161
+ main()