@sonzai-labs/openclaw-context 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config.ts","../src/cache.ts","../src/context-builder.ts","../src/session-key.ts","../src/engine.ts","../src/plugin.ts","../src/setup.ts"],"names":["g","Sonzai"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Plugin configuration — maps to `plugins.entries.sonzai` in openclaw.json\n * or environment variables.\n */\n\nexport interface DisableMap {\n mood?: boolean;\n personality?: boolean;\n relationships?: boolean;\n memory?: boolean;\n goals?: boolean;\n interests?: boolean;\n habits?: boolean;\n}\n\nexport interface SonzaiPluginConfig {\n /** Sonzai API key (sk-...). Required. */\n apiKey: string;\n /** Pre-provisioned agent UUID. If omitted, auto-provisions from agentName. */\n agentId?: string;\n /** Base URL override (e.g. for staging). Defaults to https://api.sonz.ai */\n baseUrl?: string;\n /**\n * Agent name for auto-provisioning. The backend derives a deterministic\n * UUID from (tenantID + lowercase(name)), so the same API key + same name\n * always maps to the same agent — no duplicates across restarts.\n *\n * IMPORTANT for B2B: if multiple OpenClaw instances share one API key,\n * each needs a unique agentName to get its own Sonzai agent.\n * Defaults to \"openclaw-agent\".\n */\n agentName?: string;\n /** Default userId when session key has no peer identity (CLI 1:1). Defaults to \"owner\". */\n defaultUserId?: string;\n /** Max tokens for Sonzai context injection. Defaults to 2000. */\n contextTokenBudget?: number;\n /** Selectively disable context sources. */\n disable?: DisableMap;\n /** LLM provider for side-effect extraction (e.g. \"gemini\", \"openai\"). Uses platform default if omitted. */\n extractionProvider?: string;\n /** LLM model for side-effect extraction (e.g. \"gemini-2.5-flash\"). Uses platform default if omitted. */\n extractionModel?: string;\n}\n\nexport interface ResolvedConfig {\n apiKey: string;\n agentId: string | undefined;\n baseUrl: string;\n agentName: string;\n defaultUserId: string;\n contextTokenBudget: number;\n disable: DisableMap;\n extractionProvider: string | undefined;\n extractionModel: string | undefined;\n}\n\nconst DEFAULTS = {\n baseUrl: \"https://api.sonz.ai\",\n agentName: \"openclaw-agent\",\n defaultUserId: \"owner\",\n contextTokenBudget: 2000,\n} as const;\n\n/**\n * Resolve configuration from explicit config, then fall back to env vars.\n */\nexport function resolveConfig(raw?: Partial<SonzaiPluginConfig>): ResolvedConfig {\n const apiKey =\n raw?.apiKey ||\n env(\"SONZAI_API_KEY\") ||\n env(\"SONZAI_OPENCLAW_API_KEY\");\n\n if (!apiKey) {\n throw new Error(\n \"[@sonzai-labs/openclaw-context] Missing API key. \" +\n \"Set apiKey in plugin config or SONZAI_API_KEY environment variable.\",\n );\n }\n\n return {\n apiKey,\n agentId: raw?.agentId || env(\"SONZAI_AGENT_ID\") || undefined,\n baseUrl: raw?.baseUrl || env(\"SONZAI_BASE_URL\") || DEFAULTS.baseUrl,\n agentName: raw?.agentName || env(\"SONZAI_AGENT_NAME\") || DEFAULTS.agentName,\n defaultUserId: raw?.defaultUserId || DEFAULTS.defaultUserId,\n contextTokenBudget: raw?.contextTokenBudget ?? DEFAULTS.contextTokenBudget,\n disable: raw?.disable ?? {},\n extractionProvider: raw?.extractionProvider || env(\"SONZAI_EXTRACTION_PROVIDER\") || undefined,\n extractionModel: raw?.extractionModel || env(\"SONZAI_EXTRACTION_MODEL\") || undefined,\n };\n}\n\nfunction env(key: string): string | undefined {\n try {\n return typeof process !== \"undefined\" ? process.env[key] : undefined;\n } catch {\n return undefined;\n }\n}\n","/**\n * Lightweight in-memory TTL cache.\n *\n * Used to avoid re-fetching slow-changing data (personality, agent profile)\n * on every assemble() call.\n */\n\ninterface CacheEntry<T> {\n value: T;\n expiresAt: number;\n}\n\nexport class SessionCache<T> {\n private readonly store = new Map<string, CacheEntry<T>>();\n\n constructor(private readonly ttlMs: number) {}\n\n get(key: string): T | undefined {\n const entry = this.store.get(key);\n if (!entry) return undefined;\n if (Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n return entry.value;\n }\n\n set(key: string, value: T): void {\n this.store.set(key, {\n value,\n expiresAt: Date.now() + this.ttlMs,\n });\n }\n\n delete(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n}\n","/**\n * Transforms Sonzai API responses into a formatted systemPromptAddition\n * string for OpenClaw context injection.\n */\n\nimport type {\n EnrichedContextResponse,\n GoalsResponse,\n HabitsResponse,\n InterestsResponse,\n MemorySearchResponse,\n MoodResponse,\n PersonalityResponse,\n RelationshipResponse,\n} from \"@sonzai-labs/agents\";\n\n// ---------------------------------------------------------------------------\n// Public interface\n// ---------------------------------------------------------------------------\n\nexport interface ContextSources {\n personality?: PersonalityResponse;\n mood?: MoodResponse;\n relationships?: RelationshipResponse;\n memories?: MemorySearchResponse;\n goals?: GoalsResponse;\n interests?: InterestsResponse;\n habits?: HabitsResponse;\n}\n\n/**\n * Sections in priority order (lowest priority first — dropped first on truncation).\n */\nconst SECTION_ORDER: (keyof ContextSources)[] = [\n \"habits\",\n \"interests\",\n \"goals\",\n \"relationships\",\n \"mood\",\n \"memories\",\n \"personality\",\n];\n\ntype SectionFormatter = (data: unknown) => string | null;\n\nconst formatters: Record<keyof ContextSources, SectionFormatter> = {\n personality: formatPersonality,\n mood: formatMood,\n relationships: formatRelationships,\n memories: formatMemories,\n goals: formatGoals,\n interests: formatInterests,\n habits: formatHabits,\n};\n\n/**\n * Build the systemPromptAddition from all available context sources.\n * Returns an empty string if no data is available.\n */\nexport function buildSystemPromptAddition(\n sources: ContextSources,\n tokenBudget: number,\n): string {\n // Build sections in priority order (highest priority first for display)\n const sections: { key: keyof ContextSources; text: string }[] = [];\n\n for (const key of [...SECTION_ORDER].reverse()) {\n const data = sources[key];\n if (!data) continue;\n const text = formatters[key](data);\n if (text) sections.push({ key, text });\n }\n\n if (sections.length === 0) return \"\";\n\n // Assemble full output\n let result = \"<sonzai-context>\\n\" + sections.map((s) => s.text).join(\"\\n\\n\") + \"\\n</sonzai-context>\";\n\n // Truncate lowest-priority sections until within budget\n while (estimateTokens(result) > tokenBudget && sections.length > 1) {\n // Remove the last section (lowest priority in display order = highest index corresponds to lowest priority)\n const dropKey = SECTION_ORDER.find((k) =>\n sections.some((s) => s.key === k),\n );\n if (!dropKey) break;\n const idx = sections.findIndex((s) => s.key === dropKey);\n if (idx === -1) break;\n sections.splice(idx, 1);\n result = \"<sonzai-context>\\n\" + sections.map((s) => s.text).join(\"\\n\\n\") + \"\\n</sonzai-context>\";\n }\n\n // Final hard truncation if single section is still too long\n if (estimateTokens(result) > tokenBudget) {\n const maxChars = tokenBudget * 4;\n result = result.slice(0, maxChars) + \"\\n[...truncated]\\n</sonzai-context>\";\n }\n\n return result;\n}\n\n/**\n * Rough token estimate: ~4 chars per token, erring on overestimation.\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n// ---------------------------------------------------------------------------\n// Section formatters\n// ---------------------------------------------------------------------------\n\nfunction formatPersonality(data: unknown): string | null {\n const resp = data as PersonalityResponse;\n const p = resp?.profile;\n if (!p) return null;\n\n const lines = [\"## Personality\"];\n lines.push(`Name: ${p.name}`);\n if (p.bio) lines.push(`Bio: ${p.bio}`);\n if (p.primary_traits?.length) lines.push(`Traits: ${p.primary_traits.join(\", \")}`);\n if (p.speech_patterns?.length) lines.push(`Speech patterns: ${p.speech_patterns.join(\", \")}`);\n if (p.personality_prompt) lines.push(`Character: ${p.personality_prompt}`);\n\n if (p.big5) {\n const b5 = p.big5;\n const traits = [\n `O:${b5.openness?.score ?? \"?\"}`,\n `C:${b5.conscientiousness?.score ?? \"?\"}`,\n `E:${b5.extraversion?.score ?? \"?\"}`,\n `A:${b5.agreeableness?.score ?? \"?\"}`,\n `N:${b5.neuroticism?.score ?? \"?\"}`,\n ];\n lines.push(`Big5: ${traits.join(\" \")}`);\n }\n\n if (p.preferences) {\n const pref = p.preferences;\n lines.push(\n `Style: pace=${pref.pace}, formality=${pref.formality}, humor=${pref.humor_style}, expression=${pref.emotional_expression}`,\n );\n }\n\n // Recent evolution\n const evo = resp?.evolution;\n if (evo?.length) {\n lines.push(\"Recent shifts:\");\n for (const d of evo.slice(0, 3)) {\n lines.push(`- ${d.change} (${d.reason})`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatMood(data: unknown): string | null {\n const mood = data as Record<string, unknown>;\n if (!mood || Object.keys(mood).length === 0) return null;\n\n const lines = [\"## Current Mood\"];\n\n // The mood response shape varies — extract known fields robustly\n for (const [key, value] of Object.entries(mood)) {\n if (key.startsWith(\"_\") || value === null || value === undefined) continue;\n if (typeof value === \"object\") {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.length > 1 ? lines.join(\"\\n\") : null;\n}\n\nfunction formatRelationships(data: unknown): string | null {\n const rels = data as Record<string, unknown>;\n if (!rels || Object.keys(rels).length === 0) return null;\n\n const lines = [\"## Relationship\"];\n for (const [key, value] of Object.entries(rels)) {\n if (key.startsWith(\"_\") || value === null || value === undefined) continue;\n if (typeof value === \"object\") {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.length > 1 ? lines.join(\"\\n\") : null;\n}\n\nfunction formatMemories(data: unknown): string | null {\n const resp = data as MemorySearchResponse;\n if (!resp?.results?.length) return null;\n\n const lines = [\"## Relevant Memories\"];\n for (const mem of resp.results.slice(0, 10)) {\n const score = mem.score ? ` (score: ${mem.score.toFixed(2)})` : \"\";\n lines.push(`- ${mem.content}${score}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatGoals(data: unknown): string | null {\n const resp = data as GoalsResponse;\n if (!resp?.goals?.length) return null;\n\n const lines = [\"## Goals\"];\n for (const g of resp.goals.filter((g) => g.status === \"active\").slice(0, 5)) {\n lines.push(`- ${g.title}: ${g.description} [${g.type}, priority=${g.priority}]`);\n }\n\n return lines.length > 1 ? lines.join(\"\\n\") : null;\n}\n\nfunction formatInterests(data: unknown): string | null {\n const interests = data as Record<string, unknown>;\n if (!interests || Object.keys(interests).length === 0) return null;\n\n const lines = [\"## Interests\"];\n for (const [key, value] of Object.entries(interests)) {\n if (key.startsWith(\"_\") || value === null || value === undefined) continue;\n if (typeof value === \"object\") {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.length > 1 ? lines.join(\"\\n\") : null;\n}\n\nfunction formatHabits(data: unknown): string | null {\n const habits = data as Record<string, unknown>;\n if (!habits || Object.keys(habits).length === 0) return null;\n\n const lines = [\"## Habits\"];\n for (const [key, value] of Object.entries(habits)) {\n if (key.startsWith(\"_\") || value === null || value === undefined) continue;\n if (typeof value === \"object\") {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n\n return lines.length > 1 ? lines.join(\"\\n\") : null;\n}\n\n// ---------------------------------------------------------------------------\n// Single-call context builder (from EnrichedContextResponse)\n// ---------------------------------------------------------------------------\n\ninterface DisableConfig {\n personality?: boolean;\n mood?: boolean;\n relationships?: boolean;\n memory?: boolean;\n goals?: boolean;\n interests?: boolean;\n habits?: boolean;\n}\n\n/**\n * Build the systemPromptAddition from a single EnrichedContextResponse\n * (returned by GET /agents/{id}/context). Single network call replaces 7.\n */\nexport function buildSystemPromptFromContext(\n ctx: EnrichedContextResponse,\n tokenBudget: number,\n disable: DisableConfig = {},\n): string {\n const sections: { key: string; text: string; priority: number }[] = [];\n\n if (!disable.personality && ctx.personality_prompt) {\n const lines = [\"## Personality\"];\n lines.push(`Character: ${ctx.personality_prompt}`);\n if (ctx.primary_traits?.length) lines.push(`Traits: ${ctx.primary_traits.join(\", \")}`);\n if (ctx.speech_patterns?.length) lines.push(`Speech patterns: ${ctx.speech_patterns.join(\", \")}`);\n if (ctx.big5) {\n const b5 = ctx.big5 as Record<string, Record<string, number>>;\n const traits = [\"openness\", \"conscientiousness\", \"extraversion\", \"agreeableness\", \"neuroticism\"]\n .map((t) => `${t[0]!.toUpperCase()}:${b5[t]?.score ?? \"?\"}`)\n .join(\" \");\n lines.push(`Big5: ${traits}`);\n }\n sections.push({ key: \"personality\", text: lines.join(\"\\n\"), priority: 7 });\n }\n\n if (!disable.memory) {\n const facts = ctx.loaded_facts;\n if (facts?.length) {\n const lines = [\"## Relevant Memories\"];\n for (const f of facts.slice(0, 10)) {\n const text = (f.atomic_text as string) || (f.content as string) || JSON.stringify(f);\n lines.push(`- ${text}`);\n }\n sections.push({ key: \"memories\", text: lines.join(\"\\n\"), priority: 6 });\n }\n }\n\n if (!disable.mood && ctx.current_mood) {\n const mood = ctx.current_mood;\n const lines = [\"## Current Mood\"];\n for (const [key, value] of Object.entries(mood)) {\n if (key.startsWith(\"_\") || value === null || value === undefined) continue;\n lines.push(`${key}: ${typeof value === \"object\" ? JSON.stringify(value) : value}`);\n }\n if (lines.length > 1) sections.push({ key: \"mood\", text: lines.join(\"\\n\"), priority: 5 });\n }\n\n if (!disable.relationships && ctx.relationship_narrative) {\n const lines = [\"## Relationship\"];\n lines.push(ctx.relationship_narrative);\n if (ctx.love_from_agent !== undefined) lines.push(`Love (agent->user): ${ctx.love_from_agent}`);\n if (ctx.love_from_user !== undefined) lines.push(`Love (user->agent): ${ctx.love_from_user}`);\n if (ctx.relationship_status) lines.push(`Status: ${ctx.relationship_status}`);\n sections.push({ key: \"relationships\", text: lines.join(\"\\n\"), priority: 4 });\n }\n\n if (!disable.goals) {\n const goals = ctx.active_goals as Array<Record<string, unknown>> | undefined;\n if (goals?.length) {\n const lines = [\"## Goals\"];\n for (const g of goals.slice(0, 5)) {\n lines.push(`- ${g.title}: ${g.description} [${g.type}]`);\n }\n sections.push({ key: \"goals\", text: lines.join(\"\\n\"), priority: 3 });\n }\n }\n\n if (!disable.interests && ctx.true_interests?.length) {\n sections.push({ key: \"interests\", text: `## Interests\\n${ctx.true_interests.join(\", \")}`, priority: 2 });\n }\n\n if (!disable.habits) {\n const ctxHabits = ctx.habits as Array<Record<string, unknown>> | undefined;\n if (ctxHabits?.length) {\n const lines = [\"## Habits\"];\n for (const h of ctxHabits.slice(0, 5)) {\n lines.push(`- ${h.name}: ${h.description || h.category || \"\"}`);\n }\n sections.push({ key: \"habits\", text: lines.join(\"\\n\"), priority: 1 });\n }\n }\n\n if (sections.length === 0) return \"\";\n\n sections.sort((a, b) => b.priority - a.priority);\n let result = \"<sonzai-context>\\n\" + sections.map((s) => s.text).join(\"\\n\\n\") + \"\\n</sonzai-context>\";\n\n while (estimateTokens(result) > tokenBudget && sections.length > 1) {\n sections.pop();\n result = \"<sonzai-context>\\n\" + sections.map((s) => s.text).join(\"\\n\\n\") + \"\\n</sonzai-context>\";\n }\n\n if (estimateTokens(result) > tokenBudget) {\n const maxChars = tokenBudget * 4;\n result = result.slice(0, maxChars) + \"\\n[...truncated]\\n</sonzai-context>\";\n }\n\n return result;\n}\n","/**\n * Extracts user identity from OpenClaw session keys.\n *\n * Session key formats:\n * CLI 1:1 — agent:<agentId>:<mainKey>\n * DM — agent:<agentId>:<channel>:direct:<peerId>\n * Group — agent:<agentId>:<channel>:group:<groupId>\n * Cron — cron:<jobId>\n * Webhook — hook:<uuid>\n */\n\nexport interface ParsedSessionKey {\n /** The agentId segment from the session key (may differ from configured agentId). */\n agentId: string | null;\n /** Resolved userId for Sonzai SDK calls. */\n userId: string;\n /** Channel identifier (e.g. \"telegram\", \"discord\"), if present. */\n channel: string | null;\n /** How this session was identified. */\n sessionType: \"cli\" | \"dm\" | \"group\" | \"cron\" | \"webhook\" | \"unknown\";\n}\n\nexport function parseSessionKey(\n sessionId: string,\n defaultUserId: string,\n): ParsedSessionKey {\n const parts = sessionId.split(\":\");\n\n // agent:<agentId>:...\n if (parts[0] === \"agent\" && parts.length >= 3) {\n const agentId = parts[1] ?? null;\n\n // agent:<agentId>:<channel>:direct:<peerId...>\n const directIdx = parts.indexOf(\"direct\");\n if (directIdx !== -1 && directIdx + 1 < parts.length) {\n const channel = directIdx >= 3 ? parts[2]! : null;\n // peerId may itself contain colons (e.g. \"telegram:123\"), rejoin everything after \"direct:\"\n const peerId = parts.slice(directIdx + 1).join(\":\");\n return {\n agentId,\n userId: peerId,\n channel,\n sessionType: \"dm\",\n };\n }\n\n // agent:<agentId>:<channel>:group:<groupId...>\n const groupIdx = parts.indexOf(\"group\");\n if (groupIdx !== -1 && groupIdx + 1 < parts.length) {\n const channel = groupIdx >= 3 ? parts[2]! : null;\n const groupId = parts.slice(groupIdx + 1).join(\":\");\n return {\n agentId,\n userId: groupId,\n channel,\n sessionType: \"group\",\n };\n }\n\n // agent:<agentId>:<mainKey> — CLI / 1:1\n return {\n agentId,\n userId: defaultUserId,\n channel: null,\n sessionType: \"cli\",\n };\n }\n\n // cron:<jobId>\n if (parts[0] === \"cron\") {\n return {\n agentId: null,\n userId: defaultUserId,\n channel: null,\n sessionType: \"cron\",\n };\n }\n\n // hook:<uuid>\n if (parts[0] === \"hook\") {\n return {\n agentId: null,\n userId: defaultUserId,\n channel: null,\n sessionType: \"webhook\",\n };\n }\n\n // Unrecognized format\n return {\n agentId: null,\n userId: defaultUserId,\n channel: null,\n sessionType: \"unknown\",\n };\n}\n","/**\n * SonzaiContextEngine — bridges OpenClaw lifecycle hooks to the\n * Sonzai Mind Layer API via @sonzai-labs/agents.\n */\n\nimport type { Sonzai } from \"@sonzai-labs/agents\";\nimport { SessionCache } from \"./cache.js\";\nimport { buildSystemPromptFromContext, estimateTokens } from \"./context-builder.js\";\nimport type { ResolvedConfig } from \"./config.js\";\nimport { parseSessionKey } from \"./session-key.js\";\nimport type {\n AfterTurnArgs,\n AssembleArgs,\n AssembleResult,\n BootstrapArgs,\n CompactArgs,\n CompactResult,\n ContextEngine,\n ContextEngineInfo,\n IngestArgs,\n MessageItem,\n SessionState,\n} from \"./types.js\";\n\n// Cache TTLs\n// Profile/behavioral caching is now handled server-side by Redis layer caches.\nconst AGENT_CACHE_TTL = 30 * 60 * 1000; // 30 minutes\n\nexport class SonzaiContextEngine implements ContextEngine {\n readonly info: ContextEngineInfo = {\n id: \"sonzai\",\n name: \"Sonzai Mind Layer\",\n ownsCompaction: true,\n };\n\n private readonly sessions = new Map<string, SessionState>();\n private readonly agentCache = new SessionCache<string>(AGENT_CACHE_TTL);\n\n constructor(\n private readonly client: Sonzai,\n private readonly config: ResolvedConfig,\n ) {}\n\n // -------------------------------------------------------------------------\n // bootstrap — initialize session, optionally auto-provision agent\n // -------------------------------------------------------------------------\n\n async bootstrap({ sessionId }: BootstrapArgs): Promise<void> {\n try {\n const parsed = parseSessionKey(sessionId, this.config.defaultUserId);\n const agentId = await this.resolveAgentId(parsed.agentId);\n\n // Start a Sonzai session\n await this.client.agents.sessions.start(agentId, {\n userId: parsed.userId,\n sessionId,\n });\n\n this.sessions.set(sessionId, {\n agentId,\n userId: parsed.userId,\n sonzaiSessionId: sessionId,\n startedAt: Date.now(),\n turnCount: 0,\n lastProcessedIndex: 0,\n lastMessages: [],\n });\n } catch (err) {\n console.warn(\"[@sonzai-labs/openclaw-context] bootstrap failed:\", err);\n }\n }\n\n // -------------------------------------------------------------------------\n // ingest — no-op; processing happens in afterTurn with full conversation\n // -------------------------------------------------------------------------\n\n async ingest(_args: IngestArgs): Promise<{ ingested: boolean }> {\n return { ingested: true };\n }\n\n // -------------------------------------------------------------------------\n // assemble — fetch enriched context and inject as systemPromptAddition\n // -------------------------------------------------------------------------\n\n async assemble({\n sessionId,\n messages,\n tokenBudget,\n origin,\n }: AssembleArgs): Promise<AssembleResult> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { messages, estimatedTokens: 0 };\n }\n\n // Store messages for afterTurn processing\n session.lastMessages = messages;\n\n try {\n const { agentId, userId } = session;\n const lastUserMsg = findLastUserMessage(messages);\n const budget = Math.min(tokenBudget, this.config.contextTokenBudget);\n\n // Resolve userId for group chats: prefer origin.from if available\n const effectiveUserId =\n origin?.from && origin?.provider\n ? `${origin.provider}:${origin.from}`\n : userId;\n\n // Single API call replaces 7 parallel calls — server-side caching\n // handles profile (5min), behavioral (30s), constellation (5min),\n // and memory (2h session cache) acceleration.\n const context = await this.client.agents.getContext(agentId, {\n userId: effectiveUserId,\n sessionId: session.sonzaiSessionId,\n query: lastUserMsg,\n });\n\n const systemPromptAddition = buildSystemPromptFromContext(\n context,\n budget,\n this.config.disable,\n );\n\n return {\n messages,\n estimatedTokens: estimateTokens(systemPromptAddition),\n systemPromptAddition: systemPromptAddition || undefined,\n };\n } catch (err) {\n console.warn(\"[@sonzai-labs/openclaw-context] assemble failed:\", err);\n return { messages, estimatedTokens: 0 };\n }\n }\n\n // -------------------------------------------------------------------------\n // compact — trigger Sonzai's consolidation pipeline\n // -------------------------------------------------------------------------\n\n async compact({ sessionId }: CompactArgs): Promise<CompactResult> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return { ok: false, compacted: false };\n }\n\n try {\n await this.client.agents.consolidate(session.agentId);\n return { ok: true, compacted: true };\n } catch (err) {\n console.warn(\"[@sonzai-labs/openclaw-context] compact failed:\", err);\n return { ok: false, compacted: false };\n }\n }\n\n // -------------------------------------------------------------------------\n // afterTurn — send new messages for fact extraction\n // -------------------------------------------------------------------------\n\n async afterTurn({ sessionId }: AfterTurnArgs): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) return;\n\n try {\n session.turnCount++;\n\n // Only send messages added since last afterTurn\n const newMessages = session.lastMessages.slice(session.lastProcessedIndex);\n session.lastProcessedIndex = session.lastMessages.length;\n\n if (newMessages.length === 0) return;\n\n await this.client.agents.process(session.agentId, {\n userId: session.userId,\n sessionId: session.sonzaiSessionId,\n messages: newMessages.map((m) => ({\n role: m.role as \"user\" | \"assistant\" | \"system\",\n content: m.content,\n })),\n provider: this.config.extractionProvider,\n model: this.config.extractionModel,\n });\n } catch (err) {\n console.warn(\"[@sonzai-labs/openclaw-context] afterTurn failed:\", err);\n }\n }\n\n // -------------------------------------------------------------------------\n // dispose — end all active sessions and clear caches\n // -------------------------------------------------------------------------\n\n async dispose(): Promise<void> {\n const endPromises = [...this.sessions.entries()].map(\n async ([_sessionId, session]) => {\n try {\n await this.client.agents.sessions.end(session.agentId, {\n userId: session.userId,\n sessionId: session.sonzaiSessionId,\n totalMessages: session.turnCount,\n durationSeconds: Math.floor(\n (Date.now() - session.startedAt) / 1000,\n ),\n });\n } catch {\n // Best-effort cleanup\n }\n },\n );\n\n await Promise.allSettled(endPromises);\n this.sessions.clear();\n this.agentCache.clear();\n }\n\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n /**\n * Resolve the Sonzai agent ID: use config if provided, otherwise\n * auto-provision via the idempotent create endpoint.\n *\n * Idempotency guarantee: the backend derives a deterministic UUID v5 from\n * `SHA1(namespace, tenantID + \"/\" + lowercase(name))`. Same API key (tenant)\n * + same name → same UUID on every call, even across restarts or pod\n * replacements.\n *\n * The name used is always `config.agentName` (default: \"openclaw-agent\").\n * This is stable because it comes from the plugin config / env var, not\n * from any runtime state like pod IDs or session UUIDs.\n *\n * If a B2B client needs multiple distinct agents under one API key, they\n * set a unique `agentName` per OpenClaw instance in their config.\n */\n private async resolveAgentId(_sessionAgentId: string | null): Promise<string> {\n if (this.config.agentId) {\n return this.config.agentId;\n }\n\n const name = this.config.agentName;\n\n // Check cache\n const cached = this.agentCache.get(name);\n if (cached) return cached;\n\n // Auto-provision — idempotent (returns 200 if exists, 201 if new)\n const agent = await this.client.agents.create({ name });\n\n this.agentCache.set(name, agent.agent_id);\n return agent.agent_id;\n }\n\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Find the last user message content from the conversation. */\nfunction findLastUserMessage(messages: MessageItem[]): string | undefined {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i]!.role === \"user\") {\n return messages[i]!.content;\n }\n }\n return undefined;\n}\n","/**\n * OpenClaw plugin entry point.\n *\n * Registers the \"sonzai\" ContextEngine with OpenClaw's plugin system.\n */\n\nimport { Sonzai } from \"@sonzai-labs/agents\";\nimport { resolveConfig } from \"./config.js\";\nimport { SonzaiContextEngine } from \"./engine.js\";\nimport type { PluginAPI, ContextEngine } from \"./types.js\";\n\nexport default function register(api: PluginAPI): void {\n api.registerContextEngine(\"sonzai\", (): ContextEngine => {\n const config = resolveConfig();\n const client = new Sonzai({\n apiKey: config.apiKey,\n baseUrl: config.baseUrl,\n });\n return new SonzaiContextEngine(client, config);\n });\n}\n","/**\n * Interactive and programmatic setup for the Sonzai OpenClaw plugin.\n *\n * Interactive: `npx @sonzai-labs/openclaw-context setup`\n * Programmatic: `import { setup } from \"@sonzai-labs/openclaw-context\"`\n */\n\nimport { Sonzai } from \"@sonzai-labs/agents\";\nimport * as readline from \"node:readline\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Programmatic setup — for B2B integrations\n// ---------------------------------------------------------------------------\n\nexport interface SetupOptions {\n /** Sonzai API key. */\n apiKey: string;\n /** Agent name (deterministic ID derived from tenant + name). */\n agentName?: string;\n /** Pre-existing agent ID (skips agent provisioning). */\n agentId?: string;\n /** Base URL override. */\n baseUrl?: string;\n /** Path to openclaw.json. Defaults to ./openclaw.json */\n configPath?: string;\n /** If true, writes to openclaw.json. If false, returns config object only. */\n writeConfig?: boolean;\n}\n\nexport interface SetupResult {\n agentId: string;\n agentName: string;\n config: Record<string, unknown>;\n configPath?: string;\n written: boolean;\n}\n\n/**\n * Programmatic setup — validates API key, provisions agent, optionally\n * writes openclaw.json. Designed for B2B automation scripts.\n */\nexport async function setup(options: SetupOptions): Promise<SetupResult> {\n const baseUrl = options.baseUrl || \"https://api.sonz.ai\";\n const agentName = options.agentName || \"openclaw-agent\";\n const writeConfig = options.writeConfig ?? true;\n const configPath = options.configPath || \"./openclaw.json\";\n\n // 1. Validate API key by provisioning / finding the agent\n const client = new Sonzai({ apiKey: options.apiKey, baseUrl });\n\n let agentId: string;\n if (options.agentId) {\n // Verify agent exists\n const agent = await client.agents.get(options.agentId);\n agentId = agent.agent_id;\n } else {\n // Idempotent create — backend derives deterministic UUID from tenant+name\n const agent = await client.agents.create({ name: agentName });\n agentId = agent.agent_id;\n }\n\n // 2. Build the openclaw.json plugin config\n const pluginConfig = buildOpenClawConfig(options.apiKey, agentId);\n\n // 3. Optionally write to openclaw.json\n let written = false;\n if (writeConfig) {\n mergeOpenClawConfig(configPath, pluginConfig);\n written = true;\n }\n\n return {\n agentId,\n agentName,\n config: pluginConfig,\n configPath: written ? path.resolve(configPath) : undefined,\n written,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Interactive CLI setup — `npx @sonzai-labs/openclaw-context setup`\n// ---------------------------------------------------------------------------\n\nexport async function interactiveSetup(): Promise<void> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const ask = (question: string): Promise<string> =>\n new Promise((resolve) => rl.question(question, resolve));\n\n console.log(\"\\n🦞 Sonzai Mind Layer — OpenClaw Plugin Setup\\n\");\n\n try {\n // Step 1: API Key\n const envKey = process.env.SONZAI_API_KEY;\n let apiKey: string;\n if (envKey) {\n const useEnv = await ask(\n `Found SONZAI_API_KEY in environment (${envKey.slice(0, 8)}...). Use it? [Y/n] `,\n );\n apiKey = useEnv.toLowerCase() === \"n\" ? await ask(\"Enter your Sonzai API key: \") : envKey;\n } else {\n apiKey = await ask(\"Enter your Sonzai API key (from https://sonz.ai/settings/api): \");\n }\n\n if (!apiKey.trim()) {\n console.log(\"No API key provided. Aborting.\");\n return;\n }\n\n // Step 2: Agent\n const hasAgent = await ask(\"Do you have an existing Sonzai agent ID? [y/N] \");\n let agentId: string | undefined;\n let agentName = \"openclaw-agent\";\n\n if (hasAgent.toLowerCase() === \"y\") {\n agentId = await ask(\"Enter agent ID: \");\n } else {\n const customName = await ask(\n `Agent name for auto-provisioning [openclaw-agent]: `,\n );\n if (customName.trim()) agentName = customName.trim();\n }\n\n // Step 3: Validate\n console.log(\"\\nValidating API key and provisioning agent...\");\n const result = await setup({\n apiKey: apiKey.trim(),\n agentId: agentId?.trim() || undefined,\n agentName,\n writeConfig: false,\n });\n console.log(`Agent ready: ${result.agentId}`);\n\n // Step 4: Write config\n const configPath = await ask(\"Path to openclaw.json [./openclaw.json]: \");\n const resolvedPath = configPath.trim() || \"./openclaw.json\";\n\n mergeOpenClawConfig(resolvedPath, result.config);\n console.log(`\\nConfig written to ${path.resolve(resolvedPath)}`);\n\n // Step 5: Env var hint\n console.log(\"\\n--- Setup Complete ---\\n\");\n console.log(\"Set your API key as an environment variable (recommended):\\n\");\n console.log(` export SONZAI_API_KEY=\"${apiKey.trim()}\"\\n`);\n console.log(\"Or add it to your shell profile (~/.bashrc, ~/.zshrc).\\n\");\n console.log(\n \"The agent ID is saved in openclaw.json — no need to set SONZAI_AGENT_ID.\\n\",\n );\n } finally {\n rl.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction buildOpenClawConfig(\n _apiKey: string,\n agentId: string,\n): Record<string, unknown> {\n return {\n plugins: {\n slots: {\n contextEngine: \"sonzai\",\n },\n entries: {\n sonzai: {\n enabled: true,\n agentId,\n // apiKey is intentionally NOT written to the config file —\n // it should be set via SONZAI_API_KEY env var for security.\n },\n },\n },\n };\n}\n\nfunction mergeOpenClawConfig(\n configPath: string,\n pluginConfig: Record<string, unknown>,\n): void {\n let existing: Record<string, unknown> = {};\n\n const resolvedPath = path.resolve(configPath);\n if (fs.existsSync(resolvedPath)) {\n try {\n const raw = fs.readFileSync(resolvedPath, \"utf-8\");\n existing = JSON.parse(raw);\n } catch {\n // If parse fails, start fresh\n }\n }\n\n // Deep merge plugins section\n const merged = { ...existing };\n const existingPlugins = (merged.plugins || {}) as Record<string, unknown>;\n const newPlugins = pluginConfig.plugins as Record<string, unknown>;\n\n const existingSlots = (existingPlugins.slots || {}) as Record<string, unknown>;\n const newSlots = (newPlugins.slots || {}) as Record<string, unknown>;\n\n const existingEntries = (existingPlugins.entries || {}) as Record<string, unknown>;\n const newEntries = (newPlugins.entries || {}) as Record<string, unknown>;\n\n merged.plugins = {\n ...existingPlugins,\n slots: { ...existingSlots, ...newSlots },\n entries: { ...existingEntries, ...newEntries },\n };\n\n fs.writeFileSync(resolvedPath, JSON.stringify(merged, null, 2) + \"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI entry point\n// ---------------------------------------------------------------------------\n\n/** Run when invoked as `npx @sonzai-labs/openclaw-context setup` */\nexport async function main(): Promise<void> {\n const command = process.argv[2];\n\n if (command === \"setup\") {\n await interactiveSetup();\n } else {\n console.log(\"Usage: npx @sonzai-labs/openclaw-context setup\");\n console.log(\"\\nRun interactive setup to configure the Sonzai OpenClaw plugin.\");\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@sonzai-labs/openclaw-context",
3
+ "version": "1.0.0",
4
+ "description": "OpenClaw ContextEngine plugin for the Sonzai Mind Layer — gives OpenClaw agents hierarchical memory, personality evolution, mood tracking, and fact extraction",
5
+ "license": "MIT",
6
+ "author": "Sonzai Labs <engineering@sonz.ai>",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/sonz-ai/openclaw-context.git"
10
+ },
11
+ "homepage": "https://github.com/sonz-ai/openclaw-context#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/sonz-ai/openclaw-context/issues"
14
+ },
15
+ "keywords": [
16
+ "sonzai",
17
+ "openclaw",
18
+ "context-engine",
19
+ "memory",
20
+ "ai",
21
+ "agents",
22
+ "plugin"
23
+ ],
24
+ "type": "module",
25
+ "main": "./dist/index.cjs",
26
+ "module": "./dist/index.js",
27
+ "types": "./dist/index.d.ts",
28
+ "exports": {
29
+ ".": {
30
+ "import": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ },
34
+ "require": {
35
+ "types": "./dist/index.d.cts",
36
+ "default": "./dist/index.cjs"
37
+ }
38
+ }
39
+ },
40
+ "bin": {
41
+ "sonzai-openclaw": "./dist/cli.js"
42
+ },
43
+ "files": ["dist", "LICENSE", "README.md"],
44
+ "scripts": {
45
+ "build": "tsup",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "typecheck": "tsc --noEmit",
49
+ "lint": "biome check src/",
50
+ "clean": "rm -rf dist"
51
+ },
52
+ "peerDependencies": {
53
+ "@sonzai-labs/agents": "^1.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@biomejs/biome": "^2.4.10",
57
+ "@sonzai-labs/agents": "^1.0.2",
58
+ "@types/node": "^25.5.0",
59
+ "msw": "^2.12.14",
60
+ "tsup": "^8.5.1",
61
+ "typescript": "^6.0.2",
62
+ "vitest": "^4.1.2"
63
+ },
64
+ "engines": {
65
+ "node": ">=18.0.0"
66
+ }
67
+ }