fix(mem0-plugin): review fixes — loop guard, v3 response format, robustness
- on_stop_cursor.sh: add loop_count guard to prevent infinite re-entry - on_stop.sh: drop set -e so stats failure doesn't kill the reminder - _identity.py: fix fallback stub signatures to match production (accept cwd arg) - on_pre_compact.py: add missing infer=False on session_state writes - on_session_start.sh: handle v3 search response format (dict with results key) - Align all plugin versions to 0.2.1 (Claude Code, Codex, Cursor)
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mem0",
|
"name": "mem0",
|
||||||
"version": "0.2.0",
|
"version": "0.2.1",
|
||||||
"description": "Mem0 memory layer for AI applications. Add persistent memory, personalization, and semantic search to Codex workflows using the Mem0 Platform MCP server.",
|
"description": "Mem0 memory layer for AI applications. Add persistent memory, personalization, and semantic search to Codex workflows using the Mem0 Platform MCP server.",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Mem0",
|
"name": "Mem0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mem0",
|
"name": "mem0",
|
||||||
"version": "0.2.0",
|
"version": "0.2.1",
|
||||||
"description": "Mem0 memory layer for AI applications. Add persistent memory, personalization, and semantic search using the Mem0 Platform MCP server.",
|
"description": "Mem0 memory layer for AI applications. Add persistent memory, personalization, and semantic search using the Mem0 Platform MCP server.",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "Mem0",
|
"name": "Mem0",
|
||||||
|
|||||||
@@ -31,10 +31,10 @@ def resolve_user_id() -> str:
|
|||||||
try:
|
try:
|
||||||
from _project import resolve_branch, resolve_project_id, save_project_mapping
|
from _project import resolve_branch, resolve_project_id, save_project_mapping
|
||||||
except ImportError:
|
except ImportError:
|
||||||
def resolve_project_id() -> str:
|
def resolve_project_id(cwd: str | None = None) -> str:
|
||||||
return os.path.basename(os.getcwd())
|
return os.path.basename(cwd or os.getcwd())
|
||||||
|
|
||||||
def resolve_branch() -> str:
|
def resolve_branch(cwd: str | None = None) -> str:
|
||||||
return "unknown"
|
return "unknown"
|
||||||
|
|
||||||
def save_project_mapping(cwd: str, project_id: str) -> None:
|
def save_project_mapping(cwd: str, project_id: str) -> None:
|
||||||
|
|||||||
@@ -186,6 +186,7 @@ def store_memory(api_key: str, content: str, user_id: str, source: str, session_
|
|||||||
"app_id": project_id,
|
"app_id": project_id,
|
||||||
"metadata": metadata,
|
"metadata": metadata,
|
||||||
"expiration_date": expires,
|
"expiration_date": expires,
|
||||||
|
"infer": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
data = json.dumps(body).encode("utf-8")
|
data = json.dumps(body).encode("utf-8")
|
||||||
|
|||||||
@@ -53,12 +53,15 @@ req = urllib.request.Request(
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
with urllib.request.urlopen(req, timeout=5) as r:
|
with urllib.request.urlopen(req, timeout=5) as r:
|
||||||
results = json.loads(r.read())
|
data = json.loads(r.read())
|
||||||
if isinstance(results, list):
|
if isinstance(data, list):
|
||||||
n = len(results)
|
results = data
|
||||||
print(f'{n}+' if n >= 100 else str(n))
|
elif isinstance(data, dict) and 'results' in data:
|
||||||
|
results = data['results']
|
||||||
else:
|
else:
|
||||||
print('?')
|
print('?'); raise SystemExit
|
||||||
|
n = len(results)
|
||||||
|
print(f'{n}+' if n >= 100 else str(n))
|
||||||
except Exception:
|
except Exception:
|
||||||
print('?')
|
print('?')
|
||||||
" 2>/dev/null || echo "?")
|
" 2>/dev/null || echo "?")
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
#
|
#
|
||||||
# IMPORTANT: Check stop_hook_active to avoid infinite loops.
|
# IMPORTANT: Check stop_hook_active to avoid infinite loops.
|
||||||
|
|
||||||
set -euo pipefail
|
# Intentionally omit -e so the reminder always emits even if session_stats fails.
|
||||||
|
set -uo pipefail
|
||||||
|
|
||||||
if [ -n "${MEM0_DEBUG:-}" ]; then
|
if [ -n "${MEM0_DEBUG:-}" ]; then
|
||||||
mkdir -p "$HOME/.mem0" && exec 2>>"$HOME/.mem0/hooks.log"
|
mkdir -p "$HOME/.mem0" && exec 2>>"$HOME/.mem0/hooks.log"
|
||||||
|
|||||||
@@ -19,6 +19,14 @@ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|||||||
|
|
||||||
INPUT=$(cat)
|
INPUT=$(cat)
|
||||||
|
|
||||||
|
# Guard against infinite loops: if this is a re-entry after a prior followup,
|
||||||
|
# let the turn end. Cursor exposes loop_count in the input JSON.
|
||||||
|
LOOP_COUNT=$(echo "$INPUT" | jq -r '.loop_count // 0' 2>/dev/null || echo "0")
|
||||||
|
if [ "$LOOP_COUNT" -gt 1 ]; then
|
||||||
|
echo '{}'
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
# Session-end report (best-effort)
|
# Session-end report (best-effort)
|
||||||
REPORT=$(python3 "$SCRIPT_DIR/session_stats.py" report 2>/dev/null || echo "")
|
REPORT=$(python3 "$SCRIPT_DIR/session_stats.py" report 2>/dev/null || echo "")
|
||||||
REPORT_BLOCK=""
|
REPORT_BLOCK=""
|
||||||
|
|||||||
Reference in New Issue
Block a user