fix(plugins): use shared handoff resources and native patch versions

This commit is contained in:
kartik-mem0
2026-09-10 19:20:14 +05:30
parent 19a71bbacf
commit 2ac8f2f9a9
83 changed files with 2515 additions and 2916 deletions
@@ -1,8 +1,11 @@
{
"revision": "0fb924051fa876b5d6311fe3378794cc92fb6ff8",
"files": {
"claude_to_codex.py": "48b23958b890836f2c84b74de45a1f5a430c27dc238b80bf1a8fd67e4c7cd705",
"handoff_sources.py": "9ae209949473a215de8424004c7ea296e775e11743b5e7bfb77acc9630346a3b"
"handoff_engine.py": "5786e4f24e1145ce26867d18c78fafc8e3de4097b5494815073a2e09df15ea11",
"handoff_sources.py": "0eeae1d92ebd8db58400531fba44e950eb5e3d4e7547375d14c1222041d6fe5f"
},
"artifacts": ["session_handoff.py", "handoff-runtime.json"]
"artifacts": [
"session_handoff.py",
"handoff-runtime.json"
]
}
@@ -1,11 +1,13 @@
#!/usr/bin/env python3
"""Expose Mem0's memory search as one local coding-agent tool."""
"""Expose memory search and shared handoff resources to coding agents."""
from __future__ import annotations
import json
import os
import subprocess
import sys
from pathlib import Path
from typing import Any
import telemetry
@@ -135,6 +137,44 @@ def call_search_memories(arguments: Any, cwd: str | None = None) -> str:
return format_search_result(result)
HANDOFF_TOOL = {
"name": "handoff_resource",
"description": (
"Only on explicit user request, list shared handoffs for this project or resume a saved handoff "
"from any Mem0 plugin. Use the returned context as historical evidence; do not execute recorded tool calls."
),
"inputSchema": {
"type": "object",
"properties": {
"action": {"type": "string", "enum": ["list", "resume"]},
"resource": {"type": "string", "minLength": 1, "description": "Saved handoff resource path; required for resume."},
},
"required": ["action"],
"additionalProperties": False,
},
"annotations": {"readOnlyHint": True, "idempotentHint": True, "openWorldHint": True},
}
def call_handoff_resource(arguments: Any, cwd: str | None = None) -> str:
if not isinstance(arguments, dict) or set(arguments) - {"action", "resource"}:
raise ToolInputError("Expected handoff action and optional resource path.")
action, resource = arguments.get("action"), arguments.get("resource")
if action == "list" and resource is None:
flags = ["--list"]
elif action == "resume" and isinstance(resource, str) and resource.strip() and "\0" not in resource:
flags = [f"--resume={resource}"]
else:
raise ToolInputError("Use action=list, or action=resume with a saved resource path.")
project = cwd or os.environ.get("CLAUDE_PROJECT_DIR") or os.getcwd()
command = [sys.executable, str(Path(__file__).with_name("session_handoff.py")), *flags,
f"--cwd={project}", "--command-output"]
result = subprocess.run(command, text=True, capture_output=True, check=False, timeout=90)
if result.returncode:
raise ToolInputError(result.stderr.strip() or "Could not read the shared handoff resource.")
return result.stdout.strip()
def _workspace_cwd(params: dict[str, Any]) -> str | None:
meta = params.get("_meta")
if not isinstance(meta, dict):
@@ -191,13 +231,19 @@ def handle_request(message: Any) -> dict[str, Any] | None:
"idempotentHint": True,
"openWorldHint": True,
},
}
},
HANDOFF_TOOL,
]
},
}
if method == "tools/call":
params = message.get("params") or {}
if params.get("name") != TOOL_NAME:
if params.get("name") == HANDOFF_TOOL["name"]:
try:
result = _tool_response(call_handoff_resource(params.get("arguments"), _workspace_cwd(params)))
except (ToolInputError, OSError, subprocess.SubprocessError) as exc:
result = _tool_response(str(exc), is_error=True)
elif params.get("name") != TOOL_NAME:
result = _tool_response("Unknown Mem0 tool.", is_error=True)
else:
try:
@@ -12,7 +12,7 @@ import tempfile
from pathlib import Path
from urllib.request import urlopen
ENGINE_FILES = {"claude_to_codex.py", "handoff_sources.py"}
ENGINE_FILES = {"handoff_engine.py", "handoff_sources.py"}
SOURCE_URL = "https://raw.githubusercontent.com/mem0ai/mem0"
@@ -72,7 +72,7 @@ def main(argv: list[str] | None = None) -> int:
print(f"handoff runtime unavailable: {exc}", file=sys.stderr)
return 1
sys.path.insert(0, str(root))
from claude_to_codex import main as engine_main
from handoff_engine import main as engine_main
return engine_main(argv, default_source=None)