refactor(opencode): native SDK tools, drop MCP, trim skills, expand telemetry

Reworks @mem0/opencode-plugin to expose memory operations as native OpenCode
tools (via the @opencode-ai/plugin `tool()` helper, backed by the mem0ai SDK)
instead of delegating to the remote MCP server. Skills load via the `config`
hook (`skills.paths`) instead of being copied into the project `.opencode/`.

- Drop MCP: remove the regex-based MCP tool interception, the bundled
  opencode.json MCP registration, and the cli.ts installer (mem0-opencode bin).
- Native tools: add_memory, search_memories, get_memories, get_memory,
  update_memory, delete_memory, delete_all_memories, delete_entities,
  list_entities, get_event_status.
- Trim skills 16 -> 8 (context-loader, dream, forget, health, peek, pin,
  remember, tour); remove import, export, memory-reviewer, mem0, list-projects,
  switch-project, stats, onboard. De-MCP/onboard wording in kept skills.
- Telemetry: emit the full shared plugin.* schema (adds user_prompt, bash_error,
  pre_compact, session_stop alongside session_start, tool_use); tool_use now
  fires from inside each native tool; add project_hash + os_version props.
- Fix duplicate error-search (single topK:6); correct the documented
  experimental.chat.messages.transform hook name.
- Bump to 0.2.0.
This commit is contained in:
kartik-mem0
2026-06-16 12:35:58 +05:30
parent a2f01a8fcc
commit 013718c817
33 changed files with 778 additions and 5867 deletions
@@ -13,11 +13,13 @@
* installs without a key emit nothing). Disable with MEM0_TELEMETRY=false.
*
* Never sends: memory content, API keys, raw user/project IDs. Only sends:
* event type, platform, plugin version, anonymized hash of the API key.
* event type, platform, plugin version, and anonymized hashes of the API key
* and project ID.
*/
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
import { release } from "node:os";
const POSTHOG_API_KEY = "phc_hgJkUVJFYtmaJqrvf6CYN67TIQ8yhXAkWzUn9AMU4yX";
const POSTHOG_HOST = "https://us.i.posthog.com/i/v0/e/";
@@ -62,6 +64,7 @@ export function buildEvent(
eventType: string,
properties: Record<string, unknown>,
apiKey: string | undefined,
projectId?: string,
): Record<string, unknown> | null {
if (!isTelemetryEnabled() || !apiKey) return null;
return {
@@ -74,9 +77,14 @@ export function buildEvent(
platform: "opencode",
plugin_version: PLUGIN_VERSION,
os: process.platform,
os_version: release(),
sample_rate: 1.0,
$process_person_profile: false,
$lib: "posthog-node",
// Anonymized project segmentation, matching telemetry.py's project_hash.
...(projectId
? { project_hash: createHash("sha256").update(projectId).digest("hex") }
: {}),
},
};
}
@@ -86,8 +94,9 @@ export function captureEvent(
eventType: string,
properties: Record<string, unknown>,
apiKey: string | undefined,
projectId?: string,
): void {
const payload = buildEvent(eventType, properties, apiKey);
const payload = buildEvent(eventType, properties, apiKey, projectId);
if (!payload) return;
try {
void fetch(POSTHOG_HOST, {