@agentmemory/agentmemory 0.7.0 → 0.7.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["API_URL","API_URL","API_URL","VALID_TYPES","MS_PER_DAY","DEFAULTS","findObservation","checkAuth"],"sources":["../src/config.ts","../src/providers/agent-sdk.ts","../src/providers/anthropic.ts","../src/providers/openrouter.ts","../src/providers/circuit-breaker.ts","../src/providers/resilient.ts","../src/providers/fallback-chain.ts","../src/providers/embedding/gemini.ts","../src/providers/embedding/openai.ts","../src/providers/embedding/voyage.ts","../src/providers/embedding/cohere.ts","../src/providers/embedding/openrouter.ts","../src/providers/embedding/local.ts","../src/providers/embedding/index.ts","../src/providers/index.ts","../src/state/kv.ts","../src/state/vector-index.ts","../src/state/schema.ts","../src/functions/graph-retrieval.ts","../src/functions/query-expansion.ts","../src/state/hybrid-search.ts","../src/state/stemmer.ts","../src/state/synonyms.ts","../src/state/search-index.ts","../src/state/index-persistence.ts","../src/functions/privacy.ts","../src/state/keyed-mutex.ts","../src/functions/observe.ts","../src/prompts/compression.ts","../src/prompts/xml.ts","../src/functions/search.ts","../src/eval/schemas.ts","../src/eval/validator.ts","../src/eval/quality.ts","../src/eval/self-correct.ts","../src/functions/compress.ts","../src/functions/context.ts","../src/prompts/summary.ts","../src/functions/summarize.ts","../src/functions/migrate.ts","../src/functions/file-index.ts","../src/functions/consolidate.ts","../src/functions/patterns.ts","../src/functions/remember.ts","../src/functions/evict.ts","../src/functions/relations.ts","../src/functions/timeline.ts","../src/functions/smart-search.ts","../src/functions/profile.ts","../src/functions/auto-forget.ts","../src/version.ts","../src/functions/export-import.ts","../src/functions/enrich.ts","../src/functions/audit.ts","../src/functions/claude-bridge.ts","../src/prompts/graph-extraction.ts","../src/functions/graph.ts","../src/prompts/consolidation.ts","../src/functions/consolidation-pipeline.ts","../src/functions/team.ts","../src/functions/governance.ts","../src/functions/snapshot.ts","../src/functions/actions.ts","../src/functions/frontier.ts","../src/functions/leases.ts","../src/functions/routines.ts","../src/functions/signals.ts","../src/functions/checkpoints.ts","../src/functions/flow-compress.ts","../src/functions/mesh.ts","../src/functions/branch-aware.ts","../src/functions/sentinels.ts","../src/functions/sketches.ts","../src/functions/crystallize.ts","../src/functions/diagnostics.ts","../src/functions/facets.ts","../src/functions/verify.ts","../src/functions/cascade.ts","../src/functions/lessons.ts","../src/functions/obsidian-export.ts","../src/functions/sliding-window.ts","../src/functions/temporal-graph.ts","../src/functions/retention.ts","../src/health/thresholds.ts","../src/health/monitor.ts","../src/auth.ts","../src/triggers/api.ts","../src/triggers/events.ts","../src/mcp/tools-registry.ts","../src/mcp/server.ts","../src/viewer/server.ts","../src/eval/metrics-store.ts","../src/functions/dedup.ts","../src/telemetry/setup.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type {\n AgentMemoryConfig,\n ProviderConfig,\n EmbeddingConfig,\n FallbackConfig,\n ClaudeBridgeConfig,\n TeamConfig,\n} from \"./types.js\";\n\nfunction safeParseInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = parseInt(value, 10);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nconst DATA_DIR = join(homedir(), \".agentmemory\");\nconst ENV_FILE = join(DATA_DIR, \".env\");\n\nfunction loadEnvFile(): Record<string, string> {\n if (!existsSync(ENV_FILE)) return {};\n const content = readFileSync(ENV_FILE, \"utf-8\");\n const vars: Record<string, string> = {};\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n let val = trimmed.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n vars[key] = val;\n }\n return vars;\n}\n\nfunction detectProvider(env: Record<string, string>): ProviderConfig {\n const maxTokens = parseInt(env[\"MAX_TOKENS\"] || \"4096\", 10);\n\n if (env[\"ANTHROPIC_API_KEY\"]) {\n return {\n provider: \"anthropic\",\n model: env[\"ANTHROPIC_MODEL\"] || \"claude-sonnet-4-20250514\",\n maxTokens,\n };\n }\n if (env[\"GEMINI_API_KEY\"]) {\n return {\n provider: \"gemini\",\n model: env[\"GEMINI_MODEL\"] || \"gemini-2.0-flash\",\n maxTokens,\n };\n }\n if (env[\"OPENROUTER_API_KEY\"]) {\n return {\n provider: \"openrouter\",\n model: env[\"OPENROUTER_MODEL\"] || \"anthropic/claude-sonnet-4-20250514\",\n maxTokens,\n };\n }\n return {\n provider: \"agent-sdk\",\n model: \"claude-sonnet-4-20250514\",\n maxTokens: 4096,\n };\n}\n\nexport function loadConfig(): AgentMemoryConfig {\n const env = getMergedEnv();\n\n const provider = detectProvider(env);\n\n return {\n engineUrl: env[\"III_ENGINE_URL\"] || \"ws://localhost:49134\",\n restPort: parseInt(env[\"III_REST_PORT\"] || \"3111\", 10) || 3111,\n streamsPort: parseInt(env[\"III_STREAMS_PORT\"] || \"3112\", 10) || 3112,\n provider,\n tokenBudget: safeParseInt(env[\"TOKEN_BUDGET\"], 2000),\n maxObservationsPerSession: safeParseInt(env[\"MAX_OBS_PER_SESSION\"], 500),\n compressionModel: provider.model,\n dataDir: DATA_DIR,\n };\n}\n\nfunction getMergedEnv(\n overrides?: Record<string, string>,\n): Record<string, string> {\n const fileEnv = loadEnvFile();\n return { ...fileEnv, ...process.env, ...overrides } as Record<string, string>;\n}\n\nexport function getEnvVar(key: string): string | undefined {\n return getMergedEnv()[key];\n}\n\nexport function loadEmbeddingConfig(): EmbeddingConfig {\n const env = getMergedEnv();\n let bm25Weight = parseFloat(env[\"BM25_WEIGHT\"] || \"0.4\");\n let vectorWeight = parseFloat(env[\"VECTOR_WEIGHT\"] || \"0.6\");\n bm25Weight =\n isNaN(bm25Weight) || bm25Weight < 0 ? 0.4 : Math.min(bm25Weight, 1);\n vectorWeight =\n isNaN(vectorWeight) || vectorWeight < 0 ? 0.6 : Math.min(vectorWeight, 1);\n return {\n provider: env[\"EMBEDDING_PROVIDER\"] || undefined,\n bm25Weight,\n vectorWeight,\n };\n}\n\nexport function detectEmbeddingProvider(\n env?: Record<string, string>,\n): string | null {\n const source = env ?? getMergedEnv();\n const forced = source[\"EMBEDDING_PROVIDER\"];\n if (forced) return forced;\n\n if (source[\"GEMINI_API_KEY\"]) return \"gemini\";\n if (source[\"OPENAI_API_KEY\"]) return \"openai\";\n if (source[\"VOYAGE_API_KEY\"]) return \"voyage\";\n if (source[\"COHERE_API_KEY\"]) return \"cohere\";\n if (source[\"OPENROUTER_API_KEY\"]) return \"openrouter\";\n return null;\n}\n\nexport function loadClaudeBridgeConfig(): ClaudeBridgeConfig {\n const env = getMergedEnv();\n const enabled = env[\"CLAUDE_MEMORY_BRIDGE\"] === \"true\";\n const projectPath = env[\"CLAUDE_PROJECT_PATH\"] || \"\";\n const lineBudget = safeParseInt(env[\"CLAUDE_MEMORY_LINE_BUDGET\"], 200);\n let memoryFilePath = \"\";\n if (enabled && projectPath) {\n const safePath = projectPath.replace(/[/\\\\]/g, \"-\").replace(/^-/, \"\");\n memoryFilePath = join(\n homedir(),\n \".claude\",\n \"projects\",\n safePath,\n \"memory\",\n \"MEMORY.md\",\n );\n }\n return { enabled, projectPath, memoryFilePath, lineBudget };\n}\n\nexport function loadTeamConfig(): TeamConfig | null {\n const env = getMergedEnv();\n const teamId = env[\"TEAM_ID\"];\n const userId = env[\"USER_ID\"];\n if (!teamId || !userId) return null;\n const mode = env[\"TEAM_MODE\"] === \"shared\" ? \"shared\" : \"private\";\n return { teamId, userId, mode };\n}\n\nexport function loadSnapshotConfig(): {\n enabled: boolean;\n interval: number;\n dir: string;\n} {\n const env = getMergedEnv();\n return {\n enabled: env[\"SNAPSHOT_ENABLED\"] === \"true\",\n interval: safeParseInt(env[\"SNAPSHOT_INTERVAL\"], 3600),\n dir: env[\"SNAPSHOT_DIR\"] || join(homedir(), \".agentmemory\", \"snapshots\"),\n };\n}\n\nexport function isGraphExtractionEnabled(): boolean {\n return getMergedEnv()[\"GRAPH_EXTRACTION_ENABLED\"] === \"true\";\n}\n\nexport function getGraphBatchSize(): number {\n return safeParseInt(getMergedEnv()[\"GRAPH_EXTRACTION_BATCH_SIZE\"], 10);\n}\n\nexport function isConsolidationEnabled(): boolean {\n return getMergedEnv()[\"CONSOLIDATION_ENABLED\"] === \"true\";\n}\n\nexport function getConsolidationDecayDays(): number {\n return safeParseInt(getMergedEnv()[\"CONSOLIDATION_DECAY_DAYS\"], 30);\n}\n\nexport function isStandaloneMcp(): boolean {\n return getMergedEnv()[\"STANDALONE_MCP\"] === \"true\";\n}\n\nexport function getStandalonePersistPath(): string {\n const env = getMergedEnv();\n return (\n env[\"STANDALONE_PERSIST_PATH\"] ||\n join(homedir(), \".agentmemory\", \"standalone.json\")\n );\n}\n\nconst VALID_PROVIDERS = new Set([\n \"anthropic\",\n \"gemini\",\n \"openrouter\",\n \"agent-sdk\",\n]);\n\nexport function loadFallbackConfig(): FallbackConfig {\n const env = getMergedEnv();\n const raw = env[\"FALLBACK_PROVIDERS\"] || \"\";\n const providers = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(\n (p): p is FallbackConfig[\"providers\"][number] =>\n Boolean(p) && VALID_PROVIDERS.has(p),\n );\n return { providers };\n}\n","import type { MemoryProvider } from '../types.js'\n\nexport class AgentSDKProvider implements MemoryProvider {\n name = 'agent-sdk'\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.query(systemPrompt, userPrompt)\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.query(systemPrompt, userPrompt)\n }\n\n private async query(systemPrompt: string, userPrompt: string): Promise<string> {\n const { query } = await import('@anthropic-ai/claude-agent-sdk')\n\n const messages = query({\n prompt: userPrompt,\n options: {\n systemPrompt,\n maxTurns: 1,\n allowedTools: [],\n },\n })\n\n let result = ''\n for await (const msg of messages) {\n if (msg.type === 'result') {\n result = typeof msg.result === 'string' ? msg.result : JSON.stringify(msg.result)\n }\n }\n return result\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport type { MemoryProvider } from '../types.js'\n\nexport class AnthropicProvider implements MemoryProvider {\n name = 'anthropic'\n private client: Anthropic\n private model: string\n private maxTokens: number\n\n constructor(apiKey: string, model: string, maxTokens: number) {\n this.client = new Anthropic({ apiKey })\n this.model = model\n this.maxTokens = maxTokens\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt)\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt)\n }\n\n private async call(systemPrompt: string, userPrompt: string): Promise<string> {\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: this.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userPrompt }],\n })\n\n const textBlock = response.content.find((b) => b.type === 'text')\n return textBlock?.text ?? ''\n }\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nexport class OpenRouterProvider implements MemoryProvider {\n name: string;\n private apiKey: string;\n private model: string;\n private maxTokens: number;\n private baseUrl: string;\n\n constructor(\n apiKey: string,\n model: string,\n maxTokens: number,\n baseUrl: string,\n ) {\n this.apiKey = apiKey;\n this.model = model;\n this.maxTokens = maxTokens;\n this.baseUrl = baseUrl;\n this.name = baseUrl.includes(\"openrouter\") ? \"openrouter\" : \"gemini\";\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt);\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt);\n }\n\n private async call(\n systemPrompt: string,\n userPrompt: string,\n ): Promise<string> {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...(this.baseUrl.includes(\"openrouter\")\n ? { \"HTTP-Referer\": \"https://github.com/rohitg00/agentmemory\" }\n : {}),\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: this.maxTokens,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${this.name} API error (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const choices = data.choices as\n | Array<{ message: { content: string } }>\n | undefined;\n const content = choices?.[0]?.message?.content;\n if (!content) {\n throw new Error(\n `${this.name} returned unexpected response: ${JSON.stringify(data).slice(0, 200)}`,\n );\n }\n return content;\n }\n}\n","import type { CircuitBreakerState } from \"../types.js\";\n\ninterface CircuitBreakerOptions {\n failureThreshold?: number;\n failureWindowMs?: number;\n recoveryTimeoutMs?: number;\n}\n\nfunction positiveFinite(val: number | undefined, fallback: number): number {\n return Number.isFinite(val) && val! > 0 ? val! : fallback;\n}\n\nexport class CircuitBreaker {\n private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n private failures = 0;\n private lastFailureAt: number | null = null;\n private openedAt: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly failureWindowMs: number;\n private readonly recoveryTimeoutMs: number;\n\n constructor(opts?: CircuitBreakerOptions) {\n this.failureThreshold = Math.max(\n 1,\n Math.floor(positiveFinite(opts?.failureThreshold, 3)),\n );\n this.failureWindowMs = positiveFinite(opts?.failureWindowMs, 60_000);\n this.recoveryTimeoutMs = positiveFinite(opts?.recoveryTimeoutMs, 30_000);\n }\n\n get isAllowed(): boolean {\n if (this.state === \"closed\") return true;\n if (this.state === \"open\") {\n if (\n this.openedAt &&\n Date.now() - this.openedAt >= this.recoveryTimeoutMs\n ) {\n this.state = \"half-open\";\n return true;\n }\n return false;\n }\n return true;\n }\n\n recordSuccess(): void {\n if (this.state === \"half-open\") {\n this.state = \"closed\";\n this.failures = 0;\n this.lastFailureAt = null;\n this.openedAt = null;\n }\n }\n\n recordFailure(): void {\n const now = Date.now();\n if (this.state === \"half-open\") {\n this.state = \"open\";\n this.openedAt = now;\n return;\n }\n if (this.lastFailureAt && now - this.lastFailureAt > this.failureWindowMs) {\n this.failures = 0;\n }\n this.failures += 1;\n this.lastFailureAt = now;\n if (this.failures >= this.failureThreshold) {\n this.state = \"open\";\n this.openedAt = now;\n }\n }\n\n getState(): CircuitBreakerState {\n return {\n state: this.state,\n failures: this.failures,\n lastFailureAt: this.lastFailureAt,\n openedAt: this.openedAt,\n };\n }\n}\n","import type { MemoryProvider, CircuitBreakerState } from \"../types.js\";\nimport { CircuitBreaker } from \"./circuit-breaker.js\";\n\nexport class ResilientProvider implements MemoryProvider {\n private breaker = new CircuitBreaker();\n name: string;\n\n constructor(private inner: MemoryProvider) {\n this.name = `resilient(${inner.name})`;\n }\n\n private async call(fn: () => Promise<string>): Promise<string> {\n if (!this.breaker.isAllowed) {\n throw new Error(\"circuit_breaker_open\");\n }\n try {\n const result = await fn();\n this.breaker.recordSuccess();\n return result;\n } catch (err) {\n this.breaker.recordFailure();\n throw err;\n }\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(() => this.inner.compress(systemPrompt, userPrompt));\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(() => this.inner.summarize(systemPrompt, userPrompt));\n }\n\n get circuitState(): CircuitBreakerState {\n return this.breaker.getState();\n }\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nexport class FallbackChainProvider implements MemoryProvider {\n name: string;\n\n constructor(private providers: MemoryProvider[]) {\n this.name = `fallback(${providers.map((p) => p.name).join(\" -> \")})`;\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.tryAll((p) => p.compress(systemPrompt, userPrompt));\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.tryAll((p) => p.summarize(systemPrompt, userPrompt));\n }\n\n private async tryAll(\n fn: (p: MemoryProvider) => Promise<string>,\n ): Promise<string> {\n let lastError: Error | null = null;\n for (const provider of this.providers) {\n try {\n return await fn(provider);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n }\n throw lastError || new Error(\"No providers available\");\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst BATCH_LIMIT = 100;\nconst API_BASE = \"https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:batchEmbedContent\";\n\nexport class GeminiEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"gemini\";\n readonly dimensions = 768;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"GEMINI_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"GEMINI_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const results: Float32Array[] = [];\n\n for (let i = 0; i < texts.length; i += BATCH_LIMIT) {\n const chunk = texts.slice(i, i + BATCH_LIMIT);\n const response = await fetch(`${API_BASE}?key=${this.apiKey}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n requests: chunk.map((t) => ({\n model: \"models/text-embedding-004\",\n content: { parts: [{ text: t }] },\n })),\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Gemini embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n embeddings: Array<{ values: number[] }>;\n };\n\n for (const emb of data.embeddings) {\n results.push(new Float32Array(emb.values));\n }\n }\n\n return results;\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.openai.com/v1/embeddings\";\n\nexport class OpenAIEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"openai\";\n readonly dimensions = 1536;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"OPENAI_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"OPENAI_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"text-embedding-3-small\",\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`OpenAI embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.voyageai.com/v1/embeddings\";\n\nexport class VoyageEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"voyage\";\n readonly dimensions = 1024;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"VOYAGE_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"VOYAGE_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"voyage-code-3\",\n input: texts,\n input_type: \"document\",\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Voyage embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.cohere.ai/v1/embed\";\n\nexport class CohereEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"cohere\";\n readonly dimensions = 1024;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"COHERE_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"COHERE_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"embed-english-v3.0\",\n texts,\n input_type: \"search_document\",\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Cohere embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n embeddings: number[][];\n };\n\n return data.embeddings.map((e) => new Float32Array(e));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://openrouter.ai/api/v1/embeddings\";\n\nexport class OpenRouterEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"openrouter\";\n readonly dimensions = 1536;\n private apiKey: string;\n private model: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"OPENROUTER_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"OPENROUTER_API_KEY is required\");\n this.model =\n getEnvVar(\"OPENROUTER_EMBEDDING_MODEL\") ||\n \"openai/text-embedding-3-small\";\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(\n `OpenRouter embedding failed (${response.status}): ${err}`,\n );\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\n\ntype Pipeline = (\n task: string,\n model: string,\n) => Promise<\n (\n texts: string[],\n options: { pooling: string; normalize: boolean },\n ) => Promise<{ tolist: () => number[][] }>\n>;\n\nexport class LocalEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"local\";\n readonly dimensions = 384;\n private extractor: Awaited<ReturnType<Pipeline>> | null = null;\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const extractor = await this.getExtractor();\n const output = await extractor(texts, {\n pooling: \"mean\",\n normalize: true,\n });\n const vectors = output.tolist();\n return vectors.map((v: number[]) => new Float32Array(v));\n }\n\n private async getExtractor() {\n if (this.extractor) return this.extractor;\n\n let transformers: { pipeline: Pipeline };\n try {\n // @ts-ignore - optional peer dependency\n transformers = await import(\"@xenova/transformers\");\n } catch {\n throw new Error(\n \"Install @xenova/transformers for local embeddings: npm install @xenova/transformers\",\n );\n }\n\n this.extractor = await transformers.pipeline(\n \"feature-extraction\",\n \"Xenova/all-MiniLM-L6-v2\",\n );\n return this.extractor;\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { detectEmbeddingProvider, getEnvVar } from \"../../config.js\";\nimport { GeminiEmbeddingProvider } from \"./gemini.js\";\nimport { OpenAIEmbeddingProvider } from \"./openai.js\";\nimport { VoyageEmbeddingProvider } from \"./voyage.js\";\nimport { CohereEmbeddingProvider } from \"./cohere.js\";\nimport { OpenRouterEmbeddingProvider } from \"./openrouter.js\";\nimport { LocalEmbeddingProvider } from \"./local.js\";\n\nexport {\n GeminiEmbeddingProvider,\n OpenAIEmbeddingProvider,\n VoyageEmbeddingProvider,\n CohereEmbeddingProvider,\n OpenRouterEmbeddingProvider,\n LocalEmbeddingProvider,\n};\n\nexport function createEmbeddingProvider(): EmbeddingProvider | null {\n const detected = detectEmbeddingProvider();\n if (!detected) return null;\n\n switch (detected) {\n case \"gemini\":\n return new GeminiEmbeddingProvider(getEnvVar(\"GEMINI_API_KEY\")!);\n case \"openai\":\n return new OpenAIEmbeddingProvider(getEnvVar(\"OPENAI_API_KEY\")!);\n case \"voyage\":\n return new VoyageEmbeddingProvider(getEnvVar(\"VOYAGE_API_KEY\")!);\n case \"cohere\":\n return new CohereEmbeddingProvider(getEnvVar(\"COHERE_API_KEY\")!);\n case \"openrouter\":\n return new OpenRouterEmbeddingProvider(getEnvVar(\"OPENROUTER_API_KEY\")!);\n case \"local\":\n return new LocalEmbeddingProvider();\n default:\n return null;\n }\n}\n","import type {\n MemoryProvider,\n ProviderConfig,\n FallbackConfig,\n} from \"../types.js\";\nimport { AgentSDKProvider } from \"./agent-sdk.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OpenRouterProvider } from \"./openrouter.js\";\nimport { ResilientProvider } from \"./resilient.js\";\nimport { FallbackChainProvider } from \"./fallback-chain.js\";\nimport { getEnvVar } from \"../config.js\";\n\nexport { createEmbeddingProvider } from \"./embedding/index.js\";\n\nfunction requireEnvVar(key: string): string {\n const value = getEnvVar(key);\n if (!value) {\n throw new Error(\n `Missing required environment variable: ${key}. Set it in ~/.agentmemory/.env or as an environment variable.`,\n );\n }\n return value;\n}\n\nexport function createProvider(config: ProviderConfig): ResilientProvider {\n return new ResilientProvider(createBaseProvider(config));\n}\n\nexport function createFallbackProvider(\n config: ProviderConfig,\n fallbackConfig: FallbackConfig,\n): ResilientProvider {\n if (fallbackConfig.providers.length === 0) {\n return createProvider(config);\n }\n\n const providers: MemoryProvider[] = [createBaseProvider(config)];\n for (const providerType of fallbackConfig.providers) {\n if (providerType === config.provider) continue;\n try {\n const fbConfig: ProviderConfig = {\n provider: providerType,\n model: config.model,\n maxTokens: config.maxTokens,\n };\n providers.push(createBaseProvider(fbConfig));\n } catch {\n // skip unavailable fallback providers\n }\n }\n\n if (providers.length > 1) {\n return new ResilientProvider(new FallbackChainProvider(providers));\n }\n return new ResilientProvider(providers[0]);\n}\n\nfunction createBaseProvider(config: ProviderConfig): MemoryProvider {\n switch (config.provider) {\n case \"anthropic\":\n return new AnthropicProvider(\n requireEnvVar(\"ANTHROPIC_API_KEY\"),\n config.model,\n config.maxTokens,\n );\n case \"gemini\":\n return new OpenRouterProvider(\n requireEnvVar(\"GEMINI_API_KEY\"),\n config.model,\n config.maxTokens,\n \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\",\n );\n case \"openrouter\":\n return new OpenRouterProvider(\n requireEnvVar(\"OPENROUTER_API_KEY\"),\n config.model,\n config.maxTokens,\n \"https://openrouter.ai/api/v1/chat/completions\",\n );\n case \"agent-sdk\":\n default:\n return new AgentSDKProvider();\n }\n}\n","import type { ISdk } from 'iii-sdk'\n\nexport class StateKV {\n constructor(private sdk: ISdk) {}\n\n async get<T = unknown>(scope: string, key: string): Promise<T | null> {\n return this.sdk.trigger<{ scope: string; key: string }, T | null>(\n 'state::get',\n { scope, key },\n )\n }\n\n async set<T = unknown>(scope: string, key: string, data: T): Promise<T> {\n return this.sdk.trigger<{ scope: string; key: string; data: T }, T>(\n 'state::set',\n { scope, key, data },\n )\n }\n\n async delete(scope: string, key: string): Promise<void> {\n return this.sdk.trigger<{ scope: string; key: string }, void>(\n 'state::delete',\n { scope, key },\n )\n }\n\n async list<T = unknown>(scope: string): Promise<T[]> {\n return this.sdk.trigger<{ scope: string }, T[]>(\n 'state::list',\n { scope },\n )\n }\n}\n","function float32ToBase64(arr: Float32Array): string {\n return Buffer.from(arr.buffer).toString(\"base64\");\n}\n\nfunction base64ToFloat32(b64: string): Float32Array {\n return new Float32Array(Buffer.from(b64, \"base64\").buffer);\n}\n\nfunction cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (a.length !== b.length) return 0;\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n\nexport class VectorIndex {\n private vectors: Map<string, { embedding: Float32Array; sessionId: string }> =\n new Map();\n\n add(obsId: string, sessionId: string, embedding: Float32Array): void {\n this.vectors.set(obsId, { embedding, sessionId });\n }\n\n remove(obsId: string): void {\n this.vectors.delete(obsId);\n }\n\n search(\n query: Float32Array,\n limit = 20,\n ): Array<{ obsId: string; sessionId: string; score: number }> {\n const results: Array<{\n obsId: string;\n sessionId: string;\n score: number;\n }> = [];\n let minScore = -Infinity;\n\n for (const [obsId, entry] of this.vectors) {\n const score = cosineSimilarity(query, entry.embedding);\n if (results.length < limit) {\n results.push({ obsId, sessionId: entry.sessionId, score });\n if (results.length === limit) {\n results.sort((a, b) => a.score - b.score);\n minScore = results[0].score;\n }\n } else if (score > minScore) {\n results[0] = { obsId, sessionId: entry.sessionId, score };\n results.sort((a, b) => a.score - b.score);\n minScore = results[0].score;\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results;\n }\n\n get size(): number {\n return this.vectors.size;\n }\n\n clear(): void {\n this.vectors.clear();\n }\n\n restoreFrom(other: VectorIndex): void {\n const src = (other as any).vectors as Map<\n string,\n { embedding: Float32Array; sessionId: string }\n >;\n this.vectors = new Map();\n for (const [obsId, entry] of src) {\n this.vectors.set(obsId, {\n embedding: new Float32Array(entry.embedding),\n sessionId: entry.sessionId,\n });\n }\n }\n\n serialize(): string {\n const data: Array<[string, { embedding: string; sessionId: string }]> = [];\n for (const [obsId, entry] of this.vectors) {\n data.push([\n obsId,\n {\n embedding: float32ToBase64(entry.embedding),\n sessionId: entry.sessionId,\n },\n ]);\n }\n return JSON.stringify(data);\n }\n\n static deserialize(json: string): VectorIndex {\n const idx = new VectorIndex();\n let data: unknown;\n try {\n data = JSON.parse(json);\n } catch {\n return idx;\n }\n if (!Array.isArray(data)) return idx;\n for (const row of data) {\n try {\n if (!Array.isArray(row) || row.length < 2) continue;\n const [obsId, entry] = row;\n if (\n typeof obsId !== \"string\" ||\n typeof entry?.embedding !== \"string\" ||\n typeof entry?.sessionId !== \"string\"\n )\n continue;\n idx.vectors.set(obsId, {\n embedding: base64ToFloat32(entry.embedding),\n sessionId: entry.sessionId,\n });\n } catch {\n continue;\n }\n }\n return idx;\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport const KV = {\n sessions: \"mem:sessions\",\n observations: (sessionId: string) => `mem:obs:${sessionId}`,\n memories: \"mem:memories\",\n summaries: \"mem:summaries\",\n config: \"mem:config\",\n metrics: \"mem:metrics\",\n health: \"mem:health\",\n embeddings: (obsId: string) => `mem:emb:${obsId}`,\n bm25Index: \"mem:index:bm25\",\n relations: \"mem:relations\",\n profiles: \"mem:profiles\",\n claudeBridge: \"mem:claude-bridge\",\n graphNodes: \"mem:graph:nodes\",\n graphEdges: \"mem:graph:edges\",\n semantic: \"mem:semantic\",\n procedural: \"mem:procedural\",\n teamShared: (teamId: string) => `mem:team:${teamId}:shared`,\n teamUsers: (teamId: string, userId: string) =>\n `mem:team:${teamId}:users:${userId}`,\n teamProfile: (teamId: string) => `mem:team:${teamId}:profile`,\n audit: \"mem:audit\",\n actions: \"mem:actions\",\n actionEdges: \"mem:action-edges\",\n leases: \"mem:leases\",\n routines: \"mem:routines\",\n routineRuns: \"mem:routine-runs\",\n signals: \"mem:signals\",\n checkpoints: \"mem:checkpoints\",\n mesh: \"mem:mesh\",\n sketches: \"mem:sketches\",\n facets: \"mem:facets\",\n sentinels: \"mem:sentinels\",\n crystals: \"mem:crystals\",\n lessons: \"mem:lessons\",\n graphEdgeHistory: \"mem:graph:edge-history\",\n enrichedChunks: (sessionId: string) => `mem:enriched:${sessionId}`,\n latentEmbeddings: (obsId: string) => `mem:latent:${obsId}`,\n retentionScores: \"mem:retention\",\n} as const;\n\nexport const STREAM = {\n name: \"mem-live\",\n group: (sessionId: string) => sessionId,\n viewerGroup: \"viewer\",\n} as const;\n\nexport function generateId(prefix: string): string {\n const ts = Date.now().toString(36);\n const rand = crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n return `${prefix}_${ts}_${rand}`;\n}\n\nexport function fingerprintId(prefix: string, content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `${prefix}_${hash.slice(0, 16)}`;\n}\n\nexport function jaccardSimilarity(a: string, b: string): number {\n const setA = new Set(a.split(/\\s+/).filter((t) => t.length > 2));\n const setB = new Set(b.split(/\\s+/).filter((t) => t.length > 2));\n if (setA.size === 0 && setB.size === 0) return 1;\n if (setA.size === 0 || setB.size === 0) return 0;\n let intersection = 0;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n return intersection / (setA.size + setB.size - intersection);\n}\n","import type {\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nexport interface GraphRetrievalResult {\n obsId: string;\n sessionId: string;\n score: number;\n graphContext: string;\n pathLength: number;\n}\n\nfunction buildGraphContext(\n path: Array<{ node: GraphNode; edge?: GraphEdge }>,\n): string {\n const parts: string[] = [];\n for (const step of path) {\n const props = Object.entries(step.node.properties)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n let line = `[${step.node.type}] ${step.node.name}`;\n if (props) line += ` (${props})`;\n if (step.edge) {\n line += ` --${step.edge.type}-->`;\n if (step.edge.context?.reasoning) {\n line += ` [${step.edge.context.reasoning}]`;\n }\n if (step.edge.tvalid) {\n line += ` @${step.edge.tvalid}`;\n }\n }\n parts.push(line);\n }\n return parts.join(\" \");\n}\n\nexport class GraphRetrieval {\n constructor(private kv: StateKV) {}\n\n async searchByEntities(\n entityNames: string[],\n maxDepth = 2,\n maxResults = 20,\n ): Promise<GraphRetrievalResult[]> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const matchingNodes = allNodes.filter((n) => {\n const nameLower = n.name.toLowerCase();\n return entityNames.some(\n (e) =>\n nameLower.includes(e.toLowerCase()) ||\n e.toLowerCase().includes(nameLower),\n );\n });\n\n if (matchingNodes.length === 0) return [];\n\n const results: GraphRetrievalResult[] = [];\n const visitedObs = new Set<string>();\n\n for (const startNode of matchingNodes) {\n const paths = this.bfsTraversal(\n startNode,\n allNodes,\n allEdges,\n maxDepth,\n );\n\n for (const path of paths) {\n const lastNode = path[path.length - 1].node;\n for (const obsId of lastNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n\n const pathLength = path.length;\n const edgeWeights = path\n .filter((s) => s.edge)\n .map((s) => s.edge!.weight);\n const avgWeight =\n edgeWeights.length > 0\n ? edgeWeights.reduce((a, b) => a + b, 0) / edgeWeights.length\n : 0.5;\n const score = avgWeight * (1 / pathLength);\n\n results.push({\n obsId,\n sessionId: \"\",\n score,\n graphContext: buildGraphContext(path),\n pathLength,\n });\n }\n }\n\n for (const obsId of startNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n results.push({\n obsId,\n sessionId: \"\",\n score: 1.0,\n graphContext: `[${startNode.type}] ${startNode.name}`,\n pathLength: 0,\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n }\n\n async expandFromChunks(\n obsIds: string[],\n maxDepth = 1,\n maxResults = 10,\n ): Promise<GraphRetrievalResult[]> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const linkedNodes = allNodes.filter((n) =>\n n.sourceObservationIds.some((id) => obsIds.includes(id)),\n );\n\n const results: GraphRetrievalResult[] = [];\n const visitedObs = new Set<string>(obsIds);\n\n for (const node of linkedNodes) {\n const paths = this.bfsTraversal(node, allNodes, allEdges, maxDepth);\n for (const path of paths) {\n const lastNode = path[path.length - 1].node;\n for (const obsId of lastNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n\n const pathLength = path.length;\n const score = 0.5 * (1 / (pathLength + 1));\n\n results.push({\n obsId,\n sessionId: \"\",\n score,\n graphContext: buildGraphContext(path),\n pathLength,\n });\n }\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n }\n\n async temporalQuery(\n entityName: string,\n asOf?: string,\n ): Promise<{\n entity: GraphNode | null;\n currentState: GraphEdge[];\n history: GraphEdge[];\n }> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const entity = allNodes.find(\n (n) => n.name.toLowerCase() === entityName.toLowerCase(),\n );\n if (!entity) return { entity: null, currentState: [], history: [] };\n\n const relatedEdges = allEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n if (!asOf) {\n const latestEdges = this.getLatestEdges(relatedEdges);\n const historicalEdges = relatedEdges.filter(\n (e) => !latestEdges.some((le) => le.id === e.id),\n );\n return { entity, currentState: latestEdges, history: historicalEdges };\n }\n\n const asOfDate = new Date(asOf).getTime();\n const validEdges = relatedEdges.filter((e) => {\n const commitDate = new Date(e.tcommit || e.createdAt).getTime();\n if (commitDate > asOfDate) return false;\n if (e.tvalid) {\n const validDate = new Date(e.tvalid).getTime();\n if (validDate > asOfDate) return false;\n }\n if (e.tvalidEnd) {\n const endDate = new Date(e.tvalidEnd).getTime();\n if (endDate < asOfDate) return false;\n }\n return true;\n });\n\n return {\n entity,\n currentState: this.getLatestEdges(validEdges),\n history: validEdges,\n };\n }\n\n private getLatestEdges(edges: GraphEdge[]): GraphEdge[] {\n const byKey = new Map<string, GraphEdge[]>();\n for (const e of edges) {\n const key = `${e.sourceNodeId}|${e.targetNodeId}|${e.type}`;\n if (!byKey.has(key)) byKey.set(key, []);\n byKey.get(key)!.push(e);\n }\n\n const latest: GraphEdge[] = [];\n for (const group of byKey.values()) {\n if (group.length === 0) continue;\n group.sort(\n (a, b) =>\n new Date(b.tcommit || b.createdAt).getTime() -\n new Date(a.tcommit || a.createdAt).getTime(),\n );\n const newest = group.find((e) => e.isLatest !== false) || group[0];\n latest.push(newest);\n }\n return latest;\n }\n\n private bfsTraversal(\n startNode: GraphNode,\n allNodes: GraphNode[],\n allEdges: GraphEdge[],\n maxDepth: number,\n ): Array<Array<{ node: GraphNode; edge?: GraphEdge }>> {\n const paths: Array<Array<{ node: GraphNode; edge?: GraphEdge }>> = [];\n const visited = new Set<string>();\n const queue: Array<{\n nodeId: string;\n depth: number;\n path: Array<{ node: GraphNode; edge?: GraphEdge }>;\n }> = [{ nodeId: startNode.id, depth: 0, path: [{ node: startNode }] }];\n\n visited.add(startNode.id);\n\n while (queue.length > 0) {\n const { nodeId, depth, path } = queue.shift()!;\n paths.push(path);\n\n if (depth >= maxDepth) continue;\n\n const neighborEdges = allEdges.filter(\n (e) => e.sourceNodeId === nodeId || e.targetNodeId === nodeId,\n );\n\n for (const edge of neighborEdges) {\n const nextId =\n edge.sourceNodeId === nodeId\n ? edge.targetNodeId\n : edge.sourceNodeId;\n if (visited.has(nextId)) continue;\n visited.add(nextId);\n\n const nextNode = allNodes.find((n) => n.id === nextId);\n if (!nextNode) continue;\n\n queue.push({\n nodeId: nextId,\n depth: depth + 1,\n path: [...path, { node: nextNode, edge }],\n });\n }\n }\n\n return paths;\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { MemoryProvider, QueryExpansion } from \"../types.js\";\n\nconst QUERY_EXPANSION_SYSTEM = `You are a query expansion engine for a memory retrieval system. Given a user query, generate diverse reformulations to maximize recall.\n\nOutput EXACTLY this XML:\n<expansion>\n <reformulations>\n <query>semantically diverse rephrasing 1</query>\n <query>semantically diverse rephrasing 2</query>\n <query>semantically diverse rephrasing 3</query>\n </reformulations>\n <temporal>\n <query>time-concretized version if applicable</query>\n </temporal>\n <entities>\n <entity>extracted entity name 1</entity>\n <entity>extracted entity name 2</entity>\n </entities>\n</expansion>\n\nRules:\n- Generate 3-5 reformulations capturing different interpretations\n- Include paraphrases, domain-specific restatements, and abstract/concrete variants\n- Extract any named entities (people, files, projects, libraries, concepts)\n- If the query mentions time (\"last week\", \"recently\"), generate temporal concretizations\n- Each reformulation should capture a distinct facet of intent\n- Keep reformulations concise (under 100 chars each)`;\n\nfunction parseExpansionXml(xml: string): QueryExpansion | null {\n const reformulations: string[] = [];\n const queryRegex =\n /<reformulations>[\\s\\S]*?<\\/reformulations>/;\n const reformBlock = xml.match(queryRegex);\n if (reformBlock) {\n const qRegex = /<query>([^<]+)<\\/query>/g;\n let match;\n while ((match = qRegex.exec(reformBlock[0])) !== null) {\n reformulations.push(match[1].trim());\n }\n }\n\n const temporalConcretizations: string[] = [];\n const tempBlock = xml.match(/<temporal>[\\s\\S]*?<\\/temporal>/);\n if (tempBlock) {\n const qRegex = /<query>([^<]+)<\\/query>/g;\n let match;\n while ((match = qRegex.exec(tempBlock[0])) !== null) {\n temporalConcretizations.push(match[1].trim());\n }\n }\n\n const entityExtractions: string[] = [];\n const entityRegex = /<entity>([^<]+)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n entityExtractions.push(match[1].trim());\n }\n\n return {\n original: \"\",\n reformulations,\n temporalConcretizations,\n entityExtractions,\n };\n}\n\nexport function registerQueryExpansionFunction(\n sdk: ISdk,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::expand-query\",\n description:\n \"Generate diverse query reformulations for improved recall\",\n },\n async (data: { query: string; maxReformulations?: number }) => {\n const ctx = getContext();\n const maxR = data.maxReformulations ?? 5;\n\n try {\n const response = await provider.compress(\n QUERY_EXPANSION_SYSTEM,\n `Expand this query for memory retrieval:\\n\\n\"${data.query}\"`,\n );\n\n const parsed = parseExpansionXml(response);\n if (!parsed) {\n ctx.logger.warn(\"Failed to parse query expansion\");\n return {\n success: true,\n expansion: {\n original: data.query,\n reformulations: [],\n temporalConcretizations: [],\n entityExtractions: [],\n },\n };\n }\n\n parsed.original = data.query;\n parsed.reformulations = parsed.reformulations.slice(0, maxR);\n\n ctx.logger.info(\"Query expanded\", {\n original: data.query,\n reformulations: parsed.reformulations.length,\n entities: parsed.entityExtractions.length,\n });\n\n return { success: true, expansion: parsed };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Query expansion failed\", { error: msg });\n return {\n success: true,\n expansion: {\n original: data.query,\n reformulations: [],\n temporalConcretizations: [],\n entityExtractions: [],\n },\n };\n }\n },\n );\n}\n\nexport function extractEntitiesFromQuery(query: string): string[] {\n const entities: string[] = [];\n const quoted = query.match(/\"([^\"]+)\"/g);\n if (quoted) {\n for (const q of quoted) {\n entities.push(q.replace(/\"/g, \"\"));\n }\n }\n const capitalized = query.match(/\\b[A-Z][a-zA-Z0-9_.-]+\\b/g);\n if (capitalized) {\n const stopWords = new Set([\n \"The\",\n \"This\",\n \"That\",\n \"What\",\n \"When\",\n \"Where\",\n \"How\",\n \"Why\",\n \"Who\",\n \"Which\",\n \"Did\",\n \"Does\",\n \"Do\",\n \"Is\",\n \"Are\",\n \"Was\",\n \"Were\",\n \"Has\",\n \"Have\",\n \"Had\",\n \"Can\",\n \"Could\",\n \"Would\",\n \"Should\",\n \"Will\",\n \"May\",\n \"Might\",\n \"If\",\n \"And\",\n \"But\",\n \"Or\",\n \"Not\",\n \"For\",\n \"From\",\n \"With\",\n \"About\",\n \"After\",\n \"Before\",\n \"Between\",\n ]);\n for (const c of capitalized) {\n if (!stopWords.has(c)) entities.push(c);\n }\n }\n return [...new Set(entities)];\n}\n","import { SearchIndex } from \"./search-index.js\";\nimport { VectorIndex } from \"./vector-index.js\";\nimport type {\n EmbeddingProvider,\n HybridSearchResult,\n CompressedObservation,\n QueryExpansion,\n} from \"../types.js\";\nimport type { StateKV } from \"./kv.js\";\nimport { KV } from \"./schema.js\";\nimport {\n GraphRetrieval,\n type GraphRetrievalResult,\n} from \"../functions/graph-retrieval.js\";\nimport { extractEntitiesFromQuery } from \"../functions/query-expansion.js\";\n\nconst RRF_K = 60;\n\nexport class HybridSearch {\n private graphRetrieval: GraphRetrieval;\n\n constructor(\n private bm25: SearchIndex,\n private vector: VectorIndex | null,\n private embeddingProvider: EmbeddingProvider | null,\n private kv: StateKV,\n private bm25Weight = 0.4,\n private vectorWeight = 0.6,\n private graphWeight = 0.3,\n ) {\n this.graphRetrieval = new GraphRetrieval(kv);\n }\n\n async search(query: string, limit = 20): Promise<HybridSearchResult[]> {\n return this.tripleStreamSearch(query, limit);\n }\n\n async searchWithExpansion(\n query: string,\n limit: number,\n expansion: QueryExpansion,\n ): Promise<HybridSearchResult[]> {\n const allQueries = [\n query,\n ...expansion.reformulations,\n ...expansion.temporalConcretizations,\n ];\n\n const allEntities = [\n ...expansion.entityExtractions,\n ...extractEntitiesFromQuery(query),\n ];\n\n const resultSets = await Promise.all(\n allQueries.map((q) => this.tripleStreamSearch(q, limit, allEntities)),\n );\n\n const merged = new Map<string, HybridSearchResult>();\n for (const results of resultSets) {\n for (const r of results) {\n const existing = merged.get(r.observation.id);\n if (!existing || r.combinedScore > existing.combinedScore) {\n merged.set(r.observation.id, r);\n }\n }\n }\n\n return Array.from(merged.values())\n .sort((a, b) => b.combinedScore - a.combinedScore)\n .slice(0, limit);\n }\n\n private async tripleStreamSearch(\n query: string,\n limit: number,\n entityHints?: string[],\n ): Promise<HybridSearchResult[]> {\n const bm25Results = this.bm25.search(query, limit * 2);\n\n let vectorResults: Array<{\n obsId: string;\n sessionId: string;\n score: number;\n }> = [];\n let queryEmbedding: Float32Array | null = null;\n\n if (this.vector && this.embeddingProvider && this.vector.size > 0) {\n try {\n queryEmbedding = await this.embeddingProvider.embed(query);\n vectorResults = this.vector.search(queryEmbedding, limit * 2);\n } catch {\n // fall through to BM25-only\n }\n }\n\n const entities =\n entityHints && entityHints.length > 0\n ? entityHints\n : extractEntitiesFromQuery(query);\n let graphResults: GraphRetrievalResult[] = [];\n if (entities.length > 0) {\n try {\n graphResults = await this.graphRetrieval.searchByEntities(\n entities,\n 2,\n limit,\n );\n } catch {\n // graph search is best-effort\n }\n }\n\n const topVectorObs = vectorResults.slice(0, 5).map((r) => r.obsId);\n if (topVectorObs.length > 0) {\n try {\n const expansionResults =\n await this.graphRetrieval.expandFromChunks(topVectorObs, 1, 5);\n graphResults = [...graphResults, ...expansionResults];\n } catch {\n // expansion is best-effort\n }\n }\n\n const scores = new Map<\n string,\n {\n bm25Rank: number;\n vectorRank: number;\n graphRank: number;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n graphContext?: string;\n }\n >();\n\n bm25Results.forEach((r, i) => {\n scores.set(r.obsId, {\n bm25Rank: i + 1,\n vectorRank: Infinity,\n graphRank: Infinity,\n sessionId: r.sessionId,\n bm25Score: r.score,\n vectorScore: 0,\n graphScore: 0,\n });\n });\n\n vectorResults.forEach((r, i) => {\n const existing = scores.get(r.obsId);\n if (existing) {\n existing.vectorRank = i + 1;\n existing.vectorScore = r.score;\n } else {\n scores.set(r.obsId, {\n bm25Rank: Infinity,\n vectorRank: i + 1,\n graphRank: Infinity,\n sessionId: r.sessionId,\n bm25Score: 0,\n vectorScore: r.score,\n graphScore: 0,\n });\n }\n });\n\n graphResults.forEach((r, i) => {\n const existing = scores.get(r.obsId);\n if (existing) {\n existing.graphRank = Math.min(existing.graphRank, i + 1);\n existing.graphScore = Math.max(existing.graphScore, r.score);\n if (r.graphContext && !existing.graphContext) {\n existing.graphContext = r.graphContext;\n }\n } else {\n scores.set(r.obsId, {\n bm25Rank: Infinity,\n vectorRank: Infinity,\n graphRank: i + 1,\n sessionId: r.sessionId,\n bm25Score: 0,\n vectorScore: 0,\n graphScore: r.score,\n graphContext: r.graphContext,\n });\n }\n });\n\n const hasVector = vectorResults.length > 0;\n const hasGraph = graphResults.length > 0;\n\n let effectiveBm25W = this.bm25Weight;\n let effectiveVectorW = hasVector ? this.vectorWeight : 0;\n let effectiveGraphW = hasGraph ? this.graphWeight : 0;\n\n const totalW = effectiveBm25W + effectiveVectorW + effectiveGraphW;\n if (totalW > 0) {\n effectiveBm25W /= totalW;\n effectiveVectorW /= totalW;\n effectiveGraphW /= totalW;\n }\n\n const combined = Array.from(scores.entries()).map(([obsId, s]) => ({\n obsId,\n sessionId: s.sessionId,\n bm25Score: s.bm25Score,\n vectorScore: s.vectorScore,\n graphScore: s.graphScore,\n graphContext: s.graphContext,\n combinedScore:\n effectiveBm25W * (1 / (RRF_K + s.bm25Rank)) +\n effectiveVectorW * (1 / (RRF_K + s.vectorRank)) +\n effectiveGraphW * (1 / (RRF_K + s.graphRank)),\n }));\n\n combined.sort((a, b) => b.combinedScore - a.combinedScore);\n const diversified = this.diversifyBySession(combined, limit);\n return this.enrichResults(diversified, limit);\n }\n\n private diversifyBySession(\n results: Array<{\n obsId: string;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n combinedScore: number;\n graphContext?: string;\n }>,\n limit: number,\n maxPerSession = 3,\n ): typeof results {\n const selected: typeof results = [];\n const sessionCounts = new Map<string, number>();\n\n for (const r of results) {\n const count = sessionCounts.get(r.sessionId) || 0;\n if (count >= maxPerSession) continue;\n selected.push(r);\n sessionCounts.set(r.sessionId, count + 1);\n if (selected.length >= limit) break;\n }\n\n if (selected.length < limit) {\n for (const r of results) {\n if (selected.length >= limit) break;\n if (!selected.some(s => s.obsId === r.obsId)) {\n selected.push(r);\n }\n }\n }\n\n return selected;\n }\n\n private async enrichResults(\n results: Array<{\n obsId: string;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n combinedScore: number;\n graphContext?: string;\n }>,\n limit: number,\n ): Promise<HybridSearchResult[]> {\n const sliced = results.slice(0, limit);\n const observations = await Promise.all(\n sliced.map((r) =>\n this.kv\n .get<CompressedObservation>(KV.observations(r.sessionId), r.obsId)\n .catch(() => null),\n ),\n );\n const enriched: HybridSearchResult[] = [];\n for (let i = 0; i < sliced.length; i++) {\n const obs = observations[i];\n if (obs) {\n enriched.push({\n observation: obs,\n bm25Score: sliced[i].bm25Score,\n vectorScore: sliced[i].vectorScore,\n graphScore: sliced[i].graphScore,\n combinedScore: sliced[i].combinedScore,\n sessionId: sliced[i].sessionId,\n graphContext: sliced[i].graphContext,\n });\n }\n }\n return enriched;\n }\n}\n","const step2map: Record<string, string> = {\n ational: \"ate\", tional: \"tion\", enci: \"ence\", anci: \"ance\",\n izer: \"ize\", iser: \"ise\", abli: \"able\", alli: \"al\",\n entli: \"ent\", eli: \"e\", ousli: \"ous\", ization: \"ize\",\n isation: \"ise\", ation: \"ate\", ator: \"ate\", alism: \"al\",\n iveness: \"ive\", fulness: \"ful\", ousness: \"ous\", aliti: \"al\",\n iviti: \"ive\", biliti: \"ble\",\n};\n\nconst step3map: Record<string, string> = {\n icate: \"ic\", ative: \"\", alize: \"al\", alise: \"al\",\n iciti: \"ic\", ical: \"ic\", ful: \"\", ness: \"\",\n};\n\nfunction hasVowel(s: string): boolean {\n return /[aeiou]/.test(s);\n}\n\nfunction measure(s: string): number {\n const reduced = s.replace(/[^aeiouy]+/g, \"C\").replace(/[aeiouy]+/g, \"V\");\n const m = reduced.match(/VC/g);\n return m ? m.length : 0;\n}\n\nfunction endsDoubleConsonant(s: string): boolean {\n return s.length >= 2 && s[s.length - 1] === s[s.length - 2] && !/[aeiou]/.test(s[s.length - 1]);\n}\n\nfunction endsCVC(s: string): boolean {\n if (s.length < 3) return false;\n const c1 = s[s.length - 3], v = s[s.length - 2], c2 = s[s.length - 1];\n return !/[aeiou]/.test(c1) && /[aeiou]/.test(v) && !/[aeiouwxy]/.test(c2);\n}\n\nexport function stem(word: string): string {\n if (word.length <= 2) return word;\n\n let w = word;\n\n if (w.endsWith(\"sses\")) w = w.slice(0, -2);\n else if (w.endsWith(\"ies\")) w = w.slice(0, -2);\n else if (!w.endsWith(\"ss\") && w.endsWith(\"s\")) w = w.slice(0, -1);\n\n if (w.endsWith(\"eed\")) {\n if (measure(w.slice(0, -3)) > 0) w = w.slice(0, -1);\n } else if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) {\n w = w.slice(0, -2);\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w += \"e\";\n else if (endsDoubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && endsCVC(w)) w += \"e\";\n } else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) {\n w = w.slice(0, -3);\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w += \"e\";\n else if (endsDoubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && endsCVC(w)) w += \"e\";\n }\n\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) {\n w = w.slice(0, -1) + \"i\";\n }\n\n for (const [suffix, replacement] of Object.entries(step2map)) {\n if (w.endsWith(suffix)) {\n const base = w.slice(0, -suffix.length);\n if (measure(base) > 0) w = base + replacement;\n break;\n }\n }\n\n for (const [suffix, replacement] of Object.entries(step3map)) {\n if (w.endsWith(suffix)) {\n const base = w.slice(0, -suffix.length);\n if (measure(base) > 0) w = base + replacement;\n break;\n }\n }\n\n if (w.endsWith(\"al\") || w.endsWith(\"ance\") || w.endsWith(\"ence\") ||\n w.endsWith(\"er\") || w.endsWith(\"ic\") || w.endsWith(\"able\") ||\n w.endsWith(\"ible\") || w.endsWith(\"ant\") || w.endsWith(\"ement\") ||\n w.endsWith(\"ment\") || w.endsWith(\"ent\") || w.endsWith(\"tion\") ||\n w.endsWith(\"sion\") || w.endsWith(\"ou\") || w.endsWith(\"ism\") ||\n w.endsWith(\"ate\") || w.endsWith(\"iti\") || w.endsWith(\"ous\") ||\n w.endsWith(\"ive\") || w.endsWith(\"ize\") || w.endsWith(\"ise\")) {\n const suffixLen = w.match(/(ement|ment|tion|sion|ance|ence|able|ible|ism|ate|iti|ous|ive|ize|ise|ant|ent|al|er|ic|ou)$/)?.[0]?.length ?? 0;\n if (suffixLen > 0) {\n const base = w.slice(0, -suffixLen);\n if (measure(base) > 1) w = base;\n }\n }\n\n if (w.endsWith(\"e\")) {\n const base = w.slice(0, -1);\n if (measure(base) > 1 || (measure(base) === 1 && !endsCVC(base))) {\n w = base;\n }\n }\n\n if (endsDoubleConsonant(w) && w.endsWith(\"l\") && measure(w.slice(0, -1)) > 1) {\n w = w.slice(0, -1);\n }\n\n return w;\n}\n","import { stem } from \"./stemmer.js\";\n\nconst SYNONYM_GROUPS: string[][] = [\n [\"auth\", \"authentication\", \"authn\", \"authenticating\"],\n [\"authz\", \"authorization\", \"authorizing\"],\n [\"db\", \"database\", \"datastore\"],\n [\"perf\", \"performance\", \"latency\", \"throughput\", \"slow\", \"bottleneck\"],\n [\"optim\", \"optimization\", \"optimizing\", \"optimise\", \"query-optimization\"],\n [\"k8s\", \"kubernetes\", \"kube\"],\n [\"config\", \"configuration\", \"configuring\", \"setup\"],\n [\"deps\", \"dependencies\", \"dependency\"],\n [\"env\", \"environment\"],\n [\"fn\", \"function\"],\n [\"impl\", \"implementation\", \"implementing\"],\n [\"msg\", \"message\", \"messaging\"],\n [\"repo\", \"repository\"],\n [\"req\", \"request\"],\n [\"res\", \"response\"],\n [\"ts\", \"typescript\"],\n [\"js\", \"javascript\"],\n [\"pg\", \"postgres\", \"postgresql\"],\n [\"err\", \"error\", \"errors\"],\n [\"api\", \"endpoint\", \"endpoints\"],\n [\"ci\", \"continuous-integration\"],\n [\"cd\", \"continuous-deployment\"],\n [\"test\", \"testing\", \"tests\"],\n [\"doc\", \"documentation\", \"docs\"],\n [\"infra\", \"infrastructure\"],\n [\"deploy\", \"deployment\", \"deploying\"],\n [\"cache\", \"caching\", \"cached\"],\n [\"log\", \"logging\", \"logs\"],\n [\"monitor\", \"monitoring\"],\n [\"observe\", \"observability\"],\n [\"sec\", \"security\", \"secure\"],\n [\"validate\", \"validation\", \"validating\"],\n [\"migrate\", \"migration\", \"migrations\"],\n [\"debug\", \"debugging\"],\n [\"container\", \"containerization\", \"docker\"],\n [\"crash\", \"crashloop\", \"crashloopbackoff\"],\n [\"webhook\", \"webhooks\", \"callback\"],\n [\"middleware\", \"mw\"],\n [\"paginate\", \"pagination\"],\n [\"serialize\", \"serialization\"],\n [\"encrypt\", \"encryption\"],\n [\"hash\", \"hashing\"],\n];\n\nconst synonymMap = new Map<string, Set<string>>();\n\nfor (const group of SYNONYM_GROUPS) {\n const stemmed = group.map(t => stem(t.toLowerCase()));\n for (const s of stemmed) {\n if (!synonymMap.has(s)) synonymMap.set(s, new Set());\n for (const other of stemmed) {\n if (other !== s) synonymMap.get(s)!.add(other);\n }\n }\n}\n\nexport function getSynonyms(stemmedTerm: string): string[] {\n const syns = synonymMap.get(stemmedTerm);\n return syns ? [...syns] : [];\n}\n","import type { CompressedObservation } from \"../types.js\";\nimport { stem } from \"./stemmer.js\";\nimport { getSynonyms } from \"./synonyms.js\";\n\ninterface IndexEntry {\n obsId: string;\n sessionId: string;\n termCount: number;\n}\n\nexport class SearchIndex {\n private entries: Map<string, IndexEntry> = new Map();\n private invertedIndex: Map<string, Set<string>> = new Map();\n private docTermCounts: Map<string, Map<string, number>> = new Map();\n private totalDocLength = 0;\n private sortedTerms: string[] | null = null;\n\n private readonly k1 = 1.2;\n private readonly b = 0.75;\n\n add(obs: CompressedObservation): void {\n const terms = this.extractTerms(obs);\n const termFreq = new Map<string, number>();\n let termCount = 0;\n\n for (const term of terms) {\n termFreq.set(term, (termFreq.get(term) || 0) + 1);\n termCount++;\n }\n\n this.entries.set(obs.id, {\n obsId: obs.id,\n sessionId: obs.sessionId,\n termCount,\n });\n this.docTermCounts.set(obs.id, termFreq);\n this.totalDocLength += termCount;\n\n for (const term of termFreq.keys()) {\n if (!this.invertedIndex.has(term)) {\n this.invertedIndex.set(term, new Set());\n }\n this.invertedIndex.get(term)!.add(obs.id);\n }\n\n this.sortedTerms = null;\n }\n\n search(\n query: string,\n limit = 20,\n ): Array<{ obsId: string; sessionId: string; score: number }> {\n const rawTerms = this.tokenize(query.toLowerCase());\n if (rawTerms.length === 0) return [];\n\n const N = this.entries.size;\n if (N === 0) return [];\n const avgDocLen = this.totalDocLength / N;\n\n const queryTerms: Array<{ term: string; weight: number }> = [];\n const seen = new Set<string>();\n for (const term of rawTerms) {\n if (!seen.has(term)) {\n seen.add(term);\n queryTerms.push({ term, weight: 1.0 });\n }\n for (const syn of getSynonyms(term)) {\n if (!seen.has(syn)) {\n seen.add(syn);\n queryTerms.push({ term: syn, weight: 0.7 });\n }\n }\n }\n\n const scores = new Map<string, number>();\n const sorted = this.getSortedTerms();\n\n for (const { term, weight } of queryTerms) {\n const matchingDocs = this.invertedIndex.get(term);\n if (matchingDocs) {\n const df = matchingDocs.size;\n const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);\n\n for (const obsId of matchingDocs) {\n const entry = this.entries.get(obsId)!;\n const docTerms = this.docTermCounts.get(obsId);\n const tf = docTerms?.get(term) || 0;\n const docLen = entry.termCount;\n\n const numerator = tf * (this.k1 + 1);\n const denominator =\n tf + this.k1 * (1 - this.b + this.b * (docLen / avgDocLen));\n const bm25Score = idf * (numerator / denominator) * weight;\n\n scores.set(obsId, (scores.get(obsId) || 0) + bm25Score);\n }\n }\n\n const startIdx = this.lowerBound(sorted, term);\n for (let si = startIdx; si < sorted.length; si++) {\n const indexTerm = sorted[si];\n if (!indexTerm.startsWith(term)) break;\n if (indexTerm === term) continue;\n\n const obsIds = this.invertedIndex.get(indexTerm)!;\n const prefixDf = obsIds.size;\n const prefixIdf =\n Math.log((N - prefixDf + 0.5) / (prefixDf + 0.5) + 1) * 0.5;\n for (const obsId of obsIds) {\n const entry = this.entries.get(obsId)!;\n const docTerms = this.docTermCounts.get(obsId);\n const tf = docTerms?.get(indexTerm) || 0;\n const docLen = entry.termCount;\n const numerator = tf * (this.k1 + 1);\n const denominator =\n tf + this.k1 * (1 - this.b + this.b * (docLen / avgDocLen));\n scores.set(\n obsId,\n (scores.get(obsId) || 0) + prefixIdf * (numerator / denominator) * weight,\n );\n }\n }\n }\n\n return Array.from(scores.entries())\n .map(([obsId, score]) => {\n const entry = this.entries.get(obsId)!;\n return { obsId, sessionId: entry.sessionId, score };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n clear(): void {\n this.entries.clear();\n this.invertedIndex.clear();\n this.docTermCounts.clear();\n this.totalDocLength = 0;\n this.sortedTerms = null;\n }\n\n restoreFrom(other: SearchIndex): void {\n this.entries = new Map(\n Array.from(other.entries.entries()).map(([k, v]) => [k, { ...v }]),\n );\n this.invertedIndex = new Map(\n Array.from(other.invertedIndex.entries()).map(([k, v]) => [\n k,\n new Set(v),\n ]),\n );\n this.docTermCounts = new Map(\n Array.from(other.docTermCounts.entries()).map(([k, v]) => [\n k,\n new Map(v),\n ]),\n );\n this.totalDocLength = other.totalDocLength;\n this.sortedTerms = null;\n }\n\n serialize(): string {\n const entries = Array.from(this.entries.entries());\n const inverted = Array.from(this.invertedIndex.entries()).map(\n ([term, ids]) => [term, Array.from(ids)] as [string, string[]],\n );\n const docTerms = Array.from(this.docTermCounts.entries()).map(\n ([id, counts]) =>\n [id, Array.from(counts.entries())] as [string, [string, number][]],\n );\n return JSON.stringify({\n v: 2,\n entries,\n inverted,\n docTerms,\n totalDocLength: this.totalDocLength,\n });\n }\n\n static deserialize(json: string): SearchIndex {\n try {\n const idx = new SearchIndex();\n const data = JSON.parse(json);\n if (!data?.entries || !data?.inverted || !data?.docTerms) return idx;\n for (const [key, val] of data.entries) {\n idx.entries.set(key, val);\n }\n for (const [term, ids] of data.inverted) {\n idx.invertedIndex.set(term, new Set(ids));\n }\n for (const [id, counts] of data.docTerms) {\n idx.docTermCounts.set(id, new Map(counts));\n }\n const rawLen = Number(data.totalDocLength);\n idx.totalDocLength =\n Number.isFinite(rawLen) && rawLen >= 0 ? Math.floor(rawLen) : 0;\n return idx;\n } catch {\n return new SearchIndex();\n }\n }\n\n private extractTerms(obs: CompressedObservation): string[] {\n const parts = [\n obs.title,\n obs.subtitle || \"\",\n obs.narrative,\n ...obs.facts,\n ...obs.concepts,\n ...obs.files,\n obs.type,\n ];\n return this.tokenize(parts.join(\" \").toLowerCase());\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/[^\\w\\s/.\\-_]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length > 1)\n .map((t) => stem(t));\n }\n\n private getSortedTerms(): string[] {\n if (!this.sortedTerms) {\n this.sortedTerms = Array.from(this.invertedIndex.keys()).sort();\n }\n return this.sortedTerms;\n }\n\n private lowerBound(arr: string[], target: string): number {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (arr[mid] < target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n}\n","import { SearchIndex } from \"./search-index.js\";\nimport { VectorIndex } from \"./vector-index.js\";\nimport type { StateKV } from \"./kv.js\";\nimport { KV } from \"./schema.js\";\n\nconst DEBOUNCE_MS = 5000;\n\nexport class IndexPersistence {\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private kv: StateKV,\n private bm25: SearchIndex,\n private vector: VectorIndex | null,\n ) {}\n\n scheduleSave(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = setTimeout(() => this.save(), DEBOUNCE_MS);\n }\n\n async save(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.kv.set(KV.bm25Index, \"data\", this.bm25.serialize());\n if (this.vector && this.vector.size > 0) {\n await this.kv.set(KV.bm25Index, \"vectors\", this.vector.serialize());\n }\n }\n\n async load(): Promise<{\n bm25: SearchIndex | null;\n vector: VectorIndex | null;\n }> {\n let bm25: SearchIndex | null = null;\n let vector: VectorIndex | null = null;\n\n const bm25Data = await this.kv\n .get<string>(KV.bm25Index, \"data\")\n .catch(() => null);\n if (bm25Data && typeof bm25Data === \"string\") {\n bm25 = SearchIndex.deserialize(bm25Data);\n }\n\n const vecData = await this.kv\n .get<string>(KV.bm25Index, \"vectors\")\n .catch(() => null);\n if (vecData && typeof vecData === \"string\") {\n vector = VectorIndex.deserialize(vecData);\n }\n\n return { bm25, vector };\n }\n\n stop(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import type { ISdk } from \"iii-sdk\";\n\nconst PRIVATE_TAG_RE = /<private>[\\s\\S]*?<\\/private>/gi;\n\nconst SECRET_PATTERN_SOURCES = [\n /(?:api[_-]?key|secret|token|password|credential|auth)[\\s]*[=:]\\s*[\"']?[A-Za-z0-9_\\-/.+]{20,}[\"']?/gi,\n /(?:sk|pk|rk|ak)-[A-Za-z0-9]{20,}/g,\n /sk-ant-[A-Za-z0-9\\-_]{20,}/g,\n /ghp_[A-Za-z0-9]{36}/g,\n /github_pat_[A-Za-z0-9_]{22,}/g,\n /xoxb-[A-Za-z0-9\\-]+/g,\n /AKIA[0-9A-Z]{16}/g,\n /AIza[A-Za-z0-9\\-_]{35}/g,\n /eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n /npm_[A-Za-z0-9]{36}/g,\n /glpat-[A-Za-z0-9\\-_]{20,}/g,\n /dop_v1_[A-Za-z0-9]{64}/g,\n];\n\nexport function stripPrivateData(input: string): string {\n let result = input.replace(PRIVATE_TAG_RE, \"[REDACTED]\");\n for (const source of SECRET_PATTERN_SOURCES) {\n const pattern = new RegExp(source.source, source.flags);\n result = result.replace(pattern, \"[REDACTED_SECRET]\");\n }\n return result;\n}\n\nexport function registerPrivacyFunction(sdk: ISdk): void {\n sdk.registerFunction(\n {\n id: \"mem::privacy\",\n description: \"Strip private tags and secrets from input\",\n },\n async (data: { input: string }) => {\n return { output: stripPrivateData(data.input) };\n },\n );\n}\n","const locks = new Map<string, Promise<void>>();\n\nexport function withKeyedLock<T>(\n key: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const prev = locks.get(key) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n const cleanup = next.then(\n () => {},\n () => {},\n );\n locks.set(key, cleanup);\n cleanup.then(() => {\n if (locks.get(key) === cleanup) locks.delete(key);\n });\n return next;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { RawObservation, HookPayload, Session } from \"../types.js\";\nimport { KV, STREAM, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { stripPrivateData } from \"./privacy.js\";\nimport { DedupMap } from \"./dedup.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nexport function registerObserveFunction(\n sdk: ISdk,\n kv: StateKV,\n dedupMap?: DedupMap,\n maxObservationsPerSession?: number,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::observe\",\n description: \"Capture and store a tool-use observation\",\n },\n async (payload: HookPayload) => {\n const ctx = getContext();\n\n if (\n !payload?.sessionId ||\n typeof payload.sessionId !== \"string\" ||\n !payload.hookType ||\n typeof payload.hookType !== \"string\" ||\n !payload.timestamp ||\n typeof payload.timestamp !== \"string\"\n ) {\n return {\n success: false,\n error:\n \"Invalid payload: sessionId, hookType, and timestamp are required\",\n };\n }\n\n const obsId = generateId(\"obs\");\n\n let dedupHash: string | undefined;\n if (dedupMap) {\n const d =\n typeof payload.data === \"object\" && payload.data !== null\n ? (payload.data as Record<string, unknown>)\n : {};\n const toolName = (d[\"tool_name\"] as string) || payload.hookType;\n dedupHash = dedupMap.computeHash(\n payload.sessionId,\n toolName,\n d[\"tool_input\"],\n );\n if (dedupMap.isDuplicate(dedupHash)) {\n return { deduplicated: true, sessionId: payload.sessionId };\n }\n }\n\n let sanitizedRaw: unknown = payload.data;\n try {\n const jsonStr = JSON.stringify(payload.data);\n const sanitized = stripPrivateData(jsonStr);\n sanitizedRaw = JSON.parse(sanitized);\n } catch {\n sanitizedRaw = stripPrivateData(String(payload.data));\n }\n\n const raw: RawObservation = {\n id: obsId,\n sessionId: payload.sessionId,\n timestamp: payload.timestamp,\n hookType: payload.hookType,\n raw: sanitizedRaw,\n };\n\n if (typeof sanitizedRaw === \"object\" && sanitizedRaw !== null) {\n const d = sanitizedRaw as Record<string, unknown>;\n if (\n payload.hookType === \"post_tool_use\" ||\n payload.hookType === \"post_tool_failure\"\n ) {\n raw.toolName = d[\"tool_name\"] as string | undefined;\n raw.toolInput = d[\"tool_input\"];\n raw.toolOutput = d[\"tool_output\"] || d[\"error\"];\n }\n if (payload.hookType === \"prompt_submit\") {\n raw.userPrompt = d[\"prompt\"] as string | undefined;\n }\n }\n\n return withKeyedLock(`obs:${payload.sessionId}`, async () => {\n if (maxObservationsPerSession && maxObservationsPerSession > 0) {\n const existing = await kv.list(KV.observations(payload.sessionId));\n if (existing.length >= maxObservationsPerSession) {\n return {\n success: false,\n error: `Session observation limit reached (${maxObservationsPerSession})`,\n };\n }\n }\n\n await kv.set(KV.observations(payload.sessionId), obsId, raw);\n\n if (dedupMap && dedupHash) {\n dedupMap.record(dedupHash);\n }\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.group(payload.sessionId),\n item_id: obsId,\n data: { type: \"raw\", observation: raw },\n });\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.viewerGroup,\n item_id: obsId,\n data: { type: \"raw\", observation: raw, sessionId: payload.sessionId },\n });\n\n const session = await kv.get<Session>(KV.sessions, payload.sessionId);\n if (session) {\n await kv.set(KV.sessions, payload.sessionId, {\n ...session,\n observationCount: (session.observationCount || 0) + 1,\n });\n }\n\n sdk.triggerVoid(\"mem::compress\", {\n observationId: obsId,\n sessionId: payload.sessionId,\n raw,\n });\n\n ctx.logger.info(\"Observation captured\", {\n obsId,\n sessionId: payload.sessionId,\n hook: payload.hookType,\n });\n return { observationId: obsId };\n });\n },\n );\n}\n","export const COMPRESSION_SYSTEM = `You are a memory compression engine for an AI coding agent. Your job is to extract the essential information from a tool usage observation and compress it into structured data.\n\nOutput EXACTLY this XML format with no additional text:\n\n<observation>\n <type>one of: file_read, file_write, file_edit, command_run, search, web_fetch, conversation, error, decision, discovery, subagent, notification, task, other</type>\n <title>Short descriptive title (max 80 chars)</title>\n <subtitle>One-line context (optional)</subtitle>\n <facts>\n <fact>Specific factual detail 1</fact>\n <fact>Specific factual detail 2</fact>\n </facts>\n <narrative>2-3 sentence summary of what happened and why it matters</narrative>\n <concepts>\n <concept>technical concept or pattern</concept>\n </concepts>\n <files>\n <file>path/to/file</file>\n </files>\n <importance>1-10 scale, 10 being critical architectural decision</importance>\n</observation>\n\nRules:\n- Be concise but preserve ALL technically relevant details\n- File paths must be exact\n- Importance: 1-3 for routine reads, 4-6 for edits/commands, 7-9 for architectural decisions, 10 for breaking changes\n- Concepts should be reusable search terms (e.g., \"React hooks\", \"SQL migration\", \"auth middleware\")\n- Strip any secrets, tokens, or credentials from the output`;\n\nexport function buildCompressionPrompt(observation: {\n hookType: string;\n toolName?: string;\n toolInput?: unknown;\n toolOutput?: unknown;\n userPrompt?: string;\n timestamp: string;\n}): string {\n const parts = [\n `Timestamp: ${observation.timestamp}`,\n `Hook: ${observation.hookType}`,\n ];\n\n if (observation.toolName) parts.push(`Tool: ${observation.toolName}`);\n if (observation.toolInput) {\n const input =\n typeof observation.toolInput === \"string\"\n ? observation.toolInput\n : JSON.stringify(observation.toolInput, null, 2);\n parts.push(`Input:\\n${truncate(input, 4000)}`);\n }\n if (observation.toolOutput) {\n const output =\n typeof observation.toolOutput === \"string\"\n ? observation.toolOutput\n : JSON.stringify(observation.toolOutput, null, 2);\n parts.push(`Output:\\n${truncate(output, 4000)}`);\n }\n if (observation.userPrompt) {\n parts.push(`User prompt:\\n${truncate(observation.userPrompt, 2000)}`);\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n[...truncated]\" : s;\n}\n","const VALID_TAG = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;\n\nexport function getXmlTag(xml: string, tag: string): string {\n if (!VALID_TAG.test(tag)) return \"\";\n const match = xml.match(new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`));\n return match ? match[1].trim() : \"\";\n}\n\nexport function getXmlChildren(\n xml: string,\n parentTag: string,\n childTag: string,\n): string[] {\n if (!VALID_TAG.test(parentTag) || !VALID_TAG.test(childTag)) return [];\n const parentMatch = xml.match(\n new RegExp(`<${parentTag}>([\\\\s\\\\S]*?)</${parentTag}>`),\n );\n if (!parentMatch) return [];\n const items: string[] = [];\n const re = new RegExp(`<${childTag}>([\\\\s\\\\S]*?)</${childTag}>`, \"g\");\n let m;\n while ((m = re.exec(parentMatch[1])) !== null) {\n items.push(m[1].trim());\n }\n return items;\n}\n","import type { ISdk } from 'iii-sdk'\nimport { getContext } from 'iii-sdk'\nimport type { CompressedObservation, SearchResult, Session } from '../types.js'\nimport { KV } from '../state/schema.js'\nimport { StateKV } from '../state/kv.js'\nimport { SearchIndex } from '../state/search-index.js'\n\nlet index: SearchIndex | null = null\n\nexport function getSearchIndex(): SearchIndex {\n if (!index) index = new SearchIndex()\n return index\n}\n\nexport async function rebuildIndex(kv: StateKV): Promise<number> {\n const idx = getSearchIndex()\n idx.clear()\n\n const sessions = await kv.list<Session>(KV.sessions)\n if (!sessions.length) return 0\n\n let count = 0\n const obsPerSession: CompressedObservation[][] = []\n const failedSessions: string[] = []\n for (let batch = 0; batch < sessions.length; batch += 10) {\n const chunk = sessions.slice(batch, batch + 10)\n const results = await Promise.all(\n chunk.map(async (s) => {\n try {\n return await kv.list<CompressedObservation>(KV.observations(s.id))\n } catch {\n failedSessions.push(s.id)\n return [] as CompressedObservation[]\n }\n })\n )\n obsPerSession.push(...results)\n }\n if (failedSessions.length > 0) {\n const ctx = getContext()\n ctx.logger.warn('rebuildIndex: failed to load observations for sessions', { failedSessions })\n }\n for (const observations of obsPerSession) {\n for (const obs of observations) {\n if (obs.title && obs.narrative) {\n idx.add(obs)\n count++\n }\n }\n }\n return count\n}\n\nexport function registerSearchFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: 'mem::search', description: 'Search observations by keyword' },\n async (data: { query: string; limit?: number }) => {\n const ctx = getContext()\n const idx = getSearchIndex()\n\n if (idx.size === 0) {\n const count = await rebuildIndex(kv)\n ctx.logger.info('Search index rebuilt', { entries: count })\n }\n\n const results = idx.search(data.query, data.limit || 20)\n\n const enriched: SearchResult[] = []\n for (const r of results) {\n const obs = await kv.get<CompressedObservation>(KV.observations(r.sessionId), r.obsId)\n if (obs) {\n enriched.push({ observation: obs, score: r.score, sessionId: r.sessionId })\n }\n }\n\n ctx.logger.info('Search completed', { query: data.query, results: enriched.length })\n return { results: enriched }\n }\n )\n}\n","import { z } from \"zod\";\n\nconst HookTypeEnum = z.enum([\n \"session_start\",\n \"prompt_submit\",\n \"pre_tool_use\",\n \"post_tool_use\",\n \"post_tool_failure\",\n \"pre_compact\",\n \"subagent_start\",\n \"subagent_stop\",\n \"notification\",\n \"task_completed\",\n \"stop\",\n \"session_end\",\n]);\n\nconst ObservationTypeEnum = z.enum([\n \"file_read\",\n \"file_write\",\n \"file_edit\",\n \"command_run\",\n \"search\",\n \"web_fetch\",\n \"conversation\",\n \"error\",\n \"decision\",\n \"discovery\",\n \"subagent\",\n \"notification\",\n \"task\",\n \"other\",\n]);\n\nexport const ObserveInputSchema = z.object({\n hookType: HookTypeEnum,\n sessionId: z.string().min(1),\n project: z.string().min(1),\n cwd: z.string().min(1),\n timestamp: z.string().min(1),\n data: z.unknown(),\n});\n\nexport const CompressOutputSchema = z.object({\n type: ObservationTypeEnum,\n title: z.string().min(1).max(120),\n subtitle: z.string().optional(),\n facts: z.array(z.string()).min(1),\n narrative: z.string().min(10),\n concepts: z.array(z.string()),\n files: z.array(z.string()),\n importance: z.number().int().min(1).max(10),\n});\n\nexport const SummaryOutputSchema = z.object({\n title: z.string().min(1),\n narrative: z.string().min(20),\n keyDecisions: z.array(z.string()),\n filesModified: z.array(z.string()),\n concepts: z.array(z.string()),\n});\n\nexport const SearchInputSchema = z.object({\n query: z.string().min(1),\n limit: z.number().int().positive().optional(),\n});\n\nexport const ContextInputSchema = z.object({\n sessionId: z.string().min(1),\n project: z.string().min(1),\n budget: z.number().positive().optional(),\n});\n\nexport const RememberInputSchema = z.object({\n content: z.string().min(1),\n type: z\n .enum([\"pattern\", \"preference\", \"architecture\", \"bug\", \"workflow\", \"fact\"])\n .optional(),\n concepts: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n});\n\nexport const SmartSearchInputSchema = z.object({\n query: z.string().optional(),\n expandIds: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n});\n\nexport const TimelineInputSchema = z.object({\n anchor: z.string().min(1),\n project: z.string().optional(),\n before: z.number().int().nonnegative().optional(),\n after: z.number().int().nonnegative().optional(),\n});\n\nexport const ProfileInputSchema = z.object({\n project: z.string().min(1),\n refresh: z.boolean().optional(),\n});\n\nexport const RelateInputSchema = z.object({\n sourceId: z.string().min(1),\n targetId: z.string().min(1),\n type: z.enum([\"supersedes\", \"extends\", \"derives\", \"contradicts\", \"related\"]),\n});\n\nexport const EvolveInputSchema = z.object({\n memoryId: z.string().min(1),\n newContent: z.string().min(1),\n newTitle: z.string().optional(),\n});\n\nexport const ExportImportInputSchema = z.object({\n exportData: z.object({\n version: z.union([z.literal(\"0.3.0\"), z.literal(\"0.4.0\")]),\n exportedAt: z.string(),\n sessions: z.array(z.unknown()),\n observations: z.record(z.string(), z.array(z.unknown())),\n memories: z.array(z.unknown()),\n summaries: z.array(z.unknown()),\n profiles: z.array(z.unknown()).optional(),\n }),\n strategy: z.enum([\"merge\", \"replace\", \"skip\"]).optional(),\n});\n","import type { z } from \"zod\";\nimport type { EvalResult } from \"../types.js\";\n\nexport function validateInput<T>(\n schema: z.ZodType<T>,\n data: unknown,\n functionId: string,\n): { valid: true; data: T } | { valid: false; result: EvalResult } {\n const parsed = schema.safeParse(data);\n if (parsed.success) {\n return { valid: true, data: parsed.data };\n }\n return {\n valid: false,\n result: {\n valid: false,\n errors: parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`),\n qualityScore: 0,\n latencyMs: 0,\n functionId,\n },\n };\n}\n\nexport function validateOutput<T>(\n schema: z.ZodType<T>,\n data: unknown,\n functionId: string,\n): { valid: true; data: T } | { valid: false; result: EvalResult } {\n return validateInput(schema, data, functionId);\n}\n","export function scoreCompression(obs: {\n type?: string;\n title?: string;\n facts?: string[];\n narrative?: string;\n concepts?: string[];\n importance?: number;\n}): number {\n let score = 0;\n if (obs.facts && obs.facts.length > 0) score += 25;\n if (obs.facts && obs.facts.length >= 3) score += 10;\n if (obs.narrative && obs.narrative.length >= 20) score += 20;\n if (obs.narrative && obs.narrative.length >= 50) score += 5;\n if (obs.title && obs.title.length >= 5 && obs.title.length <= 120) score += 15;\n if (obs.concepts && obs.concepts.length > 0) score += 15;\n if (obs.importance && obs.importance >= 1 && obs.importance <= 10) score += 10;\n return Math.min(100, score);\n}\n\nexport function scoreSummary(summary: {\n title?: string;\n narrative?: string;\n keyDecisions?: string[];\n filesModified?: string[];\n concepts?: string[];\n}): number {\n let score = 0;\n if (summary.title && summary.title.length >= 5) score += 20;\n if (summary.narrative && summary.narrative.length >= 20) score += 25;\n if (summary.narrative && summary.narrative.length >= 100) score += 5;\n if (summary.keyDecisions && summary.keyDecisions.length > 0) score += 20;\n if (summary.filesModified && summary.filesModified.length > 0) score += 15;\n if (summary.concepts && summary.concepts.length > 0) score += 15;\n return Math.min(100, score);\n}\n\nexport function scoreContextRelevance(\n context: string,\n project: string,\n): number {\n let score = 0;\n if (context.length > 0) score += 20;\n if (project && context.toLowerCase().includes(project.toLowerCase())) score += 20;\n if (context.includes(\"<\")) score += 15;\n const sectionCount = (context.match(/<\\w+>/g) || []).length;\n if (sectionCount >= 2) score += 15;\n if (sectionCount >= 4) score += 10;\n if (context.length >= 100) score += 10;\n if (context.length >= 500) score += 10;\n return Math.min(100, score);\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nconst STRICTER_SUFFIX = `\n\nIMPORTANT: Your previous response was invalid. Please ensure your output strictly follows the required XML format. Every required field must be present with valid values.`;\n\nexport async function compressWithRetry(\n provider: MemoryProvider,\n systemPrompt: string,\n userPrompt: string,\n validator: (response: string) => { valid: boolean; errors?: string[] },\n maxRetries = 1,\n): Promise<{ response: string; retried: boolean }> {\n const first = await provider.compress(systemPrompt, userPrompt);\n const result = validator(first);\n if (result.valid) return { response: first, retried: false };\n\n for (let i = 0; i < maxRetries; i++) {\n const retry = await provider.compress(\n systemPrompt + STRICTER_SUFFIX,\n userPrompt,\n );\n const retryResult = validator(retry);\n if (retryResult.valid) return { response: retry, retried: true };\n }\n\n return { response: first, retried: true };\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n RawObservation,\n CompressedObservation,\n ObservationType,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, STREAM } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport {\n COMPRESSION_SYSTEM,\n buildCompressionPrompt,\n} from \"../prompts/compression.js\";\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\nimport { getSearchIndex } from \"./search.js\";\nimport { CompressOutputSchema } from \"../eval/schemas.js\";\nimport { validateOutput } from \"../eval/validator.js\";\nimport { scoreCompression } from \"../eval/quality.js\";\nimport { compressWithRetry } from \"../eval/self-correct.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\n\nconst VALID_TYPES = new Set<string>([\n \"file_read\",\n \"file_write\",\n \"file_edit\",\n \"command_run\",\n \"search\",\n \"web_fetch\",\n \"conversation\",\n \"error\",\n \"decision\",\n \"discovery\",\n \"subagent\",\n \"notification\",\n \"task\",\n \"other\",\n]);\n\nfunction parseCompressionXml(\n xml: string,\n): Omit<CompressedObservation, \"id\" | \"sessionId\" | \"timestamp\"> | null {\n const rawType = getXmlTag(xml, \"type\");\n const title = getXmlTag(xml, \"title\");\n if (!rawType || !title) return null;\n const type = VALID_TYPES.has(rawType) ? rawType : \"other\";\n\n return {\n type: type as ObservationType,\n title,\n subtitle: getXmlTag(xml, \"subtitle\") || undefined,\n facts: getXmlChildren(xml, \"facts\", \"fact\"),\n narrative: getXmlTag(xml, \"narrative\"),\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n files: getXmlChildren(xml, \"files\", \"file\"),\n importance: Math.max(\n 1,\n Math.min(10, parseInt(getXmlTag(xml, \"importance\") || \"5\", 10) || 5),\n ),\n };\n}\n\nexport function registerCompressFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n metricsStore?: MetricsStore,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::compress\",\n description: \"Compress a raw observation using LLM\",\n },\n async (data: {\n observationId: string;\n sessionId: string;\n raw: RawObservation;\n }) => {\n const ctx = getContext();\n const startMs = Date.now();\n const prompt = buildCompressionPrompt({\n hookType: data.raw.hookType,\n toolName: data.raw.toolName,\n toolInput: data.raw.toolInput,\n toolOutput: data.raw.toolOutput,\n userPrompt: data.raw.userPrompt,\n timestamp: data.raw.timestamp,\n });\n\n try {\n const validator = (response: string) => {\n const parsed = parseCompressionXml(response);\n if (!parsed) return { valid: false, errors: [\"xml_parse_failed\"] };\n const result = validateOutput(\n CompressOutputSchema,\n parsed,\n \"mem::compress\",\n );\n return result.valid\n ? { valid: true }\n : { valid: false, errors: result.result.errors };\n };\n\n const { response, retried } = await compressWithRetry(\n provider,\n COMPRESSION_SYSTEM,\n prompt,\n validator,\n 1,\n );\n\n const parsed = parseCompressionXml(response);\n if (!parsed) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::compress\", latencyMs, false);\n }\n ctx.logger.warn(\"Failed to parse compression XML\", {\n obsId: data.observationId,\n retried,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const qualityScore = scoreCompression(parsed);\n\n const compressed: CompressedObservation = {\n id: data.observationId,\n sessionId: data.sessionId,\n timestamp: data.raw.timestamp,\n ...parsed,\n confidence: qualityScore / 100,\n };\n\n await kv.set(\n KV.observations(data.sessionId),\n data.observationId,\n compressed,\n );\n\n getSearchIndex().add(compressed);\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.group(data.sessionId),\n item_id: data.observationId,\n data: { type: \"compressed\", observation: compressed },\n });\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.viewerGroup,\n item_id: data.observationId,\n data: {\n type: \"compressed\",\n observation: compressed,\n sessionId: data.sessionId,\n },\n });\n\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\n \"mem::compress\",\n latencyMs,\n true,\n qualityScore,\n );\n }\n\n ctx.logger.info(\"Observation compressed\", {\n obsId: data.observationId,\n type: compressed.type,\n importance: compressed.importance,\n qualityScore,\n retried,\n });\n\n return { success: true, compressed, qualityScore };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::compress\", latencyMs, false);\n }\n ctx.logger.error(\"Compression failed\", {\n obsId: data.observationId,\n error: msg,\n });\n return { success: false, error: \"compression_failed\" };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n ContextBlock,\n ProjectProfile,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 3);\n}\n\nfunction escapeXmlAttr(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nexport function registerContextFunction(\n sdk: ISdk,\n kv: StateKV,\n tokenBudget: number,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::context\",\n description: \"Generate context for session injection\",\n },\n async (data: { sessionId: string; project: string; budget?: number }) => {\n const ctx = getContext();\n const budget = data.budget || tokenBudget;\n const blocks: ContextBlock[] = [];\n\n const profile = await kv\n .get<ProjectProfile>(KV.profiles, data.project)\n .catch(() => null);\n if (profile) {\n const profileParts = [];\n if (profile.topConcepts.length > 0) {\n profileParts.push(\n `Concepts: ${profile.topConcepts\n .slice(0, 8)\n .map((c) => c.concept)\n .join(\", \")}`,\n );\n }\n if (profile.topFiles.length > 0) {\n profileParts.push(\n `Key files: ${profile.topFiles\n .slice(0, 5)\n .map((f) => f.file)\n .join(\", \")}`,\n );\n }\n if (profile.conventions.length > 0) {\n profileParts.push(`Conventions: ${profile.conventions.join(\"; \")}`);\n }\n if (profile.commonErrors.length > 0) {\n profileParts.push(\n `Common errors: ${profile.commonErrors.slice(0, 3).join(\"; \")}`,\n );\n }\n if (profileParts.length > 0) {\n const profileContent = `## Project Profile\\n${profileParts.join(\"\\n\")}`;\n blocks.push({\n type: \"memory\",\n content: profileContent,\n tokens: estimateTokens(profileContent),\n recency: new Date(profile.updatedAt).getTime(),\n });\n }\n }\n\n const allSessions = await kv.list<Session>(KV.sessions);\n const sessions = allSessions\n .filter((s) => s.project === data.project && s.id !== data.sessionId)\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n )\n .slice(0, 10);\n\n const summariesPerSession = await Promise.all(\n sessions.map((s) =>\n kv.get<SessionSummary>(KV.summaries, s.id).catch(() => null),\n ),\n );\n\n const sessionsNeedingObs: number[] = [];\n for (let i = 0; i < sessions.length; i++) {\n const summary = summariesPerSession[i];\n if (summary) {\n const content = `## ${summary.title}\\n${summary.narrative}\\nDecisions: ${summary.keyDecisions.join(\"; \")}\\nFiles: ${summary.filesModified.join(\", \")}`;\n blocks.push({\n type: \"summary\",\n content,\n tokens: estimateTokens(content),\n recency: new Date(summary.createdAt).getTime(),\n });\n } else {\n sessionsNeedingObs.push(i);\n }\n }\n\n const obsResults = await Promise.all(\n sessionsNeedingObs.map((i) =>\n kv\n .list<CompressedObservation>(KV.observations(sessions[i].id))\n .catch(() => []),\n ),\n );\n\n for (let j = 0; j < sessionsNeedingObs.length; j++) {\n const i = sessionsNeedingObs[j];\n const observations = obsResults[j];\n const important = observations.filter(\n (o) => o.title && o.importance >= 5,\n );\n\n if (important.length > 0) {\n const items = important\n .sort((a, b) => b.importance - a.importance)\n .slice(0, 5)\n .map((o) => `- [${o.type}] ${o.title}: ${o.narrative}`)\n .join(\"\\n\");\n const content = `## Session ${sessions[i].id.slice(0, 8)} (${sessions[i].startedAt})\\n${items}`;\n blocks.push({\n type: \"observation\",\n content,\n tokens: estimateTokens(content),\n recency: new Date(sessions[i].startedAt).getTime(),\n });\n }\n }\n\n blocks.sort((a, b) => b.recency - a.recency);\n\n let usedTokens = 0;\n const selected: string[] = [];\n const header = `<agentmemory-context project=\"${escapeXmlAttr(data.project)}\">`;\n const footer = `</agentmemory-context>`;\n usedTokens += estimateTokens(header) + estimateTokens(footer);\n\n for (const block of blocks) {\n if (usedTokens + block.tokens > budget) break;\n selected.push(block.content);\n usedTokens += block.tokens;\n }\n\n if (selected.length === 0) {\n ctx.logger.info(\"No context available\", { project: data.project });\n return { context: \"\", blocks: 0, tokens: 0 };\n }\n\n const result = `${header}\\n${selected.join(\"\\n\\n\")}\\n${footer}`;\n ctx.logger.info(\"Context generated\", {\n blocks: selected.length,\n tokens: usedTokens,\n });\n return { context: result, blocks: selected.length, tokens: usedTokens };\n },\n );\n}\n","export const SUMMARY_SYSTEM = `You are a session summarizer for an AI coding agent's memory system. Given all compressed observations from a coding session, produce a concise session summary.\n\nOutput EXACTLY this XML format with no additional text:\n\n<summary>\n <title>Short session title (max 100 chars)</title>\n <narrative>3-5 sentence narrative of what was accomplished</narrative>\n <decisions>\n <decision>Key technical decision made</decision>\n </decisions>\n <files>\n <file>path/to/modified/file</file>\n </files>\n <concepts>\n <concept>key concept from session</concept>\n </concepts>\n</summary>\n\nRules:\n- Focus on outcomes, not individual tool calls\n- Highlight decisions and their rationale\n- List all files that were created or modified\n- Concepts should be searchable terms for future context retrieval`\n\nexport function buildSummaryPrompt(observations: Array<{\n type: string\n title: string\n facts: string[]\n narrative: string\n files: string[]\n concepts: string[]\n}>): string {\n const lines = observations.map((obs, i) => {\n const facts = obs.facts.map((f) => ` - ${f}`).join('\\n')\n return `[${i + 1}] ${obs.type}: ${obs.title}\\n${obs.narrative}\\nFacts:\\n${facts}\\nFiles: ${obs.files.join(', ')}`\n })\n return `Session observations (${observations.length} total):\\n\\n${lines.join('\\n\\n---\\n\\n')}`\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n SessionSummary,\n MemoryProvider,\n Session,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { SUMMARY_SYSTEM, buildSummaryPrompt } from \"../prompts/summary.js\";\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\nimport { SummaryOutputSchema } from \"../eval/schemas.js\";\nimport { validateOutput } from \"../eval/validator.js\";\nimport { scoreSummary } from \"../eval/quality.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\n\nfunction parseSummaryXml(\n xml: string,\n sessionId: string,\n project: string,\n obsCount: number,\n): SessionSummary | null {\n const title = getXmlTag(xml, \"title\");\n if (!title) return null;\n\n return {\n sessionId,\n project,\n createdAt: new Date().toISOString(),\n title,\n narrative: getXmlTag(xml, \"narrative\"),\n keyDecisions: getXmlChildren(xml, \"decisions\", \"decision\"),\n filesModified: getXmlChildren(xml, \"files\", \"file\"),\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n observationCount: obsCount,\n };\n}\n\nexport function registerSummarizeFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n metricsStore?: MetricsStore,\n): void {\n sdk.registerFunction(\n { id: \"mem::summarize\", description: \"Generate end-of-session summary\" },\n async (data: { sessionId: string }) => {\n const ctx = getContext();\n const startMs = Date.now();\n\n const session = await kv.get<Session>(KV.sessions, data.sessionId);\n if (!session) {\n ctx.logger.warn(\"Session not found for summarize\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"session_not_found\" };\n }\n\n const observations = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n const compressed = observations.filter((o) => o.title);\n\n if (compressed.length === 0) {\n ctx.logger.info(\"No observations to summarize\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"no_observations\" };\n }\n\n try {\n const prompt = buildSummaryPrompt(compressed);\n const response = await provider.summarize(SUMMARY_SYSTEM, prompt);\n const summary = parseSummaryXml(\n response,\n data.sessionId,\n session.project,\n compressed.length,\n );\n\n if (!summary) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.warn(\"Failed to parse summary XML\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const summaryForValidation = {\n title: summary.title,\n narrative: summary.narrative,\n keyDecisions: summary.keyDecisions,\n filesModified: summary.filesModified,\n concepts: summary.concepts,\n };\n const validation = validateOutput(\n SummaryOutputSchema,\n summaryForValidation,\n \"mem::summarize\",\n );\n\n if (!validation.valid) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.warn(\"Summary validation failed\", {\n sessionId: data.sessionId,\n errors: validation.result.errors,\n });\n return { success: false, error: \"validation_failed\" };\n }\n\n const qualityScore = scoreSummary(summaryForValidation);\n\n await kv.set(KV.summaries, data.sessionId, summary);\n\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\n \"mem::summarize\",\n latencyMs,\n true,\n qualityScore,\n );\n }\n\n ctx.logger.info(\"Session summarized\", {\n sessionId: data.sessionId,\n title: summary.title,\n decisions: summary.keyDecisions.length,\n qualityScore,\n valid: validation.valid,\n });\n\n return { success: true, summary, qualityScore };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.error(\"Summarize failed\", {\n sessionId: data.sessionId,\n error: msg,\n });\n return { success: false, error: msg };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n} from \"../types.js\";\n\nconst ALLOWED_DIRS = [resolve(homedir(), \".agentmemory\")];\n\nfunction isAllowedPath(dbPath: string): boolean {\n const resolved = resolve(dbPath);\n return ALLOWED_DIRS.some((dir) => resolved.startsWith(dir + \"/\"));\n}\n\nexport function registerMigrateFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::migrate\",\n description: \"Import data from SQLite database\",\n },\n async (data: { dbPath: string }) => {\n const ctx = getContext();\n ctx.logger.info(\"Migration started\", { dbPath: data.dbPath });\n\n if (!isAllowedPath(data.dbPath)) {\n return {\n success: false,\n error: `Path not allowed. Must be under: ${ALLOWED_DIRS.join(\", \")}`,\n };\n }\n\n let Database: any;\n try {\n // @ts-expect-error optional dependency\n Database = (await import(\"better-sqlite3\")).default;\n } catch {\n return {\n success: false,\n error:\n \"better-sqlite3 not installed. Run: npm install better-sqlite3\",\n };\n }\n\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(data.dbPath)) {\n return { success: false, error: `Database not found: ${data.dbPath}` };\n }\n\n try {\n const db = Database(data.dbPath, { readonly: true });\n let sessionCount = 0;\n let obsCount = 0;\n let summaryCount = 0;\n\n const sessions = db\n .prepare(\"SELECT * FROM sessions ORDER BY created_at DESC\")\n .all() as any[];\n for (const row of sessions) {\n const session: Session = {\n id: row.session_id || row.id,\n project: row.project_path || row.project || \"unknown\",\n cwd: row.cwd || row.project_path || \"\",\n startedAt:\n row.created_at || row.started_at || new Date().toISOString(),\n endedAt: row.ended_at || row.updated_at,\n status: \"completed\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, session.id, session);\n sessionCount++;\n }\n\n let observations: any[] = [];\n try {\n observations = db\n .prepare(\"SELECT * FROM observations ORDER BY created_at ASC\")\n .all() as any[];\n } catch {\n try {\n observations = db\n .prepare(\n \"SELECT * FROM compressed_observations ORDER BY created_at ASC\",\n )\n .all() as any[];\n } catch {\n ctx.logger.warn(\"No observation tables found\");\n }\n }\n\n for (const row of observations) {\n const sessionId = row.session_id || \"migrated\";\n const obs: CompressedObservation = {\n id: row.id || generateId(\"mig\"),\n sessionId,\n timestamp: row.created_at || new Date().toISOString(),\n type: row.type || \"other\",\n title: row.title || row.summary || \"Migrated observation\",\n subtitle: row.subtitle,\n facts: safeJsonParse(row.facts, []),\n narrative: row.narrative || row.content || \"\",\n concepts: safeJsonParse(row.concepts, []),\n files: safeJsonParse(row.files, []),\n importance: row.importance || 5,\n };\n await kv.set(KV.observations(sessionId), obs.id, obs);\n obsCount++;\n }\n\n let summaries: any[] = [];\n try {\n summaries = db\n .prepare(\"SELECT * FROM session_summaries\")\n .all() as any[];\n } catch {\n ctx.logger.warn(\"No summaries table found\");\n }\n\n for (const row of summaries) {\n const summary: SessionSummary = {\n sessionId: row.session_id,\n project: row.project || \"unknown\",\n createdAt: row.created_at || new Date().toISOString(),\n title: row.title || \"Migrated session\",\n narrative: row.narrative || row.summary || \"\",\n keyDecisions: safeJsonParse(row.key_decisions, []),\n filesModified: safeJsonParse(row.files_modified, []),\n concepts: safeJsonParse(row.concepts, []),\n observationCount: row.observation_count || 0,\n };\n await kv.set(KV.summaries, row.session_id, summary);\n summaryCount++;\n }\n\n db.close();\n ctx.logger.info(\"Migration complete\", {\n sessionCount,\n obsCount,\n summaryCount,\n });\n return { success: true, sessionCount, obsCount, summaryCount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Migration failed\", { error: msg });\n return { success: false, error: \"Migration failed\" };\n }\n },\n );\n}\n\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\n if (Array.isArray(value)) return value as T;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { CompressedObservation, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface FileHistory {\n file: string;\n observations: Array<{\n sessionId: string;\n obsId: string;\n type: string;\n title: string;\n narrative: string;\n importance: number;\n timestamp: string;\n }>;\n}\n\nexport function registerFileIndexFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::file-context\" },\n async (data: { sessionId: string; files: string[]; project?: string }) => {\n const ctx = getContext();\n const results: FileHistory[] = [];\n\n const sessions = await kv.list<Session>(KV.sessions);\n let otherSessions = sessions.filter((s) => s.id !== data.sessionId);\n if (data.project) {\n otherSessions = otherSessions.filter((s) => s.project === data.project);\n }\n otherSessions = otherSessions\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n )\n .slice(0, 15);\n\n const obsCache = new Map<string, CompressedObservation[]>();\n for (const session of otherSessions) {\n obsCache.set(\n session.id,\n await kv.list<CompressedObservation>(KV.observations(session.id)),\n );\n }\n\n for (const file of data.files) {\n const history: FileHistory = { file, observations: [] };\n const normalizedFile = file.replace(/^\\.\\//, \"\");\n\n for (const session of otherSessions) {\n const observations = obsCache.get(session.id) || [];\n\n for (const obs of observations) {\n if (!obs.files || !obs.title) continue;\n const matches = obs.files.some(\n (f) =>\n f === file ||\n f === normalizedFile ||\n f.endsWith(`/${normalizedFile}`) ||\n normalizedFile.endsWith(`/${f}`),\n );\n if (matches && obs.importance >= 4) {\n history.observations.push({\n sessionId: session.id,\n obsId: obs.id,\n type: obs.type,\n title: obs.title,\n narrative: obs.narrative,\n importance: obs.importance,\n timestamp: obs.timestamp,\n });\n }\n }\n }\n\n history.observations.sort((a, b) => b.importance - a.importance);\n history.observations = history.observations.slice(0, 5);\n\n if (history.observations.length > 0) {\n results.push(history);\n }\n }\n\n if (results.length === 0) {\n return { context: \"\" };\n }\n\n const lines: string[] = [\"<agentmemory-file-context>\"];\n for (const fh of results) {\n lines.push(`## ${fh.file}`);\n for (const obs of fh.observations) {\n lines.push(`- [${obs.type}] ${obs.title}: ${obs.narrative}`);\n }\n }\n lines.push(\"</agentmemory-file-context>\");\n\n const context = lines.join(\"\\n\");\n ctx.logger.info(\"File context generated\", {\n files: data.files.length,\n results: results.length,\n });\n return { context };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Memory,\n Session,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst CONSOLIDATION_SYSTEM = `You are a memory consolidation engine. Given a set of related observations from coding sessions, synthesize them into a single long-term memory.\n\nOutput XML:\n<memory>\n <type>pattern|preference|architecture|bug|workflow|fact</type>\n <title>Concise memory title (max 80 chars)</title>\n <content>2-4 sentence description of the learned insight</content>\n <concepts>\n <concept>key term</concept>\n </concepts>\n <files>\n <file>relevant/file/path</file>\n </files>\n <strength>1-10 how confident/important this memory is</strength>\n</memory>`;\n\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\n\nfunction parseMemoryXml(\n xml: string,\n sessionIds: string[],\n): Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\"> | null {\n const type = getXmlTag(xml, \"type\");\n const title = getXmlTag(xml, \"title\");\n const content = getXmlTag(xml, \"content\");\n if (!type || !title || !content) return null;\n\n const validTypes = new Set([\n \"pattern\",\n \"preference\",\n \"architecture\",\n \"bug\",\n \"workflow\",\n \"fact\",\n ]);\n\n return {\n type: (validTypes.has(type) ? type : \"fact\") as Memory[\"type\"],\n title,\n content,\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n files: getXmlChildren(xml, \"files\", \"file\"),\n sessionIds,\n strength: Math.max(\n 1,\n Math.min(10, parseInt(getXmlTag(xml, \"strength\") || \"5\", 10) || 5),\n ),\n version: 1,\n isLatest: true,\n };\n}\n\nexport function registerConsolidateFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::consolidate\" },\n async (data: { project?: string; minObservations?: number }) => {\n const ctx = getContext();\n const minObs = data.minObservations ?? 10;\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const allObs: Array<CompressedObservation & { sid: string }> = [];\n const obsPerSession: CompressedObservation[][] = [];\n for (let batch = 0; batch < filtered.length; batch += 10) {\n const chunk = filtered.slice(batch, batch + 10);\n const results = await Promise.all(\n chunk.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n obsPerSession.push(...results);\n }\n for (let i = 0; i < filtered.length; i++) {\n for (const obs of obsPerSession[i]) {\n if (obs.title && obs.importance >= 5) {\n allObs.push({ ...obs, sid: filtered[i].id });\n }\n }\n }\n\n if (allObs.length < minObs) {\n return { consolidated: 0, reason: \"insufficient_observations\" };\n }\n\n const conceptGroups = new Map<string, typeof allObs>();\n for (const obs of allObs) {\n for (const concept of obs.concepts) {\n const key = concept.toLowerCase();\n if (!conceptGroups.has(key)) conceptGroups.set(key, []);\n conceptGroups.get(key)!.push(obs);\n }\n }\n\n let consolidated = 0;\n const existingMemories = await kv.list<Memory>(KV.memories);\n const existingTitles = new Set(\n existingMemories.map((m) => m.title.toLowerCase()),\n );\n\n const MAX_LLM_CALLS = 10;\n let llmCallCount = 0;\n\n const sortedGroups = [...conceptGroups.entries()]\n .filter(([, g]) => g.length >= 3)\n .sort((a, b) => b[1].length - a[1].length);\n\n for (const [concept, obsGroup] of sortedGroups) {\n if (llmCallCount >= MAX_LLM_CALLS) break;\n\n const top = obsGroup\n .sort((a, b) => b.importance - a.importance)\n .slice(0, 8);\n const sessionIds = [...new Set(top.map((o) => o.sid))];\n\n const prompt = top\n .map(\n (o) =>\n `[${o.type}] ${o.title}\\n${o.narrative}\\nFiles: ${o.files.join(\", \")}\\nImportance: ${o.importance}`,\n )\n .join(\"\\n\\n\");\n\n try {\n const response = await Promise.race([\n provider.compress(\n CONSOLIDATION_SYSTEM,\n `Concept: \"${concept}\"\\n\\nObservations:\\n${prompt}`,\n ),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"compress timeout\")), 30_000),\n ),\n ]);\n llmCallCount++;\n const parsed = parseMemoryXml(response, sessionIds);\n if (!parsed) continue;\n\n const existingMatch = existingMemories.find(\n (m) => m.title.toLowerCase() === parsed.title.toLowerCase(),\n );\n\n const now = new Date().toISOString();\n const obsIds = [...new Set(top.map((o) => o.id))];\n if (existingMatch) {\n existingMatch.isLatest = false;\n await kv.set(KV.memories, existingMatch.id, existingMatch);\n\n const evolved: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n ...parsed,\n version: (existingMatch.version || 1) + 1,\n parentId: existingMatch.id,\n supersedes: [\n existingMatch.id,\n ...(existingMatch.supersedes || []),\n ],\n sourceObservationIds: obsIds,\n isLatest: true,\n };\n await kv.set(KV.memories, evolved.id, evolved);\n existingTitles.add(evolved.title.toLowerCase());\n consolidated++;\n } else {\n const memory: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n ...parsed,\n sourceObservationIds: obsIds,\n version: 1,\n isLatest: true,\n };\n await kv.set(KV.memories, memory.id, memory);\n existingTitles.add(memory.title.toLowerCase());\n consolidated++;\n }\n } catch (err) {\n ctx.logger.warn(\"Consolidation failed for concept\", {\n concept,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n ctx.logger.info(\"Consolidation complete\", {\n consolidated,\n totalObs: allObs.length,\n });\n return { consolidated, totalObservations: allObs.length };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { CompressedObservation, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface Pattern {\n type: \"co_change\" | \"error_repeat\" | \"workflow\";\n description: string;\n files: string[];\n frequency: number;\n sessions: string[];\n}\n\nexport function registerPatternsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::patterns\" },\n async (data: { project?: string }) => {\n const ctx = getContext();\n const patterns: Pattern[] = [];\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const fileCoOccurrences = new Map<string, number>();\n const fileSessionMap = new Map<string, Set<string>>();\n const errorPatterns = new Map<\n string,\n { count: number; sessions: Set<string> }\n >();\n\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n if (!observations.length) continue;\n\n const sessionFiles = new Set<string>();\n for (const obs of observations) {\n if (!obs.files) continue;\n for (const f of obs.files) {\n sessionFiles.add(f);\n if (!fileSessionMap.has(f)) fileSessionMap.set(f, new Set());\n fileSessionMap.get(f)!.add(session.id);\n }\n\n if (obs.type === \"error\" && obs.title) {\n const key = obs.title.toLowerCase();\n if (!errorPatterns.has(key)) {\n errorPatterns.set(key, { count: 0, sessions: new Set() });\n }\n const ep = errorPatterns.get(key)!;\n ep.count++;\n ep.sessions.add(session.id);\n }\n }\n\n const fileList = [...sessionFiles].sort();\n for (let i = 0; i < fileList.length; i++) {\n for (let j = i + 1; j < fileList.length; j++) {\n const pair = `${fileList[i]}::${fileList[j]}`;\n fileCoOccurrences.set(pair, (fileCoOccurrences.get(pair) || 0) + 1);\n }\n }\n }\n\n for (const [pair, count] of fileCoOccurrences) {\n if (count < 3) continue;\n const [fileA, fileB] = pair.split(\"::\");\n const sessionsA = fileSessionMap.get(fileA) || new Set();\n const sessionsB = fileSessionMap.get(fileB) || new Set();\n const commonSessions = [...sessionsA].filter((s) => sessionsB.has(s));\n\n patterns.push({\n type: \"co_change\",\n description: `${fileA} and ${fileB} are frequently modified together`,\n files: [fileA, fileB],\n frequency: count,\n sessions: commonSessions,\n });\n }\n\n for (const [\n errorKey,\n { count, sessions: errorSessions },\n ] of errorPatterns) {\n if (count < 2) continue;\n patterns.push({\n type: \"error_repeat\",\n description: `Recurring error: ${errorKey}`,\n files: [],\n frequency: count,\n sessions: [...errorSessions],\n });\n }\n\n patterns.sort((a, b) => b.frequency - a.frequency);\n\n ctx.logger.info(\"Pattern detection complete\", {\n patterns: patterns.length,\n sessions: filtered.length,\n });\n\n return { patterns: patterns.slice(0, 20) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::generate-rules\" },\n async (data: { project?: string }) => {\n const ctx = getContext();\n const result = await sdk.trigger<\n { project?: string },\n { patterns: Pattern[] }\n >(\"mem::patterns\", data);\n\n const rules: string[] = [];\n\n for (const pattern of result.patterns) {\n if (pattern.type === \"co_change\" && pattern.frequency >= 4) {\n rules.push(\n `When modifying ${pattern.files[0]}, also check ${pattern.files[1]} (co-changed ${pattern.frequency} times).`,\n );\n }\n if (pattern.type === \"error_repeat\" && pattern.frequency >= 3) {\n rules.push(\n `Watch for: ${pattern.description} (occurred ${pattern.frequency} times across ${pattern.sessions.length} sessions).`,\n );\n }\n }\n\n ctx.logger.info(\"Rules generated\", { count: rules.length });\n return { rules };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory } from \"../types.js\";\nimport { KV, generateId, jaccardSimilarity } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nexport function registerRememberFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::remember\" },\n async (data: {\n content: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n ttlDays?: number;\n sourceObservationIds?: string[];\n }) => {\n const ctx = getContext();\n if (\n !data.content ||\n typeof data.content !== \"string\" ||\n !data.content.trim()\n ) {\n return { success: false, error: \"content is required\" };\n }\n if (data.files && !Array.isArray(data.files)) {\n return { success: false, error: \"files must be an array\" };\n }\n if (data.concepts && !Array.isArray(data.concepts)) {\n return { success: false, error: \"concepts must be an array\" };\n }\n if (data.sourceObservationIds && !Array.isArray(data.sourceObservationIds)) {\n return { success: false, error: \"sourceObservationIds must be an array\" };\n }\n const validTypes = new Set([\n \"pattern\",\n \"preference\",\n \"architecture\",\n \"bug\",\n \"workflow\",\n \"fact\",\n ]);\n const memType = validTypes.has(data.type || \"\")\n ? (data.type as Memory[\"type\"])\n : \"fact\";\n\n const now = new Date().toISOString();\n\n return withKeyedLock(\"mem:remember\", async () => {\n const existingMemories = await kv.list<Memory>(KV.memories);\n let supersededId: string | undefined;\n let supersededVersion = 1;\n let supersededMemory: Memory | undefined;\n const lowerContent = data.content.toLowerCase();\n for (const existing of existingMemories) {\n if (existing.isLatest === false) continue;\n const similarity = jaccardSimilarity(\n lowerContent,\n existing.content.toLowerCase(),\n );\n if (similarity > 0.7) {\n supersededId = existing.id;\n supersededVersion = existing.version ?? 1;\n supersededMemory = existing;\n break;\n }\n }\n\n const memory: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n type: memType,\n title: data.content.slice(0, 80),\n content: data.content,\n concepts: data.concepts || [],\n files: data.files || [],\n sessionIds: [],\n strength: 7,\n version: supersededId ? supersededVersion + 1 : 1,\n parentId: supersededId,\n supersedes: supersededId ? [supersededId] : [],\n sourceObservationIds: (data.sourceObservationIds || []).filter(\n (id): id is string => typeof id === \"string\" && id.length > 0,\n ),\n isLatest: true,\n };\n\n if (data.ttlDays && typeof data.ttlDays === \"number\" && data.ttlDays > 0) {\n memory.forgetAfter = new Date(Date.now() + data.ttlDays * 86400000).toISOString();\n }\n\n if (supersededMemory) {\n supersededMemory.isLatest = false;\n await kv.set(KV.memories, supersededMemory.id, supersededMemory);\n }\n await kv.set(KV.memories, memory.id, memory);\n\n if (supersededId) {\n sdk.triggerVoid(\"mem::cascade-update\", {\n supersededMemoryId: supersededId,\n });\n }\n\n ctx.logger.info(\"Memory saved\", {\n memId: memory.id,\n type: memory.type,\n });\n return { success: true, memory };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::forget\" },\n async (data: {\n sessionId?: string;\n observationIds?: string[];\n memoryId?: string;\n }) => {\n const ctx = getContext();\n let deleted = 0;\n\n if (data.memoryId) {\n await kv.delete(KV.memories, data.memoryId);\n deleted++;\n }\n\n if (\n data.sessionId &&\n data.observationIds &&\n data.observationIds.length > 0\n ) {\n for (const obsId of data.observationIds) {\n await kv.delete(KV.observations(data.sessionId), obsId);\n deleted++;\n }\n }\n\n if (\n data.sessionId &&\n (!data.observationIds || data.observationIds.length === 0) &&\n !data.memoryId\n ) {\n const observations = await kv.list<{ id: string }>(\n KV.observations(data.sessionId),\n );\n for (const obs of observations) {\n await kv.delete(KV.observations(data.sessionId), obs.id);\n deleted++;\n }\n await kv.delete(KV.sessions, data.sessionId);\n await kv.delete(KV.summaries, data.sessionId);\n deleted += 2;\n }\n\n ctx.logger.info(\"Memory forgotten\", { deleted });\n return { success: true, deleted };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n Memory,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface EvictionConfig {\n staleSessionDays: number;\n lowImportanceMaxDays: number;\n lowImportanceThreshold: number;\n maxObservationsPerProject: number;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst DEFAULTS: EvictionConfig = {\n staleSessionDays: 30,\n lowImportanceMaxDays: 90,\n lowImportanceThreshold: 3,\n maxObservationsPerProject: 10_000,\n};\n\ninterface EvictionStats {\n staleSessions: number;\n lowImportanceObs: number;\n capEvictions: number;\n expiredMemories: number;\n nonLatestMemories: number;\n dryRun: boolean;\n}\n\nexport function registerEvictFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::evict\",\n description: \"Evict stale memories based on age and importance\",\n },\n async (data: { dryRun?: boolean }): Promise<EvictionStats> => {\n const ctx = getContext();\n const dryRun = data?.dryRun ?? false;\n\n const configOverride = await kv\n .get<Partial<EvictionConfig>>(KV.config, \"eviction\")\n .catch(() => null);\n const cfg = { ...DEFAULTS, ...configOverride };\n\n const now = Date.now();\n const stats: EvictionStats = {\n staleSessions: 0,\n lowImportanceObs: 0,\n capEvictions: 0,\n expiredMemories: 0,\n nonLatestMemories: 0,\n dryRun,\n };\n\n const sessions = await kv.list<Session>(KV.sessions).catch(() => []);\n const summaries = await kv\n .list<SessionSummary>(KV.summaries)\n .catch(() => []);\n const summaryIds = new Set(summaries.map((s) => s.sessionId));\n\n for (const session of sessions) {\n if (!session.startedAt) continue;\n const age = now - new Date(session.startedAt).getTime();\n const staleDays = cfg.staleSessionDays * MS_PER_DAY;\n if (age > staleDays && !summaryIds.has(session.id)) {\n stats.staleSessions++;\n if (!dryRun) {\n await kv.delete(KV.sessions, session.id).catch(() => {});\n }\n }\n }\n\n const projectObs = new Map<string, CompressedObservation[]>();\n for (const session of sessions) {\n const obs = await kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => []);\n const compressed = obs.filter((o) => o.title);\n\n for (const o of compressed) {\n if (!o.timestamp) continue;\n const age = now - new Date(o.timestamp).getTime();\n const maxAge = cfg.lowImportanceMaxDays * MS_PER_DAY;\n if (\n age > maxAge &&\n (o.importance ?? 5) < cfg.lowImportanceThreshold\n ) {\n stats.lowImportanceObs++;\n if (!dryRun) {\n await kv\n .delete(KV.observations(session.id), o.id)\n .catch(() => {});\n }\n }\n }\n\n const project = session.project || \"unknown\";\n const existing = projectObs.get(project) || [];\n existing.push(...compressed);\n projectObs.set(project, existing);\n }\n\n for (const [, obs] of projectObs) {\n if (obs.length > cfg.maxObservationsPerProject) {\n const sorted = obs.sort(\n (a, b) => (a.importance ?? 5) - (b.importance ?? 5),\n );\n const toEvict = sorted.slice(\n 0,\n obs.length - cfg.maxObservationsPerProject,\n );\n stats.capEvictions += toEvict.length;\n if (!dryRun) {\n for (const o of toEvict) {\n await kv\n .delete(KV.observations(o.sessionId), o.id)\n .catch(() => {});\n }\n }\n }\n }\n\n const memories = await kv.list<Memory>(KV.memories).catch(() => []);\n const evictedMemIds = new Set<string>();\n for (const mem of memories) {\n if (mem.forgetAfter) {\n const expiry = new Date(mem.forgetAfter).getTime();\n if (now > expiry) {\n stats.expiredMemories++;\n evictedMemIds.add(mem.id);\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id).catch(() => {});\n }\n }\n }\n\n if (\n !evictedMemIds.has(mem.id) &&\n mem.isLatest === false &&\n mem.createdAt\n ) {\n const age = now - new Date(mem.createdAt).getTime();\n if (age > cfg.lowImportanceMaxDays * MS_PER_DAY) {\n stats.nonLatestMemories++;\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id).catch(() => {});\n }\n }\n }\n }\n\n ctx.logger.info(\"Eviction complete\", { stats });\n return stats;\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, MemoryRelation } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nfunction computeConfidence(\n source: Memory,\n target: Memory,\n relationType: MemoryRelation[\"type\"],\n): number {\n let score = 0.5;\n\n const sharedSessions = source.sessionIds.filter((sid) =>\n target.sessionIds.includes(sid),\n );\n score += Math.min(sharedSessions.length * 0.1, 0.3);\n\n const now = Date.now();\n const sourceAge = now - new Date(source.updatedAt).getTime();\n const targetAge = now - new Date(target.updatedAt).getTime();\n const sevenDays = 7 * 24 * 60 * 60 * 1000;\n const ninetyDays = 90 * 24 * 60 * 60 * 1000;\n if (sourceAge < sevenDays && targetAge < sevenDays) {\n score += 0.1;\n } else if (sourceAge > ninetyDays && targetAge > ninetyDays) {\n score -= 0.1;\n }\n\n if (relationType === \"supersedes\") score += 0.1;\n if (relationType === \"contradicts\") score -= 0.05;\n\n return Math.max(0, Math.min(1, score));\n}\n\nexport function registerRelationsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::relate\",\n description: \"Create a relationship between memories\",\n },\n async (data: {\n sourceId: string;\n targetId: string;\n type: MemoryRelation[\"type\"];\n confidence?: number;\n }) => {\n const ctx = getContext();\n const [firstId, secondId] = [data.sourceId, data.targetId].sort();\n\n return withKeyedLock(`mem:${firstId}`, () =>\n withKeyedLock(`mem:${secondId}`, async () => {\n const source = await kv.get<Memory>(KV.memories, data.sourceId);\n const target = await kv.get<Memory>(KV.memories, data.targetId);\n if (!source || !target) {\n return {\n success: false,\n error: \"source or target memory not found\",\n };\n }\n\n const confidence =\n data.confidence !== undefined\n ? Math.max(0, Math.min(1, data.confidence))\n : computeConfidence(source, target, data.type);\n\n const relation: MemoryRelation = {\n type: data.type,\n sourceId: data.sourceId,\n targetId: data.targetId,\n createdAt: new Date().toISOString(),\n confidence,\n };\n\n const relationId = generateId(\"rel\");\n await kv.set(KV.relations, relationId, relation);\n\n if (!source.relatedIds) source.relatedIds = [];\n if (!source.relatedIds.includes(data.targetId)) {\n source.relatedIds.push(data.targetId);\n await kv.set(KV.memories, data.sourceId, source);\n }\n\n if (!target.relatedIds) target.relatedIds = [];\n if (!target.relatedIds.includes(data.sourceId)) {\n target.relatedIds.push(data.sourceId);\n await kv.set(KV.memories, data.targetId, target);\n }\n\n ctx.logger.info(\"Memory relation created\", {\n relationId,\n type: data.type,\n source: data.sourceId,\n target: data.targetId,\n });\n return { success: true, relationId, relation };\n }),\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::evolve\", description: \"Create a new version of a memory\" },\n async (data: {\n memoryId: string;\n newContent: string;\n newTitle?: string;\n }) => {\n const ctx = getContext();\n\n const existing = await kv.get<Memory>(KV.memories, data.memoryId);\n if (!existing) {\n return { success: false, error: \"memory not found\" };\n }\n\n const now = new Date().toISOString();\n const evolved: Memory = {\n ...existing,\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n title: data.newTitle || existing.title,\n content: data.newContent,\n version: (existing.version || 1) + 1,\n parentId: existing.id,\n supersedes: [existing.id, ...(existing.supersedes || [])],\n isLatest: true,\n };\n\n existing.isLatest = false;\n await kv.set(KV.memories, existing.id, existing);\n\n await kv.set(KV.memories, evolved.id, evolved);\n\n const relation: MemoryRelation = {\n type: \"supersedes\",\n sourceId: evolved.id,\n targetId: existing.id,\n createdAt: now,\n confidence: 1.0,\n };\n await kv.set(KV.relations, generateId(\"rel\"), relation);\n\n ctx.logger.info(\"Memory evolved\", {\n oldId: existing.id,\n newId: evolved.id,\n version: evolved.version,\n });\n return { success: true, memory: evolved, previousId: existing.id };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::get-related\",\n description: \"Get related memories within N hops\",\n },\n async (data: {\n memoryId: string;\n maxHops?: number;\n minConfidence?: number;\n }) => {\n const ctx = getContext();\n const maxHops = Math.min(data.maxHops ?? 2, 5);\n const MAX_VISITED = 500;\n const rawMinConf = Number(data.minConfidence);\n const minConfidence = Number.isFinite(rawMinConf)\n ? Math.max(0, Math.min(1, rawMinConf))\n : 0;\n\n const allRelations = await kv\n .list<MemoryRelation>(KV.relations)\n .catch(() => []);\n\n const visited = new Set<string>();\n const result: Array<{\n memory: Memory;\n hop: number;\n confidence: number;\n }> = [];\n const queue: Array<{ id: string; hop: number }> = [\n { id: data.memoryId, hop: 0 },\n ];\n\n while (queue.length > 0 && visited.size < MAX_VISITED) {\n const current = queue.shift()!;\n if (visited.has(current.id) || current.hop > maxHops) continue;\n visited.add(current.id);\n\n const memory = await kv.get<Memory>(KV.memories, current.id);\n if (!memory) continue;\n\n if (current.hop > 0) {\n const matchingRelations = allRelations.filter(\n (r) =>\n (r.sourceId === current.id && visited.has(r.targetId)) ||\n (r.targetId === current.id && visited.has(r.sourceId)),\n );\n const confidence =\n matchingRelations.length > 0\n ? Math.max(...matchingRelations.map((r) => r.confidence ?? 0.5))\n : 0.5;\n if (confidence >= minConfidence) {\n result.push({ memory, hop: current.hop, confidence });\n }\n }\n\n const relatedIds = memory.relatedIds || [];\n const supersedes = memory.supersedes || [];\n const parentId = memory.parentId ? [memory.parentId] : [];\n\n const kvLinked = allRelations\n .filter((r) => r.sourceId === current.id || r.targetId === current.id)\n .map((r) => (r.sourceId === current.id ? r.targetId : r.sourceId));\n\n const allLinks = [\n ...new Set([...relatedIds, ...supersedes, ...parentId, ...kvLinked]),\n ];\n\n for (const nextId of allLinks) {\n if (!visited.has(nextId)) {\n queue.push({ id: nextId, hop: current.hop + 1 });\n }\n }\n }\n\n result.sort((a, b) => b.confidence - a.confidence);\n\n ctx.logger.info(\"Related memories retrieved\", {\n memoryId: data.memoryId,\n found: result.length,\n });\n return { results: result };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Session,\n TimelineEntry,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerTimelineFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::timeline\",\n description: \"Get chronological observations around an anchor point\",\n },\n async (data: {\n anchor: string;\n project?: string;\n before?: number;\n after?: number;\n }) => {\n const ctx = getContext();\n const before = Math.max(0, Math.floor(data.before ?? 5));\n const after = Math.max(0, Math.floor(data.after ?? 5));\n\n if (!data.anchor || typeof data.anchor !== \"string\") {\n return { entries: [], anchor: data.anchor, reason: \"invalid_anchor\" };\n }\n\n let anchorTime: number;\n const isoPattern = /^\\d{4}-\\d{2}-\\d{2}/;\n if (isoPattern.test(data.anchor)) {\n anchorTime = new Date(data.anchor).getTime();\n if (isNaN(anchorTime)) {\n return { entries: [], anchor: data.anchor, reason: \"invalid_date\" };\n }\n } else {\n const searchResults = await findByKeyword(\n kv,\n data.anchor,\n data.project,\n );\n if (searchResults.length === 0) {\n return { entries: [], anchor: data.anchor, reason: \"no_match\" };\n }\n anchorTime = new Date(searchResults[0].timestamp).getTime();\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const allObs: Array<CompressedObservation & { sid: string }> = [];\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n for (const obs of observations) {\n if (obs.title && obs.timestamp) {\n allObs.push({ ...obs, sid: session.id });\n }\n }\n }\n\n allObs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n let anchorIdx = 0;\n let minDist = Infinity;\n for (let i = 0; i < allObs.length; i++) {\n const dist = Math.abs(\n new Date(allObs[i].timestamp).getTime() - anchorTime,\n );\n if (dist < minDist) {\n minDist = dist;\n anchorIdx = i;\n }\n }\n\n const startIdx = Math.max(0, anchorIdx - before);\n const endIdx = Math.min(allObs.length - 1, anchorIdx + after);\n const entries: TimelineEntry[] = [];\n\n for (let i = startIdx; i <= endIdx; i++) {\n const obs = allObs[i];\n const { sid, ...observation } = obs;\n entries.push({\n observation,\n sessionId: sid,\n relativePosition: i - anchorIdx,\n });\n }\n\n ctx.logger.info(\"Timeline retrieved\", {\n anchor: data.anchor,\n entries: entries.length,\n });\n return { entries, anchorIndex: anchorIdx - startIdx };\n },\n );\n}\n\nasync function findByKeyword(\n kv: StateKV,\n keyword: string,\n project?: string,\n): Promise<CompressedObservation[]> {\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = project\n ? sessions.filter((s) => s.project === project)\n : sessions;\n\n const lower = keyword.toLowerCase();\n const matches: CompressedObservation[] = [];\n\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n for (const obs of observations) {\n if (\n obs.title?.toLowerCase().includes(lower) ||\n obs.narrative?.toLowerCase().includes(lower) ||\n obs.concepts?.some((c) => c.toLowerCase().includes(lower))\n ) {\n matches.push(obs);\n }\n }\n }\n\n return matches.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompactSearchResult,\n CompressedObservation,\n HybridSearchResult,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerSmartSearchFunction(\n sdk: ISdk,\n kv: StateKV,\n searchFn: (query: string, limit: number) => Promise<HybridSearchResult[]>,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::smart-search\",\n description:\n \"Search with progressive disclosure: compact results first, expand specific IDs for full details\",\n },\n async (data: {\n query?: string;\n expandIds?: Array<string | { obsId: string; sessionId: string }>;\n limit?: number;\n }) => {\n const ctx = getContext();\n\n if (data.expandIds && data.expandIds.length > 0) {\n const raw = data.expandIds.slice(0, 20);\n const items = raw.map((entry) => {\n if (typeof entry === \"string\") return { obsId: entry, sessionId: undefined as string | undefined };\n if (entry && typeof entry === \"object\" && typeof (entry as any).obsId === \"string\") {\n return { obsId: (entry as any).obsId, sessionId: (entry as any).sessionId as string | undefined };\n }\n return null;\n }).filter((item): item is NonNullable<typeof item> => item !== null);\n\n const expanded: Array<{\n obsId: string;\n sessionId: string;\n observation: CompressedObservation;\n }> = [];\n\n const results = await Promise.all(\n items.map(({ obsId, sessionId }) =>\n findObservation(kv, obsId, sessionId).then((obs) =>\n obs ? { obsId, sessionId: obs.sessionId, observation: obs } : null,\n ),\n ),\n );\n for (const r of results) {\n if (r) expanded.push(r);\n }\n\n const truncated = data.expandIds.length > raw.length;\n ctx.logger.info(\"Smart search expanded\", {\n requested: data.expandIds.length,\n attempted: raw.length,\n returned: expanded.length,\n truncated,\n });\n return { mode: \"expanded\", results: expanded, truncated };\n }\n\n if (!data.query || typeof data.query !== \"string\" || !data.query.trim()) {\n return { mode: \"compact\", results: [], error: \"query is required\" };\n }\n\n const limit = Math.max(1, Math.min(data.limit ?? 20, 100));\n const hybridResults = await searchFn(data.query, limit);\n\n const compact: CompactSearchResult[] = hybridResults.map((r) => ({\n obsId: r.observation.id,\n sessionId: r.sessionId,\n title: r.observation.title,\n type: r.observation.type,\n score: r.combinedScore,\n timestamp: r.observation.timestamp,\n }));\n\n ctx.logger.info(\"Smart search compact\", {\n query: data.query,\n results: compact.length,\n });\n return { mode: \"compact\", results: compact };\n },\n );\n}\n\nasync function findObservation(\n kv: StateKV,\n obsId: string,\n sessionIdHint?: string,\n): Promise<CompressedObservation | null> {\n if (sessionIdHint) {\n const obs = await kv\n .get<CompressedObservation>(KV.observations(sessionIdHint), obsId)\n .catch(() => null);\n if (obs) return obs;\n }\n\n const sessions = await kv.list<{ id: string }>(KV.sessions);\n for (let i = 0; i < sessions.length; i += 5) {\n const batch = sessions.slice(i, i + 5);\n const results = await Promise.all(\n batch.map((s) =>\n kv.get<CompressedObservation>(KV.observations(s.id), obsId).catch(() => null),\n ),\n );\n const found = results.find((r) => r !== null);\n if (found) return found;\n }\n return null;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Session,\n ProjectProfile,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerProfileFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::profile\",\n description: \"Generate or retrieve a project profile from aggregated data\",\n },\n async (data: { project: string; refresh?: boolean }) => {\n const ctx = getContext();\n\n if (!data.refresh) {\n const cached = await kv\n .get<ProjectProfile>(KV.profiles, data.project)\n .catch(() => null);\n if (cached) {\n const age = Date.now() - new Date(cached.updatedAt).getTime();\n if (age < 3600_000) {\n return { profile: cached, cached: true };\n }\n }\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const projectSessions = sessions.filter(\n (s) => s.project === data.project,\n );\n\n if (projectSessions.length === 0) {\n return { profile: null, reason: \"no_sessions\" };\n }\n\n const conceptFreq = new Map<string, number>();\n const fileFreq = new Map<string, number>();\n const errors: string[] = [];\n const recentActivity: string[] = [];\n let totalObs = 0;\n\n const sortedSessions = projectSessions.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n const top20Sessions = sortedSessions.slice(0, 20);\n const obsPerSession = await Promise.all(\n top20Sessions.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n\n for (let i = 0; i < top20Sessions.length; i++) {\n const session = top20Sessions[i];\n const observations = obsPerSession[i];\n totalObs += observations.length;\n\n for (const obs of observations) {\n for (const concept of obs.concepts || []) {\n conceptFreq.set(concept, (conceptFreq.get(concept) || 0) + 1);\n }\n for (const file of obs.files || []) {\n fileFreq.set(file, (fileFreq.get(file) || 0) + 1);\n }\n if (obs.type === \"error\") {\n errors.push(obs.title);\n }\n }\n\n const important = observations\n .filter((o) => o.importance >= 7)\n .sort((a, b) => b.importance - a.importance);\n if (important.length > 0) {\n recentActivity.push(\n `[${session.startedAt.slice(0, 10)}] ${important[0].title}`,\n );\n }\n }\n\n const topConcepts = Array.from(conceptFreq.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([concept, frequency]) => ({ concept, frequency }));\n\n const topFiles = Array.from(fileFreq.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([file, frequency]) => ({ file, frequency }));\n\n const uniqueErrors = [...new Set(errors)].slice(0, 10);\n\n const profile: ProjectProfile = {\n project: data.project,\n updatedAt: new Date().toISOString(),\n topConcepts,\n topFiles,\n conventions: extractConventions(topConcepts, topFiles),\n commonErrors: uniqueErrors,\n recentActivity: recentActivity.slice(0, 10),\n sessionCount: projectSessions.length,\n totalObservations: totalObs,\n };\n\n await kv.set(KV.profiles, data.project, profile);\n\n ctx.logger.info(\"Profile generated\", {\n project: data.project,\n sessions: projectSessions.length,\n observations: totalObs,\n });\n return { profile, cached: false };\n },\n );\n}\n\nfunction extractConventions(\n concepts: Array<{ concept: string; frequency: number }>,\n files: Array<{ file: string; frequency: number }>,\n): string[] {\n const conventions: string[] = [];\n\n const tsFiles = files.filter((f) => f.file.endsWith(\".ts\")).length;\n const jsFiles = files.filter((f) => f.file.endsWith(\".js\")).length;\n if (tsFiles > jsFiles && tsFiles > 0) {\n conventions.push(\"TypeScript project\");\n }\n\n const srcFiles = files.filter((f) => f.file.includes(\"/src/\")).length;\n if (srcFiles > files.length * 0.5) {\n conventions.push(\"Standard src/ directory structure\");\n }\n\n const testFiles = files.filter(\n (f) => f.file.includes(\"test\") || f.file.includes(\"spec\"),\n ).length;\n if (testFiles > 0) {\n conventions.push(\"Has test files\");\n }\n\n for (const { concept, frequency } of concepts.slice(0, 5)) {\n if (frequency >= 3) {\n conventions.push(`Frequently uses: ${concept}`);\n }\n }\n\n return conventions;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, CompressedObservation, Session } from \"../types.js\";\nimport { KV, jaccardSimilarity } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\nconst CONTRADICTION_THRESHOLD = 0.9;\n\ninterface AutoForgetResult {\n ttlExpired: string[];\n contradictions: Array<{\n memoryA: string;\n memoryB: string;\n similarity: number;\n }>;\n lowValueObs: string[];\n dryRun: boolean;\n}\n\nexport function registerAutoForgetFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::auto-forget\",\n description:\n \"Auto-forget expired (TTL), contradictory, and low-value data\",\n },\n async (data: { dryRun?: boolean }): Promise<AutoForgetResult> => {\n const ctx = getContext();\n const dryRun = data?.dryRun ?? false;\n const now = Date.now();\n\n const result: AutoForgetResult = {\n ttlExpired: [],\n contradictions: [],\n lowValueObs: [],\n dryRun,\n };\n\n const memories = await kv.list<Memory>(KV.memories);\n const deletedIds = new Set<string>();\n for (const mem of memories) {\n if (mem.forgetAfter) {\n const expiry = new Date(mem.forgetAfter).getTime();\n if (now > expiry) {\n result.ttlExpired.push(mem.id);\n deletedIds.add(mem.id);\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id);\n }\n }\n }\n }\n\n const latestMemories = memories\n .filter((m) => m.isLatest !== false && !deletedIds.has(m.id))\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n )\n .slice(0, 1000);\n\n const tokenCache = new Map<string, Set<string>>();\n for (const mem of latestMemories) {\n tokenCache.set(\n mem.id,\n new Set(\n mem.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 2),\n ),\n );\n }\n\n const memById = new Map(latestMemories.map((m) => [m.id, m]));\n const conceptIndex = new Map<string, string[]>();\n for (const mem of latestMemories) {\n const concepts = mem.concepts || [];\n for (const c of concepts) {\n const key = c.toLowerCase();\n if (!conceptIndex.has(key)) conceptIndex.set(key, []);\n conceptIndex.get(key)!.push(mem.id);\n }\n }\n\n const compared = new Set<string>();\n for (const [, memIds] of conceptIndex) {\n for (let i = 0; i < memIds.length; i++) {\n for (let j = i + 1; j < memIds.length; j++) {\n const key =\n memIds[i] < memIds[j]\n ? `${memIds[i]}|${memIds[j]}`\n : `${memIds[j]}|${memIds[i]}`;\n if (compared.has(key)) continue;\n compared.add(key);\n\n const setA = tokenCache.get(memIds[i])!;\n const setB = tokenCache.get(memIds[j])!;\n let intersection = 0;\n if (setA.size === 0 && setB.size === 0) continue;\n if (setA.size === 0 || setB.size === 0) continue;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n const sim =\n intersection / (setA.size + setB.size - intersection);\n\n if (sim > CONTRADICTION_THRESHOLD) {\n const memA = memById.get(memIds[i])!;\n const memB = memById.get(memIds[j])!;\n result.contradictions.push({\n memoryA: memA.id,\n memoryB: memB.id,\n similarity: sim,\n });\n\n if (!dryRun) {\n const older =\n new Date(memA.createdAt).getTime() <\n new Date(memB.createdAt).getTime()\n ? memA\n : memB;\n older.isLatest = false;\n await kv.set(KV.memories, older.id, older);\n }\n }\n }\n }\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const obsPerSession: CompressedObservation[][] = [];\n for (let batch = 0; batch < sessions.length; batch += 10) {\n const chunk = sessions.slice(batch, batch + 10);\n const results = await Promise.all(\n chunk.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n obsPerSession.push(...results);\n }\n for (let i = 0; i < sessions.length; i++) {\n for (const obs of obsPerSession[i]) {\n if (!obs.timestamp) continue;\n const age = now - new Date(obs.timestamp).getTime();\n if (age > 180 * MS_PER_DAY && (obs.importance ?? 5) <= 2) {\n result.lowValueObs.push(obs.id);\n if (!dryRun) {\n await kv\n .delete(KV.observations(sessions[i].id), obs.id)\n .catch(() => {});\n }\n }\n }\n }\n\n ctx.logger.info(\"Auto-forget complete\", {\n ttlExpired: result.ttlExpired.length,\n contradictions: result.contradictions.length,\n lowValueObs: result.lowValueObs.length,\n dryRun,\n });\n return result;\n },\n );\n}\n","export const VERSION: \"0.3.0\" | \"0.4.0\" | \"0.5.0\" | \"0.6.0\" | \"0.6.1\" | \"0.7.0\" = \"0.7.0\";\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n Memory,\n SessionSummary,\n ProjectProfile,\n ExportData,\n GraphNode,\n GraphEdge,\n SemanticMemory,\n ProceduralMemory,\n Action,\n ActionEdge,\n Routine,\n Signal,\n Checkpoint,\n Sentinel,\n Sketch,\n Crystal,\n Facet,\n Lesson,\n ExportPagination,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { VERSION } from \"../version.js\";\n\nexport function registerExportImportFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::export\", description: \"Export all memory data as JSON\" },\n async (data?: { maxSessions?: number; offset?: number }) => {\n const ctx = getContext();\n const rawMax = Number(data?.maxSessions);\n const maxSessions = Number.isFinite(rawMax) && rawMax > 0 ? Math.min(Math.floor(rawMax), 1000) : undefined;\n const rawOffset = Number(data?.offset);\n const offset = Number.isFinite(rawOffset) && rawOffset >= 0 ? Math.floor(rawOffset) : 0;\n\n const allSessions = await kv.list<Session>(KV.sessions);\n const paginatedSessions = maxSessions !== undefined\n ? allSessions.slice(offset, offset + maxSessions)\n : allSessions;\n const memories = await kv.list<Memory>(KV.memories);\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n\n const observations: Record<string, CompressedObservation[]> = {};\n const obsResults = await Promise.all(\n paginatedSessions.map((session) =>\n kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => [] as CompressedObservation[])\n .then((obs) => ({ sessionId: session.id, obs })),\n ),\n );\n for (const { sessionId, obs } of obsResults) {\n if (obs.length > 0) {\n observations[sessionId] = obs;\n }\n }\n\n const profiles: ProjectProfile[] = [];\n const uniqueProjects = [...new Set(paginatedSessions.map((s) => s.project))];\n const profileResults = await Promise.all(\n uniqueProjects.map((project) =>\n kv.get<ProjectProfile>(KV.profiles, project).catch(() => null),\n ),\n );\n for (const profile of profileResults) {\n if (profile) profiles.push(profile);\n }\n\n const [\n graphNodes,\n graphEdges,\n semanticMemories,\n proceduralMemories,\n actions,\n actionEdges,\n sentinels,\n sketches,\n crystals,\n facets,\n lessons,\n routines,\n signals,\n checkpoints,\n ] = await Promise.all([\n kv.list<GraphNode>(KV.graphNodes).catch(() => []),\n kv.list<GraphEdge>(KV.graphEdges).catch(() => []),\n kv.list<SemanticMemory>(KV.semantic).catch(() => []),\n kv.list<ProceduralMemory>(KV.procedural).catch(() => []),\n kv.list<Action>(KV.actions).catch(() => []),\n kv.list<ActionEdge>(KV.actionEdges).catch(() => []),\n kv.list<Sentinel>(KV.sentinels).catch(() => []),\n kv.list<Sketch>(KV.sketches).catch(() => []),\n kv.list<Crystal>(KV.crystals).catch(() => []),\n kv.list<Facet>(KV.facets).catch(() => []),\n kv.list<Lesson>(KV.lessons).catch(() => []),\n kv.list<Routine>(KV.routines).catch(() => []),\n kv.list<Signal>(KV.signals).catch(() => []),\n kv.list<Checkpoint>(KV.checkpoints).catch(() => []),\n ]);\n\n const exportData: ExportData = {\n version: VERSION,\n exportedAt: new Date().toISOString(),\n sessions: paginatedSessions,\n observations,\n memories,\n summaries,\n profiles: profiles.length > 0 ? profiles : undefined,\n graphNodes: graphNodes.length > 0 ? graphNodes : undefined,\n graphEdges: graphEdges.length > 0 ? graphEdges : undefined,\n semanticMemories:\n semanticMemories.length > 0 ? semanticMemories : undefined,\n proceduralMemories:\n proceduralMemories.length > 0 ? proceduralMemories : undefined,\n actions: actions.length > 0 ? actions : undefined,\n actionEdges: actionEdges.length > 0 ? actionEdges : undefined,\n sentinels: sentinels.length > 0 ? sentinels : undefined,\n sketches: sketches.length > 0 ? sketches : undefined,\n crystals: crystals.length > 0 ? crystals : undefined,\n facets: facets.length > 0 ? facets : undefined,\n lessons: lessons.length > 0 ? lessons : undefined,\n routines: routines.length > 0 ? routines : undefined,\n signals: signals.length > 0 ? signals : undefined,\n checkpoints: checkpoints.length > 0 ? checkpoints : undefined,\n };\n\n if (maxSessions !== undefined) {\n exportData.pagination = {\n offset,\n limit: maxSessions,\n total: allSessions.length,\n hasMore: offset + maxSessions < allSessions.length,\n };\n }\n\n const totalObs = Object.values(observations).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n );\n ctx.logger.info(\"Export complete\", {\n sessions: paginatedSessions.length,\n totalSessions: allSessions.length,\n observations: totalObs,\n memories: memories.length,\n summaries: summaries.length,\n });\n\n return exportData;\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::import\",\n description: \"Import memory data from JSON export\",\n },\n async (data: {\n exportData: ExportData;\n strategy?: \"merge\" | \"replace\" | \"skip\";\n }) => {\n const ctx = getContext();\n const strategy = data.strategy || \"merge\";\n const importData = data.exportData;\n\n const supportedVersions = new Set([\"0.3.0\", \"0.4.0\", \"0.5.0\", \"0.6.0\", \"0.6.1\", \"0.7.0\"]);\n if (!supportedVersions.has(importData.version)) {\n return {\n success: false,\n error: `Unsupported export version: ${importData.version}`,\n };\n }\n\n const MAX_SESSIONS = 10_000;\n const MAX_MEMORIES = 50_000;\n const MAX_SUMMARIES = 10_000;\n const MAX_OBS_PER_SESSION = 5_000;\n const MAX_TOTAL_OBSERVATIONS = 500_000;\n\n if (!Array.isArray(importData.sessions)) {\n return { success: false, error: \"sessions must be an array\" };\n }\n if (!Array.isArray(importData.memories)) {\n return { success: false, error: \"memories must be an array\" };\n }\n if (!Array.isArray(importData.summaries)) {\n return { success: false, error: \"summaries must be an array\" };\n }\n if (\n typeof importData.observations !== \"object\" ||\n importData.observations === null ||\n Array.isArray(importData.observations)\n ) {\n return { success: false, error: \"observations must be an object\" };\n }\n\n if (importData.sessions.length > MAX_SESSIONS) {\n return {\n success: false,\n error: `Too many sessions (max ${MAX_SESSIONS})`,\n };\n }\n if (importData.memories.length > MAX_MEMORIES) {\n return {\n success: false,\n error: `Too many memories (max ${MAX_MEMORIES})`,\n };\n }\n if (importData.summaries.length > MAX_SUMMARIES) {\n return {\n success: false,\n error: `Too many summaries (max ${MAX_SUMMARIES})`,\n };\n }\n const MAX_OBS_BUCKETS = 10_000;\n const obsBuckets = Object.keys(importData.observations);\n if (obsBuckets.length > MAX_OBS_BUCKETS) {\n return {\n success: false,\n error: `Too many observation buckets (max ${MAX_OBS_BUCKETS})`,\n };\n }\n\n let totalObservations = 0;\n for (const [, obs] of Object.entries(importData.observations)) {\n if (!Array.isArray(obs)) {\n return { success: false, error: \"observation values must be arrays\" };\n }\n if (obs.length > MAX_OBS_PER_SESSION) {\n return {\n success: false,\n error: `Too many observations per session (max ${MAX_OBS_PER_SESSION})`,\n };\n }\n totalObservations += obs.length;\n }\n if (totalObservations > MAX_TOTAL_OBSERVATIONS) {\n return {\n success: false,\n error: `Too many total observations (max ${MAX_TOTAL_OBSERVATIONS})`,\n };\n }\n\n const stats = {\n sessions: 0,\n observations: 0,\n memories: 0,\n summaries: 0,\n skipped: 0,\n };\n\n if (strategy === \"replace\") {\n const existing = await kv.list<Session>(KV.sessions);\n for (const session of existing) {\n await kv.delete(KV.sessions, session.id);\n const obs = await kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => []);\n for (const o of obs) {\n await kv.delete(KV.observations(session.id), o.id);\n }\n }\n const existingMem = await kv.list<Memory>(KV.memories);\n for (const m of existingMem) {\n await kv.delete(KV.memories, m.id);\n }\n const existingSummaries = await kv.list<SessionSummary>(KV.summaries);\n for (const s of existingSummaries) {\n await kv.delete(KV.summaries, s.sessionId);\n }\n for (const a of await kv.list<Action>(KV.actions).catch(() => [])) {\n await kv.delete(KV.actions, a.id);\n }\n for (const e of await kv.list<ActionEdge>(KV.actionEdges).catch(() => [])) {\n await kv.delete(KV.actionEdges, e.id);\n }\n for (const r of await kv.list<Routine>(KV.routines).catch(() => [])) {\n await kv.delete(KV.routines, r.id);\n }\n for (const s of await kv.list<Signal>(KV.signals).catch(() => [])) {\n await kv.delete(KV.signals, s.id);\n }\n for (const c of await kv.list<Checkpoint>(KV.checkpoints).catch(() => [])) {\n await kv.delete(KV.checkpoints, c.id);\n }\n for (const s of await kv.list<Sentinel>(KV.sentinels).catch(() => [])) {\n await kv.delete(KV.sentinels, s.id);\n }\n for (const s of await kv.list<Sketch>(KV.sketches).catch(() => [])) {\n await kv.delete(KV.sketches, s.id);\n }\n for (const c of await kv.list<Crystal>(KV.crystals).catch(() => [])) {\n await kv.delete(KV.crystals, c.id);\n }\n for (const f of await kv.list<Facet>(KV.facets).catch(() => [])) {\n await kv.delete(KV.facets, f.id);\n }\n for (const l of await kv.list<Lesson>(KV.lessons).catch(() => [])) {\n await kv.delete(KV.lessons, l.id);\n }\n for (const n of await kv.list<{ id: string }>(KV.graphNodes).catch(() => [])) {\n await kv.delete(KV.graphNodes, n.id);\n }\n for (const e of await kv.list<{ id: string }>(KV.graphEdges).catch(() => [])) {\n await kv.delete(KV.graphEdges, e.id);\n }\n for (const s of await kv.list<{ id: string }>(KV.semantic).catch(() => [])) {\n await kv.delete(KV.semantic, s.id);\n }\n for (const p of await kv.list<{ id: string }>(KV.procedural).catch(() => [])) {\n await kv.delete(KV.procedural, p.id);\n }\n }\n\n for (const session of importData.sessions) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<Session>(KV.sessions, session.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.sessions, session.id, session);\n stats.sessions++;\n }\n\n for (const [sessionId, obs] of Object.entries(importData.observations)) {\n for (const o of obs) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<CompressedObservation>(KV.observations(sessionId), o.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.observations(sessionId), o.id, o);\n stats.observations++;\n }\n }\n\n for (const memory of importData.memories) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<Memory>(KV.memories, memory.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.memories, memory.id, memory);\n stats.memories++;\n }\n\n for (const summary of importData.summaries) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<SessionSummary>(KV.summaries, summary.sessionId)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.summaries, summary.sessionId, summary);\n stats.summaries++;\n }\n\n if (importData.graphNodes) {\n for (const node of importData.graphNodes) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.graphNodes, node.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.graphNodes, node.id, node);\n }\n }\n if (importData.graphEdges) {\n for (const edge of importData.graphEdges) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.graphEdges, edge.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.graphEdges, edge.id, edge);\n }\n }\n if (importData.semanticMemories) {\n for (const sem of importData.semanticMemories) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.semantic, sem.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.semantic, sem.id, sem);\n }\n }\n if (importData.proceduralMemories) {\n for (const proc of importData.proceduralMemories) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.procedural, proc.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.procedural, proc.id, proc);\n }\n }\n\n if (importData.actions) {\n for (const action of importData.actions) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.actions, action.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.actions, action.id, action);\n }\n }\n if (importData.actionEdges) {\n for (const edge of importData.actionEdges) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.actionEdges, edge.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n if (importData.routines) {\n for (const routine of importData.routines) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.routines, routine.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.routines, routine.id, routine);\n }\n }\n if (importData.signals) {\n for (const signal of importData.signals) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.signals, signal.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.signals, signal.id, signal);\n }\n }\n if (importData.checkpoints) {\n for (const checkpoint of importData.checkpoints) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.checkpoints, checkpoint.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n }\n }\n if (importData.sentinels) {\n for (const sentinel of importData.sentinels) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.sentinels, sentinel.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n }\n }\n if (importData.sketches) {\n for (const sketch of importData.sketches) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.sketches, sketch.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.sketches, sketch.id, sketch);\n }\n }\n if (importData.crystals) {\n for (const crystal of importData.crystals) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.crystals, crystal.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.crystals, crystal.id, crystal);\n }\n }\n if (importData.facets) {\n for (const facet of importData.facets) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.facets, facet.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.facets, facet.id, facet);\n }\n }\n if (importData.lessons) {\n for (const lesson of importData.lessons) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.lessons, lesson.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.lessons, lesson.id, lesson);\n }\n }\n\n ctx.logger.info(\"Import complete\", { strategy, ...stats });\n return { success: true, strategy, ...stats };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst MAX_CONTEXT_LENGTH = 4000;\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\nexport function registerEnrichFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::enrich\",\n description:\n \"Aggregate file context, relevant observations, and bug memories for pre-tool enrichment\",\n },\n async (data: {\n sessionId: string;\n files: string[];\n terms?: string[];\n toolName?: string;\n }) => {\n const ctx = getContext();\n const parts: string[] = [];\n\n const fileContextPromise = sdk\n .trigger<{ sessionId: string; files: string[] }, { context: string }>(\n \"mem::file-context\",\n {\n sessionId: data.sessionId,\n files: data.files,\n },\n )\n .catch(() => ({ context: \"\" }));\n\n const searchQueries: string[] = [\n ...data.files.map((f) => f.split(\"/\").pop() || f),\n ...(data.terms || []),\n ].filter((q) => q.length > 0);\n\n const searchPromise =\n searchQueries.length > 0\n ? sdk\n .trigger<\n { query: string; limit: number },\n { results: Array<{ observation: { narrative: string } }> }\n >(\"mem::search\", {\n query: searchQueries.join(\" \"),\n limit: 5,\n })\n .catch(() => ({ results: [] }))\n : Promise.resolve({ results: [] });\n\n const bugMemoriesPromise = kv\n .list<Memory>(KV.memories)\n .then((memories) =>\n memories\n .filter(\n (m) =>\n m.type === \"bug\" &&\n m.isLatest &&\n m.files.some((f) =>\n data.files.some((df) => f.includes(df) || df.includes(f)),\n ),\n )\n .sort(\n (a, b) =>\n new Date(b.updatedAt || b.createdAt).getTime() -\n new Date(a.updatedAt || a.createdAt).getTime(),\n ),\n )\n .catch(() => []);\n\n const [fileContext, searchResult, bugMemories] = await Promise.all([\n fileContextPromise,\n searchPromise,\n bugMemoriesPromise,\n ]);\n\n if (fileContext.context) {\n parts.push(fileContext.context);\n }\n\n if (searchResult.results.length > 0) {\n const observations = searchResult.results\n .map((r) => r.observation?.narrative)\n .filter(Boolean)\n .map((n) => escapeXml(n as string))\n .join(\"\\n\");\n if (observations) {\n parts.push(\n `<agentmemory-relevant-context>\\n${observations}\\n</agentmemory-relevant-context>`,\n );\n }\n }\n\n if (bugMemories.length > 0) {\n const bugs = bugMemories\n .slice(0, 3)\n .map((m) => `- ${escapeXml(m.title)}: ${escapeXml(m.content)}`)\n .join(\"\\n\");\n parts.push(\n `<agentmemory-past-errors>\\n${bugs}\\n</agentmemory-past-errors>`,\n );\n }\n\n let context = parts.join(\"\\n\\n\");\n let truncated = false;\n if (context.length > MAX_CONTEXT_LENGTH) {\n context = context.slice(0, MAX_CONTEXT_LENGTH);\n truncated = true;\n }\n\n ctx.logger.info(\"Enrichment completed\", {\n sessionId: data.sessionId,\n fileCount: data.files.length,\n contextLength: context.length,\n truncated,\n });\n\n return { context, truncated };\n },\n );\n}\n","import type { AuditEntry } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nexport async function recordAudit(\n kv: StateKV,\n operation: AuditEntry[\"operation\"],\n functionId: string,\n targetIds: string[],\n details: Record<string, unknown> = {},\n qualityScore?: number,\n userId?: string,\n): Promise<AuditEntry> {\n const entry: AuditEntry = {\n id: generateId(\"aud\"),\n timestamp: new Date().toISOString(),\n operation,\n userId,\n functionId,\n targetIds,\n details,\n qualityScore,\n };\n await kv.set(KV.audit, entry.id, entry);\n return entry;\n}\n\nexport async function queryAudit(\n kv: StateKV,\n filter?: {\n operation?: AuditEntry[\"operation\"];\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n },\n): Promise<AuditEntry[]> {\n const all = await kv.list<AuditEntry>(KV.audit);\n let entries = [...all].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (filter?.operation) {\n entries = entries.filter((e) => e.operation === filter.operation);\n }\n if (filter?.dateFrom) {\n const from = new Date(filter.dateFrom).getTime();\n if (Number.isNaN(from)) {\n throw new Error(`Invalid dateFrom: ${filter.dateFrom}`);\n }\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= from);\n }\n if (filter?.dateTo) {\n const to = new Date(filter.dateTo).getTime();\n if (Number.isNaN(to)) {\n throw new Error(`Invalid dateTo: ${filter.dateTo}`);\n }\n entries = entries.filter((e) => new Date(e.timestamp).getTime() <= to);\n }\n\n return entries.slice(0, filter?.limit || 100);\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { Memory, ClaudeBridgeConfig } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction parseMemoryMd(content: string): {\n sections: Map<string, string>;\n raw: string;\n} {\n const sections = new Map<string, string>();\n let currentSection = \"\";\n let currentContent: string[] = [];\n\n for (const line of content.split(\"\\n\")) {\n if (line.startsWith(\"## \")) {\n if (currentSection) {\n sections.set(currentSection, currentContent.join(\"\\n\").trim());\n }\n currentSection = line.slice(3).trim();\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n if (currentSection) {\n sections.set(currentSection, currentContent.join(\"\\n\").trim());\n }\n\n return { sections, raw: content };\n}\n\nfunction serializeToMemoryMd(\n memories: Memory[],\n projectSummary: string,\n lineBudget: number,\n): string {\n const lines: string[] = [];\n lines.push(\"# Agent Memory (auto-synced by agentmemory)\");\n lines.push(\"\");\n\n if (projectSummary) {\n lines.push(\"## Project Summary\");\n lines.push(projectSummary);\n lines.push(\"\");\n }\n\n lines.push(\"## Key Memories\");\n lines.push(\"\");\n\n const sorted = [...memories]\n .filter((m) => m.isLatest)\n .sort((a, b) => b.strength - a.strength);\n\n for (const mem of sorted) {\n if (lines.length >= lineBudget - 2) break;\n lines.push(`### ${mem.title}`);\n const contentLines = mem.content.split(\"\\n\");\n for (const cl of contentLines) {\n if (lines.length >= lineBudget - 1) break;\n lines.push(cl);\n }\n lines.push(\"\");\n }\n\n return lines.slice(0, lineBudget).join(\"\\n\");\n}\n\nexport function registerClaudeBridgeFunction(\n sdk: ISdk,\n kv: StateKV,\n config: ClaudeBridgeConfig,\n): void {\n sdk.registerFunction(\n { id: \"mem::claude-bridge-read\" },\n async () => {\n const ctx = getContext();\n if (!config.enabled || !config.memoryFilePath) {\n return { success: false, error: \"Claude bridge not configured\" };\n }\n\n try {\n if (!existsSync(config.memoryFilePath)) {\n return { success: true, content: \"\", parsed: false };\n }\n const content = readFileSync(config.memoryFilePath, \"utf-8\");\n const { sections } = parseMemoryMd(content);\n\n await kv.set(KV.claudeBridge, \"last-read\", {\n timestamp: new Date().toISOString(),\n sections: Object.fromEntries(sections),\n lineCount: content.split(\"\\n\").length,\n });\n\n ctx.logger.info(\"Claude bridge: read MEMORY.md\", {\n path: config.memoryFilePath,\n lines: content.split(\"\\n\").length,\n });\n return { success: true, content, sections: Object.fromEntries(sections) };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Claude bridge read failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::claude-bridge-sync\" },\n async () => {\n const ctx = getContext();\n if (!config.enabled || !config.memoryFilePath) {\n return { success: false, error: \"Claude bridge not configured\" };\n }\n\n try {\n const memories = await kv.list<Memory>(KV.memories);\n const latestMemories = memories.filter((m) => m.isLatest);\n\n let projectSummary = \"\";\n if (config.projectPath) {\n const profile = await kv\n .get<{ summary?: string }>(KV.profiles, config.projectPath)\n .catch(() => null);\n projectSummary = profile?.summary || \"\";\n }\n\n const md = serializeToMemoryMd(\n latestMemories,\n projectSummary,\n config.lineBudget,\n );\n\n const dir = dirname(config.memoryFilePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(config.memoryFilePath, md, \"utf-8\");\n\n await recordAudit(kv, \"export\", \"mem::claude-bridge-sync\", [], {\n path: config.memoryFilePath,\n memoryCount: latestMemories.length,\n lines: md.split(\"\\n\").length,\n });\n\n ctx.logger.info(\"Claude bridge: synced to MEMORY.md\", {\n path: config.memoryFilePath,\n memories: latestMemories.length,\n });\n return { success: true, path: config.memoryFilePath, lines: md.split(\"\\n\").length };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Claude bridge sync failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n}\n","export const GRAPH_EXTRACTION_SYSTEM = `You are a knowledge graph extraction engine. Given a compressed observation from a coding session, extract entities and relationships.\n\nOutput format (XML):\n<entities>\n <entity type=\"file|function|concept|error|decision|pattern|library|person\" name=\"exact name\">\n <property key=\"key\">value</property>\n </entity>\n</entities>\n<relationships>\n <relationship type=\"uses|imports|modifies|causes|fixes|depends_on|related_to\" source=\"entity name\" target=\"entity name\" weight=\"0.1-1.0\"/>\n</relationships>\n\nRules:\n- Extract concrete entities only (real file paths, function names, library names)\n- Use the most specific type available\n- Weight relationships by how strong/direct the connection is\n- If no entities found, output empty tags`;\n\nexport function buildGraphExtractionPrompt(\n observations: Array<{\n title: string;\n narrative: string;\n concepts: string[];\n files: string[];\n type: string;\n }>,\n): string {\n const items = observations\n .map(\n (o, i) =>\n `[${i + 1}] Type: ${o.type}\\nTitle: ${o.title}\\nNarrative: ${o.narrative}\\nConcepts: ${(o.concepts ?? []).join(\", \")}\\nFiles: ${(o.files ?? []).join(\", \")}`,\n )\n .join(\"\\n\\n\");\n return `Extract entities and relationships from these observations:\\n\\n${items}`;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n GraphNode,\n GraphEdge,\n GraphQueryResult,\n CompressedObservation,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport {\n GRAPH_EXTRACTION_SYSTEM,\n buildGraphExtractionPrompt,\n} from \"../prompts/graph-extraction.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction parseGraphXml(\n xml: string,\n observationIds: string[],\n): {\n nodes: GraphNode[];\n edges: GraphEdge[];\n} {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const now = new Date().toISOString();\n\n const entityRegex =\n /<entity\\s+type=\"([^\"]+)\"\\s+name=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n const type = match[1] as GraphNode[\"type\"];\n const name = match[2];\n const propsBlock = match[3];\n const properties: Record<string, string> = {};\n\n const propRegex = /<property\\s+key=\"([^\"]+)\">([^<]*)<\\/property>/g;\n let propMatch;\n while ((propMatch = propRegex.exec(propsBlock)) !== null) {\n properties[propMatch[1]] = propMatch[2];\n }\n\n nodes.push({\n id: generateId(\"gn\"),\n type,\n name,\n properties,\n sourceObservationIds: observationIds,\n createdAt: now,\n });\n }\n\n const relRegex =\n /<relationship\\s+type=\"([^\"]+)\"\\s+source=\"([^\"]+)\"\\s+target=\"([^\"]+)\"\\s+weight=\"([^\"]+)\"\\s*\\/>/g;\n while ((match = relRegex.exec(xml)) !== null) {\n const type = match[1] as GraphEdge[\"type\"];\n const sourceName = match[2];\n const targetName = match[3];\n const parsedWeight = parseFloat(match[4]);\n const weight = Number.isNaN(parsedWeight) ? 0.5 : parsedWeight;\n\n const sourceNode = nodes.find((n) => n.name === sourceName);\n const targetNode = nodes.find((n) => n.name === targetName);\n\n if (sourceNode && targetNode) {\n edges.push({\n id: generateId(\"ge\"),\n type,\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n weight: Math.max(0, Math.min(1, weight)),\n sourceObservationIds: observationIds,\n createdAt: now,\n });\n }\n }\n\n return { nodes, edges };\n}\n\nexport function registerGraphFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::graph-extract\" },\n async (data: { observations: CompressedObservation[] }) => {\n const ctx = getContext();\n if (!data.observations || data.observations.length === 0) {\n return { success: false, error: \"No observations provided\" };\n }\n\n const prompt = buildGraphExtractionPrompt(\n data.observations.map((o) => ({\n title: o.title,\n narrative: o.narrative,\n concepts: o.concepts,\n files: o.files,\n type: o.type,\n })),\n );\n\n try {\n const response = await provider.compress(\n GRAPH_EXTRACTION_SYSTEM,\n prompt,\n );\n\n const obsIds = data.observations.map((o) => o.id);\n const { nodes, edges } = parseGraphXml(response, obsIds);\n\n const existingNodes = await kv.list<GraphNode>(KV.graphNodes);\n const existingEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n for (const node of nodes) {\n const existing = existingNodes.find(\n (n) => n.name === node.name && n.type === node.type,\n );\n if (existing) {\n const merged = {\n ...existing,\n sourceObservationIds: [\n ...new Set([...existing.sourceObservationIds, ...obsIds]),\n ],\n properties: { ...existing.properties, ...node.properties },\n };\n await kv.set(KV.graphNodes, existing.id, merged);\n const idx = existingNodes.findIndex((n) => n.id === existing.id);\n if (idx !== -1) existingNodes[idx] = merged;\n } else {\n await kv.set(KV.graphNodes, node.id, node);\n existingNodes.push(node);\n }\n }\n\n for (const edge of edges) {\n const edgeKey = `${edge.sourceNodeId}|${edge.targetNodeId}|${edge.type}`;\n const existingEdge = existingEdges.find(\n (e) => `${e.sourceNodeId}|${e.targetNodeId}|${e.type}` === edgeKey,\n );\n if (existingEdge) {\n existingEdge.sourceObservationIds = [\n ...new Set([...existingEdge.sourceObservationIds, ...obsIds]),\n ];\n await kv.set(KV.graphEdges, existingEdge.id, existingEdge);\n } else {\n await kv.set(KV.graphEdges, edge.id, edge);\n existingEdges.push(edge);\n }\n }\n\n await recordAudit(kv, \"observe\", \"mem::graph-extract\", obsIds, {\n nodesExtracted: nodes.length,\n edgesExtracted: edges.length,\n });\n\n ctx.logger.info(\"Graph extraction complete\", {\n nodes: nodes.length,\n edges: edges.length,\n });\n return {\n success: true,\n nodesAdded: nodes.length,\n edgesAdded: edges.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Graph extraction failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::graph-query\" },\n async (data: {\n startNodeId?: string;\n nodeType?: string;\n maxDepth?: number;\n query?: string;\n }): Promise<GraphQueryResult> => {\n const allNodes = (await kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n const maxDepth = Math.min(data.maxDepth || 3, 5);\n\n if (data.query) {\n const lower = data.query.toLowerCase();\n const matchingNodes = allNodes.filter(\n (n) =>\n n.name.toLowerCase().includes(lower) ||\n Object.values(n.properties).some(\n (v) => typeof v === \"string\" && v.toLowerCase().includes(lower),\n ),\n );\n const nodeIds = new Set(matchingNodes.map((n) => n.id));\n const relatedEdges = allEdges.filter(\n (e) => nodeIds.has(e.sourceNodeId) || nodeIds.has(e.targetNodeId),\n );\n return { nodes: matchingNodes, edges: relatedEdges, depth: 0 };\n }\n\n if (data.startNodeId) {\n const visited = new Set<string>();\n const visitedEdges = new Set<string>();\n const resultNodes: GraphNode[] = [];\n const resultEdges: GraphEdge[] = [];\n const queue: Array<{ nodeId: string; depth: number }> = [\n { nodeId: data.startNodeId, depth: 0 },\n ];\n\n while (queue.length > 0) {\n const { nodeId, depth } = queue.shift()!;\n if (visited.has(nodeId) || depth > maxDepth) continue;\n visited.add(nodeId);\n\n const node = allNodes.find((n) => n.id === nodeId);\n if (node) {\n if (!data.nodeType || node.type === data.nodeType) {\n resultNodes.push(node);\n }\n }\n\n const neighborEdges = allEdges.filter(\n (e) => e.sourceNodeId === nodeId || e.targetNodeId === nodeId,\n );\n for (const edge of neighborEdges) {\n if (!visitedEdges.has(edge.id)) {\n visitedEdges.add(edge.id);\n resultEdges.push(edge);\n }\n const nextId =\n edge.sourceNodeId === nodeId\n ? edge.targetNodeId\n : edge.sourceNodeId;\n if (!visited.has(nextId)) {\n queue.push({ nodeId: nextId, depth: depth + 1 });\n }\n }\n }\n\n return { nodes: resultNodes, edges: resultEdges, depth: maxDepth };\n }\n\n let filtered = allNodes;\n if (data.nodeType) {\n filtered = allNodes.filter((n) => n.type === data.nodeType);\n }\n return { nodes: filtered, edges: allEdges, depth: 0 };\n },\n );\n\n sdk.registerFunction({ id: \"mem::graph-stats\" }, async () => {\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const nodesByType: Record<string, number> = {};\n for (const n of nodes) {\n nodesByType[n.type] = (nodesByType[n.type] || 0) + 1;\n }\n\n const edgesByType: Record<string, number> = {};\n for (const e of edges) {\n edgesByType[e.type] = (edgesByType[e.type] || 0) + 1;\n }\n\n return {\n totalNodes: nodes.length,\n totalEdges: edges.length,\n nodesByType,\n edgesByType,\n };\n });\n}\n","export const SEMANTIC_MERGE_SYSTEM = `You are a memory consolidation engine. Given overlapping episodic memories (session summaries), extract stable factual knowledge.\n\nOutput format (XML):\n<facts>\n <fact confidence=\"0.0-1.0\">Concise factual statement</fact>\n</facts>\n\nRules:\n- Extract only facts that appear in 2+ episodes or are highly confident\n- Confidence reflects how well-supported the fact is across episodes\n- Combine overlapping information into single concise facts\n- Skip ephemeral details (specific error messages, temporary states)`;\n\nexport function buildSemanticMergePrompt(\n episodes: Array<{ title: string; narrative: string; concepts: string[] }>,\n): string {\n const items = episodes\n .map(\n (e, i) =>\n `[Episode ${i + 1}]\\nTitle: ${e.title}\\nNarrative: ${e.narrative}\\nConcepts: ${e.concepts.join(\", \")}`,\n )\n .join(\"\\n\\n\");\n return `Consolidate these episodic memories into stable facts:\\n\\n${items}`;\n}\n\nexport const PROCEDURAL_EXTRACTION_SYSTEM = `You are a procedural memory extractor. Given repeated patterns and workflows observed across sessions, extract reusable procedures.\n\nOutput format (XML):\n<procedures>\n <procedure name=\"short descriptive name\" trigger=\"when to use this procedure\">\n <step>Step 1 description</step>\n <step>Step 2 description</step>\n </procedure>\n</procedures>\n\nRules:\n- Only extract procedures observed 2+ times\n- Steps should be concrete and actionable\n- Trigger condition should be specific enough to match automatically`;\n\nexport function buildProceduralExtractionPrompt(\n patterns: Array<{ content: string; frequency: number }>,\n): string {\n const items = patterns\n .map((p, i) => `[Pattern ${i + 1}] (seen ${p.frequency}x)\\n${p.content}`)\n .join(\"\\n\\n\");\n return `Extract reusable procedures from these recurring patterns:\\n\\n${items}`;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n SemanticMemory,\n ProceduralMemory,\n SessionSummary,\n Memory,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport {\n SEMANTIC_MERGE_SYSTEM,\n buildSemanticMergePrompt,\n PROCEDURAL_EXTRACTION_SYSTEM,\n buildProceduralExtractionPrompt,\n} from \"../prompts/consolidation.js\";\nimport { recordAudit } from \"./audit.js\";\nimport { getConsolidationDecayDays, isConsolidationEnabled } from \"../config.js\";\n\nfunction applyDecay(\n items: Array<{\n strength: number;\n lastAccessedAt?: string;\n updatedAt: string;\n }>,\n decayDays: number,\n): void {\n if (decayDays <= 0 || !Number.isFinite(decayDays)) return;\n const now = Date.now();\n for (const item of items) {\n const lastAccess = item.lastAccessedAt || item.updatedAt;\n const daysSince =\n (now - new Date(lastAccess).getTime()) / (1000 * 60 * 60 * 24);\n if (daysSince > decayDays) {\n const decayPeriods = Math.floor(daysSince / decayDays);\n item.strength = Math.max(\n 0.1,\n item.strength * Math.pow(0.9, decayPeriods),\n );\n }\n }\n}\n\nexport function registerConsolidationPipelineFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::consolidate-pipeline\" },\n async (data?: { tier?: string; force?: boolean }) => {\n if (!data?.force && !isConsolidationEnabled()) {\n return { success: false, skipped: true, reason: \"CONSOLIDATION_ENABLED is not set to true\" };\n }\n const ctx = getContext();\n const tier = data?.tier || \"all\";\n const decayDays = getConsolidationDecayDays();\n const results: Record<string, unknown> = {};\n\n if (tier === \"all\" || tier === \"semantic\") {\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const existingSemantic = await kv.list<SemanticMemory>(KV.semantic);\n\n if (summaries.length >= 5) {\n const recentSummaries = summaries\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n )\n .slice(0, 20);\n\n const prompt = buildSemanticMergePrompt(\n recentSummaries.map((s) => ({\n title: s.title,\n narrative: s.narrative,\n concepts: s.concepts,\n })),\n );\n\n try {\n const response = await provider.summarize(\n SEMANTIC_MERGE_SYSTEM,\n prompt,\n );\n\n const factRegex = /<fact\\s+confidence=\"([^\"]+)\">([^<]+)<\\/fact>/g;\n let match;\n let newFacts = 0;\n const now = new Date().toISOString();\n\n while ((match = factRegex.exec(response)) !== null) {\n const parsedConf = parseFloat(match[1]);\n const confidence = Number.isNaN(parsedConf) ? 0.5 : parsedConf;\n const fact = match[2].trim();\n\n const existing = existingSemantic.find(\n (s) => s.fact.toLowerCase() === fact.toLowerCase(),\n );\n if (existing) {\n existing.accessCount++;\n existing.lastAccessedAt = now;\n existing.updatedAt = now;\n existing.confidence = Math.max(existing.confidence, confidence);\n await kv.set(KV.semantic, existing.id, existing);\n } else {\n const sem: SemanticMemory = {\n id: generateId(\"sem\"),\n fact,\n confidence,\n sourceSessionIds: recentSummaries.map((s) => s.sessionId),\n sourceMemoryIds: [],\n accessCount: 1,\n lastAccessedAt: now,\n strength: confidence,\n createdAt: now,\n updatedAt: now,\n };\n await kv.set(KV.semantic, sem.id, sem);\n newFacts++;\n }\n }\n results.semantic = { newFacts, totalSummaries: summaries.length };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Semantic consolidation failed\", { error: msg });\n results.semantic = { error: msg };\n }\n } else {\n results.semantic = {\n skipped: true,\n reason: \"fewer than 5 summaries\",\n };\n }\n }\n\n if (tier === \"all\" || tier === \"procedural\") {\n const memories = await kv.list<Memory>(KV.memories);\n const patterns = memories\n .filter((m) => m.isLatest && m.type === \"pattern\")\n .map((m) => ({\n content: m.content,\n frequency: m.sessionIds.length || 1,\n }))\n .filter((p) => p.frequency >= 2);\n\n if (patterns.length >= 2) {\n const prompt = buildProceduralExtractionPrompt(patterns);\n\n try {\n const response = await provider.summarize(\n PROCEDURAL_EXTRACTION_SYSTEM,\n prompt,\n );\n\n const procRegex =\n /<procedure\\s+name=\"([^\"]+)\"\\s+trigger=\"([^\"]+)\">([\\s\\S]*?)<\\/procedure>/g;\n let match;\n let newProcs = 0;\n const now = new Date().toISOString();\n const existingProcs = await kv.list<ProceduralMemory>(\n KV.procedural,\n );\n\n while ((match = procRegex.exec(response)) !== null) {\n const name = match[1];\n const trigger = match[2];\n const stepsBlock = match[3];\n const steps: string[] = [];\n\n const stepRegex = /<step>([^<]+)<\\/step>/g;\n let stepMatch;\n while ((stepMatch = stepRegex.exec(stepsBlock)) !== null) {\n steps.push(stepMatch[1].trim());\n }\n\n const existing = existingProcs.find(\n (p) => p.name.toLowerCase() === name.toLowerCase(),\n );\n if (existing) {\n existing.frequency++;\n existing.updatedAt = now;\n existing.strength = Math.min(1, existing.strength + 0.1);\n await kv.set(KV.procedural, existing.id, existing);\n } else {\n const proc: ProceduralMemory = {\n id: generateId(\"proc\"),\n name,\n steps,\n triggerCondition: trigger,\n frequency: 1,\n sourceSessionIds: [],\n strength: 0.5,\n createdAt: now,\n updatedAt: now,\n };\n await kv.set(KV.procedural, proc.id, proc);\n newProcs++;\n }\n }\n results.procedural = {\n newProcedures: newProcs,\n patternsAnalyzed: patterns.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Procedural extraction failed\", { error: msg });\n results.procedural = { error: msg };\n }\n } else {\n results.procedural = {\n skipped: true,\n reason: \"fewer than 2 recurring patterns\",\n };\n }\n }\n\n if (tier === \"all\" || tier === \"decay\") {\n const semantic = await kv.list<SemanticMemory>(KV.semantic);\n applyDecay(semantic, decayDays);\n for (const s of semantic) {\n await kv.set(KV.semantic, s.id, s);\n }\n\n const procedural = await kv.list<ProceduralMemory>(KV.procedural);\n applyDecay(procedural, decayDays);\n for (const p of procedural) {\n await kv.set(KV.procedural, p.id, p);\n }\n\n results.decay = {\n semantic: semantic.length,\n procedural: procedural.length,\n };\n }\n\n if (process.env[\"OBSIDIAN_AUTO_EXPORT\"] === \"true\") {\n try {\n await sdk.trigger(\"mem::obsidian-export\", {});\n results.obsidianExport = { success: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.warn(\"Obsidian auto-export failed\", { error: msg });\n results.obsidianExport = { success: false, error: msg };\n }\n }\n\n await recordAudit(kv, \"consolidate\", \"mem::consolidate-pipeline\", [], {\n tier,\n results,\n });\n\n ctx.logger.info(\"Consolidation pipeline complete\", { tier, results });\n return { success: true, results };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n TeamConfig,\n TeamSharedItem,\n TeamProfile,\n Memory,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\n\nconst VALID_ITEM_TYPES = new Set([\"memory\", \"pattern\", \"observation\"]);\n\nexport function registerTeamFunction(\n sdk: ISdk,\n kv: StateKV,\n config: TeamConfig,\n): void {\n sdk.registerFunction(\n { id: \"mem::team-share\" },\n async (data: {\n itemId: string;\n itemType: \"memory\" | \"pattern\" | \"observation\";\n sessionId?: string;\n project?: string;\n }) => {\n const ctx = getContext();\n if (!data.itemId || !data.itemType) {\n return { success: false, error: \"itemId and itemType are required\" };\n }\n if (!VALID_ITEM_TYPES.has(data.itemType)) {\n return { success: false, error: `Invalid itemType: ${data.itemType}` };\n }\n\n let content: unknown;\n if (data.itemType === \"observation\") {\n if (!data.sessionId) {\n return {\n success: false,\n error: \"sessionId is required for observations\",\n };\n }\n content = await kv.get(KV.observations(data.sessionId), data.itemId);\n } else {\n content = await kv.get<Memory>(KV.memories, data.itemId);\n }\n if (!content) {\n return { success: false, error: \"Item not found\" };\n }\n\n const shared: TeamSharedItem = {\n id: generateId(\"ts\"),\n sharedBy: config.userId,\n sharedAt: new Date().toISOString(),\n type: data.itemType,\n content,\n project: data.project || \"\",\n visibility: \"shared\",\n };\n\n await kv.set(KV.teamShared(config.teamId), shared.id, shared);\n\n await recordAudit(kv, \"share\", \"mem::team-share\", [data.itemId], {\n teamId: config.teamId,\n userId: config.userId,\n itemType: data.itemType,\n });\n\n ctx.logger.info(\"Team share\", {\n teamId: config.teamId,\n itemId: data.itemId,\n });\n return { success: true, sharedItem: shared };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::team-feed\" },\n async (data?: { limit?: number }) => {\n const limit = data?.limit || 20;\n const items = await kv.list<TeamSharedItem>(KV.teamShared(config.teamId));\n\n const filtered = items.filter((i) => i.visibility === \"shared\");\n const sorted = filtered\n .sort(\n (a, b) =>\n new Date(b.sharedAt).getTime() - new Date(a.sharedAt).getTime(),\n )\n .slice(0, limit);\n\n return { items: sorted, total: filtered.length };\n },\n );\n\n sdk.registerFunction({ id: \"mem::team-profile\" }, async () => {\n const items = await kv.list<TeamSharedItem>(KV.teamShared(config.teamId));\n\n const members = [...new Set(items.map((i) => i.sharedBy))];\n\n const conceptCounts = new Map<string, number>();\n const fileCounts = new Map<string, number>();\n const patterns: string[] = [];\n\n for (const item of items) {\n if (item.type === \"memory\" || item.type === \"pattern\") {\n const mem = item.content as Memory;\n if (mem?.concepts) {\n for (const c of mem.concepts) {\n conceptCounts.set(c, (conceptCounts.get(c) || 0) + 1);\n }\n }\n if (mem?.files) {\n for (const f of mem.files) {\n fileCounts.set(f, (fileCounts.get(f) || 0) + 1);\n }\n }\n if (item.type === \"pattern\" && mem?.content) {\n patterns.push(mem.content.slice(0, 100));\n }\n }\n }\n\n const topConcepts = [...conceptCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([concept, frequency]) => ({ concept, frequency }));\n\n const topFiles = [...fileCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([file, frequency]) => ({ file, frequency }));\n\n const profile: TeamProfile = {\n teamId: config.teamId,\n members,\n topConcepts,\n topFiles,\n sharedPatterns: patterns.slice(0, 10),\n totalSharedItems: items.length,\n updatedAt: new Date().toISOString(),\n };\n\n await kv.set(KV.teamProfile(config.teamId), \"profile\", profile);\n return profile;\n });\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, GovernanceFilter, AuditEntry } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit, queryAudit } from \"./audit.js\";\n\nexport function registerGovernanceFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::governance-delete\" },\n async (data: { memoryIds: string[]; reason?: string }) => {\n const ctx = getContext();\n if (\n !data.memoryIds ||\n !Array.isArray(data.memoryIds) ||\n data.memoryIds.length === 0\n ) {\n return { success: false, error: \"memoryIds array is required\" };\n }\n\n let deleted = 0;\n for (const id of data.memoryIds) {\n const mem = await kv.get<Memory>(KV.memories, id);\n if (mem) {\n await kv.delete(KV.memories, id);\n deleted++;\n }\n }\n\n await recordAudit(\n kv,\n \"delete\",\n \"mem::governance-delete\",\n data.memoryIds,\n {\n reason: data.reason || \"manual deletion\",\n deleted,\n },\n );\n\n ctx.logger.info(\"Governance delete\", {\n requested: data.memoryIds.length,\n deleted,\n });\n return { success: true, deleted, total: data.memoryIds.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::governance-bulk\" },\n async (data: GovernanceFilter & { dryRun?: boolean }) => {\n const ctx = getContext();\n\n const hasFilter =\n (data.type && data.type.length > 0) ||\n data.dateFrom ||\n data.dateTo ||\n data.qualityBelow !== undefined;\n if (!hasFilter && !data.dryRun) {\n return {\n success: false,\n error: \"At least one filter is required for non-dryRun bulk delete\",\n };\n }\n\n const memories = await kv.list<Memory>(KV.memories);\n let candidates = memories;\n\n if (data.type && data.type.length > 0) {\n candidates = candidates.filter((m) => data.type!.includes(m.type));\n }\n if (data.dateFrom) {\n const from = new Date(data.dateFrom).getTime();\n if (Number.isNaN(from)) {\n return { success: false, error: \"Invalid dateFrom format\" };\n }\n candidates = candidates.filter(\n (m) => new Date(m.createdAt).getTime() >= from,\n );\n }\n if (data.dateTo) {\n const to = new Date(data.dateTo).getTime();\n if (Number.isNaN(to)) {\n return { success: false, error: \"Invalid dateTo format\" };\n }\n candidates = candidates.filter(\n (m) => new Date(m.createdAt).getTime() <= to,\n );\n }\n if (data.qualityBelow !== undefined) {\n candidates = candidates.filter((m) => m.strength < data.qualityBelow!);\n }\n\n if (data.dryRun) {\n return {\n success: true,\n dryRun: true,\n wouldDelete: candidates.length,\n ids: candidates.map((m) => m.id),\n };\n }\n\n for (const mem of candidates) {\n await kv.delete(KV.memories, mem.id);\n }\n\n await recordAudit(\n kv,\n \"delete\",\n \"mem::governance-bulk\",\n candidates.map((m) => m.id),\n { filter: data, deleted: candidates.length },\n );\n\n ctx.logger.info(\"Governance bulk delete\", { deleted: candidates.length });\n return { success: true, deleted: candidates.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::audit-query\" },\n async (data?: {\n operation?: AuditEntry[\"operation\"];\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n }) => {\n return queryAudit(kv, data);\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SnapshotMeta, Session, Memory, GraphNode } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\nimport { VERSION } from \"../version.js\";\n\nconst COMMIT_HASH_RE = /^[0-9a-f]{7,40}$/i;\n\nconst execFileAsync = promisify(execFile);\n\nasync function gitExec(dir: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, { cwd: dir });\n return stdout.trim();\n}\n\nasync function ensureGitRepo(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n if (!existsSync(join(dir, \".git\"))) {\n await gitExec(dir, [\"init\"]);\n await gitExec(dir, [\"config\", \"user.email\", \"agentmemory@local\"]);\n await gitExec(dir, [\"config\", \"user.name\", \"agentmemory\"]);\n }\n}\n\nexport function registerSnapshotFunction(\n sdk: ISdk,\n kv: StateKV,\n snapshotDir: string,\n): void {\n sdk.registerFunction(\n { id: \"mem::snapshot-create\" },\n async (data?: { message?: string }) => {\n const ctx = getContext();\n\n try {\n await ensureGitRepo(snapshotDir);\n\n const sessions = await kv.list<Session>(KV.sessions);\n const memories = await kv.list<Memory>(KV.memories);\n const graphNodes = await kv.list<GraphNode>(KV.graphNodes);\n\n const observations: Record<string, unknown[]> = {};\n for (const session of sessions) {\n const obs = await kv\n .list(KV.observations(session.id))\n .catch(() => []);\n if (obs.length > 0) {\n observations[session.id] = obs;\n }\n }\n\n const state = {\n version: VERSION,\n timestamp: new Date().toISOString(),\n sessions,\n memories,\n graphNodes,\n observations,\n };\n\n writeFileSync(\n join(snapshotDir, \"state.json\"),\n JSON.stringify(state, null, 2),\n \"utf-8\",\n );\n\n await gitExec(snapshotDir, [\"add\", \".\"]);\n\n const message = data?.message || `Snapshot ${new Date().toISOString()}`;\n try {\n await gitExec(snapshotDir, [\"commit\", \"-m\", message]);\n } catch (commitErr) {\n const errMsg =\n commitErr instanceof Error ? commitErr.message : String(commitErr);\n if (errMsg.includes(\"nothing to commit\")) {\n return { success: true, message: \"No changes to snapshot\" };\n }\n throw commitErr;\n }\n\n const commitHash = await gitExec(snapshotDir, [\"rev-parse\", \"HEAD\"]);\n\n const meta: SnapshotMeta = {\n id: generateId(\"snap\"),\n commitHash,\n createdAt: new Date().toISOString(),\n message,\n stats: {\n sessions: sessions.length,\n observations: Object.values(observations).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n ),\n memories: memories.length,\n graphNodes: graphNodes.length,\n },\n };\n\n await recordAudit(kv, \"export\", \"mem::snapshot-create\", [meta.id], {\n commitHash,\n stats: meta.stats,\n });\n\n ctx.logger.info(\"Snapshot created\", { commitHash });\n return { success: true, snapshot: meta };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Snapshot failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction({ id: \"mem::snapshot-list\" }, async () => {\n try {\n if (!existsSync(join(snapshotDir, \".git\"))) {\n return { snapshots: [] };\n }\n const log = await gitExec(snapshotDir, [\n \"log\",\n \"--format=%H|%aI|%s\",\n \"-20\",\n ]);\n const snapshots = log\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const parts = line.split(\"|\");\n const [hash, date] = parts;\n const msg = parts.slice(2).join(\"|\");\n return { commitHash: hash, createdAt: date, message: msg };\n });\n return { snapshots };\n } catch {\n return { snapshots: [] };\n }\n });\n\n sdk.registerFunction(\n { id: \"mem::snapshot-restore\" },\n async (data: { commitHash: string }) => {\n const ctx = getContext();\n if (!data.commitHash) {\n return { success: false, error: \"commitHash is required\" };\n }\n if (!COMMIT_HASH_RE.test(data.commitHash)) {\n return { success: false, error: \"Invalid commitHash format\" };\n }\n\n try {\n await gitExec(snapshotDir, [\n \"checkout\",\n data.commitHash,\n \"--\",\n \"state.json\",\n ]);\n const content = readFileSync(join(snapshotDir, \"state.json\"), \"utf-8\");\n const state = JSON.parse(content) as {\n sessions?: Array<{ id: string } & Record<string, unknown>>;\n memories?: Array<{ id: string } & Record<string, unknown>>;\n graphNodes?: Array<{ id: string } & Record<string, unknown>>;\n observations?: Record<\n string,\n Array<{ id: string } & Record<string, unknown>>\n >;\n };\n\n if (state.sessions) {\n for (const session of state.sessions) {\n await kv.set(KV.sessions, session.id, session);\n }\n }\n if (state.memories) {\n for (const memory of state.memories) {\n await kv.set(KV.memories, memory.id, memory);\n }\n }\n if (state.graphNodes) {\n for (const node of state.graphNodes) {\n await kv.set(KV.graphNodes, node.id, node);\n }\n }\n if (state.observations) {\n for (const [sessionId, obs] of Object.entries(state.observations)) {\n for (const o of obs) {\n await kv.set(KV.observations(sessionId), o.id, o);\n }\n }\n }\n\n await gitExec(snapshotDir, [\"checkout\", \"HEAD\", \"--\", \"state.json\"]);\n\n await recordAudit(kv, \"import\", \"mem::snapshot-restore\", [], {\n commitHash: data.commitHash,\n sessions: state.sessions?.length || 0,\n memories: state.memories?.length || 0,\n graphNodes: state.graphNodes?.length || 0,\n });\n\n ctx.logger.info(\"Snapshot restored\", {\n commitHash: data.commitHash,\n });\n return { success: true, commitHash: data.commitHash };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Snapshot restore failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge } from \"../types.js\";\n\nexport function registerActionsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::action-create\" },\n async (data: {\n title: string;\n description?: string;\n priority?: number;\n createdBy?: string;\n project?: string;\n tags?: string[];\n parentId?: string;\n sourceObservationIds?: string[];\n sourceMemoryIds?: string[];\n edges?: Array<{ type: string; targetActionId: string }>;\n }) => {\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n return withKeyedLock(\"mem:actions\", async () => {\n const now = new Date().toISOString();\n const action: Action = {\n id: generateId(\"act\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n priority: Math.max(1, Math.min(10, data.priority || 5)),\n createdAt: now,\n updatedAt: now,\n createdBy: data.createdBy || \"unknown\",\n project: data.project,\n tags: data.tags || [],\n sourceObservationIds: data.sourceObservationIds || [],\n sourceMemoryIds: data.sourceMemoryIds || [],\n parentId: data.parentId,\n };\n\n if (data.parentId) {\n const parent = await kv.get<Action>(KV.actions, data.parentId);\n if (!parent) {\n return { success: false, error: \"parent action not found\" };\n }\n }\n\n const validEdgeTypes = [\n \"requires\",\n \"unlocks\",\n \"spawned_by\",\n \"gated_by\",\n \"conflicts_with\",\n ];\n const pendingEdges: ActionEdge[] = [];\n let hasRequires = false;\n if (data.edges && Array.isArray(data.edges)) {\n for (const e of data.edges) {\n if (!validEdgeTypes.includes(e.type)) {\n return { success: false, error: `invalid edge type: ${e.type}` };\n }\n const targetAction = await kv.get<Action>(KV.actions, e.targetActionId);\n if (!targetAction) {\n return { success: false, error: `target action not found: ${e.targetActionId}` };\n }\n if (e.type === \"requires\") hasRequires = true;\n pendingEdges.push({\n id: generateId(\"ae\"),\n type: e.type as ActionEdge[\"type\"],\n sourceActionId: action.id,\n targetActionId: e.targetActionId,\n createdAt: now,\n });\n }\n }\n\n if (hasRequires) {\n action.status = \"blocked\";\n }\n\n await kv.set(KV.actions, action.id, action);\n\n for (const edge of pendingEdges) {\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n\n return { success: true, action, edges: pendingEdges };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-update\" },\n async (data: {\n actionId: string;\n status?: Action[\"status\"];\n title?: string;\n description?: string;\n priority?: number;\n assignedTo?: string;\n result?: string;\n tags?: string[];\n }) => {\n if (!data.actionId) {\n return { success: false, error: \"actionId is required\" };\n }\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n\n if (data.status !== undefined) action.status = data.status;\n if (data.title !== undefined) action.title = data.title.trim();\n if (data.description !== undefined)\n action.description = data.description.trim();\n if (data.priority !== undefined)\n action.priority = Math.max(1, Math.min(10, data.priority));\n if (data.assignedTo !== undefined) action.assignedTo = data.assignedTo;\n if (data.result !== undefined) action.result = data.result;\n if (data.tags !== undefined) action.tags = data.tags;\n action.updatedAt = new Date().toISOString();\n\n await kv.set(KV.actions, action.id, action);\n\n if (data.status === \"done\") {\n await propagateCompletion(kv, action.id);\n }\n\n return { success: true, action };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-edge-create\" },\n async (data: {\n sourceActionId: string;\n targetActionId: string;\n type: string;\n metadata?: Record<string, unknown>;\n }) => {\n if (!data.sourceActionId || !data.targetActionId || !data.type) {\n return {\n success: false,\n error: \"sourceActionId, targetActionId, and type are required\",\n };\n }\n\n const validTypes = [\n \"requires\",\n \"unlocks\",\n \"spawned_by\",\n \"gated_by\",\n \"conflicts_with\",\n ];\n if (!validTypes.includes(data.type)) {\n return {\n success: false,\n error: `type must be one of: ${validTypes.join(\", \")}`,\n };\n }\n\n const sourceAction = await kv.get<Action>(KV.actions, data.sourceActionId);\n if (!sourceAction) {\n return { success: false, error: \"source action not found\" };\n }\n const targetAction = await kv.get<Action>(KV.actions, data.targetActionId);\n if (!targetAction) {\n return { success: false, error: \"target action not found\" };\n }\n\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: data.type as ActionEdge[\"type\"],\n sourceActionId: data.sourceActionId,\n targetActionId: data.targetActionId,\n createdAt: new Date().toISOString(),\n metadata: data.metadata,\n };\n\n await kv.set(KV.actionEdges, edge.id, edge);\n return { success: true, edge };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-list\" },\n async (data: {\n status?: string;\n project?: string;\n parentId?: string;\n tags?: string[];\n limit?: number;\n }) => {\n let actions = await kv.list<Action>(KV.actions);\n\n if (data.status) {\n actions = actions.filter((a) => a.status === data.status);\n }\n if (data.project) {\n actions = actions.filter((a) => a.project === data.project);\n }\n if (data.parentId) {\n actions = actions.filter((a) => a.parentId === data.parentId);\n }\n if (data.tags && data.tags.length > 0) {\n actions = actions.filter((a) =>\n data.tags!.some((t) => a.tags.includes(t)),\n );\n }\n\n actions.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n\n const limit = data.limit || 50;\n return { success: true, actions: actions.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-get\" },\n async (data: { actionId: string }) => {\n if (!data.actionId) {\n return { success: false, error: \"actionId is required\" };\n }\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const edges = allEdges.filter(\n (e) =>\n e.sourceActionId === data.actionId ||\n e.targetActionId === data.actionId,\n );\n\n const children = (await kv.list<Action>(KV.actions)).filter(\n (a) => a.parentId === data.actionId,\n );\n\n return { success: true, action, edges, children };\n },\n );\n}\n\nasync function propagateCompletion(\n kv: StateKV,\n completedActionId: string,\n): Promise<void> {\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const unlockEdges = allEdges.filter(\n (e) =>\n e.targetActionId === completedActionId &&\n (e.type === \"requires\" || e.type === \"unlocks\"),\n );\n\n const allActions = await kv.list<Action>(KV.actions);\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n\n for (const edge of unlockEdges) {\n const candidateId = edge.sourceActionId;\n await withKeyedLock(`mem:action:${candidateId}`, async () => {\n const action = await kv.get<Action>(KV.actions, candidateId);\n if (action && action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n }\n });\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Action, ActionEdge, Checkpoint, Lease } from \"../types.js\";\n\nexport interface FrontierItem {\n action: Action;\n score: number;\n blockers: string[];\n leased: boolean;\n}\n\nexport function registerFrontierFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::frontier\" },\n async (data: {\n project?: string;\n agentId?: string;\n limit?: number;\n includeLeasedByOthers?: boolean;\n }) => {\n const actions = await kv.list<Action>(KV.actions);\n const edges = await kv.list<ActionEdge>(KV.actionEdges);\n const leases = await kv.list<Lease>(KV.leases);\n const checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const now = Date.now();\n\n const activeLeaseMap = new Map<string, Lease>();\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() > now\n ) {\n activeLeaseMap.set(lease.actionId, lease);\n }\n }\n\n const checkpointMap = new Map<string, Checkpoint>();\n for (const cp of checkpoints) {\n checkpointMap.set(cp.id, cp);\n }\n\n const actionMap = new Map<string, Action>();\n for (const a of actions) actionMap.set(a.id, a);\n\n const frontier: FrontierItem[] = [];\n\n for (const action of actions) {\n if (action.status === \"done\" || action.status === \"cancelled\") continue;\n if (data.project && action.project !== data.project) continue;\n\n const blockers: string[] = [];\n const inEdges = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n\n for (const edge of inEdges) {\n const dep = actionMap.get(edge.targetActionId);\n if (dep && dep.status !== \"done\") {\n blockers.push(`requires:${dep.id}:${dep.title}`);\n }\n }\n\n const gateEdges = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"gated_by\",\n );\n for (const edge of gateEdges) {\n const cp = checkpointMap.get(edge.targetActionId);\n if (cp && cp.status !== \"passed\") {\n blockers.push(`checkpoint:${cp.id}:${cp.name}`);\n }\n }\n\n const conflictEdges = edges.filter(\n (e) =>\n (e.sourceActionId === action.id ||\n e.targetActionId === action.id) &&\n e.type === \"conflicts_with\",\n );\n for (const edge of conflictEdges) {\n const otherId =\n edge.sourceActionId === action.id\n ? edge.targetActionId\n : edge.sourceActionId;\n const other = actionMap.get(otherId);\n if (other && other.status === \"active\") {\n blockers.push(`conflict:${other.id}:${other.title}`);\n }\n }\n\n if (blockers.length > 0) continue;\n\n const lease = activeLeaseMap.get(action.id);\n const leasedByOther =\n lease && data.agentId && lease.agentId !== data.agentId;\n if (leasedByOther && !data.includeLeasedByOthers) continue;\n\n const score = computeScore(action, edges, now);\n\n frontier.push({\n action,\n score,\n blockers: [],\n leased: !!lease,\n });\n }\n\n frontier.sort((a, b) => b.score - a.score);\n const limit = data.limit || 20;\n\n return {\n success: true,\n frontier: frontier.slice(0, limit),\n totalActions: actions.length,\n totalUnblocked: frontier.length,\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::next\" },\n async (data: { project?: string; agentId?: string }) => {\n const result = await sdk.trigger<\n { project?: string; agentId?: string; limit?: number },\n {\n success: boolean;\n frontier: FrontierItem[];\n totalActions: number;\n totalUnblocked: number;\n }\n >(\"mem::frontier\", {\n project: data.project,\n agentId: data.agentId,\n limit: 1,\n });\n\n if (!result.success) {\n return {\n success: false,\n suggestion: null,\n message: \"Failed to compute frontier\",\n totalActions: 0,\n };\n }\n if (result.frontier.length === 0) {\n return {\n success: true,\n suggestion: null,\n message: \"No actionable work found\",\n totalActions: result.totalActions || 0,\n };\n }\n\n const top = result.frontier[0];\n return {\n success: true,\n suggestion: {\n actionId: top.action.id,\n title: top.action.title,\n description: top.action.description,\n priority: top.action.priority,\n score: top.score,\n tags: top.action.tags,\n },\n message: `Suggested: ${top.action.title} (priority ${top.action.priority}, score ${top.score.toFixed(2)})`,\n totalActions: result.totalActions,\n totalUnblocked: result.totalUnblocked,\n };\n },\n );\n}\n\nfunction computeScore(\n action: Action,\n edges: ActionEdge[],\n now: number,\n): number {\n let score = action.priority * 10;\n\n const ageHours =\n (now - new Date(action.createdAt).getTime()) / (1000 * 60 * 60);\n score += Math.min(ageHours * 0.5, 20);\n\n const unlockCount = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"unlocks\",\n ).length;\n score += unlockCount * 5;\n\n if (edges.some((e) => e.sourceActionId === action.id && e.type === \"spawned_by\")) {\n score += 3;\n }\n\n if (action.status === \"active\") score += 15;\n\n return Math.round(score * 100) / 100;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, Lease } from \"../types.js\";\n\nconst DEFAULT_LEASE_TTL_MS = 10 * 60 * 1000;\nconst MAX_LEASE_TTL_MS = 60 * 60 * 1000;\n\nexport function registerLeasesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::lease-acquire\" },\n async (data: { actionId: string; agentId: string; ttlMs?: number }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n const rawTtl = typeof data.ttlMs === \"number\" && Number.isFinite(data.ttlMs) && data.ttlMs > 0\n ? data.ttlMs\n : DEFAULT_LEASE_TTL_MS;\n const ttl = Math.min(rawTtl, MAX_LEASE_TTL_MS);\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n if (action.status === \"done\" || action.status === \"cancelled\") {\n return { success: false, error: \"action already completed\" };\n }\n if (action.status === \"blocked\") {\n return { success: false, error: \"action is blocked\" };\n }\n\n const existingLeases = await kv.list<Lease>(KV.leases);\n const activeLease = existingLeases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (activeLease) {\n if (activeLease.agentId === data.agentId) {\n return {\n success: true,\n lease: activeLease,\n renewed: false,\n message: \"Already holding this lease\",\n };\n }\n return {\n success: false,\n error: \"action already leased\",\n heldBy: activeLease.agentId,\n expiresAt: activeLease.expiresAt,\n };\n }\n\n const now = new Date();\n const lease: Lease = {\n id: generateId(\"lse\"),\n actionId: data.actionId,\n agentId: data.agentId,\n acquiredAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + ttl).toISOString(),\n status: \"active\",\n };\n\n await kv.set(KV.leases, lease.id, lease);\n\n action.status = \"active\";\n action.assignedTo = data.agentId;\n action.updatedAt = now.toISOString();\n await kv.set(KV.actions, action.id, action);\n\n return { success: true, lease, renewed: false };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-release\" },\n async (data: { actionId: string; agentId: string; result?: string }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const activeLease = leases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.agentId === data.agentId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (!activeLease) {\n return { success: false, error: \"no active lease found for this agent\" };\n }\n\n activeLease.status = \"released\";\n await kv.set(KV.leases, activeLease.id, activeLease);\n\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (action && action.status === \"active\" && action.assignedTo === data.agentId) {\n if (data.result) {\n action.status = \"done\";\n action.result = data.result;\n } else {\n action.status = \"pending\";\n }\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n\n return { success: true, released: true };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-renew\" },\n async (data: { actionId: string; agentId: string; ttlMs?: number }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n const rawTtl = typeof data.ttlMs === \"number\" && Number.isFinite(data.ttlMs) && data.ttlMs > 0\n ? data.ttlMs\n : DEFAULT_LEASE_TTL_MS;\n const ttl = Math.min(rawTtl, MAX_LEASE_TTL_MS);\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const activeLease = leases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.agentId === data.agentId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (!activeLease) {\n return { success: false, error: \"no active (non-expired) lease to renew\" };\n }\n\n const now = new Date();\n const base = Math.max(now.getTime(), new Date(activeLease.expiresAt).getTime());\n activeLease.expiresAt = new Date(base + ttl).toISOString();\n activeLease.renewedAt = now.toISOString();\n await kv.set(KV.leases, activeLease.id, activeLease);\n\n return { success: true, lease: activeLease };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-cleanup\" },\n async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const now = Date.now();\n let expired = 0;\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:action:${lease.actionId}`,\n async () => {\n const currentLease = await kv.get<Lease>(KV.leases, lease.id);\n if (\n !currentLease ||\n currentLease.status !== \"active\" ||\n new Date(currentLease.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n currentLease.status = \"expired\";\n await kv.set(KV.leases, currentLease.id, currentLease);\n\n const action = await kv.get<Action>(KV.actions, currentLease.actionId);\n const otherActiveLease = (await kv.list<Lease>(KV.leases)).some(\n (l) =>\n l.id !== currentLease.id &&\n l.actionId === currentLease.actionId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n if (\n action &&\n !otherActiveLease &&\n action.status === \"active\" &&\n action.assignedTo === currentLease.agentId\n ) {\n action.status = \"pending\";\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, Routine, RoutineStep, RoutineRun } from \"../types.js\";\n\nexport function registerRoutinesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::routine-create\" },\n async (data: {\n name: string;\n description?: string;\n steps: RoutineStep[];\n tags?: string[];\n frozen?: boolean;\n sourceProceduralIds?: string[];\n }) => {\n if (!data.name || !Array.isArray(data.steps) || data.steps.length === 0) {\n return { success: false, error: \"name and steps are required\" };\n }\n\n for (let i = 0; i < data.steps.length; i++) {\n if (!data.steps[i].title?.trim()) {\n return { success: false, error: `step ${i} must have a title` };\n }\n }\n\n const orders = data.steps.map((s, i) => s.order ?? i);\n const uniqueOrders = new Set(orders);\n if (uniqueOrders.size !== orders.length) {\n return { success: false, error: \"duplicate step orders\" };\n }\n for (const step of data.steps) {\n if (step.dependsOn) {\n for (const dep of step.dependsOn) {\n if (!uniqueOrders.has(dep)) {\n return { success: false, error: `step ${step.order ?? data.steps.indexOf(step)} depends on unknown order ${dep}` };\n }\n }\n }\n }\n\n const now = new Date().toISOString();\n const routine: Routine = {\n id: generateId(\"rtn\"),\n name: data.name.trim(),\n description: (data.description || \"\").trim(),\n steps: data.steps.map((s, i) => ({\n order: s.order ?? i,\n title: s.title,\n description: s.description || \"\",\n actionTemplate: s.actionTemplate || {},\n dependsOn: s.dependsOn || [],\n })),\n createdAt: now,\n updatedAt: now,\n frozen: data.frozen ?? true,\n tags: data.tags || [],\n sourceProceduralIds: data.sourceProceduralIds || [],\n };\n\n await kv.set(KV.routines, routine.id, routine);\n return { success: true, routine };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-list\" },\n async (data: { frozen?: boolean; tags?: string[] }) => {\n let routines = await kv.list<Routine>(KV.routines);\n if (data.frozen !== undefined) {\n routines = routines.filter((r) => r.frozen === data.frozen);\n }\n if (data.tags && data.tags.length > 0) {\n routines = routines.filter((r) =>\n data.tags!.some((t) => r.tags.includes(t)),\n );\n }\n routines.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n return { success: true, routines };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-run\" },\n async (data: {\n routineId: string;\n initiatedBy?: string;\n project?: string;\n overrides?: Record<number, Partial<Action>>;\n }) => {\n if (!data.routineId) {\n return { success: false, error: \"routineId is required\" };\n }\n\n return withKeyedLock(`mem:routine:${data.routineId}`, async () => {\n const routine = await kv.get<Routine>(KV.routines, data.routineId);\n if (!routine) {\n return { success: false, error: \"routine not found\" };\n }\n\n const now = new Date().toISOString();\n const stepOrderToActionId = new Map<number, string>();\n const actionIds: string[] = [];\n const stepStatus: Record<number, \"pending\" | \"active\" | \"done\" | \"failed\"> = {};\n\n for (const step of routine.steps) {\n const template = step.actionTemplate || {};\n const override = data.overrides?.[step.order] || {};\n\n const hasDeps = (step.dependsOn || []).length > 0;\n const action: Action = {\n id: generateId(\"act\"),\n title: override.title || template.title || step.title,\n description:\n override.description ||\n template.description ||\n step.description,\n status: hasDeps ? \"blocked\" : \"pending\",\n priority:\n override.priority ?? template.priority ?? 5,\n createdAt: now,\n updatedAt: now,\n createdBy: data.initiatedBy || \"routine\",\n project: data.project || template.project,\n tags: [\n ...(template.tags || []),\n ...(override.tags || []),\n `routine:${routine.id}`,\n ],\n sourceObservationIds: [],\n sourceMemoryIds: [],\n metadata: { routineId: routine.id, stepOrder: step.order },\n };\n\n await kv.set(KV.actions, action.id, action);\n stepOrderToActionId.set(step.order, action.id);\n actionIds.push(action.id);\n stepStatus[step.order] = \"pending\";\n }\n\n for (const step of routine.steps) {\n const actionId = stepOrderToActionId.get(step.order);\n if (!actionId) continue;\n\n for (const depOrder of step.dependsOn) {\n const depActionId = stepOrderToActionId.get(depOrder);\n if (!depActionId) continue;\n const edge = {\n id: generateId(\"ae\"),\n type: \"requires\" as const,\n sourceActionId: actionId,\n targetActionId: depActionId,\n createdAt: now,\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n\n const run: RoutineRun = {\n id: generateId(\"run\"),\n routineId: routine.id,\n status: \"running\",\n startedAt: now,\n actionIds,\n stepStatus,\n initiatedBy: data.initiatedBy || \"unknown\",\n };\n\n await kv.set(KV.routineRuns, run.id, run);\n\n return {\n success: true,\n run,\n actionsCreated: actionIds.length,\n };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-status\" },\n async (data: { runId: string }) => {\n if (!data.runId) {\n return { success: false, error: \"runId is required\" };\n }\n\n const run = await kv.get<RoutineRun>(KV.routineRuns, data.runId);\n if (!run) {\n return { success: false, error: \"run not found\" };\n }\n\n const actionStates: Array<{\n actionId: string;\n status: string;\n title: string;\n }> = [];\n let allDone = true;\n let anyFailed = false;\n\n let statusChanged = false;\n for (const actionId of run.actionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action) {\n actionStates.push({\n actionId: action.id,\n status: action.status,\n title: action.title,\n });\n if (action.status !== \"done\") allDone = false;\n if (action.status === \"cancelled\") anyFailed = true;\n\n const stepOrder = (action.metadata as { stepOrder?: number })?.stepOrder;\n if (stepOrder !== undefined && stepOrder in run.stepStatus) {\n let mapped: \"pending\" | \"active\" | \"done\" | \"failed\";\n if (action.status === \"cancelled\") {\n mapped = \"failed\";\n } else if (action.status === \"blocked\") {\n mapped = \"pending\";\n } else {\n mapped = action.status as \"pending\" | \"active\" | \"done\";\n }\n if (run.stepStatus[stepOrder] !== mapped) {\n run.stepStatus[stepOrder] = mapped;\n statusChanged = true;\n }\n }\n } else {\n actionStates.push({\n actionId,\n status: \"cancelled\",\n title: \"(missing)\",\n });\n allDone = false;\n anyFailed = true;\n }\n }\n\n if (allDone && run.status === \"running\") {\n run.status = \"completed\";\n run.completedAt = new Date().toISOString();\n statusChanged = true;\n } else if (anyFailed && run.status === \"running\") {\n run.status = \"failed\";\n statusChanged = true;\n }\n\n if (statusChanged) {\n await kv.set(KV.routineRuns, run.id, run);\n }\n\n return {\n success: true,\n run,\n actions: actionStates,\n progress: {\n total: run.actionIds.length,\n done: actionStates.filter((a) => a.status === \"done\").length,\n active: actionStates.filter((a) => a.status === \"active\").length,\n pending: actionStates.filter((a) => a.status === \"pending\").length,\n blocked: actionStates.filter((a) => a.status === \"blocked\").length,\n cancelled: actionStates.filter((a) => a.status === \"cancelled\").length,\n },\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-freeze\" },\n async (data: { routineId: string }) => {\n if (!data.routineId) {\n return { success: false, error: \"routineId is required\" };\n }\n return withKeyedLock(`mem:routine:${data.routineId}`, async () => {\n const routine = await kv.get<Routine>(KV.routines, data.routineId);\n if (!routine) {\n return { success: false, error: \"routine not found\" };\n }\n routine.frozen = true;\n routine.updatedAt = new Date().toISOString();\n await kv.set(KV.routines, routine.id, routine);\n return { success: true, routine };\n });\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Signal } from \"../types.js\";\n\nexport function registerSignalsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::signal-send\" },\n async (data: {\n from: string;\n to?: string;\n content: string;\n type?: Signal[\"type\"];\n threadId?: string;\n replyTo?: string;\n metadata?: Record<string, unknown>;\n expiresInMs?: number;\n }) => {\n if (!data.from?.trim() || !data.content?.trim()) {\n return { success: false, error: \"from and non-empty content are required\" };\n }\n\n const now = new Date();\n let threadId = data.threadId;\n\n if (data.replyTo && !threadId) {\n const parent = await kv.get<Signal>(KV.signals, data.replyTo);\n if (parent) {\n threadId = parent.threadId || parent.id;\n }\n }\n\n const signal: Signal = {\n id: generateId(\"sig\"),\n from: data.from,\n to: data.to,\n content: data.content.trim(),\n type: data.type || \"info\",\n threadId: threadId || generateId(\"thr\"),\n replyTo: data.replyTo,\n metadata: data.metadata,\n createdAt: now.toISOString(),\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n await kv.set(KV.signals, signal.id, signal);\n\n return { success: true, signal };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-read\" },\n async (data: {\n agentId: string;\n unreadOnly?: boolean;\n threadId?: string;\n type?: string;\n limit?: number;\n }) => {\n if (!data.agentId) {\n return { success: false, error: \"agentId is required\" };\n }\n\n let signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n\n signals = signals.filter((s) => {\n if (s.expiresAt && new Date(s.expiresAt).getTime() <= now) return false;\n if (s.to && s.to !== data.agentId && s.from !== data.agentId)\n return false;\n if (!s.to && s.from !== data.agentId) return true;\n return true;\n });\n\n if (data.unreadOnly) {\n signals = signals.filter((s) => !s.readAt && s.to === data.agentId);\n }\n if (data.threadId) {\n signals = signals.filter((s) => s.threadId === data.threadId);\n }\n if (data.type) {\n signals = signals.filter((s) => s.type === data.type);\n }\n\n signals.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n const limit = data.limit || 50;\n const results = signals.slice(0, limit);\n\n for (const sig of results) {\n if (!sig.readAt && sig.to === data.agentId) {\n sig.readAt = new Date().toISOString();\n await kv.set(KV.signals, sig.id, sig);\n }\n }\n\n return { success: true, signals: results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-threads\" },\n async (data: { agentId: string; limit?: number }) => {\n if (!data.agentId) {\n return { success: false, error: \"agentId is required\" };\n }\n\n const signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n\n const relevant = signals.filter((s) => {\n if (s.expiresAt && new Date(s.expiresAt).getTime() <= now) return false;\n return (\n s.from === data.agentId ||\n s.to === data.agentId ||\n !s.to\n );\n });\n\n const threadMap = new Map<\n string,\n { threadId: string; messages: number; lastMessage: string; participants: Set<string> }\n >();\n\n for (const sig of relevant) {\n const tid = sig.threadId || sig.id;\n const existing = threadMap.get(tid);\n if (existing) {\n existing.messages++;\n existing.participants.add(sig.from);\n if (sig.to) existing.participants.add(sig.to);\n if (new Date(sig.createdAt) > new Date(existing.lastMessage)) {\n existing.lastMessage = sig.createdAt;\n }\n } else {\n const participants = new Set<string>([sig.from]);\n if (sig.to) participants.add(sig.to);\n threadMap.set(tid, {\n threadId: tid,\n messages: 1,\n lastMessage: sig.createdAt,\n participants,\n });\n }\n }\n\n const threads = Array.from(threadMap.values())\n .map((t) => ({\n ...t,\n participants: Array.from(t.participants),\n }))\n .sort(\n (a, b) =>\n new Date(b.lastMessage).getTime() -\n new Date(a.lastMessage).getTime(),\n )\n .slice(0, data.limit || 20);\n\n return { success: true, threads };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-cleanup\" },\n async () => {\n const signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n let removed = 0;\n\n for (const sig of signals) {\n if (sig.expiresAt && new Date(sig.expiresAt).getTime() <= now) {\n await kv.delete(KV.signals, sig.id);\n removed++;\n }\n }\n\n return { success: true, removed };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Checkpoint } from \"../types.js\";\n\nexport function registerCheckpointsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::checkpoint-create\" },\n async (data: {\n name: string;\n description?: string;\n type?: Checkpoint[\"type\"];\n linkedActionIds?: string[];\n expiresInMs?: number;\n }) => {\n if (!data.name) {\n return { success: false, error: \"name is required\" };\n }\n\n const validTypes: Checkpoint[\"type\"][] = [\"ci\", \"approval\", \"deploy\", \"external\", \"timer\"];\n if (data.type && !validTypes.includes(data.type)) {\n return { success: false, error: `invalid checkpoint type: ${data.type}. Must be one of: ${validTypes.join(\", \")}` };\n }\n\n const now = new Date();\n const checkpoint: Checkpoint = {\n id: generateId(\"ckpt\"),\n name: data.name.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n type: data.type || \"external\",\n createdAt: now.toISOString(),\n linkedActionIds: data.linkedActionIds || [],\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (!action) {\n return { success: false, error: `linked action not found: ${actionId}` };\n }\n }\n }\n\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"gated_by\",\n sourceActionId: actionId,\n targetActionId: checkpoint.id,\n createdAt: now.toISOString(),\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"pending\") {\n action.status = \"blocked\";\n action.updatedAt = now.toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n }\n }\n\n return { success: true, checkpoint };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-resolve\" },\n async (data: {\n checkpointId: string;\n status: \"passed\" | \"failed\";\n resolvedBy?: string;\n result?: unknown;\n }) => {\n if (!data.checkpointId || !data.status) {\n return {\n success: false,\n error: \"checkpointId and status are required\",\n };\n }\n\n return withKeyedLock(\n `mem:checkpoint:${data.checkpointId}`,\n async () => {\n const checkpoint = await kv.get<Checkpoint>(\n KV.checkpoints,\n data.checkpointId,\n );\n if (!checkpoint) {\n return { success: false, error: \"checkpoint not found\" };\n }\n if (checkpoint.status !== \"pending\") {\n return {\n success: false,\n error: `checkpoint already ${checkpoint.status}`,\n };\n }\n\n checkpoint.status = data.status;\n checkpoint.resolvedAt = new Date().toISOString();\n checkpoint.resolvedBy = data.resolvedBy;\n checkpoint.result = data.result;\n\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n\n let unblockedCount = 0;\n if (data.status === \"passed\" && checkpoint.linkedActionIds.length > 0) {\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const allCheckpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const cpMap = new Map(allCheckpoints.map((c) => [c.id, c]));\n\n for (const actionId of checkpoint.linkedActionIds) {\n await withKeyedLock(`mem:action:${actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"blocked\") {\n const gates = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"gated_by\",\n );\n const allGatesPassed = gates.every((g) => {\n const cp = cpMap.get(g.targetActionId);\n return cp && cp.status === \"passed\";\n });\n const requires = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"requires\",\n );\n const allActions = await kv.list<Action>(KV.actions);\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n const allRequiresMet = requires.every((r) => {\n const dep = actionMap.get(r.targetActionId);\n return dep && dep.status === \"done\";\n });\n if (allGatesPassed && allRequiresMet) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n unblockedCount++;\n }\n }\n });\n }\n }\n\n return { success: true, checkpoint, unblockedCount };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-list\" },\n async (data: { status?: string; type?: string }) => {\n let checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n\n if (data.status) {\n checkpoints = checkpoints.filter((c) => c.status === data.status);\n }\n if (data.type) {\n checkpoints = checkpoints.filter((c) => c.type === data.type);\n }\n\n checkpoints.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, checkpoints };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-expire\" },\n async () => {\n const checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const now = Date.now();\n let expired = 0;\n\n for (const cp of checkpoints) {\n if (\n cp.status === \"pending\" &&\n cp.expiresAt &&\n new Date(cp.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:checkpoint:${cp.id}`,\n async () => {\n const fresh = await kv.get<Checkpoint>(KV.checkpoints, cp.id);\n if (!fresh || fresh.status !== \"pending\") return false;\n fresh.status = \"expired\";\n fresh.resolvedAt = new Date().toISOString();\n await kv.set(KV.checkpoints, fresh.id, fresh);\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Action, ActionEdge, RoutineRun, MemoryProvider } from \"../types.js\";\n\nconst FLOW_COMPRESS_SYSTEM = `You are a workflow summarizer. Given a completed action chain, produce a concise summary capturing:\n1. The overall goal and outcome\n2. Key steps taken and their results\n3. Any notable decisions or discoveries\n4. Lessons learned\n\nOutput as XML:\n<summary>\n<goal>What was the workflow trying to achieve</goal>\n<outcome>What happened</outcome>\n<steps>Numbered list of key steps</steps>\n<discoveries>Any new insights or discoveries</discoveries>\n<lesson>What to remember for next time</lesson>\n</summary>`;\n\nexport function registerFlowCompressFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::flow-compress\" },\n async (data: { runId?: string; actionIds?: string[]; project?: string }) => {\n let actionsToCompress: Action[] = [];\n\n if (data.runId) {\n const run = await kv.get<RoutineRun>(KV.routineRuns, data.runId);\n if (!run) {\n return { success: false, error: \"run not found\" };\n }\n for (const id of run.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (action) actionsToCompress.push(action);\n }\n } else if (data.actionIds && data.actionIds.length > 0) {\n for (const id of data.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (action) actionsToCompress.push(action);\n }\n } else if (data.project) {\n const allActions = await kv.list<Action>(KV.actions);\n actionsToCompress = allActions.filter(\n (a) => a.project === data.project && a.status === \"done\",\n );\n } else {\n return {\n success: false,\n error: \"runId, actionIds, or project is required\",\n };\n }\n\n const doneActions = actionsToCompress.filter(\n (a) => a.status === \"done\",\n );\n if (doneActions.length === 0) {\n return {\n success: true,\n message: \"No completed actions to compress\",\n compressed: 0,\n };\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const relevantIds = new Set(doneActions.map((a) => a.id));\n const relevantEdges = allEdges.filter(\n (e) =>\n relevantIds.has(e.sourceActionId) ||\n relevantIds.has(e.targetActionId),\n );\n\n const prompt = buildFlowPrompt(doneActions, relevantEdges);\n\n try {\n const response = await provider.summarize(\n FLOW_COMPRESS_SYSTEM,\n prompt,\n );\n const summary = parseFlowSummary(response);\n\n const memory = {\n id: generateId(\"mem\"),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n type: \"workflow\" as const,\n title: summary.goal || `Workflow: ${doneActions.length} actions`,\n content: formatSummary(summary),\n concepts: extractConcepts(doneActions),\n files: extractFiles(doneActions),\n sessionIds: [],\n strength: 1.0,\n version: 1,\n isLatest: true,\n metadata: {\n flowCompressed: true,\n actionCount: doneActions.length,\n actionIds: doneActions.map((a) => a.id),\n },\n };\n\n await kv.set(KV.memories, memory.id, memory);\n\n return {\n success: true,\n compressed: doneActions.length,\n memoryId: memory.id,\n summary,\n };\n } catch (err) {\n return {\n success: false,\n error: `compression failed: ${String(err)}`,\n compressed: 0,\n };\n }\n },\n );\n}\n\nfunction buildFlowPrompt(\n actions: Action[],\n edges: ActionEdge[],\n): string {\n const lines: string[] = [\"## Completed Action Chain\\n\"];\n\n const sorted = [...actions].sort(\n (a, b) =>\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n\n for (const action of sorted) {\n lines.push(`### ${action.title}`);\n if (action.description) lines.push(action.description);\n if (action.result) lines.push(`Result: ${action.result}`);\n lines.push(`Priority: ${action.priority}, Tags: ${(action.tags ?? []).join(\", \")}`);\n lines.push(\"\");\n }\n\n if (edges.length > 0) {\n lines.push(\"## Dependencies\");\n for (const edge of edges) {\n lines.push(`- ${edge.sourceActionId} --${edge.type}--> ${edge.targetActionId}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction parseFlowSummary(response: string): {\n goal: string;\n outcome: string;\n steps: string;\n discoveries: string;\n lesson: string;\n} {\n const extract = (tag: string): string => {\n const match = response.match(\n new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`),\n );\n return match ? match[1].trim() : \"\";\n };\n return {\n goal: extract(\"goal\"),\n outcome: extract(\"outcome\"),\n steps: extract(\"steps\"),\n discoveries: extract(\"discoveries\"),\n lesson: extract(\"lesson\"),\n };\n}\n\nfunction formatSummary(s: {\n goal: string;\n outcome: string;\n steps: string;\n discoveries: string;\n lesson: string;\n}): string {\n const parts: string[] = [];\n if (s.goal) parts.push(`Goal: ${s.goal}`);\n if (s.outcome) parts.push(`Outcome: ${s.outcome}`);\n if (s.steps) parts.push(`Steps: ${s.steps}`);\n if (s.discoveries) parts.push(`Discoveries: ${s.discoveries}`);\n if (s.lesson) parts.push(`Lesson: ${s.lesson}`);\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractConcepts(actions: Action[]): string[] {\n const concepts = new Set<string>();\n for (const a of actions) {\n for (const tag of a.tags ?? []) {\n if (!tag.startsWith(\"routine:\")) concepts.add(tag);\n }\n }\n return Array.from(concepts);\n}\n\nfunction extractFiles(actions: Action[]): string[] {\n const files = new Set<string>();\n for (const a of actions) {\n if (a.metadata && typeof a.metadata === \"object\") {\n const meta = a.metadata as Record<string, unknown>;\n if (Array.isArray(meta.files)) {\n for (const f of meta.files) {\n if (typeof f === \"string\") files.add(f);\n }\n }\n }\n }\n return Array.from(files);\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type {\n MeshPeer,\n Memory,\n Action,\n SemanticMemory,\n ProceduralMemory,\n MemoryRelation,\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\n\nfunction isPrivateIP(ip: string): boolean {\n if (ip === \"127.0.0.1\" || ip === \"::1\" || ip === \"0.0.0.0\") return true;\n if (ip.startsWith(\"10.\") || ip.startsWith(\"192.168.\")) return true;\n if (/^172\\.(1[6-9]|2\\d|3[01])\\./.test(ip)) return true;\n if (ip === \"169.254.169.254\") return true;\n if (ip.startsWith(\"fe80:\") || ip.startsWith(\"fc00:\") || ip.startsWith(\"fd\")) return true;\n if (ip.startsWith(\"::ffff:\")) {\n const v4 = ip.slice(7);\n return isPrivateIP(v4);\n }\n return false;\n}\n\nasync function isAllowedUrl(urlStr: string): Promise<boolean> {\n try {\n const parsed = new URL(urlStr);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return false;\n if (parsed.username || parsed.password) return false;\n const host = parsed.hostname.toLowerCase();\n\n if (host === \"localhost\") return false;\n if (isIP(host) && isPrivateIP(host)) return false;\n\n if (!isIP(host)) {\n try {\n const resolved = await lookup(host, { all: true });\n if (resolved.some((r) => isPrivateIP(r.address))) return false;\n } catch {\n // DNS resolution failed — allow the URL (the actual fetch will fail if unreachable)\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nconst DEFAULT_SHARED_SCOPES = [\n \"memories\",\n \"actions\",\n \"semantic\",\n \"procedural\",\n \"relations\",\n \"graph:nodes\",\n \"graph:edges\",\n];\n\ninterface MeshSyncPayload {\n memories?: Memory[];\n actions?: Action[];\n semantic?: SemanticMemory[];\n procedural?: ProceduralMemory[];\n relations?: MemoryRelation[];\n graphNodes?: GraphNode[];\n graphEdges?: GraphEdge[];\n}\n\nasync function lwwMergeList<T extends { id: string }>(\n kv: StateKV,\n scope: string,\n items: T[] | undefined,\n lockPrefix: string,\n tsField: \"updatedAt\" | \"createdAt\",\n): Promise<number> {\n if (!items || !Array.isArray(items)) return 0;\n let count = 0;\n for (const item of items) {\n if (!item.id || typeof item.id !== \"string\") continue;\n const ts = (item as Record<string, unknown>)[tsField];\n if (typeof ts !== \"string\" || Number.isNaN(new Date(ts).getTime())) continue;\n const wrote = await withKeyedLock(`${lockPrefix}:${item.id}`, async () => {\n const existing = await kv.get<T>(scope, item.id);\n if (!existing) {\n await kv.set(scope, item.id, item);\n return true;\n }\n const existingTs = (existing as Record<string, unknown>)[tsField] as string;\n if (new Date(ts) > new Date(existingTs)) {\n await kv.set(scope, item.id, item);\n return true;\n }\n return false;\n });\n if (wrote) count++;\n }\n return count;\n}\n\nfunction graphNodeTs(node: GraphNode): string {\n return node.updatedAt || node.createdAt;\n}\n\nasync function lwwMergeGraphNodes(\n kv: StateKV,\n items: GraphNode[] | undefined,\n): Promise<number> {\n if (!items || !Array.isArray(items)) return 0;\n let count = 0;\n for (const item of items) {\n if (!item.id || typeof item.id !== \"string\") continue;\n const ts = graphNodeTs(item);\n if (!ts || Number.isNaN(new Date(ts).getTime())) continue;\n const wrote = await withKeyedLock(`mem:gnode:${item.id}`, async () => {\n const existing = await kv.get<GraphNode>(KV.graphNodes, item.id);\n if (!existing) {\n await kv.set(KV.graphNodes, item.id, item);\n return true;\n }\n if (new Date(ts) > new Date(graphNodeTs(existing))) {\n await kv.set(KV.graphNodes, item.id, item);\n return true;\n }\n return false;\n });\n if (wrote) count++;\n }\n return count;\n}\n\nexport function registerMeshFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::mesh-register\" },\n async (data: {\n url: string;\n name: string;\n sharedScopes?: string[];\n syncFilter?: { project?: string };\n }) => {\n if (!data.url || !data.name) {\n return { success: false, error: \"url and name are required\" };\n }\n\n if (!(await isAllowedUrl(data.url))) {\n return { success: false, error: \"URL blocked: private/local address not allowed\" };\n }\n\n const existing = await kv.list<MeshPeer>(KV.mesh);\n const duplicate = existing.find((p) => p.url === data.url);\n if (duplicate) {\n return { success: false, error: \"peer already registered\", peerId: duplicate.id };\n }\n\n const peer: MeshPeer = {\n id: generateId(\"peer\"),\n url: data.url,\n name: data.name,\n status: \"disconnected\",\n sharedScopes: data.sharedScopes || DEFAULT_SHARED_SCOPES,\n syncFilter: data.syncFilter,\n };\n\n await kv.set(KV.mesh, peer.id, peer);\n return { success: true, peer };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-list\" },\n async () => {\n const peers = await kv.list<MeshPeer>(KV.mesh);\n return { success: true, peers };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-sync\" },\n async (data: { peerId?: string; scopes?: string[]; direction?: \"push\" | \"pull\" | \"both\" }) => {\n const direction = data.direction || \"both\";\n let peers: MeshPeer[];\n\n if (data.peerId) {\n const peer = await kv.get<MeshPeer>(KV.mesh, data.peerId);\n if (!peer) return { success: false, error: \"peer not found\" };\n peers = [peer];\n } else {\n peers = await kv.list<MeshPeer>(KV.mesh);\n }\n\n const results: Array<{\n peerId: string;\n peerName: string;\n pushed: number;\n pulled: number;\n errors: string[];\n }> = [];\n\n for (const peer of peers) {\n const result = {\n peerId: peer.id,\n peerName: peer.name,\n pushed: 0,\n pulled: 0,\n errors: [] as string[],\n };\n\n peer.status = \"syncing\";\n await kv.set(KV.mesh, peer.id, peer);\n\n const scopes = data.scopes || peer.sharedScopes;\n\n try {\n if (!(await isAllowedUrl(peer.url))) {\n result.errors.push(\"peer URL blocked: private/local address not allowed\");\n peer.status = \"error\";\n await kv.set(KV.mesh, peer.id, peer);\n results.push(result);\n continue;\n }\n\n if (direction === \"push\" || direction === \"both\") {\n const pushData = await collectSyncData(kv, scopes, peer.lastSyncAt, peer.syncFilter);\n try {\n const response = await fetch(`${peer.url}/agentmemory/mesh/receive`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(pushData),\n signal: AbortSignal.timeout(30000),\n redirect: \"error\",\n });\n if (response.ok) {\n const body = (await response.json()) as { accepted: number };\n result.pushed = body.accepted || 0;\n } else {\n result.errors.push(`push failed: HTTP ${response.status}`);\n }\n } catch (err) {\n result.errors.push(`push failed: ${String(err)}`);\n }\n }\n\n if (direction === \"pull\" || direction === \"both\") {\n try {\n const response = await fetch(\n `${peer.url}/agentmemory/mesh/export?since=${peer.lastSyncAt || \"\"}`,\n { signal: AbortSignal.timeout(30000), redirect: \"error\" },\n );\n if (response.ok) {\n const pullData = (await response.json()) as {\n memories?: Memory[];\n actions?: Action[];\n };\n result.pulled = await applySyncData(kv, pullData, scopes);\n } else {\n result.errors.push(`pull failed: HTTP ${response.status}`);\n }\n } catch (err) {\n result.errors.push(`pull failed: ${String(err)}`);\n }\n }\n\n peer.status = result.errors.length > 0 ? \"error\" : \"connected\";\n if (result.errors.length === 0) {\n peer.lastSyncAt = new Date().toISOString();\n }\n } catch (err) {\n peer.status = \"disconnected\";\n result.errors.push(String(err));\n }\n\n await kv.set(KV.mesh, peer.id, peer);\n results.push(result);\n }\n\n return { success: true, results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-receive\" },\n async (data: MeshSyncPayload) => {\n let accepted = 0;\n\n accepted += await lwwMergeList(kv, KV.memories, data.memories, \"mem:memory\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.actions, data.actions, \"mem:action\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.semantic, data.semantic, \"mem:semantic\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.procedural, data.procedural, \"mem:procedural\", \"updatedAt\");\n if (data.relations && Array.isArray(data.relations)) {\n for (const rel of data.relations) {\n if (!rel.sourceId || !rel.targetId || !rel.type) continue;\n const relKey = `${rel.sourceId}:${rel.targetId}:${rel.type}`;\n await withKeyedLock(`mem:relation:${relKey}`, async () => {\n const existing = await kv.get<MemoryRelation>(KV.relations, relKey);\n if (!existing) {\n await kv.set(KV.relations, relKey, rel);\n accepted++;\n }\n });\n }\n }\n accepted += await lwwMergeGraphNodes(kv, data.graphNodes);\n accepted += await lwwMergeList(kv, KV.graphEdges, data.graphEdges, \"mem:gedge\", \"createdAt\");\n\n return { success: true, accepted };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-remove\" },\n async (data: { peerId: string }) => {\n if (!data.peerId) {\n return { success: false, error: \"peerId is required\" };\n }\n await kv.delete(KV.mesh, data.peerId);\n return { success: true };\n },\n );\n}\n\nfunction deltaFilter<T>(\n items: T[],\n sinceTime: number,\n tsField: \"updatedAt\" | \"createdAt\",\n): T[] {\n return items.filter(\n (item) => new Date((item as Record<string, unknown>)[tsField] as string).getTime() > sinceTime,\n );\n}\n\nasync function collectSyncData(\n kv: StateKV,\n scopes: string[],\n since?: string,\n syncFilter?: { project?: string },\n): Promise<MeshSyncPayload> {\n const result: MeshSyncPayload = {};\n const parsed = since ? new Date(since).getTime() : 0;\n const sinceTime = Number.isNaN(parsed) ? 0 : parsed;\n\n if (scopes.includes(\"memories\")) {\n const all = await kv.list<Memory>(KV.memories);\n result.memories = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"actions\")) {\n let all = await kv.list<Action>(KV.actions);\n if (syncFilter?.project) {\n all = all.filter((a) => a.project === syncFilter.project);\n }\n result.actions = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n const projectScoped = !!syncFilter?.project;\n\n if (scopes.includes(\"semantic\") && !projectScoped) {\n const all = await kv.list<SemanticMemory>(KV.semantic);\n result.semantic = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"procedural\") && !projectScoped) {\n const all = await kv.list<ProceduralMemory>(KV.procedural);\n result.procedural = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"relations\") && !projectScoped) {\n const all = await kv.list<MemoryRelation>(KV.relations);\n result.relations = deltaFilter(all, sinceTime, \"createdAt\");\n }\n\n if (scopes.includes(\"graph:nodes\") && !projectScoped) {\n const all = await kv.list<GraphNode>(KV.graphNodes);\n result.graphNodes = all.filter(\n (n) => new Date(graphNodeTs(n)).getTime() > sinceTime,\n );\n }\n\n if (scopes.includes(\"graph:edges\") && !projectScoped) {\n const all = await kv.list<GraphEdge>(KV.graphEdges);\n result.graphEdges = deltaFilter(all, sinceTime, \"createdAt\");\n }\n\n return result;\n}\n\nasync function applySyncData(\n kv: StateKV,\n data: MeshSyncPayload,\n scopes: string[],\n): Promise<number> {\n let applied = 0;\n\n if (scopes.includes(\"memories\")) {\n applied += await lwwMergeList(kv, KV.memories, data.memories, \"mem:memory\", \"updatedAt\");\n }\n if (scopes.includes(\"actions\")) {\n applied += await lwwMergeList(kv, KV.actions, data.actions, \"mem:action\", \"updatedAt\");\n }\n if (scopes.includes(\"semantic\")) {\n applied += await lwwMergeList(kv, KV.semantic, data.semantic, \"mem:semantic\", \"updatedAt\");\n }\n if (scopes.includes(\"procedural\")) {\n applied += await lwwMergeList(kv, KV.procedural, data.procedural, \"mem:procedural\", \"updatedAt\");\n }\n if (scopes.includes(\"relations\") && data.relations) {\n for (const rel of data.relations) {\n if (!rel.sourceId || !rel.targetId || !rel.type) continue;\n const relKey = `${rel.sourceId}:${rel.targetId}:${rel.type}`;\n const wrote = await withKeyedLock(`mem:relation:${relKey}`, async () => {\n const existing = await kv.get<MemoryRelation>(KV.relations, relKey);\n if (!existing) {\n await kv.set(KV.relations, relKey, rel);\n return true;\n }\n return false;\n });\n if (wrote) applied++;\n }\n }\n if (scopes.includes(\"graph:nodes\")) {\n applied += await lwwMergeGraphNodes(kv, data.graphNodes);\n }\n if (scopes.includes(\"graph:edges\")) {\n applied += await lwwMergeList(kv, KV.graphEdges, data.graphEdges, \"mem:gedge\", \"createdAt\");\n }\n\n return applied;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Session } from \"../types.js\";\nimport { execFile } from \"node:child_process\";\nimport { resolve } from \"node:path\";\n\nfunction execAsync(\n cmd: string,\n args: string[],\n cwd: string,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { cwd, timeout: 5000 }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout.trim());\n });\n });\n}\n\nexport function registerBranchAwareFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::detect-worktree\" },\n async (data: { cwd: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n try {\n const gitDir = await execAsync(\n \"git\",\n [\"rev-parse\", \"--git-dir\"],\n data.cwd,\n );\n const commonDir = await execAsync(\n \"git\",\n [\"rev-parse\", \"--git-common-dir\"],\n data.cwd,\n );\n const branch = await execAsync(\n \"git\",\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n data.cwd,\n ).catch(() => \"detached\");\n\n const topLevel = await execAsync(\n \"git\",\n [\"rev-parse\", \"--show-toplevel\"],\n data.cwd,\n );\n\n const isWorktree = resolve(data.cwd, gitDir) !== resolve(data.cwd, commonDir);\n const mainRepoRoot = isWorktree\n ? resolve(data.cwd, commonDir, \"..\")\n : topLevel;\n\n return {\n success: true,\n isWorktree,\n branch,\n topLevel,\n mainRepoRoot,\n gitDir: resolve(data.cwd, gitDir),\n commonDir: resolve(data.cwd, commonDir),\n };\n } catch {\n return {\n success: true,\n isWorktree: false,\n branch: null,\n topLevel: data.cwd,\n mainRepoRoot: data.cwd,\n gitDir: null,\n commonDir: null,\n };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::list-worktrees\" },\n async (data: { cwd: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n try {\n const output = await execAsync(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n data.cwd,\n );\n\n const worktrees: Array<{\n path: string;\n head: string;\n branch: string;\n bare: boolean;\n }> = [];\n\n const blocks = output.split(\"\\n\\n\").filter(Boolean);\n for (const block of blocks) {\n const lines = block.split(\"\\n\");\n const wt: { path: string; head: string; branch: string; bare: boolean } = {\n path: \"\",\n head: \"\",\n branch: \"\",\n bare: false,\n };\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) wt.path = line.slice(9);\n else if (line.startsWith(\"HEAD \")) wt.head = line.slice(5);\n else if (line.startsWith(\"branch \"))\n wt.branch = line.slice(7).replace(\"refs/heads/\", \"\");\n else if (line === \"bare\") wt.bare = true;\n }\n if (wt.path) worktrees.push(wt);\n }\n\n return { success: true, worktrees };\n } catch {\n return { success: true, worktrees: [] };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::branch-sessions\" },\n async (data: { cwd: string; branch?: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n const worktreeInfo = await sdk.trigger<\n { cwd: string },\n {\n success: boolean;\n isWorktree: boolean;\n mainRepoRoot: string;\n branch: string | null;\n }\n >(\"mem::detect-worktree\", { cwd: data.cwd });\n\n const projectRoot = worktreeInfo.mainRepoRoot || data.cwd;\n const branch = data.branch || worktreeInfo.branch;\n\n const sessions = await kv.list<Session>(KV.sessions);\n\n const matching = sessions.filter((s) => {\n if (s.project === projectRoot || s.cwd === projectRoot) return true;\n if (s.cwd.startsWith(projectRoot + \"/\")) return true;\n return false;\n });\n\n matching.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n return {\n success: true,\n sessions: matching,\n projectRoot,\n branch,\n isWorktree: worktreeInfo.isWorktree,\n };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Checkpoint, CompressedObservation, FunctionMetrics, Sentinel, Session } from \"../types.js\";\n\nconst VALID_TYPES: Sentinel[\"type\"][] = [\n \"webhook\",\n \"timer\",\n \"threshold\",\n \"pattern\",\n \"approval\",\n \"custom\",\n];\n\nexport function registerSentinelsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::sentinel-create\" },\n async (data: {\n name: string;\n type: Sentinel[\"type\"];\n config?: Record<string, unknown>;\n linkedActionIds?: string[];\n expiresInMs?: number;\n }) => {\n if (!data.name || typeof data.name !== \"string\") {\n return { success: false, error: \"name is required\" };\n }\n if (!data.type || !VALID_TYPES.includes(data.type)) {\n return {\n success: false,\n error: `type must be one of: ${VALID_TYPES.join(\", \")}`,\n };\n }\n\n if (data.type === \"threshold\") {\n const cfg = data.config as\n | { metric?: string; operator?: string; value?: number }\n | undefined;\n if (\n !cfg ||\n !cfg.metric ||\n ![\"gt\", \"lt\", \"eq\"].includes(cfg.operator || \"\") ||\n typeof cfg.value !== \"number\"\n ) {\n return {\n success: false,\n error:\n \"threshold config requires metric, operator (gt|lt|eq), and numeric value\",\n };\n }\n }\n\n if (data.type === \"pattern\") {\n const cfg = data.config as { pattern?: string } | undefined;\n if (!cfg || !cfg.pattern || typeof cfg.pattern !== \"string\") {\n return {\n success: false,\n error: \"pattern config requires a pattern string\",\n };\n }\n }\n\n if (data.type === \"webhook\") {\n const cfg = data.config as { path?: string } | undefined;\n if (!cfg || !cfg.path || typeof cfg.path !== \"string\") {\n return {\n success: false,\n error: \"webhook config requires a path string\",\n };\n }\n }\n\n if (data.type === \"timer\") {\n const cfg = data.config as { durationMs?: number } | undefined;\n if (!cfg || typeof cfg.durationMs !== \"number\" || cfg.durationMs <= 0) {\n return {\n success: false,\n error: \"timer config requires a positive durationMs\",\n };\n }\n }\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (!action) {\n return {\n success: false,\n error: `linked action not found: ${actionId}`,\n };\n }\n }\n }\n\n const now = new Date();\n const sentinel: Sentinel = {\n id: generateId(\"snl\"),\n name: data.name.trim(),\n type: data.type,\n status: \"watching\",\n config: data.config || {},\n createdAt: now.toISOString(),\n linkedActionIds: data.linkedActionIds || [],\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"gated_by\",\n sourceActionId: actionId,\n targetActionId: sentinel.id,\n createdAt: now.toISOString(),\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n\n if (data.type === \"timer\") {\n const durationMs = (data.config as { durationMs: number }).durationMs;\n setTimeout(async () => {\n await withKeyedLock(`mem:sentinel:${sentinel.id}`, async () => {\n const fresh = await kv.get<Sentinel>(KV.sentinels, sentinel.id);\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = { reason: \"timer_elapsed\", durationMs };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n });\n }, durationMs);\n }\n\n return { success: true, sentinel };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-trigger\" },\n async (data: { sentinelId: string; result?: unknown }) => {\n if (!data.sentinelId) {\n return { success: false, error: \"sentinelId is required\" };\n }\n\n return withKeyedLock(\n `mem:sentinel:${data.sentinelId}`,\n async () => {\n const sentinel = await kv.get<Sentinel>(\n KV.sentinels,\n data.sentinelId,\n );\n if (!sentinel) {\n return { success: false, error: \"sentinel not found\" };\n }\n if (sentinel.status !== \"watching\") {\n return {\n success: false,\n error: `sentinel already ${sentinel.status}`,\n };\n }\n\n sentinel.status = \"triggered\";\n sentinel.triggeredAt = new Date().toISOString();\n sentinel.result = data.result;\n\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n let unblockedCount = 0;\n if (sentinel.linkedActionIds.length > 0) {\n unblockedCount = await unblockLinkedActions(kv, sentinel);\n }\n\n return { success: true, sentinel, unblockedCount };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-check\" },\n async () => {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const active = sentinels.filter((s) => s.status === \"watching\");\n const triggered: string[] = [];\n\n for (const sentinel of active) {\n if (sentinel.type === \"threshold\") {\n const cfg = sentinel.config as {\n metric: string;\n operator: \"gt\" | \"lt\" | \"eq\";\n value: number;\n };\n const metrics = await kv.get<FunctionMetrics>(\n KV.metrics,\n cfg.metric,\n );\n if (!metrics) continue;\n\n const current = metrics.totalCalls;\n let matched = false;\n if (cfg.operator === \"gt\") matched = current > cfg.value;\n else if (cfg.operator === \"lt\") matched = current < cfg.value;\n else if (cfg.operator === \"eq\") matched = current === cfg.value;\n\n if (matched) {\n await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = {\n reason: \"threshold_crossed\",\n metric: cfg.metric,\n currentValue: current,\n threshold: cfg.value,\n operator: cfg.operator,\n };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n },\n );\n triggered.push(sentinel.id);\n }\n }\n\n if (sentinel.type === \"pattern\") {\n const cfg = sentinel.config as { pattern: string };\n const regex = new RegExp(cfg.pattern, \"i\");\n const sessions = await kv.list<Session>(KV.sessions);\n let matchedObs: CompressedObservation | null = null;\n\n for (const session of sessions) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n const recent = observations\n .filter(\n (o) =>\n new Date(o.timestamp).getTime() >=\n new Date(sentinel.createdAt).getTime(),\n )\n .find((o) => regex.test(o.title));\n if (recent) {\n matchedObs = recent;\n break;\n }\n }\n\n if (matchedObs) {\n await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = {\n reason: \"pattern_matched\",\n pattern: cfg.pattern,\n matchedObservationId: matchedObs!.id,\n matchedTitle: matchedObs!.title,\n };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n },\n );\n triggered.push(sentinel.id);\n }\n }\n }\n\n return { success: true, triggered, checkedCount: active.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-cancel\" },\n async (data: { sentinelId: string }) => {\n if (!data.sentinelId) {\n return { success: false, error: \"sentinelId is required\" };\n }\n\n return withKeyedLock(\n `mem:sentinel:${data.sentinelId}`,\n async () => {\n const sentinel = await kv.get<Sentinel>(\n KV.sentinels,\n data.sentinelId,\n );\n if (!sentinel) {\n return { success: false, error: \"sentinel not found\" };\n }\n if (sentinel.status !== \"watching\") {\n return {\n success: false,\n error: `cannot cancel sentinel with status ${sentinel.status}`,\n };\n }\n\n sentinel.status = \"cancelled\";\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n return { success: true, sentinel };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-list\" },\n async (data: { status?: string; type?: string }) => {\n let sentinels = await kv.list<Sentinel>(KV.sentinels);\n\n if (data.status) {\n sentinels = sentinels.filter((s) => s.status === data.status);\n }\n if (data.type) {\n sentinels = sentinels.filter((s) => s.type === data.type);\n }\n\n sentinels.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, sentinels };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-expire\" },\n async () => {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const now = Date.now();\n let expired = 0;\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return false;\n fresh.status = \"expired\";\n fresh.triggeredAt = new Date().toISOString();\n await kv.set(KV.sentinels, fresh.id, fresh);\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n\nasync function unblockLinkedActions(\n kv: StateKV,\n sentinel: Sentinel,\n): Promise<number> {\n if (sentinel.linkedActionIds.length === 0) return 0;\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const allSentinels = await kv.list<Sentinel>(KV.sentinels);\n const allCheckpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const gateMap = new Map<string, { status: string }>();\n for (const s of allSentinels) gateMap.set(s.id, { status: s.status === \"triggered\" ? \"passed\" : s.status });\n for (const c of allCheckpoints) gateMap.set(c.id, { status: c.status });\n\n let unblockedCount = 0;\n\n for (const actionId of sentinel.linkedActionIds) {\n await withKeyedLock(`mem:action:${actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"blocked\") {\n const gates = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"gated_by\",\n );\n const allPassed = gates.every((g) => {\n const gate = gateMap.get(g.targetActionId);\n return gate && gate.status === \"passed\";\n });\n if (allPassed) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n unblockedCount++;\n }\n }\n });\n }\n\n return unblockedCount;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Sketch } from \"../types.js\";\n\nexport function registerSketchesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::sketch-create\" },\n async (data: {\n title: string;\n description?: string;\n expiresInMs?: number;\n project?: string;\n }) => {\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n const now = new Date();\n const expiresInMs = data.expiresInMs || 3600000;\n const sketch: Sketch = {\n id: generateId(\"sk\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"active\",\n actionIds: [],\n project: data.project,\n createdAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + expiresInMs).toISOString(),\n };\n\n await kv.set(KV.sketches, sketch.id, sketch);\n return { success: true, sketch };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-add\" },\n async (data: {\n sketchId: string;\n title: string;\n description?: string;\n priority?: number;\n dependsOn?: string[];\n }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const now = new Date().toISOString();\n const action: Action = {\n id: generateId(\"act\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n priority: Math.max(1, Math.min(10, data.priority || 5)),\n createdAt: now,\n updatedAt: now,\n createdBy: \"sketch\",\n project: sketch.project,\n tags: [],\n sourceObservationIds: [],\n sourceMemoryIds: [],\n sketchId: data.sketchId,\n };\n\n if (data.dependsOn && data.dependsOn.length > 0) {\n const sketchActionSet = new Set(sketch.actionIds);\n for (const depId of data.dependsOn) {\n if (!sketchActionSet.has(depId)) {\n return {\n success: false,\n error: `dependency ${depId} not found in this sketch`,\n };\n }\n }\n }\n\n await kv.set(KV.actions, action.id, action);\n\n const createdEdges: ActionEdge[] = [];\n if (data.dependsOn && data.dependsOn.length > 0) {\n for (const depId of data.dependsOn) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"requires\",\n sourceActionId: action.id,\n targetActionId: depId,\n createdAt: now,\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n createdEdges.push(edge);\n }\n }\n\n sketch.actionIds.push(action.id);\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, action, edges: createdEdges };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-promote\" },\n async (data: { sketchId: string; project?: string }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const promotedIds: string[] = [];\n for (const actionId of sketch.actionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action) {\n delete action.sketchId;\n if (data.project) {\n action.project = data.project;\n }\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n promotedIds.push(action.id);\n }\n }\n\n sketch.status = \"promoted\";\n sketch.promotedAt = new Date().toISOString();\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, promotedIds };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-discard\" },\n async (data: { sketchId: string }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const actionIdSet = new Set(sketch.actionIds);\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n\n for (const actionId of sketch.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n sketch.status = \"discarded\";\n sketch.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, discardedCount: sketch.actionIds.length };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-list\" },\n async (data: { status?: string; project?: string }) => {\n let sketches = await kv.list<Sketch>(KV.sketches);\n\n if (data.status) {\n sketches = sketches.filter((s) => s.status === data.status);\n }\n if (data.project) {\n sketches = sketches.filter((s) => s.project === data.project);\n }\n\n sketches.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n const results = sketches.map((s) => ({\n ...s,\n actionCount: s.actionIds.length,\n }));\n\n return { success: true, sketches: results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-gc\" },\n async () => {\n const sketches = await kv.list<Sketch>(KV.sketches);\n const now = Date.now();\n let collected = 0;\n\n for (const sketch of sketches) {\n if (\n sketch.status !== \"active\" ||\n new Date(sketch.expiresAt).getTime() > now\n ) {\n continue;\n }\n\n await withKeyedLock(`mem:sketch:${sketch.id}`, async () => {\n const current = await kv.get<Sketch>(KV.sketches, sketch.id);\n if (\n !current ||\n current.status !== \"active\" ||\n new Date(current.expiresAt).getTime() > now\n ) {\n return;\n }\n\n const actionIdSet = new Set(current.actionIds);\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n\n for (const actionId of current.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n current.status = \"discarded\";\n current.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, current.id, current);\n collected++;\n });\n }\n\n return { success: true, collected };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Action, ActionEdge, Crystal, MemoryProvider } from \"../types.js\";\n\ninterface CrystalDigest {\n narrative: string;\n keyOutcomes: string[];\n filesAffected: string[];\n lessons: string[];\n}\n\nconst CRYSTALLIZE_SYSTEM = `You are summarizing a completed chain of agent actions into a compact digest.\nExtract: (1) what was accomplished in 1-2 sentences, (2) key decisions as bullet points,\n(3) files affected, (4) any lessons or patterns worth remembering.\nReturn as JSON: { \"narrative\": \"...\", \"keyOutcomes\": [\"...\"], \"filesAffected\": [\"...\"], \"lessons\": [\"...\"] }`;\n\nexport function registerCrystallizeFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::crystallize\" },\n async (data: {\n actionIds: string[];\n sessionId?: string;\n project?: string;\n }) => {\n if (!data.actionIds || data.actionIds.length === 0) {\n return { success: false, error: \"actionIds is required\" };\n }\n\n const actions: Action[] = [];\n for (const id of data.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (!action) {\n return { success: false, error: `action not found: ${id}` };\n }\n if (action.status !== \"done\" && action.status !== \"cancelled\") {\n return {\n success: false,\n error: `action ${id} has status \"${action.status}\", expected \"done\" or \"cancelled\"`,\n };\n }\n actions.push(action);\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const idSet = new Set(data.actionIds);\n const relevantEdges = allEdges.filter(\n (e) => idSet.has(e.sourceActionId) || idSet.has(e.targetActionId),\n );\n\n const prompt = buildChainText(actions, relevantEdges);\n\n try {\n const response = await provider.summarize(CRYSTALLIZE_SYSTEM, prompt);\n const digest = parseDigest(response);\n\n const crystal: Crystal = {\n id: generateId(\"crys\"),\n narrative: digest.narrative,\n keyOutcomes: digest.keyOutcomes,\n filesAffected: digest.filesAffected,\n lessons: digest.lessons,\n sourceActionIds: data.actionIds,\n sessionId: data.sessionId,\n project: data.project,\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(KV.crystals, crystal.id, crystal);\n\n await Promise.all(\n digest.lessons.map((lesson) =>\n sdk.trigger(\"mem::lesson-save\", {\n content: lesson,\n context: crystal.narrative,\n confidence: 0.6,\n project: data.project,\n tags: [],\n source: \"crystal\",\n sourceIds: [crystal.id],\n }).catch(() => {}),\n ),\n );\n\n for (const action of actions) {\n const updated = { ...action, crystallizedInto: crystal.id };\n await kv.set(KV.actions, action.id, updated);\n }\n\n return { success: true, crystal };\n } catch (err) {\n return {\n success: false,\n error: `crystallization failed: ${String(err)}`,\n };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::crystal-list\" },\n async (data: {\n project?: string;\n sessionId?: string;\n limit?: number;\n }) => {\n const limit = data.limit ?? 20;\n let crystals = await kv.list<Crystal>(KV.crystals);\n\n if (data.project) {\n crystals = crystals.filter((c) => c.project === data.project);\n }\n if (data.sessionId) {\n crystals = crystals.filter((c) => c.sessionId === data.sessionId);\n }\n\n crystals.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, crystals: crystals.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::crystal-get\" },\n async (data: { crystalId: string }) => {\n if (!data.crystalId) {\n return { success: false, error: \"crystalId is required\" };\n }\n\n const crystal = await kv.get<Crystal>(KV.crystals, data.crystalId);\n if (!crystal) {\n return { success: false, error: \"crystal not found\" };\n }\n\n return { success: true, crystal };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::auto-crystallize\" },\n async (data: {\n olderThanDays?: number;\n project?: string;\n dryRun?: boolean;\n }) => {\n const olderThanDays = data.olderThanDays ?? 7;\n const dryRun = data.dryRun ?? false;\n const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n\n let allActions = await kv.list<CrystallizableAction>(KV.actions);\n\n allActions = allActions.filter(\n (a) =>\n a.status === \"done\" &&\n !a.crystallizedInto &&\n new Date(a.createdAt).getTime() < cutoff,\n );\n\n if (data.project) {\n allActions = allActions.filter((a) => a.project === data.project);\n }\n\n if (allActions.length === 0) {\n return { success: true, groupCount: 0, crystalIds: [] };\n }\n\n const groups = new Map<string, Action[]>();\n for (const action of allActions) {\n const key = action.parentId ?? action.project ?? \"_ungrouped\";\n const group = groups.get(key);\n if (group) {\n group.push(action);\n } else {\n groups.set(key, [action]);\n }\n }\n\n if (dryRun) {\n const groupSummaries = Array.from(groups.entries()).map(\n ([key, actions]) => ({\n groupKey: key,\n actionCount: actions.length,\n actionIds: actions.map((a) => a.id),\n }),\n );\n return {\n success: true,\n dryRun: true,\n groupCount: groups.size,\n groups: groupSummaries,\n crystalIds: [],\n };\n }\n\n const crystalIds: string[] = [];\n for (const [, groupActions] of groups) {\n const actionIds = groupActions.map((a) => a.id);\n const project = groupActions[0].project;\n\n try {\n const result = (await sdk.trigger(\"mem::crystallize\", {\n actionIds,\n project,\n })) as { success: boolean; crystal?: Crystal };\n\n if (result.success && result.crystal) {\n crystalIds.push(result.crystal.id);\n }\n } catch {\n continue;\n }\n }\n\n return {\n success: true,\n groupCount: groups.size,\n crystalIds,\n };\n },\n );\n}\n\nfunction buildChainText(actions: Action[], edges: ActionEdge[]): string {\n const lines: string[] = [\"## Completed Action Chain\\n\"];\n\n const sorted = [...actions].sort(\n (a, b) =>\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n\n for (const action of sorted) {\n lines.push(`### ${action.title}`);\n if (action.description) lines.push(action.description);\n if (action.result) lines.push(`Result: ${action.result}`);\n lines.push(\n `Tags: ${(action.tags ?? []).join(\", \")}`,\n );\n lines.push(\"\");\n }\n\n if (edges.length > 0) {\n lines.push(\"## Dependencies\");\n for (const edge of edges) {\n lines.push(\n `- ${edge.sourceActionId} --${edge.type}--> ${edge.targetActionId}`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction parseDigest(response: string): CrystalDigest {\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return {\n narrative: response,\n keyOutcomes: [],\n filesAffected: [],\n lessons: [],\n };\n }\n const parsed = JSON.parse(jsonMatch[0]) as Record<string, unknown>;\n return {\n narrative:\n typeof parsed.narrative === \"string\" ? parsed.narrative : response,\n keyOutcomes: Array.isArray(parsed.keyOutcomes)\n ? (parsed.keyOutcomes as string[])\n : [],\n filesAffected: Array.isArray(parsed.filesAffected)\n ? (parsed.filesAffected as string[])\n : [],\n lessons: Array.isArray(parsed.lessons)\n ? (parsed.lessons as string[])\n : [],\n };\n } catch {\n return {\n narrative: response,\n keyOutcomes: [],\n filesAffected: [],\n lessons: [],\n };\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type {\n Action,\n ActionEdge,\n DiagnosticCheck,\n Lease,\n Checkpoint,\n Signal,\n Sentinel,\n Sketch,\n MeshPeer,\n Session,\n Memory,\n} from \"../types.js\";\n\nconst ALL_CATEGORIES = [\n \"actions\",\n \"leases\",\n \"sentinels\",\n \"sketches\",\n \"signals\",\n \"sessions\",\n \"memories\",\n \"mesh\",\n];\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\nconst ONE_HOUR_MS = 60 * 60 * 1000;\n\nexport function registerDiagnosticsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::diagnose\" },\n async (data: { categories?: string[] }) => {\n const categories = data.categories && data.categories.length > 0\n ? data.categories.filter((c) => ALL_CATEGORIES.includes(c))\n : ALL_CATEGORIES;\n\n const checks: DiagnosticCheck[] = [];\n const now = Date.now();\n\n if (categories.includes(\"actions\")) {\n const actions = await kv.list<Action>(KV.actions);\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const leases = await kv.list<Lease>(KV.leases);\n const actionMap = new Map(actions.map((a) => [a.id, a]));\n\n for (const action of actions) {\n if (action.status === \"active\") {\n const hasActiveLease = leases.some(\n (l) =>\n l.actionId === action.id &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > now,\n );\n if (!hasActiveLease) {\n checks.push({\n name: `active-no-lease:${action.id}`,\n category: \"actions\",\n status: \"warn\",\n message: `Action \"${action.title}\" is active but has no active lease`,\n fixable: false,\n });\n }\n }\n\n if (action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n checks.push({\n name: `blocked-deps-done:${action.id}`,\n category: \"actions\",\n status: \"fail\",\n message: `Action \"${action.title}\" is blocked but all dependencies are done`,\n fixable: true,\n });\n }\n }\n }\n\n if (action.status === \"pending\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const hasUnsatisfied = deps.some((d) => {\n const target = actionMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (hasUnsatisfied) {\n checks.push({\n name: `pending-unsatisfied-deps:${action.id}`,\n category: \"actions\",\n status: \"fail\",\n message: `Action \"${action.title}\" is pending but has unsatisfied dependencies`,\n fixable: true,\n });\n }\n }\n }\n }\n\n if (\n !checks.some((c) => c.category === \"actions\" && c.status !== \"pass\")\n ) {\n checks.push({\n name: \"actions-ok\",\n category: \"actions\",\n status: \"pass\",\n message: `All ${actions.length} actions are consistent`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"leases\")) {\n const leases = await kv.list<Lease>(KV.leases);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n let leaseIssues = 0;\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-lease:${lease.id}`,\n category: \"leases\",\n status: \"fail\",\n message: `Lease ${lease.id} for action ${lease.actionId} expired at ${lease.expiresAt}`,\n fixable: true,\n });\n leaseIssues++;\n }\n\n if (!actionIds.has(lease.actionId)) {\n checks.push({\n name: `orphaned-lease:${lease.id}`,\n category: \"leases\",\n status: \"fail\",\n message: `Lease ${lease.id} references non-existent action ${lease.actionId}`,\n fixable: true,\n });\n leaseIssues++;\n }\n }\n\n if (leaseIssues === 0) {\n checks.push({\n name: \"leases-ok\",\n category: \"leases\",\n status: \"pass\",\n message: `All ${leases.length} leases are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sentinels\")) {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n let sentinelIssues = 0;\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-sentinel:${sentinel.id}`,\n category: \"sentinels\",\n status: \"fail\",\n message: `Sentinel \"${sentinel.name}\" expired at ${sentinel.expiresAt}`,\n fixable: true,\n });\n sentinelIssues++;\n }\n\n for (const actionId of sentinel.linkedActionIds) {\n if (!actionIds.has(actionId)) {\n checks.push({\n name: `sentinel-missing-action:${sentinel.id}:${actionId}`,\n category: \"sentinels\",\n status: \"warn\",\n message: `Sentinel \"${sentinel.name}\" references non-existent action ${actionId}`,\n fixable: false,\n });\n sentinelIssues++;\n }\n }\n }\n\n if (sentinelIssues === 0) {\n checks.push({\n name: \"sentinels-ok\",\n category: \"sentinels\",\n status: \"pass\",\n message: `All ${sentinels.length} sentinels are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sketches\")) {\n const sketches = await kv.list<Sketch>(KV.sketches);\n let sketchIssues = 0;\n\n for (const sketch of sketches) {\n if (\n sketch.status === \"active\" &&\n new Date(sketch.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-sketch:${sketch.id}`,\n category: \"sketches\",\n status: \"fail\",\n message: `Sketch \"${sketch.title}\" expired at ${sketch.expiresAt}`,\n fixable: true,\n });\n sketchIssues++;\n }\n }\n\n if (sketchIssues === 0) {\n checks.push({\n name: \"sketches-ok\",\n category: \"sketches\",\n status: \"pass\",\n message: `All ${sketches.length} sketches are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"signals\")) {\n const signals = await kv.list<Signal>(KV.signals);\n let signalIssues = 0;\n\n for (const signal of signals) {\n if (\n signal.expiresAt &&\n new Date(signal.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-signal:${signal.id}`,\n category: \"signals\",\n status: \"fail\",\n message: `Signal from \"${signal.from}\" expired at ${signal.expiresAt}`,\n fixable: true,\n });\n signalIssues++;\n }\n }\n\n if (signalIssues === 0) {\n checks.push({\n name: \"signals-ok\",\n category: \"signals\",\n status: \"pass\",\n message: `All ${signals.length} signals are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sessions\")) {\n const sessions = await kv.list<Session>(KV.sessions);\n let sessionIssues = 0;\n\n for (const session of sessions) {\n if (\n session.status === \"active\" &&\n now - new Date(session.startedAt).getTime() > TWENTY_FOUR_HOURS_MS\n ) {\n checks.push({\n name: `abandoned-session:${session.id}`,\n category: \"sessions\",\n status: \"warn\",\n message: `Session ${session.id} has been active for over 24 hours`,\n fixable: false,\n });\n sessionIssues++;\n }\n }\n\n if (sessionIssues === 0) {\n checks.push({\n name: \"sessions-ok\",\n category: \"sessions\",\n status: \"pass\",\n message: `All ${sessions.length} sessions are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"memories\")) {\n const memories = await kv.list<Memory>(KV.memories);\n const memoryIds = new Set(memories.map((m) => m.id));\n const supersededBy = new Map<string, string>();\n let memoryIssues = 0;\n\n for (const memory of memories) {\n if (memory.supersedes && memory.supersedes.length > 0) {\n for (const sid of memory.supersedes) {\n if (!memoryIds.has(sid)) {\n checks.push({\n name: `memory-missing-supersedes:${memory.id}:${sid}`,\n category: \"memories\",\n status: \"warn\",\n message: `Memory \"${memory.title}\" supersedes non-existent memory ${sid}`,\n fixable: false,\n });\n memoryIssues++;\n }\n supersededBy.set(sid, memory.id);\n }\n }\n }\n\n for (const memory of memories) {\n if (memory.isLatest && supersededBy.has(memory.id)) {\n checks.push({\n name: `memory-stale-latest:${memory.id}`,\n category: \"memories\",\n status: \"fail\",\n message: `Memory \"${memory.title}\" has isLatest=true but is superseded by ${supersededBy.get(memory.id)}`,\n fixable: true,\n });\n memoryIssues++;\n }\n }\n\n if (memoryIssues === 0) {\n checks.push({\n name: \"memories-ok\",\n category: \"memories\",\n status: \"pass\",\n message: `All ${memories.length} memories are consistent`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"mesh\")) {\n const peers = await kv.list<MeshPeer>(KV.mesh);\n let meshIssues = 0;\n\n for (const peer of peers) {\n if (\n peer.lastSyncAt &&\n now - new Date(peer.lastSyncAt).getTime() > ONE_HOUR_MS\n ) {\n checks.push({\n name: `stale-peer:${peer.id}`,\n category: \"mesh\",\n status: \"warn\",\n message: `Peer \"${peer.name}\" last synced over 1 hour ago`,\n fixable: false,\n });\n meshIssues++;\n }\n\n if (peer.status === \"error\") {\n checks.push({\n name: `error-peer:${peer.id}`,\n category: \"mesh\",\n status: \"warn\",\n message: `Peer \"${peer.name}\" is in error state`,\n fixable: false,\n });\n meshIssues++;\n }\n }\n\n if (meshIssues === 0) {\n checks.push({\n name: \"mesh-ok\",\n category: \"mesh\",\n status: \"pass\",\n message: `All ${peers.length} mesh peers are healthy`,\n fixable: false,\n });\n }\n }\n\n const summary = {\n pass: checks.filter((c) => c.status === \"pass\").length,\n warn: checks.filter((c) => c.status === \"warn\").length,\n fail: checks.filter((c) => c.status === \"fail\").length,\n fixable: checks.filter((c) => c.fixable).length,\n };\n\n return { success: true, checks, summary };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::heal\" },\n async (data: { categories?: string[]; dryRun?: boolean }) => {\n const dryRun = data.dryRun ?? false;\n const categories = data.categories && data.categories.length > 0\n ? data.categories.filter((c) => ALL_CATEGORIES.includes(c))\n : ALL_CATEGORIES;\n\n let fixed = 0;\n let skipped = 0;\n const details: string[] = [];\n const now = Date.now();\n\n if (categories.includes(\"actions\")) {\n const actions = await kv.list<Action>(KV.actions);\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const actionMap = new Map(actions.map((a) => [a.id, a]));\n\n for (const action of actions) {\n if (action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n if (dryRun) {\n details.push(\n `[dry-run] Would unblock action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:action:${action.id}`,\n async () => {\n const fresh = await kv.get<Action>(KV.actions, action.id);\n if (!fresh || fresh.status !== \"blocked\") return false;\n const freshEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const freshDeps = freshEdges.filter(\n (e) =>\n e.sourceActionId === fresh.id && e.type === \"requires\",\n );\n const freshActions = await kv.list<Action>(KV.actions);\n const freshMap = new Map(\n freshActions.map((a) => [a.id, a]),\n );\n const stillAllDone = freshDeps.every((d) => {\n const target = freshMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (!stillAllDone) return false;\n fresh.status = \"pending\";\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Unblocked action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (action.status === \"pending\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const hasUnsatisfied = deps.some((d) => {\n const target = actionMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (hasUnsatisfied) {\n if (dryRun) {\n details.push(\n `[dry-run] Would block action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:action:${action.id}`,\n async () => {\n const fresh = await kv.get<Action>(KV.actions, action.id);\n if (!fresh || fresh.status !== \"pending\") return false;\n const freshEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const freshDeps = freshEdges.filter(\n (e) =>\n e.sourceActionId === fresh.id && e.type === \"requires\",\n );\n const freshActions = await kv.list<Action>(KV.actions);\n const freshMap = new Map(\n freshActions.map((a) => [a.id, a]),\n );\n const stillUnsatisfied = freshDeps.some((d) => {\n const target = freshMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (!stillUnsatisfied) return false;\n fresh.status = \"blocked\";\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Blocked action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n }\n }\n\n if (categories.includes(\"leases\")) {\n const leases = await kv.list<Lease>(KV.leases);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would expire lease ${lease.id} for action ${lease.actionId}`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:lease:${lease.actionId}`,\n async () => {\n const fresh = await kv.get<Lease>(KV.leases, lease.id);\n if (\n !fresh ||\n fresh.status !== \"active\" ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n fresh.status = \"expired\";\n await kv.set(KV.leases, fresh.id, fresh);\n\n const action = await kv.get<Action>(KV.actions, fresh.actionId);\n if (\n action &&\n action.status === \"active\" &&\n action.assignedTo === fresh.agentId\n ) {\n action.status = \"pending\";\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Expired lease ${lease.id} for action ${lease.actionId}`,\n );\n fixed++;\n } else {\n skipped++;\n }\n continue;\n }\n\n if (!actionIds.has(lease.actionId)) {\n if (dryRun) {\n details.push(\n `[dry-run] Would delete orphaned lease ${lease.id}`,\n );\n fixed++;\n continue;\n }\n await kv.delete(KV.leases, lease.id);\n details.push(`Deleted orphaned lease ${lease.id}`);\n fixed++;\n }\n }\n }\n\n if (categories.includes(\"sentinels\")) {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would expire sentinel \"${sentinel.name}\" (${sentinel.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return false;\n if (\n !fresh.expiresAt ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n fresh.status = \"expired\";\n await kv.set(KV.sentinels, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Expired sentinel \"${sentinel.name}\" (${sentinel.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (categories.includes(\"sketches\")) {\n const sketches = await kv.list<Sketch>(KV.sketches);\n\n for (const sketch of sketches) {\n if (\n sketch.status === \"active\" &&\n new Date(sketch.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would discard expired sketch \"${sketch.title}\" (${sketch.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:sketch:${sketch.id}`,\n async () => {\n const fresh = await kv.get<Sketch>(KV.sketches, sketch.id);\n if (\n !fresh ||\n fresh.status !== \"active\" ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const actionIdSet = new Set(fresh.actionIds);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n for (const actionId of fresh.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n fresh.status = \"discarded\";\n fresh.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Discarded expired sketch \"${sketch.title}\" (${sketch.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (categories.includes(\"signals\")) {\n const signals = await kv.list<Signal>(KV.signals);\n\n for (const signal of signals) {\n if (\n signal.expiresAt &&\n new Date(signal.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would delete expired signal ${signal.id}`,\n );\n fixed++;\n continue;\n }\n await kv.delete(KV.signals, signal.id);\n details.push(`Deleted expired signal ${signal.id}`);\n fixed++;\n }\n }\n }\n\n if (categories.includes(\"memories\")) {\n const memories = await kv.list<Memory>(KV.memories);\n const supersededBy = new Map<string, string>();\n\n for (const memory of memories) {\n if (memory.supersedes && memory.supersedes.length > 0) {\n for (const sid of memory.supersedes) {\n supersededBy.set(sid, memory.id);\n }\n }\n }\n\n for (const memory of memories) {\n if (memory.isLatest && supersededBy.has(memory.id)) {\n if (dryRun) {\n details.push(\n `[dry-run] Would set isLatest=false on memory \"${memory.title}\" (${memory.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:memory:${memory.id}`,\n async () => {\n const fresh = await kv.get<Memory>(KV.memories, memory.id);\n if (!fresh || !fresh.isLatest) return false;\n fresh.isLatest = false;\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.memories, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Set isLatest=false on memory \"${memory.title}\" (${memory.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n return { success: true, fixed, skipped, details };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Facet } from \"../types.js\";\n\nexport function registerFacetsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::facet-tag\" },\n async (data: {\n targetId: string;\n targetType: string;\n dimension: string;\n value: string;\n }) => {\n if (!data.targetId || typeof data.targetId !== \"string\") {\n return { success: false, error: \"targetId is required\" };\n }\n\n const validTypes = [\"action\", \"memory\", \"observation\"];\n if (!validTypes.includes(data.targetType)) {\n return {\n success: false,\n error: `targetType must be one of: ${validTypes.join(\", \")}`,\n };\n }\n\n if (\n !data.dimension ||\n typeof data.dimension !== \"string\" ||\n data.dimension.trim() === \"\"\n ) {\n return { success: false, error: \"dimension is required\" };\n }\n\n if (\n !data.value ||\n typeof data.value !== \"string\" ||\n data.value.trim() === \"\"\n ) {\n return { success: false, error: \"value is required\" };\n }\n\n const dimension = data.dimension.trim();\n const value = data.value.trim();\n\n const existing = await kv.list<Facet>(KV.facets);\n const duplicate = existing.find(\n (f) =>\n f.targetId === data.targetId &&\n f.dimension === dimension &&\n f.value === value,\n );\n if (duplicate) {\n return { success: true, facet: duplicate, skipped: true };\n }\n\n const facet: Facet = {\n id: generateId(\"fct\"),\n targetId: data.targetId,\n targetType: data.targetType as Facet[\"targetType\"],\n dimension,\n value,\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(KV.facets, facet.id, facet);\n return { success: true, facet };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-untag\" },\n async (data: {\n targetId: string;\n dimension: string;\n value?: string;\n }) => {\n if (!data.targetId) {\n return { success: false, error: \"targetId is required\" };\n }\n if (!data.dimension) {\n return { success: false, error: \"dimension is required\" };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const matches = all.filter((f) => {\n if (f.targetId !== data.targetId || f.dimension !== data.dimension) {\n return false;\n }\n if (data.value !== undefined) {\n return f.value === data.value;\n }\n return true;\n });\n\n for (const f of matches) {\n await kv.delete(KV.facets, f.id);\n }\n\n return { success: true, removed: matches.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-query\" },\n async (data: {\n matchAll?: string[];\n matchAny?: string[];\n targetType?: string;\n limit?: number;\n }) => {\n if (\n (!data.matchAll || data.matchAll.length === 0) &&\n (!data.matchAny || data.matchAny.length === 0)\n ) {\n return {\n success: false,\n error: \"at least one of matchAll or matchAny is required\",\n };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const filtered = data.targetType\n ? all.filter((f) => f.targetType === data.targetType)\n : all;\n\n const targetFacetMap = new Map<string, { targetType: string; facetKeys: Set<string> }>();\n for (const f of filtered) {\n const key = `${f.dimension}:${f.value}`;\n let entry = targetFacetMap.get(f.targetId);\n if (!entry) {\n entry = { targetType: f.targetType, facetKeys: new Set() };\n targetFacetMap.set(f.targetId, entry);\n }\n entry.facetKeys.add(key);\n }\n\n const results: Array<{ targetId: string; targetType: string; matchedFacets: string[] }> = [];\n\n for (const [targetId, entry] of targetFacetMap) {\n const matched: string[] = [];\n\n if (data.matchAll && data.matchAll.length > 0) {\n const allPresent = data.matchAll.every((k) => entry.facetKeys.has(k));\n if (!allPresent) continue;\n for (const k of data.matchAll) {\n if (!matched.includes(k)) matched.push(k);\n }\n }\n\n if (data.matchAny && data.matchAny.length > 0) {\n const anyPresent = data.matchAny.filter((k) => entry.facetKeys.has(k));\n if (anyPresent.length === 0) continue;\n for (const k of anyPresent) {\n if (!matched.includes(k)) matched.push(k);\n }\n }\n\n results.push({\n targetId,\n targetType: entry.targetType,\n matchedFacets: matched,\n });\n }\n\n const limit = data.limit || 50;\n return { success: true, results: results.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-get\" },\n async (data: { targetId: string }) => {\n if (!data.targetId) {\n return { success: false, error: \"targetId is required\" };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const targetFacets = all.filter((f) => f.targetId === data.targetId);\n\n const dimMap = new Map<string, string[]>();\n for (const f of targetFacets) {\n let values = dimMap.get(f.dimension);\n if (!values) {\n values = [];\n dimMap.set(f.dimension, values);\n }\n values.push(f.value);\n }\n\n const dimensions = Array.from(dimMap.entries()).map(([dimension, values]) => ({\n dimension,\n values,\n }));\n\n return { success: true, dimensions };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-stats\" },\n async (data: { targetType?: string }) => {\n const all = await kv.list<Facet>(KV.facets);\n const filtered = data.targetType\n ? all.filter((f) => f.targetType === data.targetType)\n : all;\n\n const dimMap = new Map<string, Map<string, number>>();\n for (const f of filtered) {\n let valueMap = dimMap.get(f.dimension);\n if (!valueMap) {\n valueMap = new Map();\n dimMap.set(f.dimension, valueMap);\n }\n valueMap.set(f.value, (valueMap.get(f.value) || 0) + 1);\n }\n\n const dimensions = Array.from(dimMap.entries()).map(([dimension, valueMap]) => ({\n dimension,\n values: Array.from(valueMap.entries()).map(([value, count]) => ({\n value,\n count,\n })),\n }));\n\n return { success: true, dimensions, totalFacets: filtered.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-dimensions\" },\n async () => {\n const all = await kv.list<Facet>(KV.facets);\n\n const counts = new Map<string, number>();\n for (const f of all) {\n counts.set(f.dimension, (counts.get(f.dimension) || 0) + 1);\n }\n\n const dimensions = Array.from(counts.entries()).map(([dimension, count]) => ({\n dimension,\n count,\n }));\n\n return { success: true, dimensions };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n Memory,\n CompressedObservation,\n Session,\n} from \"../types.js\";\n\nexport function registerVerifyFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::verify\" },\n async (data: { id: string }) => {\n if (!data.id || typeof data.id !== \"string\") {\n return { success: false, error: \"id is required\" };\n }\n\n const memory = await kv.get<Memory>(KV.memories, data.id);\n if (memory) {\n const observationIds = memory.sourceObservationIds || [];\n const observations: Array<{\n observation: CompressedObservation;\n session?: Session;\n }> = [];\n\n for (const obsId of observationIds) {\n const obs = await findObservation(kv, obsId, memory.sessionIds);\n if (obs) {\n const session = await kv.get<Session>(KV.sessions, obs.sessionId);\n observations.push({ observation: obs, session: session || undefined });\n }\n }\n\n return {\n success: true,\n type: \"memory\",\n memory: {\n id: memory.id,\n title: memory.title,\n type: memory.type,\n version: memory.version,\n strength: memory.strength,\n isLatest: memory.isLatest,\n createdAt: memory.createdAt,\n updatedAt: memory.updatedAt,\n supersedes: memory.supersedes,\n parentId: memory.parentId,\n },\n citations: observations.map((o) => ({\n observationId: o.observation.id,\n title: o.observation.title,\n type: o.observation.type,\n confidence: o.observation.confidence,\n timestamp: o.observation.timestamp,\n sessionId: o.observation.sessionId,\n sessionProject: o.session?.project,\n sessionStatus: o.session?.status,\n })),\n citationCount: observations.length,\n };\n }\n\n const obs = await findObservation(kv, data.id);\n if (obs) {\n const session = await kv.get<Session>(KV.sessions, obs.sessionId);\n return {\n success: true,\n type: \"observation\",\n observation: {\n id: obs.id,\n title: obs.title,\n type: obs.type,\n confidence: obs.confidence,\n importance: obs.importance,\n timestamp: obs.timestamp,\n sessionId: obs.sessionId,\n },\n session: session\n ? {\n id: session.id,\n project: session.project,\n status: session.status,\n startedAt: session.startedAt,\n }\n : null,\n citationCount: 0,\n citations: [],\n };\n }\n\n return { success: false, error: \"not found\" };\n },\n );\n}\n\nasync function findObservation(\n kv: StateKV,\n obsId: string,\n hintSessionIds?: string[],\n): Promise<CompressedObservation | null> {\n if (hintSessionIds) {\n for (const sid of hintSessionIds) {\n const obs = await kv.get<CompressedObservation>(KV.observations(sid), obsId);\n if (obs) return obs;\n }\n }\n const sessions = await kv.list<Session>(KV.sessions);\n for (const session of sessions) {\n if (hintSessionIds?.includes(session.id)) continue;\n const obs = await kv.get<CompressedObservation>(\n KV.observations(session.id),\n obsId,\n );\n if (obs) return obs;\n }\n return null;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Memory, GraphNode, GraphEdge } from \"../types.js\";\n\nexport function registerCascadeFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::cascade-update\" },\n async (data: { supersededMemoryId: string }) => {\n if (!data.supersededMemoryId || typeof data.supersededMemoryId !== \"string\") {\n return { success: false, error: \"supersededMemoryId is required\" };\n }\n\n const superseded = await kv.get<Memory>(KV.memories, data.supersededMemoryId);\n if (!superseded) {\n return { success: false, error: \"superseded memory not found\" };\n }\n\n let flaggedNodes = 0;\n let flaggedEdges = 0;\n let flaggedMemories = 0;\n\n const obsIds = new Set(superseded.sourceObservationIds || []);\n\n if (obsIds.size > 0) {\n const now = new Date().toISOString();\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n for (const node of nodes) {\n if (node.stale) continue;\n const overlap = (node.sourceObservationIds ?? []).some((id) => obsIds.has(id));\n if (overlap) {\n node.stale = true;\n node.updatedAt = now;\n await kv.set(KV.graphNodes, node.id, node);\n flaggedNodes++;\n }\n }\n\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n for (const edge of edges) {\n if (edge.stale) continue;\n const overlap = (edge.sourceObservationIds ?? []).some((id) => obsIds.has(id));\n if (overlap) {\n edge.stale = true;\n await kv.set(KV.graphEdges, edge.id, edge);\n flaggedEdges++;\n }\n }\n }\n\n const supersededConcepts = new Set(\n (superseded.concepts ?? []).map((c) => c.toLowerCase()),\n );\n if (supersededConcepts.size >= 2) {\n const allMemories = await kv.list<Memory>(KV.memories);\n for (const mem of allMemories) {\n if (mem.id === data.supersededMemoryId) continue;\n if (!mem.isLatest) continue;\n\n const sharedCount = (mem.concepts ?? []).filter((c) =>\n supersededConcepts.has(c.toLowerCase()),\n ).length;\n if (sharedCount >= 2) {\n flaggedMemories++;\n }\n }\n }\n\n return {\n success: true,\n flagged: {\n nodes: flaggedNodes,\n edges: flaggedEdges,\n siblingMemories: flaggedMemories,\n },\n total: flaggedNodes + flaggedEdges + flaggedMemories,\n };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, fingerprintId } from \"../state/schema.js\";\nimport type { Lesson } from \"../types.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction reinforceLesson(lesson: Lesson): void {\n const now = new Date().toISOString();\n lesson.reinforcements++;\n lesson.confidence = Math.min(\n 1.0,\n lesson.confidence + 0.1 * (1 - lesson.confidence),\n );\n lesson.lastReinforcedAt = now;\n lesson.updatedAt = now;\n}\n\nexport function registerLessonsFunctions(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::lesson-save\" },\n async (data: {\n content: string;\n context?: string;\n confidence?: number;\n project?: string;\n tags?: string[];\n source?: \"crystal\" | \"manual\" | \"consolidation\";\n sourceIds?: string[];\n }) => {\n if (!data.content?.trim()) {\n return { success: false, error: \"content is required\" };\n }\n\n const fp = fingerprintId(\"lsn\", data.content.trim().toLowerCase());\n const existing = await kv.get<Lesson>(KV.lessons, fp);\n\n if (existing && !existing.deleted) {\n reinforceLesson(existing);\n if (data.context && !existing.context) {\n existing.context = data.context;\n }\n await kv.set(KV.lessons, existing.id, existing);\n\n try {\n await recordAudit(kv, \"lesson_strengthen\", \"mem::lesson-save\", [\n existing.id,\n ]);\n } catch {}\n\n return {\n success: true,\n action: \"strengthened\",\n lesson: existing,\n };\n }\n\n const confidence =\n typeof data.confidence === \"number\" &&\n data.confidence >= 0 &&\n data.confidence <= 1\n ? data.confidence\n : 0.5;\n\n const now = new Date().toISOString();\n const lesson: Lesson = {\n id: fp,\n content: data.content.trim(),\n context: data.context?.trim() || \"\",\n confidence,\n reinforcements: 0,\n source: data.source || \"manual\",\n sourceIds: data.sourceIds || [],\n project: data.project,\n tags: data.tags || [],\n createdAt: now,\n updatedAt: now,\n decayRate: 0.05,\n };\n\n await kv.set(KV.lessons, lesson.id, lesson);\n\n try {\n await recordAudit(kv, \"lesson_save\", \"mem::lesson-save\", [lesson.id]);\n } catch {}\n\n return { success: true, action: \"created\", lesson };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-recall\" },\n async (data: {\n query: string;\n project?: string;\n minConfidence?: number;\n limit?: number;\n }) => {\n if (!data.query?.trim()) {\n return { success: false, error: \"query is required\" };\n }\n\n const query = data.query.toLowerCase();\n const minConfidence = data.minConfidence ?? 0.1;\n const limit = data.limit ?? 10;\n\n let lessons = await kv.list<Lesson>(KV.lessons);\n\n lessons = lessons.filter(\n (l) => !l.deleted && l.confidence >= minConfidence,\n );\n\n if (data.project) {\n lessons = lessons.filter((l) => l.project === data.project);\n }\n\n const scored = lessons\n .map((l) => {\n const text = `${l.content} ${l.context} ${l.tags.join(\" \")}`.toLowerCase();\n const terms = query.split(/\\s+/).filter((t) => t.length > 1);\n const matchCount = terms.filter((t) => text.includes(t)).length;\n if (matchCount === 0) return null;\n\n const relevance = matchCount / terms.length;\n const daysSinceReinforced = l.lastReinforcedAt\n ? (Date.now() - new Date(l.lastReinforcedAt).getTime()) /\n (1000 * 60 * 60 * 24)\n : (Date.now() - new Date(l.createdAt).getTime()) /\n (1000 * 60 * 60 * 24);\n const recencyBoost = 1 / (1 + daysSinceReinforced * 0.01);\n const score = l.confidence * relevance * recencyBoost;\n\n return { lesson: l, score };\n })\n .filter(Boolean) as Array<{ lesson: Lesson; score: number }>;\n\n scored.sort((a, b) => b.score - a.score);\n\n try {\n await recordAudit(kv, \"lesson_recall\", \"mem::lesson-recall\", [], {\n query: data.query,\n resultCount: scored.length,\n });\n } catch {}\n\n return {\n success: true,\n lessons: scored.slice(0, limit).map((s) => ({\n ...s.lesson,\n score: Math.round(s.score * 1000) / 1000,\n })),\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-list\" },\n async (data: {\n project?: string;\n source?: string;\n minConfidence?: number;\n limit?: number;\n }) => {\n const limit = data.limit ?? 50;\n const minConfidence = data.minConfidence ?? 0;\n let lessons = await kv.list<Lesson>(KV.lessons);\n\n lessons = lessons.filter(\n (l) => !l.deleted && l.confidence >= minConfidence,\n );\n\n if (data.project) {\n lessons = lessons.filter((l) => l.project === data.project);\n }\n if (data.source) {\n lessons = lessons.filter((l) => l.source === data.source);\n }\n\n lessons.sort((a, b) => b.confidence - a.confidence);\n\n return { success: true, lessons: lessons.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-strengthen\" },\n async (data: { lessonId: string }) => {\n if (!data.lessonId) {\n return { success: false, error: \"lessonId is required\" };\n }\n\n const lesson = await kv.get<Lesson>(KV.lessons, data.lessonId);\n if (!lesson || lesson.deleted) {\n return { success: false, error: \"lesson not found\" };\n }\n\n reinforceLesson(lesson);\n\n await kv.set(KV.lessons, lesson.id, lesson);\n\n try {\n await recordAudit(kv, \"lesson_strengthen\", \"mem::lesson-strengthen\", [\n lesson.id,\n ]);\n } catch {}\n\n return { success: true, lesson };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-decay-sweep\" },\n async () => {\n const lessons = await kv.list<Lesson>(KV.lessons);\n let decayed = 0;\n let softDeleted = 0;\n const now = Date.now();\n const timestamp = new Date().toISOString();\n const dirty: Lesson[] = [];\n\n for (const lesson of lessons) {\n if (lesson.deleted) continue;\n\n const baseline = lesson.lastDecayedAt || lesson.lastReinforcedAt || lesson.createdAt;\n const weeksSinceBaseline =\n (now - new Date(baseline).getTime()) / (1000 * 60 * 60 * 24 * 7);\n\n if (weeksSinceBaseline < 1) continue;\n\n const decay = lesson.decayRate * weeksSinceBaseline;\n const newConfidence = Math.max(0.05, lesson.confidence - decay);\n\n if (newConfidence !== lesson.confidence) {\n lesson.confidence = Math.round(newConfidence * 1000) / 1000;\n lesson.lastDecayedAt = timestamp;\n lesson.updatedAt = timestamp;\n\n if (lesson.confidence <= 0.1 && lesson.reinforcements === 0) {\n lesson.deleted = true;\n softDeleted++;\n } else {\n decayed++;\n }\n\n dirty.push(lesson);\n }\n }\n\n await Promise.all(dirty.map((l) => kv.set(KV.lessons, l.id, l)));\n\n return { success: true, decayed, softDeleted, total: lessons.length };\n },\n );\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n Memory,\n Lesson,\n Crystal,\n Session,\n} from \"../types.js\";\nimport { recordAudit } from \"./audit.js\";\n\nconst DEFAULT_VAULT = join(homedir(), \".agentmemory\", \"vault\");\n\nfunction sanitize(name: string): string {\n return name.replace(/[<>:\"/\\\\|?*\\x00-\\x1f]/g, \"_\").slice(0, 100);\n}\n\nfunction toFrontmatter(obj: Record<string, unknown>): string {\n const lines = [\"---\"];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n lines.push(`${key}: [${value.map((v) => JSON.stringify(String(v))).join(\", \")}]`);\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nfunction memoryToMd(m: Memory): string {\n const fm = toFrontmatter({\n id: m.id,\n type: m.type,\n created: m.createdAt,\n updated: m.updatedAt,\n strength: m.strength,\n version: m.version,\n concepts: m.concepts,\n files: m.files,\n });\n\n const related = (m.relatedIds || [])\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n const supersedes = (m.supersedes || [])\n .map((id) => `- [[${id}]] (superseded)`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# ${m.title}`,\n \"\",\n m.content,\n ];\n\n if (m.concepts.length > 0) {\n sections.push(\"\", \"## Concepts\", m.concepts.map((c) => `#${c.replace(/\\s+/g, \"-\")}`).join(\" \"));\n }\n if (related) {\n sections.push(\"\", \"## Related\", related);\n }\n if (supersedes) {\n sections.push(\"\", \"## Supersedes\", supersedes);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction lessonToMd(l: Lesson): string {\n const fm = toFrontmatter({\n id: l.id,\n type: \"lesson\",\n source: l.source,\n confidence: l.confidence,\n reinforcements: l.reinforcements,\n created: l.createdAt,\n updated: l.updatedAt,\n project: l.project,\n tags: l.tags,\n decayRate: l.decayRate,\n });\n\n const sourceLinks = l.sourceIds\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# Lesson: ${l.content.slice(0, 80)}`,\n \"\",\n l.content,\n ];\n\n if (l.context) {\n sections.push(\"\", \"## Context\", l.context);\n }\n if (l.tags.length > 0) {\n sections.push(\"\", \"## Tags\", l.tags.map((t) => `#${t.replace(/\\s+/g, \"-\")}`).join(\" \"));\n }\n if (sourceLinks) {\n sections.push(\"\", \"## Sources\", sourceLinks);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction crystalToMd(c: Crystal): string {\n const fm = toFrontmatter({\n id: c.id,\n type: \"crystal\",\n created: c.createdAt,\n project: c.project,\n sessionId: c.sessionId,\n filesAffected: c.filesAffected,\n });\n\n const actionLinks = c.sourceActionIds\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# Crystal: ${c.narrative.slice(0, 80)}`,\n \"\",\n c.narrative,\n \"\",\n \"## Key Outcomes\",\n ...c.keyOutcomes.map((o) => `- ${o}`),\n ];\n\n if (c.lessons.length > 0) {\n sections.push(\"\", \"## Lessons\", ...c.lessons.map((l) => `- ${l}`));\n }\n if (c.filesAffected.length > 0) {\n sections.push(\"\", \"## Files\", ...c.filesAffected.map((f) => `- \\`${f}\\``));\n }\n if (actionLinks) {\n sections.push(\"\", \"## Source Actions\", actionLinks);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction sessionToMd(s: Session): string {\n const fm = toFrontmatter({\n id: s.id,\n type: \"session\",\n project: s.project,\n status: s.status,\n started: s.startedAt,\n ended: s.endedAt,\n observations: s.observationCount,\n });\n\n return [\n fm,\n \"\",\n `# Session: ${s.project}`,\n \"\",\n `**Status:** ${s.status}`,\n `**Started:** ${s.startedAt}`,\n s.endedAt ? `**Ended:** ${s.endedAt}` : \"\",\n `**Observations:** ${s.observationCount}`,\n `**CWD:** \\`${s.cwd}\\``,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\ninterface ExportError {\n id: string;\n path: string;\n error: string;\n}\n\nexport function registerObsidianExportFunction(\n sdk: ISdk,\n kv: StateKV,\n): void {\n sdk.registerFunction(\n { id: \"mem::obsidian-export\" },\n async (data: { vaultDir?: string; types?: string[] }) => {\n const vaultDir = data.vaultDir || DEFAULT_VAULT;\n const exportTypes = new Set(\n data.types || [\"memories\", \"lessons\", \"crystals\", \"sessions\"],\n );\n\n const dirs = {\n memories: join(vaultDir, \"memories\"),\n lessons: join(vaultDir, \"lessons\"),\n crystals: join(vaultDir, \"crystals\"),\n sessions: join(vaultDir, \"sessions\"),\n };\n\n await Promise.all(\n Object.values(dirs).map((dir) => mkdir(dir, { recursive: true })),\n );\n\n const stats = { memories: 0, lessons: 0, crystals: 0, sessions: 0 };\n const errors: ExportError[] = [];\n const memoryMoc: string[] = [];\n const lessonMoc: string[] = [];\n const crystalMoc: string[] = [];\n const sessionMoc: string[] = [];\n\n const [memories, lessons, crystals, sessions] = await Promise.all([\n exportTypes.has(\"memories\") ? kv.list<Memory>(KV.memories) : Promise.resolve([] as Memory[]),\n exportTypes.has(\"lessons\") ? kv.list<Lesson>(KV.lessons) : Promise.resolve([] as Lesson[]),\n exportTypes.has(\"crystals\") ? kv.list<Crystal>(KV.crystals) : Promise.resolve([] as Crystal[]),\n exportTypes.has(\"sessions\") ? kv.list<Session>(KV.sessions) : Promise.resolve([] as Session[]),\n ]);\n\n for (const m of memories.filter((m) => m.isLatest)) {\n const filename = `${sanitize(m.id)}.md`;\n const filepath = join(dirs.memories, filename);\n try {\n await writeFile(filepath, memoryToMd(m));\n stats.memories++;\n memoryMoc.push(`- [[memories/${sanitize(m.id)}|${m.title}]] (${m.type}, strength: ${m.strength})`);\n } catch (err) {\n errors.push({ id: m.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n for (const l of lessons.filter((l) => !l.deleted)) {\n const filename = `${sanitize(l.id)}.md`;\n const filepath = join(dirs.lessons, filename);\n try {\n await writeFile(filepath, lessonToMd(l));\n stats.lessons++;\n lessonMoc.push(`- [[lessons/${sanitize(l.id)}|${l.content.slice(0, 60)}]] (confidence: ${l.confidence})`);\n } catch (err) {\n errors.push({ id: l.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n for (const c of crystals) {\n const filename = `${sanitize(c.id)}.md`;\n const filepath = join(dirs.crystals, filename);\n try {\n await writeFile(filepath, crystalToMd(c));\n stats.crystals++;\n crystalMoc.push(`- [[crystals/${sanitize(c.id)}|${c.narrative.slice(0, 60)}]]`);\n } catch (err) {\n errors.push({ id: c.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n const recent = sessions\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() -\n new Date(a.startedAt).getTime(),\n )\n .slice(0, 50);\n for (const s of recent) {\n const filename = `${sanitize(s.id)}.md`;\n const filepath = join(dirs.sessions, filename);\n try {\n await writeFile(filepath, sessionToMd(s));\n stats.sessions++;\n sessionMoc.push(`- [[sessions/${sanitize(s.id)}|${s.project} (${s.status})]]`);\n } catch (err) {\n errors.push({ id: s.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n const exportedAt = new Date().toISOString();\n const moc = [\n \"---\",\n \"type: moc\",\n `exported: ${exportedAt}`,\n \"---\",\n \"\",\n \"# agentmemory vault\",\n \"\",\n `Exported: ${exportedAt}`,\n \"\",\n `## Memories (${stats.memories})`,\n ...memoryMoc,\n \"\",\n `## Lessons (${stats.lessons})`,\n ...lessonMoc,\n \"\",\n `## Crystals (${stats.crystals})`,\n ...crystalMoc,\n \"\",\n `## Sessions (${stats.sessions})`,\n ...sessionMoc,\n ].join(\"\\n\");\n\n await writeFile(join(vaultDir, \"MOC.md\"), moc);\n\n await recordAudit(kv, \"obsidian_export\", \"mem::obsidian-export\", [], {\n vaultDir,\n stats,\n });\n\n return { success: true, exported: stats, errors: errors.length > 0 ? errors : undefined, vaultDir };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n EnrichedChunk,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst SLIDING_WINDOW_SYSTEM = `You are a contextual enrichment engine. Given a primary observation and its surrounding context window (previous and next observations from the same session), produce an enriched version.\n\nYour tasks:\n1. ENTITY RESOLUTION: Replace all pronouns, implicit references (\"that framework\", \"the file\", \"it\", \"he/she\") with the explicit entity names found in the context window.\n2. PREFERENCE MAPPING: Extract any user preferences, constraints, or opinions expressed directly or indirectly.\n3. CONTEXT BRIDGES: Add brief contextual links that make this chunk self-contained without reading adjacent chunks.\n\nOutput EXACTLY this XML:\n<enriched>\n <content>The fully enriched, self-contained text with all references resolved</content>\n <resolved_entities>\n <entity original=\"pronoun or reference\" resolved=\"explicit entity name\"/>\n </resolved_entities>\n <preferences>\n <preference>extracted user preference or constraint</preference>\n </preferences>\n <context_bridges>\n <bridge>contextual link to adjacent information</bridge>\n </context_bridges>\n</enriched>\n\nRules:\n- The enriched content MUST be understandable in complete isolation\n- Resolve ALL ambiguous references using the context window\n- Do not hallucinate entities not present in the window\n- Preserve factual accuracy while adding clarity`;\n\nfunction buildWindowPrompt(\n primary: CompressedObservation,\n before: CompressedObservation[],\n after: CompressedObservation[],\n): string {\n const parts: string[] = [];\n\n if (before.length > 0) {\n parts.push(\"=== PRECEDING CONTEXT ===\");\n for (const obs of before) {\n parts.push(`[${obs.type}] ${obs.title}: ${obs.narrative}`);\n if (obs.facts.length > 0) parts.push(`Facts: ${obs.facts.join(\"; \")}`);\n if (obs.concepts.length > 0)\n parts.push(`Concepts: ${obs.concepts.join(\", \")}`);\n }\n }\n\n parts.push(\"\\n=== PRIMARY OBSERVATION (enrich this) ===\");\n parts.push(`Type: ${primary.type}`);\n parts.push(`Title: ${primary.title}`);\n if (primary.subtitle) parts.push(`Subtitle: ${primary.subtitle}`);\n parts.push(`Narrative: ${primary.narrative}`);\n if (primary.facts.length > 0)\n parts.push(`Facts: ${primary.facts.join(\"; \")}`);\n if (primary.concepts.length > 0)\n parts.push(`Concepts: ${primary.concepts.join(\", \")}`);\n if (primary.files.length > 0)\n parts.push(`Files: ${primary.files.join(\", \")}`);\n\n if (after.length > 0) {\n parts.push(\"\\n=== FOLLOWING CONTEXT ===\");\n for (const obs of after) {\n parts.push(`[${obs.type}] ${obs.title}: ${obs.narrative}`);\n if (obs.facts.length > 0) parts.push(`Facts: ${obs.facts.join(\"; \")}`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\nfunction parseEnrichedXml(xml: string): {\n content: string;\n resolvedEntities: Record<string, string>;\n preferences: string[];\n contextBridges: string[];\n} | null {\n const contentMatch = xml.match(/<content>([\\s\\S]*?)<\\/content>/);\n if (!contentMatch) return null;\n\n const resolvedEntities: Record<string, string> = {};\n const entityRegex =\n /<entity\\s+original=\"([^\"]+)\"\\s+resolved=\"([^\"]+)\"\\s*\\/>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n resolvedEntities[match[1]] = match[2];\n }\n\n const preferences: string[] = [];\n const prefRegex = /<preference>([^<]+)<\\/preference>/g;\n while ((match = prefRegex.exec(xml)) !== null) {\n preferences.push(match[1]);\n }\n\n const contextBridges: string[] = [];\n const bridgeRegex = /<bridge>([^<]+)<\\/bridge>/g;\n while ((match = bridgeRegex.exec(xml)) !== null) {\n contextBridges.push(match[1]);\n }\n\n return {\n content: contentMatch[1].trim(),\n resolvedEntities,\n preferences,\n contextBridges,\n };\n}\n\nexport function registerSlidingWindowFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::enrich-window\",\n description:\n \"Enrich observation using sliding window context for self-containment\",\n },\n async (data: {\n observationId: string;\n sessionId: string;\n lookback?: number;\n lookahead?: number;\n }) => {\n const ctx = getContext();\n const hprev = data.lookback ?? 3;\n const hnext = data.lookahead ?? 2;\n\n const allObs = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n allObs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n const primaryIdx = allObs.findIndex((o) => o.id === data.observationId);\n if (primaryIdx === -1) {\n return { success: false, error: \"Observation not found\" };\n }\n\n const primary = allObs[primaryIdx];\n const before = allObs.slice(Math.max(0, primaryIdx - hprev), primaryIdx);\n const after = allObs.slice(primaryIdx + 1, primaryIdx + 1 + hnext);\n\n if (before.length === 0 && after.length === 0) {\n return {\n success: true,\n enriched: null,\n reason: \"No adjacent context available\",\n };\n }\n\n try {\n const prompt = buildWindowPrompt(primary, before, after);\n const response = await provider.compress(\n SLIDING_WINDOW_SYSTEM,\n prompt,\n );\n const parsed = parseEnrichedXml(response);\n\n if (!parsed) {\n ctx.logger.warn(\"Failed to parse enrichment XML\", {\n obsId: data.observationId,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const enriched: EnrichedChunk = {\n id: generateId(\"ec\"),\n originalObsId: data.observationId,\n sessionId: data.sessionId,\n content: parsed.content,\n resolvedEntities: parsed.resolvedEntities,\n preferences: parsed.preferences,\n contextBridges: parsed.contextBridges,\n windowStart: Math.max(0, primaryIdx - hprev),\n windowEnd: Math.min(allObs.length - 1, primaryIdx + hnext),\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(\n KV.enrichedChunks(data.sessionId),\n data.observationId,\n enriched,\n );\n\n ctx.logger.info(\"Observation enriched via sliding window\", {\n obsId: data.observationId,\n entitiesResolved: Object.keys(parsed.resolvedEntities).length,\n preferencesFound: parsed.preferences.length,\n bridges: parsed.contextBridges.length,\n });\n\n return { success: true, enriched };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Sliding window enrichment failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::enrich-session\",\n description: \"Enrich all observations in a session using sliding windows\",\n },\n async (data: {\n sessionId: string;\n lookback?: number;\n lookahead?: number;\n minImportance?: number;\n }) => {\n const ctx = getContext();\n const allObs = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n const minImp = data.minImportance ?? 4;\n const toEnrich = allObs.filter((o) => o.importance >= minImp);\n\n let enriched = 0;\n let failed = 0;\n\n for (const obs of toEnrich) {\n try {\n const result = (await sdk.trigger(\"mem::enrich-window\", {\n observationId: obs.id,\n sessionId: data.sessionId,\n lookback: data.lookback ?? 3,\n lookahead: data.lookahead ?? 2,\n })) as { success?: boolean } | undefined;\n if (result?.success) enriched++;\n else failed++;\n } catch {\n failed++;\n }\n }\n\n ctx.logger.info(\"Session enrichment complete\", {\n sessionId: data.sessionId,\n total: toEnrich.length,\n enriched,\n failed,\n });\n\n return { success: true, total: toEnrich.length, enriched, failed };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n GraphNode,\n GraphEdge,\n GraphEdgeType,\n EdgeContext,\n TemporalState,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst TEMPORAL_EXTRACTION_SYSTEM = `You are a temporal knowledge extraction engine. Given observations, extract entities AND their temporal relationships with full context metadata.\n\nFor each relationship, you MUST provide:\n1. Semantic relation type\n2. Temporal validity (when this fact became true in the real world)\n3. Context metadata: WHY this relationship exists, what reasoning led to it, what alternatives were considered\n\nOutput EXACTLY this XML:\n<temporal_graph>\n <entities>\n <entity type=\"file|function|concept|error|decision|pattern|library|person|project|preference|location|organization|event\" name=\"exact name\">\n <property key=\"key\">value</property>\n <alias>alternate name</alias>\n </entity>\n </entities>\n <relationships>\n <relationship type=\"uses|imports|modifies|causes|fixes|depends_on|related_to|works_at|prefers|blocked_by|caused_by|optimizes_for|rejected|avoids|located_in|succeeded_by\"\n source=\"entity name\" target=\"entity name\" weight=\"0.1-1.0\"\n valid_from=\"ISO date or 'unknown'\" valid_to=\"ISO date or 'current'\">\n <reasoning>WHY this relationship exists</reasoning>\n <sentiment>positive|negative|neutral</sentiment>\n <alternatives>\n <alt>alternative that was considered</alt>\n </alternatives>\n </relationship>\n </relationships>\n</temporal_graph>\n\nRules:\n- NEVER overwrite existing relationships — always create new versioned edges\n- Extract temporal validity from context clues (\"since last month\", \"in 2024\", \"currently\")\n- Capture reasoning/motivation behind each relationship\n- Weight relationships by directness: 1.0 = explicit statement, 0.5 = inferred, 0.1 = speculative`;\n\nfunction parseTemporalGraphXml(\n xml: string,\n observationIds: string[],\n): { nodes: GraphNode[]; edges: GraphEdge[] } {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const now = new Date().toISOString();\n\n const entityRegex =\n /<entity\\s+type=\"([^\"]+)\"\\s+name=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n const type = match[1] as GraphNode[\"type\"];\n const name = match[2];\n const propsBlock = match[3];\n const properties: Record<string, string> = {};\n const aliases: string[] = [];\n\n const propRegex = /<property\\s+key=\"([^\"]+)\">([^<]*)<\\/property>/g;\n let propMatch;\n while ((propMatch = propRegex.exec(propsBlock)) !== null) {\n properties[propMatch[1]] = propMatch[2];\n }\n\n const aliasRegex = /<alias>([^<]+)<\\/alias>/g;\n while ((propMatch = aliasRegex.exec(propsBlock)) !== null) {\n aliases.push(propMatch[1]);\n }\n\n nodes.push({\n id: generateId(\"gn\"),\n type,\n name,\n properties,\n sourceObservationIds: observationIds,\n createdAt: now,\n aliases: aliases.length > 0 ? aliases : undefined,\n });\n }\n\n const relRegex =\n /<relationship\\s+type=\"([^\"]+)\"\\s+source=\"([^\"]+)\"\\s+target=\"([^\"]+)\"\\s+weight=\"([^\"]+)\"(?:\\s+valid_from=\"([^\"]*)\")?(?:\\s+valid_to=\"([^\"]*)\")?[^>]*>([\\s\\S]*?)<\\/relationship>/g;\n while ((match = relRegex.exec(xml)) !== null) {\n const type = match[1] as GraphEdgeType;\n const sourceName = match[2];\n const targetName = match[3];\n const parsedWeight = parseFloat(match[4]);\n const weight = Number.isNaN(parsedWeight) ? 0.5 : parsedWeight;\n const validFrom = match[5] || undefined;\n const validTo = match[6] || undefined;\n const metaBlock = match[7] || \"\";\n\n const sourceNode = nodes.find(\n (n) =>\n n.name === sourceName ||\n (n.aliases && n.aliases.includes(sourceName)),\n );\n const targetNode = nodes.find(\n (n) =>\n n.name === targetName ||\n (n.aliases && n.aliases.includes(targetName)),\n );\n\n if (sourceNode && targetNode) {\n const reasoning =\n metaBlock.match(/<reasoning>([^<]*)<\\/reasoning>/)?.[1] || undefined;\n const sentiment =\n metaBlock.match(/<sentiment>([^<]*)<\\/sentiment>/)?.[1] || undefined;\n const alternatives: string[] = [];\n const altRegex = /<alt>([^<]+)<\\/alt>/g;\n let altMatch;\n while ((altMatch = altRegex.exec(metaBlock)) !== null) {\n alternatives.push(altMatch[1]);\n }\n\n const context: EdgeContext = {};\n if (reasoning) context.reasoning = reasoning;\n if (sentiment) context.sentiment = sentiment;\n if (alternatives.length > 0) context.alternatives = alternatives;\n context.confidence = Math.max(0, Math.min(1, weight));\n\n edges.push({\n id: generateId(\"ge\"),\n type,\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n weight: Math.max(0, Math.min(1, weight)),\n sourceObservationIds: observationIds,\n createdAt: now,\n tcommit: now,\n tvalid:\n validFrom && validFrom !== \"unknown\" ? validFrom : undefined,\n tvalidEnd:\n validTo && validTo !== \"current\" ? validTo : undefined,\n context: Object.keys(context).length > 0 ? context : undefined,\n version: 1,\n isLatest: true,\n });\n }\n }\n\n return { nodes, edges };\n}\n\nexport function registerTemporalGraphFunctions(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::temporal-graph-extract\",\n description:\n \"Extract temporal knowledge graph with context metadata from observations\",\n },\n async (data: {\n observations: Array<{\n id: string;\n title: string;\n narrative: string;\n concepts: string[];\n files: string[];\n type: string;\n timestamp: string;\n }>;\n }) => {\n const ctx = getContext();\n if (!data.observations || data.observations.length === 0) {\n return { success: false, error: \"No observations provided\" };\n }\n\n const items = data.observations\n .map(\n (o, i) =>\n `[${i + 1}] Type: ${o.type}\\nTimestamp: ${o.timestamp}\\nTitle: ${o.title}\\nNarrative: ${o.narrative}\\nConcepts: ${(o.concepts ?? []).join(\", \")}\\nFiles: ${(o.files ?? []).join(\", \")}`,\n )\n .join(\"\\n\\n\");\n\n try {\n const response = await provider.compress(\n TEMPORAL_EXTRACTION_SYSTEM,\n `Extract temporal knowledge graph from:\\n\\n${items}`,\n );\n\n const obsIds = data.observations.map((o) => o.id);\n const { nodes, edges } = parseTemporalGraphXml(response, obsIds);\n\n const existingNodes = await kv.list<GraphNode>(KV.graphNodes);\n const existingEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const idRemap = new Map<string, string>();\n for (const node of nodes) {\n const existing = existingNodes.find(\n (n) =>\n n.name === node.name && n.type === node.type,\n );\n if (existing) {\n const oldId = node.id;\n const merged = {\n ...existing,\n sourceObservationIds: [\n ...new Set([\n ...existing.sourceObservationIds,\n ...obsIds,\n ]),\n ],\n properties: { ...existing.properties, ...node.properties },\n updatedAt: new Date().toISOString(),\n aliases: [\n ...new Set([\n ...(existing.aliases || []),\n ...(node.aliases || []),\n ]),\n ],\n };\n if (merged.aliases.length === 0) delete (merged as any).aliases;\n await kv.set(KV.graphNodes, existing.id, merged);\n node.id = existing.id;\n idRemap.set(oldId, existing.id);\n } else {\n await kv.set(KV.graphNodes, node.id, node);\n existingNodes.push(node);\n }\n }\n\n for (const edge of edges) {\n if (idRemap.has(edge.sourceNodeId)) {\n edge.sourceNodeId = idRemap.get(edge.sourceNodeId)!;\n }\n if (idRemap.has(edge.targetNodeId)) {\n edge.targetNodeId = idRemap.get(edge.targetNodeId)!;\n }\n const existingKey = `${edge.sourceNodeId}|${edge.targetNodeId}|${edge.type}`;\n const existingEdge = existingEdges.find(\n (e) =>\n `${e.sourceNodeId}|${e.targetNodeId}|${e.type}` ===\n existingKey,\n );\n\n if (existingEdge) {\n const updatedOld = {\n ...existingEdge,\n isLatest: false,\n tvalidEnd:\n existingEdge.tvalidEnd || new Date().toISOString(),\n supersededBy: edge.id,\n };\n await kv.set(KV.graphEdges, existingEdge.id, updatedOld);\n\n await kv.set(KV.graphEdgeHistory, existingEdge.id, updatedOld);\n\n edge.version = (existingEdge.version || 1) + 1;\n }\n\n await kv.set(KV.graphEdges, edge.id, edge);\n existingEdges.push(edge);\n }\n\n ctx.logger.info(\"Temporal graph extraction complete\", {\n nodes: nodes.length,\n edges: edges.length,\n });\n return {\n success: true,\n nodesAdded: nodes.length,\n edgesAdded: edges.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Temporal graph extraction failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::temporal-query\",\n description:\n \"Query entity state at a specific point in time with full history\",\n },\n async (data: {\n entityName: string;\n asOf?: string;\n includeHistory?: boolean;\n }): Promise<TemporalState | { error: string }> => {\n const allNodes = await kv.list<GraphNode>(KV.graphNodes);\n const allEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const entity = allNodes.find(\n (n) =>\n n.name.toLowerCase() === data.entityName.toLowerCase() ||\n (n.aliases &&\n n.aliases.some(\n (a) =>\n a.toLowerCase() === data.entityName.toLowerCase(),\n )),\n );\n\n if (!entity) {\n return { error: `Entity \"${data.entityName}\" not found` } as any;\n }\n\n const relatedEdges = allEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n const historicalEdges = await kv\n .list<GraphEdge>(KV.graphEdgeHistory)\n .catch(() => [] as GraphEdge[]);\n const entityHistory = historicalEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n const allEntityEdges = [...relatedEdges, ...entityHistory];\n\n if (data.asOf) {\n const asOfTime = new Date(data.asOf).getTime();\n const validEdges = allEntityEdges.filter((e) => {\n const commitTime = new Date(\n e.tcommit || e.createdAt,\n ).getTime();\n if (commitTime > asOfTime) return false;\n if (e.tvalid) {\n const validTime = new Date(e.tvalid).getTime();\n if (validTime > asOfTime) return false;\n }\n if (e.tvalidEnd) {\n const endTime = new Date(e.tvalidEnd).getTime();\n if (endTime < asOfTime) return false;\n }\n return true;\n });\n\n const currentEdges = getLatestByKey(validEdges);\n const historical = data.includeHistory ? validEdges : [];\n\n return {\n entity,\n currentEdges,\n historicalEdges: historical,\n timeline: buildTimeline(allEntityEdges),\n };\n }\n\n const currentEdges = relatedEdges.filter(\n (e) => e.isLatest !== false,\n );\n\n return {\n entity,\n currentEdges,\n historicalEdges: data.includeHistory ? entityHistory : [],\n timeline: buildTimeline(allEntityEdges),\n };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::differential-state\",\n description:\n \"Compute state changes between two entities over time\",\n },\n async (data: {\n entityName: string;\n from?: string;\n to?: string;\n }) => {\n const allNodes = await kv.list<GraphNode>(KV.graphNodes);\n const allEdges = await kv.list<GraphEdge>(KV.graphEdges);\n const historicalEdges = await kv\n .list<GraphEdge>(KV.graphEdgeHistory)\n .catch(() => [] as GraphEdge[]);\n\n const entity = allNodes.find(\n (n) => n.name.toLowerCase() === data.entityName.toLowerCase(),\n );\n if (!entity) return { error: \"Entity not found\" };\n\n const allEntityEdges = [\n ...allEdges.filter(\n (e) =>\n e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n ),\n ...historicalEdges.filter(\n (e) =>\n e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n ),\n ];\n\n allEntityEdges.sort(\n (a, b) =>\n new Date(a.tcommit || a.createdAt).getTime() -\n new Date(b.tcommit || b.createdAt).getTime(),\n );\n\n const fromTime = data.from\n ? new Date(data.from).getTime()\n : 0;\n const toTime = data.to\n ? new Date(data.to).getTime()\n : Date.now();\n\n const filtered = allEntityEdges.filter((e) => {\n const t = new Date(e.tcommit || e.createdAt).getTime();\n return t >= fromTime && t <= toTime;\n });\n\n const changes = filtered.map((e) => ({\n type: e.type,\n target:\n e.sourceNodeId === entity.id\n ? e.targetNodeId\n : e.sourceNodeId,\n validFrom: e.tvalid || e.createdAt,\n validTo: e.tvalidEnd,\n reasoning: e.context?.reasoning,\n sentiment: e.context?.sentiment,\n version: e.version || 1,\n isLatest: e.isLatest !== false,\n }));\n\n return {\n entity: entity.name,\n totalChanges: changes.length,\n changes,\n };\n },\n );\n}\n\nfunction getLatestByKey(edges: GraphEdge[]): GraphEdge[] {\n const byKey = new Map<string, GraphEdge>();\n for (const e of edges) {\n const key = `${e.sourceNodeId}|${e.targetNodeId}|${e.type}`;\n const existing = byKey.get(key);\n if (\n !existing ||\n new Date(e.tcommit || e.createdAt).getTime() >\n new Date(existing.tcommit || existing.createdAt).getTime()\n ) {\n byKey.set(key, e);\n }\n }\n return Array.from(byKey.values());\n}\n\nfunction buildTimeline(\n edges: GraphEdge[],\n): Array<{\n edge: GraphEdge;\n validFrom: string;\n validTo?: string;\n context?: EdgeContext;\n}> {\n const sorted = [...edges].sort(\n (a, b) =>\n new Date(a.tcommit || a.createdAt).getTime() -\n new Date(b.tcommit || b.createdAt).getTime(),\n );\n\n return sorted.map((e) => ({\n edge: e,\n validFrom: e.tvalid || e.createdAt,\n validTo: e.tvalidEnd,\n context: e.context,\n }));\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Memory,\n SemanticMemory,\n RetentionScore,\n DecayConfig,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst DEFAULT_DECAY: DecayConfig = {\n lambda: 0.01,\n sigma: 0.3,\n tierThresholds: {\n hot: 0.7,\n warm: 0.4,\n cold: 0.15,\n },\n};\n\nfunction computeRetention(\n salience: number,\n createdAt: string,\n accessTimestamps: number[],\n config: DecayConfig,\n): number {\n const now = Date.now();\n const deltaT = (now - new Date(createdAt).getTime()) / (1000 * 60 * 60 * 24);\n\n const temporalDecay = Math.exp(-config.lambda * deltaT);\n\n let reinforcementBoost = 0;\n for (const tAccess of accessTimestamps) {\n const daysSinceAccess =\n (now - tAccess) / (1000 * 60 * 60 * 24);\n if (daysSinceAccess > 0) {\n reinforcementBoost += 1 / daysSinceAccess;\n }\n }\n reinforcementBoost *= config.sigma;\n\n return Math.min(1, salience * temporalDecay + reinforcementBoost);\n}\n\nfunction computeSalience(\n memory: Memory | SemanticMemory,\n accessCount: number,\n): number {\n let baseSalience = 0.5;\n\n if (\"type\" in memory) {\n const typeWeights: Record<string, number> = {\n architecture: 0.9,\n bug: 0.7,\n pattern: 0.8,\n preference: 0.85,\n workflow: 0.6,\n fact: 0.5,\n };\n baseSalience = typeWeights[(memory as Memory).type] || 0.5;\n }\n\n if (\"confidence\" in memory) {\n baseSalience = Math.max(baseSalience, (memory as SemanticMemory).confidence);\n }\n\n const accessBonus = Math.min(0.2, accessCount * 0.02);\n return Math.min(1, baseSalience + accessBonus);\n}\n\nexport function registerRetentionFunctions(\n sdk: ISdk,\n kv: StateKV,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::retention-score\",\n description:\n \"Compute retention scores for all memories using time-frequency decay\",\n },\n async (data: { config?: Partial<DecayConfig> }) => {\n const ctx = getContext();\n const config = { ...DEFAULT_DECAY, ...data.config };\n\n const memories = await kv.list<Memory>(KV.memories);\n const semanticMems = await kv.list<SemanticMemory>(KV.semantic);\n\n const scores: RetentionScore[] = [];\n\n for (const mem of memories) {\n if (!mem.isLatest) continue;\n const salience = computeSalience(mem, 0);\n const score = computeRetention(\n salience,\n mem.createdAt,\n [],\n config,\n );\n\n const entry: RetentionScore = {\n memoryId: mem.id,\n score,\n salience,\n temporalDecay: Math.exp(\n -config.lambda *\n ((Date.now() - new Date(mem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n reinforcementBoost: 0,\n lastAccessed: mem.updatedAt,\n accessCount: 0,\n };\n\n scores.push(entry);\n await kv.set(KV.retentionScores, mem.id, entry);\n }\n\n for (const sem of semanticMems) {\n const accessTimestamps = sem.lastAccessedAt\n ? [new Date(sem.lastAccessedAt).getTime()]\n : [];\n const salience = computeSalience(sem, sem.accessCount);\n const score = computeRetention(\n salience,\n sem.createdAt,\n accessTimestamps,\n config,\n );\n\n const entry: RetentionScore = {\n memoryId: sem.id,\n score,\n salience,\n temporalDecay: Math.exp(\n -config.lambda *\n ((Date.now() - new Date(sem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n reinforcementBoost:\n score - salience * Math.exp(\n -config.lambda *\n ((Date.now() - new Date(sem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n lastAccessed: sem.lastAccessedAt,\n accessCount: sem.accessCount,\n };\n\n scores.push(entry);\n await kv.set(KV.retentionScores, sem.id, entry);\n }\n\n scores.sort((a, b) => b.score - a.score);\n\n const tiers = {\n hot: scores.filter((s) => s.score >= config.tierThresholds.hot)\n .length,\n warm: scores.filter(\n (s) =>\n s.score >= config.tierThresholds.warm &&\n s.score < config.tierThresholds.hot,\n ).length,\n cold: scores.filter(\n (s) =>\n s.score >= config.tierThresholds.cold &&\n s.score < config.tierThresholds.warm,\n ).length,\n evictable: scores.filter(\n (s) => s.score < config.tierThresholds.cold,\n ).length,\n };\n\n ctx.logger.info(\"Retention scores computed\", {\n total: scores.length,\n ...tiers,\n });\n\n return { success: true, total: scores.length, tiers, scores };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::retention-evict\",\n description:\n \"Evict memories below retention threshold (tiered storage)\",\n },\n async (data: {\n threshold?: number;\n dryRun?: boolean;\n maxEvict?: number;\n }) => {\n const ctx = getContext();\n const threshold = data.threshold ?? DEFAULT_DECAY.tierThresholds.cold;\n const maxEvict = data.maxEvict ?? 50;\n\n const allScores = await kv.list<RetentionScore>(KV.retentionScores);\n const candidates = allScores\n .filter((s) => s.score < threshold)\n .sort((a, b) => a.score - b.score)\n .slice(0, maxEvict);\n\n if (data.dryRun) {\n return {\n success: true,\n dryRun: true,\n wouldEvict: candidates.length,\n candidates: candidates.map((c) => ({\n id: c.memoryId,\n score: c.score,\n })),\n };\n }\n\n let evicted = 0;\n for (const candidate of candidates) {\n try {\n await kv.delete(KV.memories, candidate.memoryId);\n await kv.delete(KV.retentionScores, candidate.memoryId);\n evicted++;\n } catch {\n continue;\n }\n }\n\n ctx.logger.info(\"Retention-based eviction complete\", {\n evicted,\n threshold,\n });\n\n return { success: true, evicted };\n },\n );\n}\n","import type { HealthSnapshot } from \"../types.js\";\n\ninterface ThresholdConfig {\n eventLoopLagWarnMs: number;\n eventLoopLagCriticalMs: number;\n cpuWarnPercent: number;\n cpuCriticalPercent: number;\n memoryWarnPercent: number;\n memoryCriticalPercent: number;\n}\n\nconst DEFAULTS: ThresholdConfig = {\n eventLoopLagWarnMs: 100,\n eventLoopLagCriticalMs: 500,\n cpuWarnPercent: 80,\n cpuCriticalPercent: 90,\n memoryWarnPercent: 80,\n memoryCriticalPercent: 95,\n};\n\nexport function evaluateHealth(\n snapshot: HealthSnapshot,\n config: Partial<ThresholdConfig> = {},\n): { status: \"healthy\" | \"degraded\" | \"critical\"; alerts: string[] } {\n const cfg = { ...DEFAULTS, ...config };\n const alerts: string[] = [];\n let critical = false;\n let degraded = false;\n\n if (\n snapshot.connectionState === \"disconnected\" ||\n snapshot.connectionState === \"failed\"\n ) {\n alerts.push(`connection_${snapshot.connectionState}`);\n critical = true;\n } else if (snapshot.connectionState === \"reconnecting\") {\n alerts.push(\"connection_reconnecting\");\n degraded = true;\n }\n\n if (snapshot.eventLoopLagMs > cfg.eventLoopLagCriticalMs) {\n alerts.push(\n `event_loop_lag_critical_${Math.round(snapshot.eventLoopLagMs)}ms`,\n );\n critical = true;\n } else if (snapshot.eventLoopLagMs > cfg.eventLoopLagWarnMs) {\n alerts.push(`event_loop_lag_warn_${Math.round(snapshot.eventLoopLagMs)}ms`);\n degraded = true;\n }\n\n if (snapshot.cpu.percent > cfg.cpuCriticalPercent) {\n alerts.push(`cpu_critical_${Math.round(snapshot.cpu.percent)}%`);\n critical = true;\n } else if (snapshot.cpu.percent > cfg.cpuWarnPercent) {\n alerts.push(`cpu_warn_${Math.round(snapshot.cpu.percent)}%`);\n degraded = true;\n }\n\n const memPercent =\n snapshot.memory.heapTotal > 0\n ? (snapshot.memory.heapUsed / snapshot.memory.heapTotal) * 100\n : 0;\n if (memPercent > cfg.memoryCriticalPercent) {\n alerts.push(`memory_critical_${Math.round(memPercent)}%`);\n critical = true;\n } else if (memPercent > cfg.memoryWarnPercent) {\n alerts.push(`memory_warn_${Math.round(memPercent)}%`);\n degraded = true;\n }\n\n const status = critical ? \"critical\" : degraded ? \"degraded\" : \"healthy\";\n return { status, alerts };\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { HealthSnapshot } from \"../types.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport { evaluateHealth } from \"./thresholds.js\";\n\nexport function registerHealthMonitor(\n sdk: ISdk,\n kv: StateKV,\n): { stop: () => void } {\n let connectionState = \"connected\";\n let prevCpuUsage = process.cpuUsage();\n let prevCpuTime = Date.now();\n\n if (typeof sdk.on === \"function\") {\n sdk.on(\"connection_state\", (state?: unknown) => {\n connectionState = state as string;\n });\n }\n\n async function collectHealth(): Promise<HealthSnapshot> {\n const mem = process.memoryUsage();\n const currentCpu = process.cpuUsage();\n const now = Date.now();\n const uptime = process.uptime();\n\n const elapsedMs = now - prevCpuTime;\n const userDelta = currentCpu.user - prevCpuUsage.user;\n const systemDelta = currentCpu.system - prevCpuUsage.system;\n const cpuPercent =\n elapsedMs > 0 ? ((userDelta + systemDelta) / 1000 / elapsedMs) * 100 : 0;\n prevCpuUsage = currentCpu;\n prevCpuTime = now;\n\n const startMark = performance.now();\n await new Promise((resolve) => setImmediate(resolve));\n const eventLoopLagMs = performance.now() - startMark;\n\n let workers: HealthSnapshot[\"workers\"] = [];\n try {\n const result = await sdk.trigger<\n unknown,\n { workers?: HealthSnapshot[\"workers\"] }\n >(\"engine::workers::list\", {});\n if (result?.workers) workers = result.workers;\n } catch {}\n\n const KV_PROBE_TIMEOUT = 5000;\n let kvConnectivity: { status: string; latencyMs?: number; error?: string };\n const kvStart = performance.now();\n try {\n await Promise.race([\n (async () => {\n await kv.set(KV.health, \"_probe\", { ts: Date.now() });\n await kv.get(KV.health, \"_probe\");\n })(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"timeout\")), KV_PROBE_TIMEOUT),\n ),\n ]);\n kvConnectivity = { status: \"ok\", latencyMs: Math.round((performance.now() - kvStart) * 100) / 100 };\n } catch {\n kvConnectivity = { status: \"error\", error: \"kv_probe_failed\", latencyMs: Math.round((performance.now() - kvStart) * 100) / 100 };\n }\n\n const snapshot: HealthSnapshot = {\n connectionState,\n workers,\n memory: {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n rss: mem.rss,\n external: mem.external,\n },\n cpu: {\n userMicros: currentCpu.user,\n systemMicros: currentCpu.system,\n percent: Math.round(cpuPercent * 100) / 100,\n },\n eventLoopLagMs,\n uptimeSeconds: uptime,\n kvConnectivity,\n status: \"healthy\",\n alerts: [],\n };\n\n const evaluated = evaluateHealth(snapshot);\n snapshot.status = evaluated.status;\n snapshot.alerts = evaluated.alerts;\n\n await kv.set(KV.health, \"latest\", snapshot).catch(() => {});\n return snapshot;\n }\n\n collectHealth().catch(() => {});\n const interval = setInterval(() => {\n collectHealth().catch(() => {});\n }, 30_000);\n interval.unref();\n\n return {\n stop: () => clearInterval(interval),\n };\n}\n\nexport async function getLatestHealth(\n kv: StateKV,\n): Promise<HealthSnapshot | null> {\n return kv.get<HealthSnapshot>(KV.health, \"latest\");\n}\n","import { timingSafeEqual, createHmac, randomBytes } from \"node:crypto\";\n\nconst hmacKey = randomBytes(32);\n\nexport function timingSafeCompare(a: string, b: string): boolean {\n const hmacA = createHmac(\"sha256\", hmacKey).update(a).digest();\n const hmacB = createHmac(\"sha256\", hmacKey).update(b).digest();\n return timingSafeEqual(hmacA, hmacB);\n}\n\nexport const VIEWER_CSP =\n \"default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self' ws://localhost:* wss://localhost:*; img-src 'self'; font-src 'self'\";\n","import type { ISdk, ApiRequest } from \"iii-sdk\";\nimport type { Session, CompressedObservation, HookPayload } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getLatestHealth } from \"../health/monitor.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\nimport type { ResilientProvider } from \"../providers/resilient.js\";\nimport { VERSION } from \"../version.js\";\nimport { timingSafeCompare, VIEWER_CSP } from \"../auth.js\";\n\ntype Response = {\n status_code: number;\n headers?: Record<string, string>;\n body: unknown;\n};\n\nfunction checkAuth(\n req: ApiRequest,\n secret: string | undefined,\n): Response | null {\n if (!secret) return null;\n const auth = req.headers?.[\"authorization\"] || req.headers?.[\"Authorization\"];\n if (\n typeof auth !== \"string\" ||\n !timingSafeCompare(auth, `Bearer ${secret}`)\n ) {\n return { status_code: 401, body: { error: \"unauthorized\" } };\n }\n return null;\n}\n\nexport function registerApiTriggers(\n sdk: ISdk,\n kv: StateKV,\n secret?: string,\n metricsStore?: MetricsStore,\n provider?: ResilientProvider | { circuitState?: unknown },\n): void {\n sdk.registerFunction(\n { id: \"api::liveness\" },\n async (): Promise<Response> => ({\n status_code: 200,\n body: { status: \"ok\", service: \"agentmemory\" },\n }),\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::liveness\",\n config: { api_path: \"/agentmemory/livez\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::health\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const health = await getLatestHealth(kv);\n const functionMetrics = metricsStore ? await metricsStore.getAll() : [];\n const circuitBreaker =\n provider && \"circuitState\" in provider ? provider.circuitState : null;\n\n const status = health?.status || \"healthy\";\n const statusCode = status === \"critical\" ? 503 : 200;\n\n return {\n status_code: statusCode,\n body: {\n status,\n service: \"agentmemory\",\n version: VERSION,\n health: health || null,\n functionMetrics,\n circuitBreaker,\n },\n };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::health\",\n config: { api_path: \"/agentmemory/health\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::observe\" },\n async (req: ApiRequest<HookPayload>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::observe\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::observe\",\n config: { api_path: \"/agentmemory/observe\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::context\" },\n async (\n req: ApiRequest<{ sessionId: string; project: string; budget?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::context\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::context\",\n config: { api_path: \"/agentmemory/context\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::search\" },\n async (\n req: ApiRequest<{ query: string; limit?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::search\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::search\",\n config: { api_path: \"/agentmemory/search\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::session::start\" },\n async (\n req: ApiRequest<{ sessionId: string; project: string; cwd: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const { sessionId, project, cwd } = req.body;\n const session: Session = {\n id: sessionId,\n project,\n cwd,\n startedAt: new Date().toISOString(),\n status: \"active\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, sessionId, session);\n const contextResult = await sdk.trigger<\n { sessionId: string; project: string },\n { context: string }\n >(\"mem::context\", { sessionId, project });\n return {\n status_code: 200,\n body: { session, context: contextResult.context },\n };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::session::start\",\n config: { api_path: \"/agentmemory/session/start\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::session::end\" },\n async (req: ApiRequest<{ sessionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const session = await kv.get<Session>(KV.sessions, req.body.sessionId);\n if (session) {\n await kv.set(KV.sessions, req.body.sessionId, {\n ...session,\n endedAt: new Date().toISOString(),\n status: \"completed\",\n });\n }\n return { status_code: 200, body: { success: true } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::session::end\",\n config: { api_path: \"/agentmemory/session/end\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::summarize\" },\n async (req: ApiRequest<{ sessionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::summarize\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::summarize\",\n config: { api_path: \"/agentmemory/summarize\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::sessions\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const sessions = await kv.list<Session>(KV.sessions);\n return { status_code: 200, body: { sessions } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::sessions\",\n config: { api_path: \"/agentmemory/sessions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::observations\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const sessionId = req.query_params[\"sessionId\"] as string;\n if (!sessionId)\n return { status_code: 400, body: { error: \"sessionId required\" } };\n const observations = await kv.list<CompressedObservation>(\n KV.observations(sessionId),\n );\n return { status_code: 200, body: { observations } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::observations\",\n config: { api_path: \"/agentmemory/observations\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::file-context\" },\n async (\n req: ApiRequest<{ sessionId: string; files: string[] }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::file-context\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::file-context\",\n config: { api_path: \"/agentmemory/file-context\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::enrich\" },\n async (\n req: ApiRequest<{\n sessionId: string;\n files: string[];\n terms?: string[];\n toolName?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.sessionId ||\n typeof req.body.sessionId !== \"string\" ||\n !Array.isArray(req.body?.files) ||\n req.body.files.length === 0 ||\n !req.body.files.every((f: unknown) => typeof f === \"string\")\n ) {\n return {\n status_code: 400,\n body: {\n error: \"sessionId (string) and files (string[]) are required\",\n },\n };\n }\n if (\n req.body.terms !== undefined &&\n (!Array.isArray(req.body.terms) ||\n !req.body.terms.every((t: unknown) => typeof t === \"string\"))\n ) {\n return {\n status_code: 400,\n body: { error: \"terms must be an array of strings\" },\n };\n }\n const result = await sdk.trigger(\"mem::enrich\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::enrich\",\n config: { api_path: \"/agentmemory/enrich\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::remember\" },\n async (\n req: ApiRequest<{\n content: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.content ||\n typeof req.body.content !== \"string\" ||\n !req.body.content.trim()\n ) {\n return { status_code: 400, body: { error: \"content is required\" } };\n }\n const result = await sdk.trigger(\"mem::remember\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::remember\",\n config: { api_path: \"/agentmemory/remember\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::forget\" },\n async (\n req: ApiRequest<{\n sessionId?: string;\n observationIds?: string[];\n memoryId?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sessionId && !req.body?.memoryId) {\n return {\n status_code: 400,\n body: { error: \"sessionId or memoryId is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::forget\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::forget\",\n config: { api_path: \"/agentmemory/forget\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::consolidate\" },\n async (\n req: ApiRequest<{ project?: string; minObservations?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::consolidate\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::consolidate\",\n config: { api_path: \"/agentmemory/consolidate\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::patterns\" },\n async (req: ApiRequest<{ project?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::patterns\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::patterns\",\n config: { api_path: \"/agentmemory/patterns\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::generate-rules\" },\n async (req: ApiRequest<{ project?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::generate-rules\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::generate-rules\",\n config: { api_path: \"/agentmemory/generate-rules\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::migrate\" },\n async (req: ApiRequest<{ dbPath: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.dbPath || typeof req.body.dbPath !== \"string\") {\n return { status_code: 400, body: { error: \"dbPath is required\" } };\n }\n const result = await sdk.trigger(\"mem::migrate\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::migrate\",\n config: { api_path: \"/agentmemory/migrate\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::evict\" },\n async (req: ApiRequest<{ dryRun?: boolean }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const dryRun =\n req.query_params?.[\"dryRun\"] === \"true\" || req.body?.dryRun === true;\n const result = await sdk.trigger(\"mem::evict\", { dryRun });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::evict\",\n config: { api_path: \"/agentmemory/evict\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::smart-search\" },\n async (\n req: ApiRequest<{ query?: string; expandIds?: string[]; limit?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.query &&\n (!req.body?.expandIds || req.body.expandIds.length === 0)\n ) {\n return {\n status_code: 400,\n body: { error: \"query or expandIds is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::smart-search\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::smart-search\",\n config: { api_path: \"/agentmemory/smart-search\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::timeline\" },\n async (\n req: ApiRequest<{\n anchor: string;\n project?: string;\n before?: number;\n after?: number;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.anchor) {\n return { status_code: 400, body: { error: \"anchor is required\" } };\n }\n const result = await sdk.trigger(\"mem::timeline\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::timeline\",\n config: { api_path: \"/agentmemory/timeline\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::profile\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const project = req.query_params[\"project\"] as string;\n if (!project) {\n return {\n status_code: 400,\n body: { error: \"project query param is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::profile\", { project });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::profile\",\n config: { api_path: \"/agentmemory/profile\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::export\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::export\", {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::export\",\n config: { api_path: \"/agentmemory/export\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::import\" },\n async (\n req: ApiRequest<{\n exportData: unknown;\n strategy?: \"merge\" | \"replace\" | \"skip\";\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.exportData) {\n return { status_code: 400, body: { error: \"exportData is required\" } };\n }\n const result = await sdk.trigger(\"mem::import\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::import\",\n config: { api_path: \"/agentmemory/import\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::relations\" },\n async (\n req: ApiRequest<{ sourceId: string; targetId: string; type: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sourceId || !req.body?.targetId || !req.body?.type) {\n return {\n status_code: 400,\n body: { error: \"sourceId, targetId, and type are required\" },\n };\n }\n const result = await sdk.trigger(\"mem::relate\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::relations\",\n config: { api_path: \"/agentmemory/relations\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::evolve\" },\n async (\n req: ApiRequest<{\n memoryId: string;\n newContent: string;\n newTitle?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.memoryId || !req.body?.newContent) {\n return {\n status_code: 400,\n body: { error: \"memoryId and newContent are required\" },\n };\n }\n const result = await sdk.trigger(\"mem::evolve\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::evolve\",\n config: { api_path: \"/agentmemory/evolve\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::auto-forget\" },\n async (req: ApiRequest<{ dryRun?: boolean }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const dryRun =\n req.query_params?.[\"dryRun\"] === \"true\" || req.body?.dryRun === true;\n const result = await sdk.trigger(\"mem::auto-forget\", { dryRun });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::auto-forget\",\n config: { api_path: \"/agentmemory/auto-forget\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::claude-bridge-read\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::claude-bridge-read\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Claude bridge not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::claude-bridge-read\",\n config: { api_path: \"/agentmemory/claude-bridge/read\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::claude-bridge-sync\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::claude-bridge-sync\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Claude bridge not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::claude-bridge-sync\",\n config: {\n api_path: \"/agentmemory/claude-bridge/sync\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-query\" },\n async (\n req: ApiRequest<{\n startNodeId?: string;\n nodeType?: string;\n maxDepth?: number;\n query?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::graph-query\", req.body || {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-query\",\n config: { api_path: \"/agentmemory/graph/query\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-stats\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::graph-stats\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-stats\",\n config: { api_path: \"/agentmemory/graph/stats\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-extract\" },\n async (req: ApiRequest<{ observations: unknown[] }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !Array.isArray(req.body?.observations) ||\n req.body.observations.length === 0\n ) {\n return {\n status_code: 400,\n body: { error: \"observations array is required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::graph-extract\", req.body);\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-extract\",\n config: { api_path: \"/agentmemory/graph/extract\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::consolidate-pipeline\" },\n async (req: ApiRequest<{ tier?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\n \"mem::consolidate-pipeline\",\n req.body || {},\n );\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Consolidation pipeline not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::consolidate-pipeline\",\n config: {\n api_path: \"/agentmemory/consolidate-pipeline\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::team-share\" },\n async (\n req: ApiRequest<{ itemId: string; itemType: string; project?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.itemId || !req.body?.itemType) {\n return {\n status_code: 400,\n body: { error: \"itemId and itemType are required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::team-share\", req.body);\n return { status_code: 201, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-share\",\n config: { api_path: \"/agentmemory/team/share\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::team-feed\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const limit = parseInt(req.query_params?.[\"limit\"] as string) || 20;\n const result = await sdk.trigger(\"mem::team-feed\", { limit });\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-feed\",\n config: { api_path: \"/agentmemory/team/feed\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::team-profile\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::team-profile\", {});\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-profile\",\n config: { api_path: \"/agentmemory/team/profile\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::audit\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::audit-query\", {\n operation: req.query_params?.[\"operation\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || 50,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::audit\",\n config: { api_path: \"/agentmemory/audit\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::governance-delete\" },\n async (\n req: ApiRequest<{ memoryIds: string[]; reason?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.memoryIds || !Array.isArray(req.body.memoryIds)) {\n return {\n status_code: 400,\n body: { error: \"memoryIds array is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::governance-delete\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::governance-delete\",\n config: {\n api_path: \"/agentmemory/governance/memories\",\n http_method: \"DELETE\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::governance-bulk\" },\n async (\n req: ApiRequest<{\n type?: string[];\n dateFrom?: string;\n dateTo?: string;\n qualityBelow?: number;\n dryRun?: boolean;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::governance-bulk\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::governance-bulk\",\n config: {\n api_path: \"/agentmemory/governance/bulk-delete\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshots\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::snapshot-list\", {});\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshots\",\n config: { api_path: \"/agentmemory/snapshots\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshot-create\" },\n async (req: ApiRequest<{ message?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\n \"mem::snapshot-create\",\n req.body || {},\n );\n return { status_code: 201, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshot-create\",\n config: { api_path: \"/agentmemory/snapshot/create\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshot-restore\" },\n async (req: ApiRequest<{ commitHash: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.commitHash) {\n return { status_code: 400, body: { error: \"commitHash is required\" } };\n }\n try {\n const result = await sdk.trigger(\"mem::snapshot-restore\", req.body);\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshot-restore\",\n config: { api_path: \"/agentmemory/snapshot/restore\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::memories\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const memories = await kv.list<import(\"../types.js\").Memory>(KV.memories);\n const latest = req.query_params?.[\"latest\"] === \"true\";\n const filtered = latest ? memories.filter((m) => m.isLatest) : memories;\n return { status_code: 200, body: { memories: filtered } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::memories\",\n config: { api_path: \"/agentmemory/memories\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-create\" },\n async (\n req: ApiRequest<{\n title: string;\n description?: string;\n priority?: number;\n createdBy?: string;\n project?: string;\n tags?: string[];\n parentId?: string;\n edges?: Array<{ type: string; targetActionId: string }>;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.title) {\n return { status_code: 400, body: { error: \"title is required\" } };\n }\n const result = await sdk.trigger(\"mem::action-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-create\",\n config: { api_path: \"/agentmemory/actions\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-update\" },\n async (\n req: ApiRequest<{\n actionId: string;\n status?: string;\n title?: string;\n description?: string;\n priority?: number;\n result?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId) {\n return { status_code: 400, body: { error: \"actionId is required\" } };\n }\n const result = await sdk.trigger(\"mem::action-update\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-update\",\n config: { api_path: \"/agentmemory/actions/update\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::action-list\", {\n status: req.query_params?.[\"status\"],\n project: req.query_params?.[\"project\"],\n parentId: req.query_params?.[\"parentId\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-list\",\n config: { api_path: \"/agentmemory/actions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-get\" },\n async (req: ApiRequest<{ actionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const actionId = req.query_params?.[\"actionId\"] as string;\n if (!actionId) {\n return { status_code: 400, body: { error: \"actionId required\" } };\n }\n const result = await sdk.trigger(\"mem::action-get\", { actionId });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-get\",\n config: { api_path: \"/agentmemory/actions/get\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-edge\" },\n async (\n req: ApiRequest<{\n sourceActionId: string;\n targetActionId: string;\n type: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sourceActionId || !req.body?.targetActionId || !req.body?.type) {\n return { status_code: 400, body: { error: \"sourceActionId, targetActionId, and type are required\" } };\n }\n const result = await sdk.trigger(\"mem::action-edge-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-edge\",\n config: { api_path: \"/agentmemory/actions/edges\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::frontier\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::frontier\", {\n project: req.query_params?.[\"project\"],\n agentId: req.query_params?.[\"agentId\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::frontier\",\n config: { api_path: \"/agentmemory/frontier\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::next\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::next\", {\n project: req.query_params?.[\"project\"],\n agentId: req.query_params?.[\"agentId\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::next\",\n config: { api_path: \"/agentmemory/next\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-acquire\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; ttlMs?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-acquire\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-acquire\",\n config: { api_path: \"/agentmemory/leases/acquire\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-release\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; result?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-release\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-release\",\n config: { api_path: \"/agentmemory/leases/release\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-renew\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; ttlMs?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-renew\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-renew\",\n config: { api_path: \"/agentmemory/leases/renew\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-create\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.name) {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-create\",\n config: { api_path: \"/agentmemory/routines\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::routine-list\", {\n frozen: req.query_params?.[\"frozen\"] === \"true\" ? true : undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-list\",\n config: { api_path: \"/agentmemory/routines\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-run\" },\n async (\n req: ApiRequest<{ routineId: string; project?: string; initiatedBy?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.routineId) {\n return { status_code: 400, body: { error: \"routineId is required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-run\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-run\",\n config: { api_path: \"/agentmemory/routines/run\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-status\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const runId = req.query_params?.[\"runId\"] as string;\n if (!runId) {\n return { status_code: 400, body: { error: \"runId query param required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-status\", { runId });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-status\",\n config: { api_path: \"/agentmemory/routines/status\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::signal-send\" },\n async (\n req: ApiRequest<{\n from: string;\n to?: string;\n content: string;\n type?: string;\n replyTo?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.from || !req.body?.content) {\n return { status_code: 400, body: { error: \"from and content are required\" } };\n }\n const result = await sdk.trigger(\"mem::signal-send\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::signal-send\",\n config: { api_path: \"/agentmemory/signals/send\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::signal-read\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const agentId = req.query_params?.[\"agentId\"] as string;\n if (!agentId) {\n return { status_code: 400, body: { error: \"agentId query param required\" } };\n }\n const result = await sdk.trigger(\"mem::signal-read\", {\n agentId,\n unreadOnly: req.query_params?.[\"unreadOnly\"] === \"true\",\n threadId: req.query_params?.[\"threadId\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::signal-read\",\n config: { api_path: \"/agentmemory/signals\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-create\" },\n async (\n req: ApiRequest<{\n name: string;\n description?: string;\n type?: string;\n linkedActionIds?: string[];\n expiresInMs?: number;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.name) {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n const result = await sdk.trigger(\"mem::checkpoint-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-create\",\n config: { api_path: \"/agentmemory/checkpoints\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-resolve\" },\n async (\n req: ApiRequest<{\n checkpointId: string;\n status: string;\n resolvedBy?: string;\n result?: unknown;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.checkpointId || !req.body?.status) {\n return { status_code: 400, body: { error: \"checkpointId and status are required\" } };\n }\n const result = await sdk.trigger(\"mem::checkpoint-resolve\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-resolve\",\n config: { api_path: \"/agentmemory/checkpoints/resolve\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::checkpoint-list\", {\n status: req.query_params?.[\"status\"],\n type: req.query_params?.[\"type\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-list\",\n config: { api_path: \"/agentmemory/checkpoints\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-register\" },\n async (\n req: ApiRequest<{ url: string; name: string; sharedScopes?: string[] }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.url || !req.body?.name) {\n return { status_code: 400, body: { error: \"url and name are required\" } };\n }\n const result = await sdk.trigger(\"mem::mesh-register\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-register\",\n config: { api_path: \"/agentmemory/mesh/peers\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-list\", {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-list\",\n config: { api_path: \"/agentmemory/mesh/peers\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-sync\" },\n async (\n req: ApiRequest<{ peerId?: string; direction?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-sync\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-sync\",\n config: { api_path: \"/agentmemory/mesh/sync\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-receive\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-receive\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-receive\",\n config: { api_path: \"/agentmemory/mesh/receive\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-export\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const since = req.query_params?.[\"since\"] as string;\n if (since) {\n const parsed = new Date(since).getTime();\n if (Number.isNaN(parsed)) {\n return { status_code: 400, body: { error: \"Invalid 'since' date format\" } };\n }\n }\n const project = req.query_params?.[\"project\"] as string | undefined;\n const sinceTime = since ? new Date(since).getTime() : 0;\n const df = <T>(items: T[], field: \"updatedAt\" | \"createdAt\") =>\n items.filter((i) => new Date((i as Record<string, unknown>)[field] as string).getTime() > sinceTime);\n const memories = await kv.list<import(\"../types.js\").Memory>(KV.memories);\n let actions = await kv.list<import(\"../types.js\").Action>(KV.actions);\n if (project) {\n actions = actions.filter((a) => a.project === project);\n }\n const body: Record<string, unknown> = {\n memories: df(memories, \"updatedAt\"),\n actions: df(actions, \"updatedAt\"),\n };\n if (!project) {\n const semantic = await kv.list<import(\"../types.js\").SemanticMemory>(KV.semantic);\n const procedural = await kv.list<import(\"../types.js\").ProceduralMemory>(KV.procedural);\n const relations = await kv.list<import(\"../types.js\").MemoryRelation>(KV.relations);\n const graphNodes = await kv.list<import(\"../types.js\").GraphNode>(KV.graphNodes);\n const graphEdges = await kv.list<import(\"../types.js\").GraphEdge>(KV.graphEdges);\n body.semantic = df(semantic, \"updatedAt\");\n body.procedural = df(procedural, \"updatedAt\");\n body.relations = df(relations, \"createdAt\");\n body.graphNodes = graphNodes.filter(\n (n) => new Date(n.updatedAt || n.createdAt).getTime() > sinceTime,\n );\n body.graphEdges = df(graphEdges, \"createdAt\");\n }\n return { status_code: 200, body };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-export\",\n config: { api_path: \"/agentmemory/mesh/export\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::flow-compress\" },\n async (\n req: ApiRequest<{\n runId?: string;\n actionIds?: string[];\n project?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::flow-compress\", req.body || {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Flow compression requires a provider\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::flow-compress\",\n config: { api_path: \"/agentmemory/flow/compress\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-detect\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::detect-worktree\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-detect\",\n config: { api_path: \"/agentmemory/branch/detect\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-worktrees\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::list-worktrees\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-worktrees\",\n config: { api_path: \"/agentmemory/branch/worktrees\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-sessions\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::branch-sessions\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-sessions\",\n config: { api_path: \"/agentmemory/branch/sessions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction({ id: \"api::viewer\" }, async (): Promise<Response> => {\n const headers = {\n \"Content-Type\": \"text/html\",\n \"Content-Security-Policy\": VIEWER_CSP,\n };\n const base = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(base, \"..\", \"viewer\", \"index.html\"),\n join(base, \"..\", \"src\", \"viewer\", \"index.html\"),\n join(base, \"viewer\", \"index.html\"),\n ];\n for (const p of candidates) {\n try {\n const html = readFileSync(p, \"utf-8\");\n return { status_code: 200, headers, body: html };\n } catch {}\n }\n return {\n status_code: 404,\n headers,\n body: \"<!DOCTYPE html><html><body><h1>agentmemory</h1><p>viewer not found</p></body></html>\",\n };\n });\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::viewer\",\n config: { api_path: \"/agentmemory/viewer\", http_method: \"GET\" },\n });\n\n sdk.registerFunction({ id: \"api::sentinel-create\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.name) return { status_code: 400, body: { error: \"name is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-create\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-create\", config: { api_path: \"/agentmemory/sentinels\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-trigger\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sentinelId) return { status_code: 400, body: { error: \"sentinelId is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-trigger\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-trigger\", config: { api_path: \"/agentmemory/sentinels/trigger\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-check\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const result = await sdk.trigger(\"mem::sentinel-check\", {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-check\", config: { api_path: \"/agentmemory/sentinels/check\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-cancel\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sentinelId) return { status_code: 400, body: { error: \"sentinelId is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-cancel\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-cancel\", config: { api_path: \"/agentmemory/sentinels/cancel\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::sentinel-list\", { status: params.status, type: params.type });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-list\", config: { api_path: \"/agentmemory/sentinels\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::sketch-create\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.title) return { status_code: 400, body: { error: \"title is required\" } };\n const result = await sdk.trigger(\"mem::sketch-create\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-create\", config: { api_path: \"/agentmemory/sketches\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-add\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId || !body?.title) return { status_code: 400, body: { error: \"sketchId and title are required\" } };\n const result = await sdk.trigger(\"mem::sketch-add\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-add\", config: { api_path: \"/agentmemory/sketches/add\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-promote\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId) return { status_code: 400, body: { error: \"sketchId is required\" } };\n const result = await sdk.trigger(\"mem::sketch-promote\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-promote\", config: { api_path: \"/agentmemory/sketches/promote\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-discard\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId) return { status_code: 400, body: { error: \"sketchId is required\" } };\n const result = await sdk.trigger(\"mem::sketch-discard\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-discard\", config: { api_path: \"/agentmemory/sketches/discard\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::sketch-list\", { status: params.status, project: params.project });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-list\", config: { api_path: \"/agentmemory/sketches\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::sketch-gc\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const result = await sdk.trigger(\"mem::sketch-gc\", {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-gc\", config: { api_path: \"/agentmemory/sketches/gc\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::crystallize\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.actionIds) return { status_code: 400, body: { error: \"actionIds is required\" } };\n const result = await sdk.trigger(\"mem::crystallize\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::crystallize\", config: { api_path: \"/agentmemory/crystals/create\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::crystal-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::crystal-list\", { project: params.project, sessionId: params.sessionId, limit: params.limit ? parseInt(params.limit as string) : undefined });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::crystal-list\", config: { api_path: \"/agentmemory/crystals\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::auto-crystallize\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::auto-crystallize\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::auto-crystallize\", config: { api_path: \"/agentmemory/crystals/auto\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::diagnose\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::diagnose\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::diagnose\", config: { api_path: \"/agentmemory/diagnostics\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::heal\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::heal\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::heal\", config: { api_path: \"/agentmemory/diagnostics/heal\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-tag\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.targetId || !body?.dimension || !body?.value) return { status_code: 400, body: { error: \"targetId, dimension, and value are required\" } };\n const result = await sdk.trigger(\"mem::facet-tag\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-tag\", config: { api_path: \"/agentmemory/facets\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-untag\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.targetId || !body?.dimension) return { status_code: 400, body: { error: \"targetId and dimension are required\" } };\n const result = await sdk.trigger(\"mem::facet-untag\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-untag\", config: { api_path: \"/agentmemory/facets/remove\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-query\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::facet-query\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-query\", config: { api_path: \"/agentmemory/facets/query\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-get\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n if (!params.targetId) return { status_code: 400, body: { error: \"targetId query param is required\" } };\n const result = await sdk.trigger(\"mem::facet-get\", { targetId: params.targetId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-get\", config: { api_path: \"/agentmemory/facets\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::facet-stats\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::facet-stats\", { targetType: params.targetType });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-stats\", config: { api_path: \"/agentmemory/facets/stats\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::verify\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.id || typeof body.id !== \"string\") return { status_code: 400, body: { error: \"id is required\" } };\n const result = await sdk.trigger(\"mem::verify\", { id: body.id });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::verify\", config: { api_path: \"/agentmemory/verify\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::cascade-update\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.supersededMemoryId || typeof body.supersededMemoryId !== \"string\") {\n return { status_code: 400, body: { error: \"supersededMemoryId is required\" } };\n }\n const result = await sdk.trigger(\"mem::cascade-update\", { supersededMemoryId: body.supersededMemoryId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::cascade-update\", config: { api_path: \"/agentmemory/cascade-update\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-save\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.content || typeof body.content !== \"string\") return { status_code: 400, body: { error: \"content is required\" } };\n const tags = typeof body.tags === \"string\" ? (body.tags as string).split(\",\").map((t: string) => t.trim()).filter(Boolean) : Array.isArray(body.tags) ? body.tags : [];\n const result = await sdk.trigger(\"mem::lesson-save\", {\n content: body.content,\n context: body.context || \"\",\n confidence: typeof body.confidence === \"number\" ? body.confidence : undefined,\n project: typeof body.project === \"string\" ? body.project : undefined,\n tags,\n source: \"manual\",\n }) as { action?: string };\n const statusCode = result?.action === \"created\" ? 201 : 200;\n return { status_code: statusCode, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-save\", config: { api_path: \"/agentmemory/lessons\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::lesson-list\", {\n project: params.project,\n source: params.source,\n minConfidence: params.minConfidence ? parseFloat(params.minConfidence as string) : undefined,\n limit: params.limit ? parseInt(params.limit as string, 10) : undefined,\n });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-list\", config: { api_path: \"/agentmemory/lessons\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::lesson-search\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.query || typeof body.query !== \"string\") return { status_code: 400, body: { error: \"query is required\" } };\n const result = await sdk.trigger(\"mem::lesson-recall\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-search\", config: { api_path: \"/agentmemory/lessons/search\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-strengthen\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.lessonId || typeof body.lessonId !== \"string\") return { status_code: 400, body: { error: \"lessonId is required\" } };\n const result = await sdk.trigger(\"mem::lesson-strengthen\", { lessonId: body.lessonId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-strengthen\", config: { api_path: \"/agentmemory/lessons/strengthen\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::obsidian-export\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = (req.body as Record<string, unknown>) || {};\n const types = typeof body.types === \"string\" ? body.types.split(\",\").map((t: string) => t.trim()).filter(Boolean) : undefined;\n const result = await sdk.trigger(\"mem::obsidian-export\", { vaultDir: body.vaultDir, types });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::obsidian-export\", config: { api_path: \"/agentmemory/obsidian/export\", http_method: \"POST\" } });\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { HookPayload, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerEventTriggers(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"event::session::started\" },\n async (data: { sessionId: string; project: string; cwd: string }) => {\n const session: Session = {\n id: data.sessionId,\n project: data.project,\n cwd: data.cwd,\n startedAt: new Date().toISOString(),\n status: \"active\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, data.sessionId, session);\n const contextResult = await sdk.trigger<\n { sessionId: string; project: string },\n { context: string }\n >(\"mem::context\", { sessionId: data.sessionId, project: data.project });\n return { session, context: contextResult.context };\n },\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::started\",\n config: { topic: \"agentmemory.session.started\" },\n });\n\n sdk.registerFunction(\n { id: \"event::observation\" },\n async (data: HookPayload) => sdk.trigger(\"mem::observe\", data),\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::observation\",\n config: { topic: \"agentmemory.observation\" },\n });\n\n sdk.registerFunction(\n { id: \"event::session::stopped\" },\n async (data: { sessionId: string }) => sdk.trigger(\"mem::summarize\", data),\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::stopped\",\n config: { topic: \"agentmemory.session.stopped\" },\n });\n\n sdk.registerFunction(\n { id: \"event::session::ended\" },\n async (data: { sessionId: string }) => {\n const session = await kv.get<Session>(KV.sessions, data.sessionId);\n if (session) {\n await kv.set(KV.sessions, data.sessionId, {\n ...session,\n endedAt: new Date().toISOString(),\n status: \"completed\",\n });\n }\n return { success: true };\n },\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::ended\",\n config: { topic: \"agentmemory.session.ended\" },\n });\n}\n","export type McpToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, { type: string; description: string }>;\n required?: string[];\n };\n};\n\nexport const CORE_TOOLS: McpToolDef[] = [\n {\n name: \"memory_recall\",\n description:\n \"Search past session observations for relevant context. Use when you need to recall what happened in previous sessions, find past decisions, or look up how a file was modified before.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (keywords, file names, concepts)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results to return (default 10)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_save\",\n description:\n \"Explicitly save an important insight, decision, or pattern to long-term memory.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"The insight or decision to remember\",\n },\n type: {\n type: \"string\",\n description:\n \"Memory type: pattern, preference, architecture, bug, workflow, or fact\",\n },\n concepts: {\n type: \"string\",\n description: \"Comma-separated key concepts\",\n },\n files: {\n type: \"string\",\n description: \"Comma-separated relevant file paths\",\n },\n },\n required: [\"content\"],\n },\n },\n {\n name: \"memory_file_history\",\n description: \"Get past observations about specific files.\",\n inputSchema: {\n type: \"object\",\n properties: {\n files: { type: \"string\", description: \"Comma-separated file paths\" },\n sessionId: {\n type: \"string\",\n description: \"Current session ID to exclude\",\n },\n },\n required: [\"files\"],\n },\n },\n {\n name: \"memory_patterns\",\n description: \"Detect recurring patterns across sessions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project path to analyze\" },\n },\n },\n },\n {\n name: \"memory_sessions\",\n description:\n \"List recent sessions with their status and observation counts.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"memory_smart_search\",\n description: \"Hybrid semantic+keyword search with progressive disclosure.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n expandIds: {\n type: \"string\",\n description: \"Comma-separated observation IDs to expand\",\n },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_timeline\",\n description: \"Chronological observations around an anchor point.\",\n inputSchema: {\n type: \"object\",\n properties: {\n anchor: {\n type: \"string\",\n description: \"Anchor point: ISO date or keyword\",\n },\n project: { type: \"string\", description: \"Filter by project path\" },\n before: {\n type: \"number\",\n description: \"Observations before anchor (default 5)\",\n },\n after: {\n type: \"number\",\n description: \"Observations after anchor (default 5)\",\n },\n },\n required: [\"anchor\"],\n },\n },\n {\n name: \"memory_profile\",\n description: \"User/project profile with top concepts and file patterns.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project path\" },\n refresh: {\n type: \"string\",\n description: \"Set to 'true' to force rebuild\",\n },\n },\n required: [\"project\"],\n },\n },\n {\n name: \"memory_export\",\n description: \"Export all memory data as JSON.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"memory_relations\",\n description: \"Query the memory relationship graph.\",\n inputSchema: {\n type: \"object\",\n properties: {\n memoryId: {\n type: \"string\",\n description: \"Memory ID to find relations for\",\n },\n maxHops: {\n type: \"number\",\n description: \"Max traversal depth (default 2)\",\n },\n minConfidence: {\n type: \"number\",\n description: \"Min confidence (0-1, default 0)\",\n },\n },\n required: [\"memoryId\"],\n },\n },\n];\n\nexport const V040_TOOLS: McpToolDef[] = [\n {\n name: \"memory_claude_bridge_sync\",\n description:\n \"Sync memory state to/from Claude Code's native MEMORY.md file.\",\n inputSchema: {\n type: \"object\",\n properties: {\n direction: {\n type: \"string\",\n description:\n \"'read' to import from MEMORY.md, 'write' to export to MEMORY.md\",\n },\n },\n required: [\"direction\"],\n },\n },\n {\n name: \"memory_graph_query\",\n description: \"Query the knowledge graph for entities and relationships.\",\n inputSchema: {\n type: \"object\",\n properties: {\n startNodeId: {\n type: \"string\",\n description: \"Starting node ID for traversal\",\n },\n nodeType: { type: \"string\", description: \"Filter by node type\" },\n maxDepth: {\n type: \"number\",\n description: \"Max BFS depth (default 3, max 5)\",\n },\n query: { type: \"string\", description: \"Search nodes by name\" },\n },\n },\n },\n {\n name: \"memory_consolidate\",\n description:\n \"Run the 4-tier memory consolidation pipeline (working -> episodic -> semantic -> procedural).\",\n inputSchema: {\n type: \"object\",\n properties: {\n tier: {\n type: \"string\",\n description: \"Target tier: episodic, semantic, or procedural\",\n },\n },\n },\n },\n {\n name: \"memory_team_share\",\n description: \"Share a memory or observation with team members.\",\n inputSchema: {\n type: \"object\",\n properties: {\n itemId: {\n type: \"string\",\n description: \"ID of memory or observation to share\",\n },\n itemType: {\n type: \"string\",\n description: \"Type: observation, memory, or pattern\",\n },\n },\n required: [\"itemId\", \"itemType\"],\n },\n },\n {\n name: \"memory_team_feed\",\n description: \"Get recent shared items from all team members.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Max items (default 20)\" },\n },\n },\n },\n {\n name: \"memory_audit\",\n description: \"View the audit trail of memory operations.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operation: { type: \"string\", description: \"Filter by operation type\" },\n limit: { type: \"number\", description: \"Max entries (default 50)\" },\n },\n },\n },\n {\n name: \"memory_governance_delete\",\n description: \"Delete specific memories with audit trail.\",\n inputSchema: {\n type: \"object\",\n properties: {\n memoryIds: {\n type: \"string\",\n description: \"Comma-separated memory IDs to delete\",\n },\n reason: { type: \"string\", description: \"Reason for deletion\" },\n },\n required: [\"memoryIds\"],\n },\n },\n {\n name: \"memory_snapshot_create\",\n description: \"Create a git-versioned snapshot of current memory state.\",\n inputSchema: {\n type: \"object\",\n properties: {\n message: { type: \"string\", description: \"Snapshot description\" },\n },\n },\n },\n];\n\nexport const V050_TOOLS: McpToolDef[] = [\n {\n name: \"memory_action_create\",\n description:\n \"Create an actionable work item with typed dependencies. Actions track what agents need to do and how work items relate to each other.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Action title\" },\n description: {\n type: \"string\",\n description: \"Detailed description of the work\",\n },\n priority: {\n type: \"number\",\n description: \"Priority 1-10 (10 highest)\",\n },\n project: { type: \"string\", description: \"Project path\" },\n tags: {\n type: \"string\",\n description: \"Comma-separated tags\",\n },\n parentId: {\n type: \"string\",\n description: \"Parent action ID for hierarchical actions\",\n },\n requires: {\n type: \"string\",\n description:\n \"Comma-separated action IDs that must complete before this\",\n },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"memory_action_update\",\n description:\n \"Update an action's status, priority, or details. Set status to 'done' to complete it and unblock dependent actions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionId: { type: \"string\", description: \"Action ID to update\" },\n status: {\n type: \"string\",\n description: \"New status: pending, active, done, blocked, cancelled\",\n },\n result: {\n type: \"string\",\n description: \"Outcome description (when completing)\",\n },\n priority: { type: \"number\", description: \"New priority 1-10\" },\n },\n required: [\"actionId\"],\n },\n },\n {\n name: \"memory_frontier\",\n description:\n \"Get all unblocked actions ranked by priority and urgency. Returns the frontier of actionable work with no unsatisfied dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Filter by project\" },\n agentId: {\n type: \"string\",\n description: \"Agent ID to check lease conflicts\",\n },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n },\n },\n },\n {\n name: \"memory_next\",\n description:\n \"Get the single most important next action to work on. Combines dependency resolution, priority, and recency into a score.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Filter by project\" },\n agentId: { type: \"string\", description: \"Current agent ID\" },\n },\n },\n },\n {\n name: \"memory_lease\",\n description:\n \"Acquire, release, or renew an exclusive lease on an action. Prevents multiple agents from working on the same thing.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionId: { type: \"string\", description: \"Action ID\" },\n agentId: { type: \"string\", description: \"Agent claiming the action\" },\n operation: {\n type: \"string\",\n description: \"acquire, release, or renew\",\n },\n result: {\n type: \"string\",\n description: \"Result when releasing (marks action done)\",\n },\n ttlMs: {\n type: \"number\",\n description: \"Lease duration in ms (default 10min, max 1hr)\",\n },\n },\n required: [\"actionId\", \"agentId\", \"operation\"],\n },\n },\n {\n name: \"memory_routine_run\",\n description:\n \"Instantiate a frozen workflow routine, creating actions for each step with proper dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n routineId: { type: \"string\", description: \"Routine template ID\" },\n project: { type: \"string\", description: \"Project context\" },\n initiatedBy: { type: \"string\", description: \"Agent starting the run\" },\n },\n required: [\"routineId\"],\n },\n },\n {\n name: \"memory_signal_send\",\n description:\n \"Send a message to another agent or broadcast. Supports threading, typed messages, and TTL expiration.\",\n inputSchema: {\n type: \"object\",\n properties: {\n from: { type: \"string\", description: \"Sender agent ID\" },\n to: {\n type: \"string\",\n description: \"Recipient agent ID (omit for broadcast)\",\n },\n content: { type: \"string\", description: \"Message content\" },\n type: {\n type: \"string\",\n description: \"Message type: info, request, response, alert, handoff\",\n },\n replyTo: {\n type: \"string\",\n description: \"Signal ID to reply to (auto-threads)\",\n },\n },\n required: [\"from\", \"content\"],\n },\n },\n {\n name: \"memory_signal_read\",\n description:\n \"Read messages for an agent. Marks delivered messages as read.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"Agent to read messages for\" },\n unreadOnly: {\n type: \"string\",\n description: \"Set to 'true' for unread only\",\n },\n threadId: {\n type: \"string\",\n description: \"Filter by conversation thread\",\n },\n limit: { type: \"number\", description: \"Max messages (default 50)\" },\n },\n required: [\"agentId\"],\n },\n },\n {\n name: \"memory_checkpoint\",\n description:\n \"Create or resolve an external checkpoint (CI result, approval, deploy status) that gates action progress.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operation: {\n type: \"string\",\n description: \"create, resolve, or list\",\n },\n name: { type: \"string\", description: \"Checkpoint name (for create)\" },\n checkpointId: {\n type: \"string\",\n description: \"Checkpoint ID (for resolve)\",\n },\n status: {\n type: \"string\",\n description: \"passed or failed (for resolve)\",\n },\n type: {\n type: \"string\",\n description: \"Checkpoint type: ci, approval, deploy, external, timer\",\n },\n linkedActionIds: {\n type: \"string\",\n description:\n \"Comma-separated action IDs this checkpoint gates (for create)\",\n },\n },\n required: [\"operation\"],\n },\n },\n {\n name: \"memory_mesh_sync\",\n description:\n \"Sync memories and actions with peer agentmemory instances for multi-agent collaboration.\",\n inputSchema: {\n type: \"object\",\n properties: {\n peerId: {\n type: \"string\",\n description: \"Specific peer ID (omit for all)\",\n },\n direction: {\n type: \"string\",\n description: \"push, pull, or both (default both)\",\n },\n },\n },\n },\n];\n\nexport const V051_TOOLS: McpToolDef[] = [\n {\n name: \"memory_sentinel_create\",\n description:\n \"Create an event-driven sentinel that watches for conditions (webhook, timer, threshold, pattern, approval) and auto-unblocks gated actions when triggered.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Sentinel name\" },\n type: {\n type: \"string\",\n description: \"Type: webhook, timer, threshold, pattern, approval, custom\",\n },\n config: {\n type: \"string\",\n description: \"JSON config (timer: {durationMs}, threshold: {metric,operator,value}, pattern: {pattern}, webhook: {path})\",\n },\n linkedActionIds: {\n type: \"string\",\n description: \"Comma-separated action IDs to gate\",\n },\n expiresInMs: { type: \"number\", description: \"Auto-expire after ms\" },\n },\n required: [\"name\", \"type\"],\n },\n },\n {\n name: \"memory_sentinel_trigger\",\n description:\n \"Externally fire a sentinel, providing an optional result payload. Unblocks any gated actions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sentinelId: { type: \"string\", description: \"Sentinel ID to trigger\" },\n result: { type: \"string\", description: \"JSON result payload\" },\n },\n required: [\"sentinelId\"],\n },\n },\n {\n name: \"memory_sketch_create\",\n description:\n \"Create an ephemeral action graph for exploratory work. Auto-expires after TTL. Can be promoted to permanent actions or discarded.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Sketch title\" },\n description: { type: \"string\", description: \"What this sketch explores\" },\n expiresInMs: { type: \"number\", description: \"TTL in ms (default 1 hour)\" },\n project: { type: \"string\", description: \"Project context\" },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"memory_sketch_promote\",\n description:\n \"Promote a sketch's ephemeral actions to permanent actions. Makes the exploratory work official.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sketchId: { type: \"string\", description: \"Sketch ID to promote\" },\n project: { type: \"string\", description: \"Override project for promoted actions\" },\n },\n required: [\"sketchId\"],\n },\n },\n {\n name: \"memory_crystallize\",\n description:\n \"Compress completed action chains into compact crystal digests using LLM summarization. Extracts narrative, key outcomes, files affected, and lessons.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionIds: {\n type: \"string\",\n description: \"Comma-separated completed action IDs to crystallize\",\n },\n project: { type: \"string\", description: \"Project context\" },\n sessionId: { type: \"string\", description: \"Session context\" },\n },\n required: [\"actionIds\"],\n },\n },\n {\n name: \"memory_diagnose\",\n description:\n \"Run health checks across all subsystems (actions, leases, sentinels, sketches, signals, sessions, memories, mesh). Identifies stuck, orphaned, and inconsistent state.\",\n inputSchema: {\n type: \"object\",\n properties: {\n categories: {\n type: \"string\",\n description: \"Comma-separated categories to check (default all)\",\n },\n },\n },\n },\n {\n name: \"memory_heal\",\n description:\n \"Auto-fix all fixable issues found by diagnostics. Unblocks stuck actions, expires stale leases, cleans up orphaned data.\",\n inputSchema: {\n type: \"object\",\n properties: {\n categories: {\n type: \"string\",\n description: \"Comma-separated categories to heal (default all)\",\n },\n dryRun: {\n type: \"string\",\n description: \"Set to 'true' for dry run (report but don't fix)\",\n },\n },\n },\n },\n {\n name: \"memory_facet_tag\",\n description:\n \"Attach a structured tag (dimension:value) to an action, memory, or observation for multi-dimensional categorization.\",\n inputSchema: {\n type: \"object\",\n properties: {\n targetId: { type: \"string\", description: \"ID of the target to tag\" },\n targetType: {\n type: \"string\",\n description: \"Type: action, memory, or observation\",\n },\n dimension: { type: \"string\", description: \"Tag dimension (e.g., priority, team, status)\" },\n value: { type: \"string\", description: \"Tag value (e.g., urgent, backend, reviewed)\" },\n },\n required: [\"targetId\", \"targetType\", \"dimension\", \"value\"],\n },\n },\n {\n name: \"memory_facet_query\",\n description:\n \"Query targets by facet tags with AND/OR logic. Find all actions tagged priority:urgent AND team:backend.\",\n inputSchema: {\n type: \"object\",\n properties: {\n matchAll: {\n type: \"string\",\n description: \"Comma-separated dimension:value pairs (AND logic)\",\n },\n matchAny: {\n type: \"string\",\n description: \"Comma-separated dimension:value pairs (OR logic)\",\n },\n targetType: {\n type: \"string\",\n description: \"Filter by type: action, memory, or observation\",\n },\n },\n },\n },\n];\n\nexport const V061_TOOLS: McpToolDef[] = [\n {\n name: \"memory_verify\",\n description:\n \"Verify a memory or observation by tracing its citation chain back to source observations and session context. Returns provenance information including confidence scores.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Memory ID or observation ID to verify\",\n },\n },\n required: [\"id\"],\n },\n },\n];\n\nexport const V070_TOOLS: McpToolDef[] = [\n {\n name: \"memory_lesson_save\",\n description:\n \"Save a lesson learned from this session. Lessons have confidence scores that strengthen when reinforced and decay when not used. Duplicate content auto-strengthens the existing lesson.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"The lesson learned (what worked, what to avoid, when to use X approach)\",\n },\n context: {\n type: \"string\",\n description: \"When/where this lesson applies\",\n },\n confidence: {\n type: \"number\",\n description: \"Initial confidence 0.0-1.0 (default 0.5)\",\n },\n project: { type: \"string\", description: \"Project this lesson is about\" },\n tags: { type: \"string\", description: \"Comma-separated tags\" },\n },\n required: [\"content\"],\n },\n },\n {\n name: \"memory_lesson_recall\",\n description:\n \"Search lessons by query. Returns lessons sorted by confidence and recency. Use to check what the agent has learned before making decisions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Filter by project\" },\n minConfidence: {\n type: \"number\",\n description: \"Minimum confidence threshold (default 0.1)\",\n },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_obsidian_export\",\n description:\n \"Export memories, lessons, and crystals as Obsidian-compatible Markdown files with YAML frontmatter and wikilinks for graph view.\",\n inputSchema: {\n type: \"object\",\n properties: {\n vaultDir: {\n type: \"string\",\n description: \"Output directory (default ~/.agentmemory/vault/)\",\n },\n types: {\n type: \"string\",\n description: \"Comma-separated types to export: memories,lessons,crystals,sessions (default all)\",\n },\n },\n },\n },\n];\n\nconst ESSENTIAL_TOOLS = new Set([\n \"memory_save\",\n \"memory_recall\",\n \"memory_consolidate\",\n \"memory_smart_search\",\n \"memory_sessions\",\n \"memory_diagnose\",\n \"memory_lesson_save\",\n]);\n\nexport function getAllTools(): McpToolDef[] {\n return [...CORE_TOOLS, ...V040_TOOLS, ...V050_TOOLS, ...V051_TOOLS, ...V061_TOOLS, ...V070_TOOLS];\n}\n\nexport function getVisibleTools(): McpToolDef[] {\n const mode = process.env[\"AGENTMEMORY_TOOLS\"] || \"core\";\n if (mode === \"all\") return getAllTools();\n return getAllTools().filter((t) => ESSENTIAL_TOOLS.has(t.name));\n}\n","import type { ISdk, ApiRequest } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n SessionSummary,\n Memory,\n Session,\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { getVisibleTools } from \"./tools-registry.js\";\nimport { timingSafeCompare } from \"../auth.js\";\n\ntype McpResponse = {\n status_code: number;\n headers?: Record<string, string>;\n body: unknown;\n};\n\nexport function registerMcpEndpoints(\n sdk: ISdk,\n kv: StateKV,\n secret?: string,\n): void {\n function checkAuth(\n req: ApiRequest,\n sec: string | undefined,\n ): McpResponse | null {\n if (!sec) return null;\n const auth =\n req.headers?.[\"authorization\"] || req.headers?.[\"Authorization\"];\n if (typeof auth !== \"string\" || !timingSafeCompare(auth, `Bearer ${sec}`)) {\n return { status_code: 401, body: { error: \"unauthorized\" } };\n }\n return null;\n }\n\n sdk.registerFunction(\n { id: \"mcp::tools::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { tools: getVisibleTools() } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::tools::list\",\n config: { api_path: \"/agentmemory/mcp/tools\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::tools::call\" },\n async (\n req: ApiRequest<{ name: string; arguments: Record<string, unknown> }>,\n ): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n if (!req.body || typeof req.body.name !== \"string\") {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n\n const { name, arguments: args = {} } = req.body;\n\n try {\n switch (name) {\n case \"memory_recall\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return {\n status_code: 400,\n body: { error: \"query is required for memory_recall\" },\n };\n }\n const result = await sdk.trigger(\"mem::search\", {\n query: args.query,\n limit: (args.limit as number) || 10,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_save\": {\n if (typeof args.content !== \"string\" || !args.content.trim()) {\n return {\n status_code: 400,\n body: { error: \"content is required for memory_save\" },\n };\n }\n const type = (args.type as string) || \"fact\";\n const concepts =\n typeof args.concepts === \"string\"\n ? args.concepts.split(\",\").map((c: string) => c.trim()).filter(Boolean)\n : [];\n const files =\n typeof args.files === \"string\"\n ? args.files.split(\",\").map((f: string) => f.trim()).filter(Boolean)\n : [];\n\n const result = await sdk.trigger(\"mem::remember\", {\n content: args.content,\n type,\n concepts,\n files,\n });\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n },\n };\n }\n\n case \"memory_file_history\": {\n if (typeof args.files !== \"string\" || !args.files.trim()) {\n return {\n status_code: 400,\n body: { error: \"files is required for memory_file_history\" },\n };\n }\n const fileList = (args.files as string)\n .split(\",\")\n .map((f: string) => f.trim());\n const result = await sdk.trigger(\"mem::file-context\", {\n sessionId: (args.sessionId as string) || \"\",\n files: fileList,\n });\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text:\n (result as { context: string }).context ||\n \"No history found.\",\n },\n ],\n },\n };\n }\n\n case \"memory_patterns\": {\n const result = await sdk.trigger(\"mem::patterns\", {\n project: args.project as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_sessions\": {\n const sessions = await kv.list(KV.sessions);\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions }, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_smart_search\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return {\n status_code: 400,\n body: { error: \"query is required for memory_smart_search\" },\n };\n }\n const expandIds =\n typeof args.expandIds === \"string\"\n ? args.expandIds.split(\",\").map((id: string) => id.trim()).slice(0, 20)\n : [];\n const result = await sdk.trigger(\"mem::smart-search\", {\n query: args.query,\n expandIds,\n limit: (args.limit as number) || 10,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_timeline\": {\n if (typeof args.anchor !== \"string\" || !args.anchor.trim()) {\n return {\n status_code: 400,\n body: { error: \"anchor is required for memory_timeline\" },\n };\n }\n const result = await sdk.trigger(\"mem::timeline\", {\n anchor: args.anchor,\n project: (args.project as string) || undefined,\n before: (args.before as number) || 5,\n after: (args.after as number) || 5,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_profile\": {\n if (typeof args.project !== \"string\" || !args.project.trim()) {\n return {\n status_code: 400,\n body: { error: \"project is required for memory_profile\" },\n };\n }\n const result = await sdk.trigger(\"mem::profile\", {\n project: args.project,\n refresh: args.refresh === \"true\",\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_export\": {\n const result = await sdk.trigger(\"mem::export\", {});\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_relations\": {\n if (typeof args.memoryId !== \"string\" || !args.memoryId.trim()) {\n return {\n status_code: 400,\n body: { error: \"memoryId is required for memory_relations\" },\n };\n }\n const rawMaxHops = Number(args.maxHops);\n const rawMinConf = Number(args.minConfidence);\n const result = await sdk.trigger(\"mem::get-related\", {\n memoryId: args.memoryId,\n maxHops: Number.isFinite(rawMaxHops) ? rawMaxHops : 2,\n minConfidence: Number.isFinite(rawMinConf)\n ? Math.max(0, Math.min(1, rawMinConf))\n : 0,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_claude_bridge_sync\": {\n const direction = (args.direction as string) || \"write\";\n const funcId =\n direction === \"read\"\n ? \"mem::claude-bridge-read\"\n : \"mem::claude-bridge-sync\";\n try {\n const result = await sdk.trigger(funcId, {});\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Claude bridge not enabled. Set CLAUDE_MEMORY_BRIDGE=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_graph_query\": {\n try {\n const result = await sdk.trigger(\"mem::graph-query\", {\n startNodeId: args.startNodeId as string,\n nodeType: args.nodeType as string,\n maxDepth: args.maxDepth as number,\n query: args.query as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Knowledge graph not enabled. Set GRAPH_EXTRACTION_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_consolidate\": {\n try {\n const result = await sdk.trigger(\"mem::consolidate-pipeline\", {\n tier: args.tier as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Consolidation not enabled. Set CONSOLIDATION_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_team_share\": {\n if (\n typeof args.itemId !== \"string\" ||\n typeof args.itemType !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"itemId and itemType are required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::team-share\", {\n itemId: args.itemId,\n itemType: args.itemType,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Team memory not enabled. Set TEAM_ID and USER_ID\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_team_feed\": {\n try {\n const result = await sdk.trigger(\"mem::team-feed\", {\n limit: (args.limit as number) || 20,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Team memory not enabled. Set TEAM_ID and USER_ID\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_audit\": {\n try {\n const result = await sdk.trigger(\"mem::audit-query\", {\n operation: args.operation as string,\n limit: (args.limit as number) || 50,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: \"Audit query failed\" }],\n isError: true,\n },\n };\n }\n }\n\n case \"memory_governance_delete\": {\n if (typeof args.memoryIds !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"memoryIds is required\" },\n };\n }\n const ids = (args.memoryIds as string)\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n try {\n const result = await sdk.trigger(\"mem::governance-delete\", {\n memoryIds: ids,\n reason: args.reason as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: \"Governance delete failed\" }],\n isError: true,\n },\n };\n }\n }\n\n case \"memory_snapshot_create\": {\n try {\n const result = await sdk.trigger(\"mem::snapshot-create\", {\n message: args.message as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Snapshots not enabled. Set SNAPSHOT_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_action_create\": {\n if (typeof args.title !== \"string\" || !args.title.trim()) {\n return {\n status_code: 400,\n body: { error: \"title is required\" },\n };\n }\n const edges: Array<{ type: string; targetActionId: string }> = [];\n if (typeof args.requires === \"string\" && args.requires.trim()) {\n for (const id of args.requires.split(\",\").map((s: string) => s.trim()).filter(Boolean)) {\n edges.push({ type: \"requires\", targetActionId: id });\n }\n }\n const tags = typeof args.tags === \"string\" && args.tags.trim()\n ? args.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : [];\n const actionResult = await sdk.trigger(\"mem::action-create\", {\n title: args.title,\n description: args.description,\n priority: args.priority,\n project: args.project,\n tags,\n parentId: args.parentId,\n edges: edges.length > 0 ? edges : undefined,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(actionResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_action_update\": {\n if (typeof args.actionId !== \"string\" || !args.actionId.trim()) {\n return {\n status_code: 400,\n body: { error: \"actionId is required\" },\n };\n }\n const updateResult = await sdk.trigger(\"mem::action-update\", {\n actionId: args.actionId,\n status: args.status,\n result: args.result,\n priority: args.priority,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(updateResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_frontier\": {\n const frontierResult = await sdk.trigger(\"mem::frontier\", {\n project: args.project,\n agentId: args.agentId,\n limit: args.limit,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(frontierResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_next\": {\n const nextResult = await sdk.trigger(\"mem::next\", {\n project: args.project,\n agentId: args.agentId,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(nextResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_lease\": {\n if (\n typeof args.actionId !== \"string\" ||\n typeof args.agentId !== \"string\" ||\n typeof args.operation !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"actionId, agentId, and operation are required\" },\n };\n }\n const op = args.operation as string;\n let leaseResult;\n if (op === \"acquire\") {\n leaseResult = await sdk.trigger(\"mem::lease-acquire\", {\n actionId: args.actionId,\n agentId: args.agentId,\n ttlMs: args.ttlMs,\n });\n } else if (op === \"release\") {\n leaseResult = await sdk.trigger(\"mem::lease-release\", {\n actionId: args.actionId,\n agentId: args.agentId,\n result: args.result,\n });\n } else if (op === \"renew\") {\n leaseResult = await sdk.trigger(\"mem::lease-renew\", {\n actionId: args.actionId,\n agentId: args.agentId,\n ttlMs: args.ttlMs,\n });\n } else {\n return {\n status_code: 400,\n body: { error: \"operation must be acquire, release, or renew\" },\n };\n }\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(leaseResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_routine_run\": {\n if (typeof args.routineId !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"routineId is required\" },\n };\n }\n const runResult = await sdk.trigger(\"mem::routine-run\", {\n routineId: args.routineId,\n project: args.project,\n initiatedBy: args.initiatedBy,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(runResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_signal_send\": {\n if (\n typeof args.from !== \"string\" ||\n typeof args.content !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"from and content are required\" },\n };\n }\n const sigResult = await sdk.trigger(\"mem::signal-send\", {\n from: args.from,\n to: args.to,\n content: args.content,\n type: args.type,\n replyTo: args.replyTo,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(sigResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_signal_read\": {\n if (typeof args.agentId !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"agentId is required\" },\n };\n }\n const readResult = await sdk.trigger(\"mem::signal-read\", {\n agentId: args.agentId,\n unreadOnly: args.unreadOnly === true || args.unreadOnly === \"true\",\n threadId: args.threadId,\n limit: args.limit,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(readResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_checkpoint\": {\n const cpOp = args.operation as string;\n if (!cpOp) {\n return {\n status_code: 400,\n body: { error: \"operation is required\" },\n };\n }\n let cpResult;\n if (cpOp === \"create\") {\n const linkedIds = typeof args.linkedActionIds === \"string\" && args.linkedActionIds.trim()\n ? args.linkedActionIds.split(\",\").map((s: string) => s.trim())\n : [];\n cpResult = await sdk.trigger(\"mem::checkpoint-create\", {\n name: args.name,\n description: args.description,\n type: args.type,\n linkedActionIds: linkedIds,\n });\n } else if (cpOp === \"resolve\") {\n if (typeof args.checkpointId !== \"string\" || !args.checkpointId.trim()) {\n return {\n status_code: 400,\n body: { error: \"checkpointId is required for resolve operation\" },\n };\n }\n cpResult = await sdk.trigger(\"mem::checkpoint-resolve\", {\n checkpointId: args.checkpointId,\n status: args.status,\n });\n } else if (cpOp === \"list\") {\n cpResult = await sdk.trigger(\"mem::checkpoint-list\", {\n status: args.status,\n type: args.type,\n });\n } else {\n return {\n status_code: 400,\n body: { error: \"operation must be create, resolve, or list\" },\n };\n }\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(cpResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_mesh_sync\": {\n const meshResult = await sdk.trigger(\"mem::mesh-sync\", {\n peerId: args.peerId,\n direction: args.direction,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(meshResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_sentinel_create\": {\n let snlConfig: Record<string, unknown> = {};\n if (typeof args.config === \"object\" && args.config !== null) {\n snlConfig = args.config as Record<string, unknown>;\n } else if (typeof args.config === \"string\" && args.config.trim()) {\n try { snlConfig = JSON.parse(args.config); } catch { return { status_code: 400, body: { error: \"invalid config JSON\" } }; }\n }\n const snlLinked = typeof args.linkedActionIds === \"string\" && args.linkedActionIds.trim()\n ? args.linkedActionIds.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const snlResult = await sdk.trigger(\"mem::sentinel-create\", {\n name: args.name,\n type: args.type,\n config: snlConfig,\n linkedActionIds: snlLinked,\n expiresInMs: args.expiresInMs,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(snlResult, null, 2) }] } };\n }\n\n case \"memory_sentinel_trigger\": {\n let snlTrigPayload: unknown;\n if (args.result !== undefined && args.result !== null) {\n if (typeof args.result === \"string\") {\n try { snlTrigPayload = JSON.parse(args.result); } catch { return { status_code: 400, body: { error: \"invalid result JSON\" } }; }\n } else {\n snlTrigPayload = args.result;\n }\n }\n const snlTrigResult = await sdk.trigger(\"mem::sentinel-trigger\", {\n sentinelId: args.sentinelId,\n result: snlTrigPayload,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(snlTrigResult, null, 2) }] } };\n }\n\n case \"memory_sketch_create\": {\n const skResult = await sdk.trigger(\"mem::sketch-create\", {\n title: args.title,\n description: args.description,\n expiresInMs: args.expiresInMs,\n project: args.project,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(skResult, null, 2) }] } };\n }\n\n case \"memory_sketch_promote\": {\n const skpResult = await sdk.trigger(\"mem::sketch-promote\", {\n sketchId: args.sketchId,\n project: args.project,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(skpResult, null, 2) }] } };\n }\n\n case \"memory_crystallize\": {\n if (typeof args.actionIds !== \"string\" || !args.actionIds.trim()) {\n return { status_code: 400, body: { error: \"actionIds is required\" } };\n }\n const crysIds = args.actionIds.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n const crysResult = await sdk.trigger(\"mem::crystallize\", {\n actionIds: crysIds,\n project: args.project,\n sessionId: args.sessionId,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(crysResult, null, 2) }] } };\n }\n\n case \"memory_diagnose\": {\n const diagCats = typeof args.categories === \"string\" && args.categories.trim()\n ? args.categories.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const diagResult = await sdk.trigger(\"mem::diagnose\", { categories: diagCats });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(diagResult, null, 2) }] } };\n }\n\n case \"memory_heal\": {\n const healCats = typeof args.categories === \"string\" && args.categories.trim()\n ? args.categories.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const healResult = await sdk.trigger(\"mem::heal\", {\n categories: healCats,\n dryRun: args.dryRun === true || args.dryRun === \"true\",\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(healResult, null, 2) }] } };\n }\n\n case \"memory_facet_tag\": {\n const fctResult = await sdk.trigger(\"mem::facet-tag\", {\n targetId: args.targetId,\n targetType: args.targetType,\n dimension: args.dimension,\n value: args.value,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(fctResult, null, 2) }] } };\n }\n\n case \"memory_facet_query\": {\n if (args.matchAll !== undefined && typeof args.matchAll !== \"string\") {\n return { status_code: 400, body: { error: \"matchAll must be a string\" } };\n }\n if (args.matchAny !== undefined && typeof args.matchAny !== \"string\") {\n return { status_code: 400, body: { error: \"matchAny must be a string\" } };\n }\n const fqAll = typeof args.matchAll === \"string\" && args.matchAll.trim()\n ? args.matchAll.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const fqAny = typeof args.matchAny === \"string\" && args.matchAny.trim()\n ? args.matchAny.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const fqResult = await sdk.trigger(\"mem::facet-query\", {\n matchAll: fqAll,\n matchAny: fqAny,\n targetType: args.targetType,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(fqResult, null, 2) }] } };\n }\n\n case \"memory_verify\": {\n if (!args.id || typeof args.id !== \"string\") {\n return { status_code: 400, body: { error: \"id is required\" } };\n }\n const verifyResult = await sdk.trigger(\"mem::verify\", { id: args.id });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(verifyResult, null, 2) }] } };\n }\n\n case \"memory_lesson_save\": {\n if (typeof args.content !== \"string\" || !args.content.trim()) {\n return { status_code: 400, body: { error: \"content is required\" } };\n }\n const lessonTags = typeof args.tags === \"string\" && args.tags.trim()\n ? args.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : [];\n const lessonSaveResult = await sdk.trigger(\"mem::lesson-save\", {\n content: args.content,\n context: args.context || \"\",\n confidence: args.confidence,\n project: args.project,\n tags: lessonTags,\n source: \"manual\",\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(lessonSaveResult, null, 2) }] } };\n }\n\n case \"memory_lesson_recall\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return { status_code: 400, body: { error: \"query is required\" } };\n }\n const lessonRecallResult = await sdk.trigger(\"mem::lesson-recall\", {\n query: args.query,\n project: args.project,\n minConfidence: args.minConfidence,\n limit: args.limit,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(lessonRecallResult, null, 2) }] } };\n }\n\n case \"memory_obsidian_export\": {\n const exportTypes = typeof args.types === \"string\" && args.types.trim()\n ? args.types.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : undefined;\n const obsidianResult = await sdk.trigger(\"mem::obsidian-export\", {\n vaultDir: args.vaultDir,\n types: exportTypes,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(obsidianResult, null, 2) }] } };\n }\n\n default:\n return {\n status_code: 400,\n body: { error: `Unknown tool: ${name}` },\n };\n }\n } catch (err) {\n return {\n status_code: 500,\n body: {\n error: \"Internal error\",\n },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::tools::call\",\n config: { api_path: \"/agentmemory/mcp/call\", http_method: \"POST\" },\n });\n\n const MCP_RESOURCES = [\n {\n uri: \"agentmemory://status\",\n name: \"Agent Memory Status\",\n description: \"Current session count, memory count, and health status\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://project/{name}/profile\",\n name: \"Project Profile\",\n description:\n \"Top concepts, frequently modified files, and conventions for a project\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://project/{name}/recent\",\n name: \"Recent Sessions\",\n description: \"Last 5 session summaries for a project\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://memories/latest\",\n name: \"Latest Memories\",\n description: \"Top 10 latest memories with their type and strength\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://graph/stats\",\n name: \"Knowledge Graph Stats\",\n description: \"Node and edge counts by type in the knowledge graph\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://team/{id}/profile\",\n name: \"Team Profile\",\n description: \"Team memory profile with shared concepts and patterns\",\n mimeType: \"application/json\",\n },\n ];\n\n sdk.registerFunction(\n { id: \"mcp::resources::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { resources: MCP_RESOURCES } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::resources::list\",\n config: { api_path: \"/agentmemory/mcp/resources\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::resources::read\" },\n async (req: ApiRequest<{ uri: string }>): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const uri = req.body?.uri;\n if (!uri || typeof uri !== \"string\") {\n return { status_code: 400, body: { error: \"uri is required\" } };\n }\n\n try {\n if (uri === \"agentmemory://status\") {\n const sessions = await kv.list<Session>(KV.sessions);\n const memories = await kv.list<Memory>(KV.memories);\n const healthData = await kv.list(KV.health).catch(() => []);\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n sessionCount: sessions.length,\n memoryCount: memories.length,\n healthStatus:\n healthData.length > 0 ? \"available\" : \"no-data\",\n }),\n },\n ],\n },\n };\n }\n\n const projectProfileMatch = uri.match(\n /^agentmemory:\\/\\/project\\/(.+)\\/profile$/,\n );\n if (projectProfileMatch) {\n let projectName: string;\n try {\n projectName = decodeURIComponent(projectProfileMatch[1]);\n } catch {\n return {\n status_code: 400,\n body: { error: \"Invalid percent-encoding in URI\" },\n };\n }\n const profile = await sdk.trigger(\"mem::profile\", {\n project: projectName,\n });\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(profile),\n },\n ],\n },\n };\n }\n\n const projectRecentMatch = uri.match(\n /^agentmemory:\\/\\/project\\/(.+)\\/recent$/,\n );\n if (projectRecentMatch) {\n let projectName: string;\n try {\n projectName = decodeURIComponent(projectRecentMatch[1]);\n } catch {\n return {\n status_code: 400,\n body: { error: \"Invalid percent-encoding in URI\" },\n };\n }\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const filtered = summaries\n .filter((s) => s.project === projectName)\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n )\n .slice(0, 5);\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(filtered),\n },\n ],\n },\n };\n }\n\n if (uri === \"agentmemory://memories/latest\") {\n const memories = await kv.list<Memory>(KV.memories);\n const latest = memories\n .filter((m) => m.isLatest)\n .sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() -\n new Date(a.updatedAt).getTime(),\n )\n .slice(0, 10)\n .map((m) => ({\n id: m.id,\n title: m.title,\n type: m.type,\n strength: m.strength,\n }));\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(latest),\n },\n ],\n },\n };\n }\n\n if (uri === \"agentmemory://graph/stats\") {\n try {\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n const nodesByType: Record<string, number> = {};\n for (const n of nodes)\n nodesByType[n.type] = (nodesByType[n.type] || 0) + 1;\n const edgesByType: Record<string, number> = {};\n for (const e of edges)\n edgesByType[e.type] = (edgesByType[e.type] || 0) + 1;\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n totalNodes: nodes.length,\n totalEdges: edges.length,\n nodesByType,\n edgesByType,\n }),\n },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n totalNodes: 0,\n totalEdges: 0,\n }),\n },\n ],\n },\n };\n }\n }\n\n const teamProfileMatch = uri.match(\n /^agentmemory:\\/\\/team\\/(.+)\\/profile$/,\n );\n if (teamProfileMatch) {\n try {\n const teamId = decodeURIComponent(teamProfileMatch[1]);\n const items = await kv.list(KV.teamShared(teamId));\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n teamId,\n sharedItems: items.length,\n }),\n },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n teamId: teamProfileMatch[1],\n sharedItems: 0,\n }),\n },\n ],\n },\n };\n }\n }\n\n return {\n status_code: 404,\n body: { error: `Unknown resource: ${uri}` },\n };\n } catch {\n return { status_code: 500, body: { error: \"Internal error\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::resources::read\",\n config: {\n api_path: \"/agentmemory/mcp/resources/read\",\n http_method: \"POST\",\n },\n });\n\n const MCP_PROMPTS = [\n {\n name: \"recall_context\",\n description:\n \"Search observations and memories to build context for a task\",\n arguments: [\n {\n name: \"task_description\",\n description: \"What you are working on\",\n required: true,\n },\n ],\n },\n {\n name: \"session_handoff\",\n description:\n \"Generate a handoff summary for continuing work in a new session\",\n arguments: [\n {\n name: \"session_id\",\n description: \"Session ID to hand off from\",\n required: true,\n },\n ],\n },\n {\n name: \"detect_patterns\",\n description: \"Detect recurring patterns across sessions for a project\",\n arguments: [\n {\n name: \"project\",\n description: \"Project path to analyze (optional)\",\n required: false,\n },\n ],\n },\n ];\n\n sdk.registerFunction(\n { id: \"mcp::prompts::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { prompts: MCP_PROMPTS } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::prompts::list\",\n config: { api_path: \"/agentmemory/mcp/prompts\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::prompts::get\" },\n async (\n req: ApiRequest<{ name: string; arguments?: Record<string, string> }>,\n ): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const promptName = req.body?.name;\n if (!promptName || typeof promptName !== \"string\") {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n\n const promptArgs = req.body?.arguments || {};\n\n try {\n switch (promptName) {\n case \"recall_context\": {\n const taskDesc = promptArgs.task_description;\n if (typeof taskDesc !== \"string\" || !taskDesc.trim()) {\n return {\n status_code: 400,\n body: {\n error:\n \"task_description argument is required and must be a string\",\n },\n };\n }\n const searchResult = await sdk\n .trigger(\"mem::search\", { query: taskDesc, limit: 10 })\n .catch(() => ({ results: [] }));\n const memories = await kv.list<Memory>(KV.memories);\n const relevant = memories.filter((m) => m.isLatest).slice(0, 5);\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Here is relevant context from past sessions for the task: \"${taskDesc}\"\\n\\n## Past Observations\\n${JSON.stringify(searchResult, null, 2)}\\n\\n## Relevant Memories\\n${JSON.stringify(relevant, null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n case \"session_handoff\": {\n const sessionId = promptArgs.session_id;\n if (typeof sessionId !== \"string\" || !sessionId.trim()) {\n return {\n status_code: 400,\n body: {\n error: \"session_id argument is required and must be a string\",\n },\n };\n }\n const session = await kv.get<Session>(KV.sessions, sessionId);\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const summary = summaries.find((s) => s.sessionId === sessionId);\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `## Session Handoff\\n\\n### Session\\n${JSON.stringify(session, null, 2)}\\n\\n### Summary\\n${JSON.stringify(summary || \"No summary available\", null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n case \"detect_patterns\": {\n if (\n promptArgs.project !== undefined &&\n typeof promptArgs.project !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"project argument must be a string\" },\n };\n }\n const result = await sdk.trigger(\"mem::patterns\", {\n project: promptArgs.project || undefined,\n });\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `## Pattern Analysis\\n\\n${JSON.stringify(result, null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n default:\n return {\n status_code: 400,\n body: { error: `Unknown prompt: ${promptName}` },\n };\n }\n } catch {\n return { status_code: 500, body: { error: \"Internal error\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::prompts::get\",\n config: { api_path: \"/agentmemory/mcp/prompts/get\", http_method: \"POST\" },\n });\n}\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { timingSafeCompare, VIEWER_CSP } from \"../auth.js\";\n\nconst ALLOWED_ORIGINS = (\n process.env.VIEWER_ALLOWED_ORIGINS ||\n \"http://localhost:3111,http://localhost:3113,http://127.0.0.1:3111,http://127.0.0.1:3113\"\n)\n .split(\",\")\n .map((o) => o.trim());\n\nfunction corsHeaders(req: IncomingMessage): Record<string, string> {\n const origin = req.headers.origin || \"\";\n const allowed = ALLOWED_ORIGINS.includes(origin)\n ? origin\n : ALLOWED_ORIGINS[0];\n return {\n \"Access-Control-Allow-Origin\": allowed,\n \"Access-Control-Allow-Methods\": \"GET, POST, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n Vary: \"Origin\",\n };\n}\n\nfunction json(\n res: ServerResponse,\n status: number,\n data: unknown,\n req?: IncomingMessage,\n): void {\n const body = JSON.stringify(data);\n const cors = req\n ? corsHeaders(req)\n : { \"Access-Control-Allow-Origin\": ALLOWED_ORIGINS[0], Vary: \"Origin\" };\n res.writeHead(status, { ...cors, \"Content-Type\": \"application/json\" });\n res.end(body);\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1_000_000) {\n req.destroy();\n reject(new Error(\"too large\"));\n return;\n }\n data += chunk.toString();\n });\n req.on(\"end\", () => resolve(data));\n req.on(\"error\", reject);\n });\n}\n\nfunction checkAuth(req: IncomingMessage, secret: string | undefined): boolean {\n if (!secret) return true;\n const auth = req.headers[\"authorization\"] || \"\";\n return (\n typeof auth === \"string\" && timingSafeCompare(auth, `Bearer ${secret}`)\n );\n}\n\nexport function startViewerServer(\n port: number,\n _kv: unknown,\n _sdk: unknown,\n secret?: string,\n restPort?: number,\n): Server {\n const resolvedRestPort = restPort ?? port - 2;\n\n const server = createServer(async (req, res) => {\n const raw = req.url || \"/\";\n const qIdx = raw.indexOf(\"?\");\n const pathname = qIdx >= 0 ? raw.slice(0, qIdx) : raw;\n const qs = qIdx >= 0 ? raw.slice(qIdx + 1) : \"\";\n const method = req.method || \"GET\";\n\n if (method === \"OPTIONS\") {\n res.writeHead(204, {\n ...corsHeaders(req),\n \"Access-Control-Max-Age\": \"86400\",\n });\n res.end();\n return;\n }\n\n if (\n method === \"GET\" &&\n (pathname === \"/\" ||\n pathname === \"/viewer\" ||\n pathname === \"/agentmemory/viewer\")\n ) {\n const base = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(base, \"..\", \"src\", \"viewer\", \"index.html\"),\n join(base, \"..\", \"viewer\", \"index.html\"),\n join(base, \"viewer\", \"index.html\"),\n ];\n for (const p of candidates) {\n try {\n const html = readFileSync(p, \"utf-8\");\n res.writeHead(200, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Security-Policy\": VIEWER_CSP,\n \"Cache-Control\": \"no-cache\",\n });\n res.end(html);\n return;\n } catch {}\n }\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"viewer not found\");\n return;\n }\n\n if (!checkAuth(req, secret)) {\n json(res, 401, { error: \"unauthorized\" }, req);\n return;\n }\n\n try {\n await proxyToRestApi(resolvedRestPort, pathname, qs, method, req, res, secret);\n } catch (err) {\n console.error(`[viewer] proxy error on ${method} ${pathname}:`, err);\n json(res, 502, { error: \"upstream error\" }, req);\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n console.log(`[agentmemory] Viewer: http://localhost:${port}`);\n });\n\n return server;\n}\n\nasync function proxyToRestApi(\n restPort: number,\n pathname: string,\n qs: string,\n method: string,\n req: IncomingMessage,\n res: ServerResponse,\n secret?: string,\n): Promise<void> {\n const upstreamPath = pathname.startsWith(\"/agentmemory/\")\n ? pathname\n : `/agentmemory${pathname.startsWith(\"/\") ? pathname : \"/\" + pathname}`;\n\n const upstreamUrl = `http://127.0.0.1:${restPort}${upstreamPath}${qs ? \"?\" + qs : \"\"}`;\n\n const headers: Record<string, string> = {};\n if (secret) {\n headers[\"Authorization\"] = `Bearer ${secret}`;\n }\n const ct = req.headers[\"content-type\"];\n if (ct) {\n headers[\"Content-Type\"] = ct;\n }\n\n let body: string | undefined;\n if (method === \"POST\" || method === \"PUT\" || method === \"DELETE\" || method === \"PATCH\") {\n body = await readBody(req);\n }\n\n const controller = new AbortController();\n const fetchTimeout = setTimeout(() => controller.abort(), 10000);\n let upstream: Response;\n try {\n upstream = await fetch(upstreamUrl, {\n method,\n headers,\n body: body || undefined,\n signal: controller.signal,\n });\n clearTimeout(fetchTimeout);\n } catch (err) {\n clearTimeout(fetchTimeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n json(res, 504, { error: \"upstream timeout\" }, req);\n return;\n }\n throw err;\n }\n\n const cors = corsHeaders(req);\n const responseBody = await upstream.text();\n const responseHeaders: Record<string, string> = {\n ...cors,\n };\n const upstreamCt = upstream.headers.get(\"content-type\");\n if (upstreamCt) {\n responseHeaders[\"Content-Type\"] = upstreamCt;\n }\n\n res.writeHead(upstream.status, responseHeaders);\n res.end(responseBody);\n}\n","import type { FunctionMetrics } from \"../types.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\n\nexport class MetricsStore {\n private cache = new Map<string, FunctionMetrics>();\n private qualityCallCounts = new Map<string, number>();\n\n constructor(private kv: StateKV) {}\n\n async record(\n functionId: string,\n latencyMs: number,\n success: boolean,\n qualityScore?: number,\n ): Promise<void> {\n let m = this.cache.get(functionId);\n if (!m) {\n m = (await this.kv.get<FunctionMetrics>(KV.metrics, functionId)) ?? {\n functionId,\n totalCalls: 0,\n successCount: 0,\n failureCount: 0,\n avgLatencyMs: 0,\n avgQualityScore: 0,\n };\n }\n\n const prev = m.totalCalls;\n m.totalCalls += 1;\n m.avgLatencyMs = (m.avgLatencyMs * prev + latencyMs) / m.totalCalls;\n if (success) {\n m.successCount += 1;\n } else {\n m.failureCount += 1;\n }\n if (qualityScore !== undefined) {\n const prevQualityCalls = this.qualityCallCounts.get(functionId) || 0;\n m.avgQualityScore =\n (m.avgQualityScore * prevQualityCalls + qualityScore) /\n (prevQualityCalls + 1);\n this.qualityCallCounts.set(functionId, prevQualityCalls + 1);\n }\n\n this.cache.set(functionId, m);\n await this.kv.set(KV.metrics, functionId, m).catch(() => {});\n }\n\n async get(functionId: string): Promise<FunctionMetrics | null> {\n return (\n this.cache.get(functionId) ??\n (await this.kv.get<FunctionMetrics>(KV.metrics, functionId))\n );\n }\n\n async getAll(): Promise<FunctionMetrics[]> {\n const kvMetrics = await this.kv\n .list<FunctionMetrics>(KV.metrics)\n .catch(() => []);\n const merged = new Map<string, FunctionMetrics>();\n for (const m of kvMetrics) merged.set(m.functionId, m);\n for (const [id, m] of this.cache) merged.set(id, m);\n return Array.from(merged.values());\n }\n}\n","import { createHash } from \"node:crypto\";\n\nconst TTL_MS = 5 * 60 * 1000;\nconst CLEANUP_INTERVAL_MS = 60_000;\n\ninterface DedupEntry {\n hash: string;\n expiresAt: number;\n}\n\nexport class DedupMap {\n private entries = new Map<string, DedupEntry>();\n private cleanupTimer: ReturnType<typeof setInterval>;\n\n constructor() {\n this.cleanupTimer = setInterval(() => this.cleanup(), CLEANUP_INTERVAL_MS);\n this.cleanupTimer.unref();\n }\n\n computeHash(sessionId: string, toolName: string, toolInput: unknown): string {\n const input =\n typeof toolInput === \"string\"\n ? toolInput.slice(0, 500)\n : JSON.stringify(toolInput ?? \"\").slice(0, 500);\n const raw = `${sessionId}:${toolName}:${input}`;\n return createHash(\"sha256\").update(raw).digest(\"hex\");\n }\n\n isDuplicate(hash: string): boolean {\n const entry = this.entries.get(hash);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) {\n this.entries.delete(hash);\n return false;\n }\n return true;\n }\n\n record(hash: string): void {\n this.entries.set(hash, { hash, expiresAt: Date.now() + TTL_MS });\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries) {\n if (now > entry.expiresAt) this.entries.delete(key);\n }\n }\n\n stop(): void {\n clearInterval(this.cleanupTimer);\n }\n\n get size(): number {\n return this.entries.size;\n }\n}\n","import { VERSION } from \"../version.js\";\n\ninterface OtelConfig {\n serviceName: string;\n serviceVersion: string;\n metricsExportIntervalMs: number;\n}\n\nexport const OTEL_CONFIG: OtelConfig = {\n serviceName: \"agentmemory\",\n serviceVersion: VERSION,\n metricsExportIntervalMs: 30_000,\n};\n\ninterface Counter {\n add: (n: number) => void;\n}\ninterface Histogram {\n record: (v: number) => void;\n}\n\ninterface Counters {\n observationsTotal: Counter;\n compressionSuccess: Counter;\n compressionFailure: Counter;\n searchTotal: Counter;\n dedupSkipped: Counter;\n evictionTotal: Counter;\n circuitBreakerOpen: Counter;\n embeddingSuccess: Counter;\n embeddingFailure: Counter;\n vectorSearchTotal: Counter;\n autoForgetTotal: Counter;\n profileGenerated: Counter;\n claudeBridgeSync: Counter;\n graphExtraction: Counter;\n consolidationRun: Counter;\n teamShare: Counter;\n auditLog: Counter;\n snapshotCreate: Counter;\n governanceDelete: Counter;\n}\n\ninterface Histograms {\n compressionLatency: Histogram;\n searchLatency: Histogram;\n contextTokens: Histogram;\n qualityScore: Histogram;\n embeddingLatency: Histogram;\n vectorSearchLatency: Histogram;\n}\n\ntype Meter = {\n createCounter: (name: string) => Counter;\n createHistogram: (name: string) => Histogram;\n};\n\nlet counters: Counters | null = null;\nlet histograms: Histograms | null = null;\n\nconst NOOP_COUNTER: Counter = { add: () => {} };\nconst NOOP_HISTOGRAM: Histogram = { record: () => {} };\n\nconst COUNTER_NAMES: Array<[keyof Counters, string]> = [\n [\"observationsTotal\", \"observations.total\"],\n [\"compressionSuccess\", \"compression.success\"],\n [\"compressionFailure\", \"compression.failure\"],\n [\"searchTotal\", \"search.total\"],\n [\"dedupSkipped\", \"dedup.skipped\"],\n [\"evictionTotal\", \"eviction.total\"],\n [\"circuitBreakerOpen\", \"circuit_breaker.open\"],\n [\"embeddingSuccess\", \"embedding.success\"],\n [\"embeddingFailure\", \"embedding.failure\"],\n [\"vectorSearchTotal\", \"vector_search.total\"],\n [\"autoForgetTotal\", \"auto_forget.total\"],\n [\"profileGenerated\", \"profile.generated\"],\n [\"claudeBridgeSync\", \"claude_bridge.sync\"],\n [\"graphExtraction\", \"graph.extraction\"],\n [\"consolidationRun\", \"consolidation.run\"],\n [\"teamShare\", \"team.share\"],\n [\"auditLog\", \"audit.log\"],\n [\"snapshotCreate\", \"snapshot.create\"],\n [\"governanceDelete\", \"governance.delete\"],\n];\n\nconst HISTOGRAM_NAMES: Array<[keyof Histograms, string]> = [\n [\"compressionLatency\", \"compression.latency_ms\"],\n [\"searchLatency\", \"search.latency_ms\"],\n [\"contextTokens\", \"context.tokens\"],\n [\"qualityScore\", \"quality.score\"],\n [\"embeddingLatency\", \"embedding.latency_ms\"],\n [\"vectorSearchLatency\", \"vector_search.latency_ms\"],\n];\n\nexport function initMetrics(getMeter?: (name: string) => Meter): {\n counters: Counters;\n histograms: Histograms;\n} {\n const meter = getMeter?.(\"agentmemory\");\n\n counters = Object.fromEntries(\n COUNTER_NAMES.map(([key, name]) => [\n key,\n meter ? meter.createCounter(name) : NOOP_COUNTER,\n ]),\n ) as unknown as Counters;\n\n histograms = Object.fromEntries(\n HISTOGRAM_NAMES.map(([key, name]) => [\n key,\n meter ? meter.createHistogram(name) : NOOP_HISTOGRAM,\n ]),\n ) as unknown as Histograms;\n\n return { counters, histograms };\n}\n","import { init } from \"iii-sdk\";\nimport {\n loadConfig,\n getEnvVar,\n loadEmbeddingConfig,\n loadFallbackConfig,\n loadClaudeBridgeConfig,\n loadTeamConfig,\n loadSnapshotConfig,\n isGraphExtractionEnabled,\n isConsolidationEnabled,\n} from \"./config.js\";\nimport {\n createProvider,\n createFallbackProvider,\n createEmbeddingProvider,\n} from \"./providers/index.js\";\nimport { StateKV } from \"./state/kv.js\";\nimport { VectorIndex } from \"./state/vector-index.js\";\nimport { HybridSearch } from \"./state/hybrid-search.js\";\nimport { IndexPersistence } from \"./state/index-persistence.js\";\nimport { registerPrivacyFunction } from \"./functions/privacy.js\";\nimport { registerObserveFunction } from \"./functions/observe.js\";\nimport { registerCompressFunction } from \"./functions/compress.js\";\nimport {\n registerSearchFunction,\n rebuildIndex,\n getSearchIndex,\n} from \"./functions/search.js\";\nimport { registerContextFunction } from \"./functions/context.js\";\nimport { registerSummarizeFunction } from \"./functions/summarize.js\";\nimport { registerMigrateFunction } from \"./functions/migrate.js\";\nimport { registerFileIndexFunction } from \"./functions/file-index.js\";\nimport { registerConsolidateFunction } from \"./functions/consolidate.js\";\nimport { registerPatternsFunction } from \"./functions/patterns.js\";\nimport { registerRememberFunction } from \"./functions/remember.js\";\nimport { registerEvictFunction } from \"./functions/evict.js\";\nimport { registerRelationsFunction } from \"./functions/relations.js\";\nimport { registerTimelineFunction } from \"./functions/timeline.js\";\nimport { registerSmartSearchFunction } from \"./functions/smart-search.js\";\nimport { registerProfileFunction } from \"./functions/profile.js\";\nimport { registerAutoForgetFunction } from \"./functions/auto-forget.js\";\nimport { registerExportImportFunction } from \"./functions/export-import.js\";\nimport { registerEnrichFunction } from \"./functions/enrich.js\";\nimport { registerClaudeBridgeFunction } from \"./functions/claude-bridge.js\";\nimport { registerGraphFunction } from \"./functions/graph.js\";\nimport { registerConsolidationPipelineFunction } from \"./functions/consolidation-pipeline.js\";\nimport { registerTeamFunction } from \"./functions/team.js\";\nimport { registerGovernanceFunction } from \"./functions/governance.js\";\nimport { registerSnapshotFunction } from \"./functions/snapshot.js\";\nimport { registerActionsFunction } from \"./functions/actions.js\";\nimport { registerFrontierFunction } from \"./functions/frontier.js\";\nimport { registerLeasesFunction } from \"./functions/leases.js\";\nimport { registerRoutinesFunction } from \"./functions/routines.js\";\nimport { registerSignalsFunction } from \"./functions/signals.js\";\nimport { registerCheckpointsFunction } from \"./functions/checkpoints.js\";\nimport { registerFlowCompressFunction } from \"./functions/flow-compress.js\";\nimport { registerMeshFunction } from \"./functions/mesh.js\";\nimport { registerBranchAwareFunction } from \"./functions/branch-aware.js\";\nimport { registerSentinelsFunction } from \"./functions/sentinels.js\";\nimport { registerSketchesFunction } from \"./functions/sketches.js\";\nimport { registerCrystallizeFunction } from \"./functions/crystallize.js\";\nimport { registerDiagnosticsFunction } from \"./functions/diagnostics.js\";\nimport { registerFacetsFunction } from \"./functions/facets.js\";\nimport { registerVerifyFunction } from \"./functions/verify.js\";\nimport { registerCascadeFunction } from \"./functions/cascade.js\";\nimport { registerLessonsFunctions } from \"./functions/lessons.js\";\nimport { registerObsidianExportFunction } from \"./functions/obsidian-export.js\";\nimport { registerSlidingWindowFunction } from \"./functions/sliding-window.js\";\nimport { registerQueryExpansionFunction } from \"./functions/query-expansion.js\";\nimport { registerTemporalGraphFunctions } from \"./functions/temporal-graph.js\";\nimport { registerRetentionFunctions } from \"./functions/retention.js\";\nimport { registerApiTriggers } from \"./triggers/api.js\";\nimport { registerEventTriggers } from \"./triggers/events.js\";\nimport { registerMcpEndpoints } from \"./mcp/server.js\";\nimport { startViewerServer } from \"./viewer/server.js\";\nimport { MetricsStore } from \"./eval/metrics-store.js\";\nimport { DedupMap } from \"./functions/dedup.js\";\nimport { registerHealthMonitor } from \"./health/monitor.js\";\nimport { initMetrics, OTEL_CONFIG } from \"./telemetry/setup.js\";\nimport { VERSION } from \"./version.js\";\n\nasync function main() {\n const config = loadConfig();\n const embeddingConfig = loadEmbeddingConfig();\n const fallbackConfig = loadFallbackConfig();\n\n const provider =\n fallbackConfig.providers.length > 0\n ? createFallbackProvider(config.provider, fallbackConfig)\n : createProvider(config.provider);\n\n const embeddingProvider = createEmbeddingProvider();\n\n console.log(`[agentmemory] Starting worker v${VERSION}...`);\n console.log(`[agentmemory] Engine: ${config.engineUrl}`);\n console.log(\n `[agentmemory] Provider: ${config.provider.provider} (${config.provider.model})`,\n );\n if (embeddingProvider) {\n console.log(\n `[agentmemory] Embedding provider: ${embeddingProvider.name} (${embeddingProvider.dimensions} dims)`,\n );\n } else {\n console.log(`[agentmemory] Embedding provider: none (BM25-only mode)`);\n }\n console.log(\n `[agentmemory] REST API: http://localhost:${config.restPort}/agentmemory/*`,\n );\n console.log(`[agentmemory] Streams: ws://localhost:${config.streamsPort}`);\n\n const sdk = init(config.engineUrl, {\n workerName: \"agentmemory\",\n otel: {\n serviceName: OTEL_CONFIG.serviceName,\n serviceVersion: OTEL_CONFIG.serviceVersion,\n metricsExportIntervalMs: OTEL_CONFIG.metricsExportIntervalMs,\n },\n });\n\n const kv = new StateKV(sdk);\n const secret = getEnvVar(\"AGENTMEMORY_SECRET\");\n const metricsStore = new MetricsStore(kv);\n const dedupMap = new DedupMap();\n\n const vectorIndex = embeddingProvider ? new VectorIndex() : null;\n\n initMetrics(\n typeof (sdk as any).getMeter === \"function\"\n ? (sdk as any).getMeter.bind(sdk)\n : undefined,\n );\n\n registerPrivacyFunction(sdk);\n registerObserveFunction(sdk, kv, dedupMap, config.maxObservationsPerSession);\n registerCompressFunction(sdk, kv, provider, metricsStore);\n registerSearchFunction(sdk, kv);\n registerContextFunction(sdk, kv, config.tokenBudget);\n registerSummarizeFunction(sdk, kv, provider, metricsStore);\n registerMigrateFunction(sdk, kv);\n registerFileIndexFunction(sdk, kv);\n registerConsolidateFunction(sdk, kv, provider);\n registerPatternsFunction(sdk, kv);\n registerRememberFunction(sdk, kv);\n registerEvictFunction(sdk, kv);\n\n registerRelationsFunction(sdk, kv);\n registerTimelineFunction(sdk, kv);\n registerProfileFunction(sdk, kv);\n registerAutoForgetFunction(sdk, kv);\n registerExportImportFunction(sdk, kv);\n registerEnrichFunction(sdk, kv);\n\n const claudeBridgeConfig = loadClaudeBridgeConfig();\n if (claudeBridgeConfig.enabled) {\n registerClaudeBridgeFunction(sdk, kv, claudeBridgeConfig);\n console.log(\n `[agentmemory] Claude bridge: syncing to ${claudeBridgeConfig.memoryFilePath}`,\n );\n }\n\n if (isGraphExtractionEnabled()) {\n registerGraphFunction(sdk, kv, provider);\n console.log(`[agentmemory] Knowledge graph: extraction enabled`);\n }\n\n registerConsolidationPipelineFunction(sdk, kv, provider);\n console.log(`[agentmemory] Consolidation pipeline: registered (CONSOLIDATION_ENABLED=${isConsolidationEnabled() ? \"true\" : \"false\"})`);\n\n const teamConfig = loadTeamConfig();\n if (teamConfig) {\n registerTeamFunction(sdk, kv, teamConfig);\n console.log(\n `[agentmemory] Team memory: ${teamConfig.teamId} (${teamConfig.mode})`,\n );\n }\n\n registerGovernanceFunction(sdk, kv);\n\n registerActionsFunction(sdk, kv);\n registerFrontierFunction(sdk, kv);\n registerLeasesFunction(sdk, kv);\n registerRoutinesFunction(sdk, kv);\n registerSignalsFunction(sdk, kv);\n registerCheckpointsFunction(sdk, kv);\n registerMeshFunction(sdk, kv);\n registerBranchAwareFunction(sdk, kv);\n registerFlowCompressFunction(sdk, kv, provider);\n registerSentinelsFunction(sdk, kv);\n registerSketchesFunction(sdk, kv);\n registerCrystallizeFunction(sdk, kv, provider);\n registerDiagnosticsFunction(sdk, kv);\n registerFacetsFunction(sdk, kv);\n registerVerifyFunction(sdk, kv);\n registerLessonsFunctions(sdk, kv);\n registerObsidianExportFunction(sdk, kv);\n registerCascadeFunction(sdk, kv);\n\n registerSlidingWindowFunction(sdk, kv, provider);\n registerQueryExpansionFunction(sdk, provider);\n registerTemporalGraphFunctions(sdk, kv, provider);\n registerRetentionFunctions(sdk, kv);\n console.log(\n `[agentmemory] v0.6 advanced retrieval: sliding-window, query-expansion, temporal-graph, retention-scoring`,\n );\n console.log(\n `[agentmemory] Orchestration layer: actions, frontier, leases, routines, signals, checkpoints, flow-compress, mesh, branch-aware, sentinels, sketches, crystallize, diagnostics, facets`,\n );\n\n const snapshotConfig = loadSnapshotConfig();\n if (snapshotConfig.enabled) {\n registerSnapshotFunction(sdk, kv, snapshotConfig.dir);\n console.log(\n `[agentmemory] Git snapshots: ${snapshotConfig.dir} (every ${snapshotConfig.interval}s)`,\n );\n }\n\n const bm25Index = getSearchIndex();\n const graphWeight = parseFloat(getEnvVar(\"AGENTMEMORY_GRAPH_WEIGHT\") || \"0.3\");\n const hybridSearch = new HybridSearch(\n bm25Index,\n vectorIndex,\n embeddingProvider,\n kv,\n embeddingConfig.bm25Weight,\n embeddingConfig.vectorWeight,\n graphWeight,\n );\n\n registerSmartSearchFunction(sdk, kv, (query, limit) =>\n hybridSearch.search(query, limit),\n );\n\n registerApiTriggers(sdk, kv, secret, metricsStore, provider);\n registerEventTriggers(sdk, kv);\n registerMcpEndpoints(sdk, kv, secret);\n\n const healthMonitor = registerHealthMonitor(sdk, kv);\n\n const indexPersistence = new IndexPersistence(kv, bm25Index, vectorIndex);\n\n const loaded = await indexPersistence.load().catch((err) => {\n console.warn(`[agentmemory] Failed to load persisted index:`, err);\n return null;\n });\n if (loaded?.bm25 && loaded.bm25.size > 0) {\n bm25Index.restoreFrom(loaded.bm25);\n console.log(\n `[agentmemory] Loaded persisted BM25 index (${bm25Index.size} docs)`,\n );\n }\n if (loaded?.vector && vectorIndex && loaded.vector.size > 0) {\n vectorIndex.restoreFrom(loaded.vector);\n console.log(\n `[agentmemory] Loaded persisted vector index (${vectorIndex.size} vectors)`,\n );\n }\n\n const needsRebuild = bm25Index.size === 0;\n\n if (needsRebuild) {\n const indexCount = await rebuildIndex(kv).catch((err) => {\n console.warn(`[agentmemory] Failed to rebuild search index:`, err);\n return 0;\n });\n if (indexCount > 0) {\n console.log(\n `[agentmemory] Search index rebuilt: ${indexCount} observations`,\n );\n indexPersistence.scheduleSave();\n }\n }\n\n console.log(\n `[agentmemory] Ready. ${embeddingProvider ? \"Triple-stream (BM25+Vector+Graph)\" : \"BM25+Graph\"} search active.`,\n );\n console.log(\n `[agentmemory] Endpoints: 100 REST + 41 MCP tools + 6 MCP resources + 3 MCP prompts`,\n );\n\n const viewerPort = config.restPort + 2;\n const viewerServer = startViewerServer(\n viewerPort,\n kv,\n sdk,\n secret,\n config.restPort,\n );\n\n const autoForgetIntervalMs = parseInt(process.env.AUTO_FORGET_INTERVAL_MS || \"3600000\", 10);\n const consolidationIntervalMs = parseInt(process.env.CONSOLIDATION_INTERVAL_MS || \"7200000\", 10);\n\n if (process.env.AUTO_FORGET_ENABLED !== \"false\") {\n const autoForgetTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::auto-forget\", { dryRun: false });\n } catch {}\n }, autoForgetIntervalMs);\n autoForgetTimer.unref();\n console.log(`[agentmemory] Auto-forget: enabled (every ${autoForgetIntervalMs / 60000}m)`);\n }\n\n if (process.env.LESSON_DECAY_ENABLED !== \"false\") {\n const lessonDecayTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::lesson-decay-sweep\", {});\n } catch {}\n }, 86400000);\n lessonDecayTimer.unref();\n console.log(`[agentmemory] Lesson decay sweep: enabled (every 24h)`);\n }\n\n if (isConsolidationEnabled()) {\n const consolidationTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::consolidate-pipeline\", {});\n } catch {}\n }, consolidationIntervalMs);\n consolidationTimer.unref();\n console.log(`[agentmemory] Auto-consolidation: enabled (every ${consolidationIntervalMs / 60000}m)`);\n }\n\n const shutdown = async () => {\n console.log(`\\n[agentmemory] Shutting down...`);\n healthMonitor.stop();\n dedupMap.stop();\n indexPersistence.stop();\n await new Promise<void>((resolve) => viewerServer.close(() => resolve()));\n await indexPersistence.save().catch((err) => {\n console.warn(`[agentmemory] Failed to save index on shutdown:`, err);\n });\n await sdk.shutdown();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((err) => {\n console.error(`[agentmemory] Fatal:`, err);\n process.exit(1);\n});\n"],"mappings":"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;GACpB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,SAAS;IAAE,MAAM;IAAU,aAAa;IAA2B,EACpE;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GAAE,MAAM;GAAU,YAAY,EAAE;GAAE;EAChD;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAA0B;IAClE,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,SAAS;GACrB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgB;IACxD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GAAE,MAAM;GAAU,YAAY,EAAE;GAAE;EAChD;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,eAAe;KACb,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,WAAW;IACT,MAAM;IACN,aACE;IACH,EACF;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,aAAa;KACX,MAAM;KACN,aAAa;KACd;IACD,UAAU;KAAE,MAAM;KAAU,aAAa;KAAuB;IAChE,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAAwB;IAC/D;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,MAAM;IACJ,MAAM;IACN,aAAa;IACd,EACF;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,UAAU,WAAW;GACjC;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,OAAO;IAAE,MAAM;IAAU,aAAa;IAA0B,EACjE;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KAAE,MAAM;KAAU,aAAa;KAA4B;IACtE,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KAAE,MAAM;KAAU,aAAa;KAAuB;IAC/D;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,SAAS;IAAE,MAAM;IAAU,aAAa;IAAwB,EACjE;GACF;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,aAAa;KACX,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgB;IACxD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aACE;KACH;IACF;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAuB;IAChE,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,UAAU;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC/D;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,SAAS;KAAE,MAAM;KAAU,aAAa;KAAoB;IAC7D;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAa;IACtD,SAAS;KAAE,MAAM;KAAU,aAAa;KAA6B;IACrE,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU;IAAC;IAAY;IAAW;IAAY;GAC/C;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KAAE,MAAM;KAAU,aAAa;KAAuB;IACjE,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,aAAa;KAAE,MAAM;KAAU,aAAa;KAA0B;IACvE;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,aAAa;KAAmB;IACxD,IAAI;KACF,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,QAAQ,UAAU;GAC9B;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAA8B;IACtE,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA6B;IACpE;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,MAAM;KAAE,MAAM;KAAU,aAAa;KAAgC;IACrE,cAAc;KACZ,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,iBAAiB;KACf,MAAM;KACN,aACE;KACH;IACF;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,aAAa;KAAiB;IACtD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,iBAAiB;KACf,MAAM;KACN,aAAa;KACd;IACD,aAAa;KAAE,MAAM;KAAU,aAAa;KAAwB;IACrE;GACD,UAAU,CAAC,QAAQ,OAAO;GAC3B;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,YAAY;KAAE,MAAM;KAAU,aAAa;KAA0B;IACrE,QAAQ;KAAE,MAAM;KAAU,aAAa;KAAuB;IAC/D;GACD,UAAU,CAAC,aAAa;GACzB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,aAAa;KAAE,MAAM;KAAU,aAAa;KAA6B;IACzE,aAAa;KAAE,MAAM;KAAU,aAAa;KAA8B;IAC1E,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC5D;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAwB;IACjE,SAAS;KAAE,MAAM;KAAU,aAAa;KAAyC;IAClF;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,WAAW;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC9D;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,YAAY;IACV,MAAM;IACN,aAAa;IACd,EACF;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAA2B;IACpE,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,WAAW;KAAE,MAAM;KAAU,aAAa;KAAgD;IAC1F,OAAO;KAAE,MAAM;KAAU,aAAa;KAA+C;IACtF;GACD,UAAU;IAAC;IAAY;IAAc;IAAa;IAAQ;GAC3D;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAa,aAA2B,CACtC;CACE,MAAM;CACN,aACE;CACF,aAAa;EACX,MAAM;EACN,YAAY,EACV,IAAI;GACF,MAAM;GACN,aAAa;GACd,EACF;EACD,UAAU,CAAC,KAAK;EACjB;CACF,CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgC;IACxE,MAAM;KAAE,MAAM;KAAU,aAAa;KAAwB;IAC9D;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,eAAe;KACb,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AA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"}
1
+ {"version":3,"file":"index.mjs","names":["API_URL","API_URL","API_URL","VALID_TYPES","MS_PER_DAY","DEFAULTS","findObservation","checkAuth"],"sources":["../src/config.ts","../src/providers/agent-sdk.ts","../src/providers/anthropic.ts","../src/providers/openrouter.ts","../src/providers/circuit-breaker.ts","../src/providers/resilient.ts","../src/providers/fallback-chain.ts","../src/providers/embedding/gemini.ts","../src/providers/embedding/openai.ts","../src/providers/embedding/voyage.ts","../src/providers/embedding/cohere.ts","../src/providers/embedding/openrouter.ts","../src/providers/embedding/local.ts","../src/providers/embedding/index.ts","../src/providers/index.ts","../src/state/kv.ts","../src/state/vector-index.ts","../src/state/schema.ts","../src/functions/graph-retrieval.ts","../src/functions/query-expansion.ts","../src/state/hybrid-search.ts","../src/state/stemmer.ts","../src/state/synonyms.ts","../src/state/search-index.ts","../src/state/index-persistence.ts","../src/functions/privacy.ts","../src/state/keyed-mutex.ts","../src/functions/observe.ts","../src/prompts/compression.ts","../src/prompts/xml.ts","../src/functions/search.ts","../src/eval/schemas.ts","../src/eval/validator.ts","../src/eval/quality.ts","../src/eval/self-correct.ts","../src/functions/compress.ts","../src/functions/context.ts","../src/prompts/summary.ts","../src/functions/summarize.ts","../src/functions/migrate.ts","../src/functions/file-index.ts","../src/functions/consolidate.ts","../src/functions/patterns.ts","../src/functions/remember.ts","../src/functions/evict.ts","../src/functions/relations.ts","../src/functions/timeline.ts","../src/functions/smart-search.ts","../src/functions/profile.ts","../src/functions/auto-forget.ts","../src/version.ts","../src/functions/export-import.ts","../src/functions/enrich.ts","../src/functions/audit.ts","../src/functions/claude-bridge.ts","../src/prompts/graph-extraction.ts","../src/functions/graph.ts","../src/prompts/consolidation.ts","../src/functions/consolidation-pipeline.ts","../src/functions/team.ts","../src/functions/governance.ts","../src/functions/snapshot.ts","../src/functions/actions.ts","../src/functions/frontier.ts","../src/functions/leases.ts","../src/functions/routines.ts","../src/functions/signals.ts","../src/functions/checkpoints.ts","../src/functions/flow-compress.ts","../src/functions/mesh.ts","../src/functions/branch-aware.ts","../src/functions/sentinels.ts","../src/functions/sketches.ts","../src/functions/crystallize.ts","../src/functions/diagnostics.ts","../src/functions/facets.ts","../src/functions/verify.ts","../src/functions/cascade.ts","../src/functions/lessons.ts","../src/functions/obsidian-export.ts","../src/functions/sliding-window.ts","../src/functions/temporal-graph.ts","../src/functions/retention.ts","../src/health/thresholds.ts","../src/health/monitor.ts","../src/auth.ts","../src/triggers/api.ts","../src/triggers/events.ts","../src/mcp/tools-registry.ts","../src/mcp/server.ts","../src/viewer/server.ts","../src/eval/metrics-store.ts","../src/functions/dedup.ts","../src/telemetry/setup.ts","../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type {\n AgentMemoryConfig,\n ProviderConfig,\n EmbeddingConfig,\n FallbackConfig,\n ClaudeBridgeConfig,\n TeamConfig,\n} from \"./types.js\";\n\nfunction safeParseInt(value: string | undefined, fallback: number): number {\n if (!value) return fallback;\n const parsed = parseInt(value, 10);\n return Number.isNaN(parsed) ? fallback : parsed;\n}\n\nconst DATA_DIR = join(homedir(), \".agentmemory\");\nconst ENV_FILE = join(DATA_DIR, \".env\");\n\nfunction loadEnvFile(): Record<string, string> {\n if (!existsSync(ENV_FILE)) return {};\n const content = readFileSync(ENV_FILE, \"utf-8\");\n const vars: Record<string, string> = {};\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n let val = trimmed.slice(eqIdx + 1).trim();\n if (\n (val.startsWith('\"') && val.endsWith('\"')) ||\n (val.startsWith(\"'\") && val.endsWith(\"'\"))\n ) {\n val = val.slice(1, -1);\n }\n vars[key] = val;\n }\n return vars;\n}\n\nfunction detectProvider(env: Record<string, string>): ProviderConfig {\n const maxTokens = parseInt(env[\"MAX_TOKENS\"] || \"4096\", 10);\n\n if (env[\"ANTHROPIC_API_KEY\"]) {\n return {\n provider: \"anthropic\",\n model: env[\"ANTHROPIC_MODEL\"] || \"claude-sonnet-4-20250514\",\n maxTokens,\n };\n }\n if (env[\"GEMINI_API_KEY\"]) {\n return {\n provider: \"gemini\",\n model: env[\"GEMINI_MODEL\"] || \"gemini-2.0-flash\",\n maxTokens,\n };\n }\n if (env[\"OPENROUTER_API_KEY\"]) {\n return {\n provider: \"openrouter\",\n model: env[\"OPENROUTER_MODEL\"] || \"anthropic/claude-sonnet-4-20250514\",\n maxTokens,\n };\n }\n return {\n provider: \"agent-sdk\",\n model: \"claude-sonnet-4-20250514\",\n maxTokens: 4096,\n };\n}\n\nexport function loadConfig(): AgentMemoryConfig {\n const env = getMergedEnv();\n\n const provider = detectProvider(env);\n\n return {\n engineUrl: env[\"III_ENGINE_URL\"] || \"ws://localhost:49134\",\n restPort: parseInt(env[\"III_REST_PORT\"] || \"3111\", 10) || 3111,\n streamsPort: parseInt(env[\"III_STREAMS_PORT\"] || \"3112\", 10) || 3112,\n provider,\n tokenBudget: safeParseInt(env[\"TOKEN_BUDGET\"], 2000),\n maxObservationsPerSession: safeParseInt(env[\"MAX_OBS_PER_SESSION\"], 500),\n compressionModel: provider.model,\n dataDir: DATA_DIR,\n };\n}\n\nfunction getMergedEnv(\n overrides?: Record<string, string>,\n): Record<string, string> {\n const fileEnv = loadEnvFile();\n return { ...fileEnv, ...process.env, ...overrides } as Record<string, string>;\n}\n\nexport function getEnvVar(key: string): string | undefined {\n return getMergedEnv()[key];\n}\n\nexport function loadEmbeddingConfig(): EmbeddingConfig {\n const env = getMergedEnv();\n let bm25Weight = parseFloat(env[\"BM25_WEIGHT\"] || \"0.4\");\n let vectorWeight = parseFloat(env[\"VECTOR_WEIGHT\"] || \"0.6\");\n bm25Weight =\n isNaN(bm25Weight) || bm25Weight < 0 ? 0.4 : Math.min(bm25Weight, 1);\n vectorWeight =\n isNaN(vectorWeight) || vectorWeight < 0 ? 0.6 : Math.min(vectorWeight, 1);\n return {\n provider: env[\"EMBEDDING_PROVIDER\"] || undefined,\n bm25Weight,\n vectorWeight,\n };\n}\n\nexport function detectEmbeddingProvider(\n env?: Record<string, string>,\n): string | null {\n const source = env ?? getMergedEnv();\n const forced = source[\"EMBEDDING_PROVIDER\"];\n if (forced) return forced;\n\n if (source[\"GEMINI_API_KEY\"]) return \"gemini\";\n if (source[\"OPENAI_API_KEY\"]) return \"openai\";\n if (source[\"VOYAGE_API_KEY\"]) return \"voyage\";\n if (source[\"COHERE_API_KEY\"]) return \"cohere\";\n if (source[\"OPENROUTER_API_KEY\"]) return \"openrouter\";\n return null;\n}\n\nexport function loadClaudeBridgeConfig(): ClaudeBridgeConfig {\n const env = getMergedEnv();\n const enabled = env[\"CLAUDE_MEMORY_BRIDGE\"] === \"true\";\n const projectPath = env[\"CLAUDE_PROJECT_PATH\"] || \"\";\n const lineBudget = safeParseInt(env[\"CLAUDE_MEMORY_LINE_BUDGET\"], 200);\n let memoryFilePath = \"\";\n if (enabled && projectPath) {\n const safePath = projectPath.replace(/[/\\\\]/g, \"-\").replace(/^-/, \"\");\n memoryFilePath = join(\n homedir(),\n \".claude\",\n \"projects\",\n safePath,\n \"memory\",\n \"MEMORY.md\",\n );\n }\n return { enabled, projectPath, memoryFilePath, lineBudget };\n}\n\nexport function loadTeamConfig(): TeamConfig | null {\n const env = getMergedEnv();\n const teamId = env[\"TEAM_ID\"];\n const userId = env[\"USER_ID\"];\n if (!teamId || !userId) return null;\n const mode = env[\"TEAM_MODE\"] === \"shared\" ? \"shared\" : \"private\";\n return { teamId, userId, mode };\n}\n\nexport function loadSnapshotConfig(): {\n enabled: boolean;\n interval: number;\n dir: string;\n} {\n const env = getMergedEnv();\n return {\n enabled: env[\"SNAPSHOT_ENABLED\"] === \"true\",\n interval: safeParseInt(env[\"SNAPSHOT_INTERVAL\"], 3600),\n dir: env[\"SNAPSHOT_DIR\"] || join(homedir(), \".agentmemory\", \"snapshots\"),\n };\n}\n\nexport function isGraphExtractionEnabled(): boolean {\n return getMergedEnv()[\"GRAPH_EXTRACTION_ENABLED\"] === \"true\";\n}\n\nexport function getGraphBatchSize(): number {\n return safeParseInt(getMergedEnv()[\"GRAPH_EXTRACTION_BATCH_SIZE\"], 10);\n}\n\nexport function isConsolidationEnabled(): boolean {\n return getMergedEnv()[\"CONSOLIDATION_ENABLED\"] === \"true\";\n}\n\nexport function getConsolidationDecayDays(): number {\n return safeParseInt(getMergedEnv()[\"CONSOLIDATION_DECAY_DAYS\"], 30);\n}\n\nexport function isStandaloneMcp(): boolean {\n return getMergedEnv()[\"STANDALONE_MCP\"] === \"true\";\n}\n\nexport function getStandalonePersistPath(): string {\n const env = getMergedEnv();\n return (\n env[\"STANDALONE_PERSIST_PATH\"] ||\n join(homedir(), \".agentmemory\", \"standalone.json\")\n );\n}\n\nconst VALID_PROVIDERS = new Set([\n \"anthropic\",\n \"gemini\",\n \"openrouter\",\n \"agent-sdk\",\n]);\n\nexport function loadFallbackConfig(): FallbackConfig {\n const env = getMergedEnv();\n const raw = env[\"FALLBACK_PROVIDERS\"] || \"\";\n const providers = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(\n (p): p is FallbackConfig[\"providers\"][number] =>\n Boolean(p) && VALID_PROVIDERS.has(p),\n );\n return { providers };\n}\n","import type { MemoryProvider } from '../types.js'\n\nexport class AgentSDKProvider implements MemoryProvider {\n name = 'agent-sdk'\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.query(systemPrompt, userPrompt)\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.query(systemPrompt, userPrompt)\n }\n\n private async query(systemPrompt: string, userPrompt: string): Promise<string> {\n const { query } = await import('@anthropic-ai/claude-agent-sdk')\n\n const messages = query({\n prompt: userPrompt,\n options: {\n systemPrompt,\n maxTurns: 1,\n allowedTools: [],\n },\n })\n\n let result = ''\n for await (const msg of messages) {\n if (msg.type === 'result') {\n result = typeof msg.result === 'string' ? msg.result : JSON.stringify(msg.result)\n }\n }\n return result\n }\n}\n","import Anthropic from '@anthropic-ai/sdk'\nimport type { MemoryProvider } from '../types.js'\n\nexport class AnthropicProvider implements MemoryProvider {\n name = 'anthropic'\n private client: Anthropic\n private model: string\n private maxTokens: number\n\n constructor(apiKey: string, model: string, maxTokens: number) {\n this.client = new Anthropic({ apiKey })\n this.model = model\n this.maxTokens = maxTokens\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt)\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt)\n }\n\n private async call(systemPrompt: string, userPrompt: string): Promise<string> {\n const response = await this.client.messages.create({\n model: this.model,\n max_tokens: this.maxTokens,\n system: systemPrompt,\n messages: [{ role: 'user', content: userPrompt }],\n })\n\n const textBlock = response.content.find((b) => b.type === 'text')\n return textBlock?.text ?? ''\n }\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nexport class OpenRouterProvider implements MemoryProvider {\n name: string;\n private apiKey: string;\n private model: string;\n private maxTokens: number;\n private baseUrl: string;\n\n constructor(\n apiKey: string,\n model: string,\n maxTokens: number,\n baseUrl: string,\n ) {\n this.apiKey = apiKey;\n this.model = model;\n this.maxTokens = maxTokens;\n this.baseUrl = baseUrl;\n this.name = baseUrl.includes(\"openrouter\") ? \"openrouter\" : \"gemini\";\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt);\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(systemPrompt, userPrompt);\n }\n\n private async call(\n systemPrompt: string,\n userPrompt: string,\n ): Promise<string> {\n const response = await fetch(this.baseUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n ...(this.baseUrl.includes(\"openrouter\")\n ? { \"HTTP-Referer\": \"https://github.com/rohitg00/agentmemory\" }\n : {}),\n },\n body: JSON.stringify({\n model: this.model,\n max_tokens: this.maxTokens,\n messages: [\n { role: \"system\", content: systemPrompt },\n { role: \"user\", content: userPrompt },\n ],\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`${this.name} API error (${response.status}): ${text}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n const choices = data.choices as\n | Array<{ message: { content: string } }>\n | undefined;\n const content = choices?.[0]?.message?.content;\n if (!content) {\n throw new Error(\n `${this.name} returned unexpected response: ${JSON.stringify(data).slice(0, 200)}`,\n );\n }\n return content;\n }\n}\n","import type { CircuitBreakerState } from \"../types.js\";\n\ninterface CircuitBreakerOptions {\n failureThreshold?: number;\n failureWindowMs?: number;\n recoveryTimeoutMs?: number;\n}\n\nfunction positiveFinite(val: number | undefined, fallback: number): number {\n return Number.isFinite(val) && val! > 0 ? val! : fallback;\n}\n\nexport class CircuitBreaker {\n private state: \"closed\" | \"open\" | \"half-open\" = \"closed\";\n private failures = 0;\n private lastFailureAt: number | null = null;\n private openedAt: number | null = null;\n\n private readonly failureThreshold: number;\n private readonly failureWindowMs: number;\n private readonly recoveryTimeoutMs: number;\n\n constructor(opts?: CircuitBreakerOptions) {\n this.failureThreshold = Math.max(\n 1,\n Math.floor(positiveFinite(opts?.failureThreshold, 3)),\n );\n this.failureWindowMs = positiveFinite(opts?.failureWindowMs, 60_000);\n this.recoveryTimeoutMs = positiveFinite(opts?.recoveryTimeoutMs, 30_000);\n }\n\n get isAllowed(): boolean {\n if (this.state === \"closed\") return true;\n if (this.state === \"open\") {\n if (\n this.openedAt &&\n Date.now() - this.openedAt >= this.recoveryTimeoutMs\n ) {\n this.state = \"half-open\";\n return true;\n }\n return false;\n }\n return true;\n }\n\n recordSuccess(): void {\n if (this.state === \"half-open\") {\n this.state = \"closed\";\n this.failures = 0;\n this.lastFailureAt = null;\n this.openedAt = null;\n }\n }\n\n recordFailure(): void {\n const now = Date.now();\n if (this.state === \"half-open\") {\n this.state = \"open\";\n this.openedAt = now;\n return;\n }\n if (this.lastFailureAt && now - this.lastFailureAt > this.failureWindowMs) {\n this.failures = 0;\n }\n this.failures += 1;\n this.lastFailureAt = now;\n if (this.failures >= this.failureThreshold) {\n this.state = \"open\";\n this.openedAt = now;\n }\n }\n\n getState(): CircuitBreakerState {\n return {\n state: this.state,\n failures: this.failures,\n lastFailureAt: this.lastFailureAt,\n openedAt: this.openedAt,\n };\n }\n}\n","import type { MemoryProvider, CircuitBreakerState } from \"../types.js\";\nimport { CircuitBreaker } from \"./circuit-breaker.js\";\n\nexport class ResilientProvider implements MemoryProvider {\n private breaker = new CircuitBreaker();\n name: string;\n\n constructor(private inner: MemoryProvider) {\n this.name = `resilient(${inner.name})`;\n }\n\n private async call(fn: () => Promise<string>): Promise<string> {\n if (!this.breaker.isAllowed) {\n throw new Error(\"circuit_breaker_open\");\n }\n try {\n const result = await fn();\n this.breaker.recordSuccess();\n return result;\n } catch (err) {\n this.breaker.recordFailure();\n throw err;\n }\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(() => this.inner.compress(systemPrompt, userPrompt));\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.call(() => this.inner.summarize(systemPrompt, userPrompt));\n }\n\n get circuitState(): CircuitBreakerState {\n return this.breaker.getState();\n }\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nexport class FallbackChainProvider implements MemoryProvider {\n name: string;\n\n constructor(private providers: MemoryProvider[]) {\n this.name = `fallback(${providers.map((p) => p.name).join(\" -> \")})`;\n }\n\n async compress(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.tryAll((p) => p.compress(systemPrompt, userPrompt));\n }\n\n async summarize(systemPrompt: string, userPrompt: string): Promise<string> {\n return this.tryAll((p) => p.summarize(systemPrompt, userPrompt));\n }\n\n private async tryAll(\n fn: (p: MemoryProvider) => Promise<string>,\n ): Promise<string> {\n let lastError: Error | null = null;\n for (const provider of this.providers) {\n try {\n return await fn(provider);\n } catch (err) {\n lastError = err instanceof Error ? err : new Error(String(err));\n }\n }\n throw lastError || new Error(\"No providers available\");\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst BATCH_LIMIT = 100;\nconst API_BASE = \"https://generativelanguage.googleapis.com/v1beta/models/text-embedding-004:batchEmbedContent\";\n\nexport class GeminiEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"gemini\";\n readonly dimensions = 768;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"GEMINI_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"GEMINI_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const results: Float32Array[] = [];\n\n for (let i = 0; i < texts.length; i += BATCH_LIMIT) {\n const chunk = texts.slice(i, i + BATCH_LIMIT);\n const response = await fetch(`${API_BASE}?key=${this.apiKey}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n requests: chunk.map((t) => ({\n model: \"models/text-embedding-004\",\n content: { parts: [{ text: t }] },\n })),\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Gemini embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n embeddings: Array<{ values: number[] }>;\n };\n\n for (const emb of data.embeddings) {\n results.push(new Float32Array(emb.values));\n }\n }\n\n return results;\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.openai.com/v1/embeddings\";\n\nexport class OpenAIEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"openai\";\n readonly dimensions = 1536;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"OPENAI_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"OPENAI_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"text-embedding-3-small\",\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`OpenAI embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.voyageai.com/v1/embeddings\";\n\nexport class VoyageEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"voyage\";\n readonly dimensions = 1024;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"VOYAGE_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"VOYAGE_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"voyage-code-3\",\n input: texts,\n input_type: \"document\",\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Voyage embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://api.cohere.ai/v1/embed\";\n\nexport class CohereEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"cohere\";\n readonly dimensions = 1024;\n private apiKey: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"COHERE_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"COHERE_API_KEY is required\");\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: \"embed-english-v3.0\",\n texts,\n input_type: \"search_document\",\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Cohere embedding failed (${response.status}): ${err}`);\n }\n\n const data = (await response.json()) as {\n embeddings: number[][];\n };\n\n return data.embeddings.map((e) => new Float32Array(e));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { getEnvVar } from \"../../config.js\";\n\nconst API_URL = \"https://openrouter.ai/api/v1/embeddings\";\n\nexport class OpenRouterEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"openrouter\";\n readonly dimensions = 1536;\n private apiKey: string;\n private model: string;\n\n constructor(apiKey?: string) {\n this.apiKey = apiKey || getEnvVar(\"OPENROUTER_API_KEY\") || \"\";\n if (!this.apiKey) throw new Error(\"OPENROUTER_API_KEY is required\");\n this.model =\n getEnvVar(\"OPENROUTER_EMBEDDING_MODEL\") ||\n \"openai/text-embedding-3-small\";\n }\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const response = await fetch(API_URL, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this.model,\n input: texts,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(\n `OpenRouter embedding failed (${response.status}): ${err}`,\n );\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[] }>;\n };\n\n return data.data.map((d) => new Float32Array(d.embedding));\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\n\ntype Pipeline = (\n task: string,\n model: string,\n) => Promise<\n (\n texts: string[],\n options: { pooling: string; normalize: boolean },\n ) => Promise<{ tolist: () => number[][] }>\n>;\n\nexport class LocalEmbeddingProvider implements EmbeddingProvider {\n readonly name = \"local\";\n readonly dimensions = 384;\n private extractor: Awaited<ReturnType<Pipeline>> | null = null;\n\n async embed(text: string): Promise<Float32Array> {\n const [result] = await this.embedBatch([text]);\n return result;\n }\n\n async embedBatch(texts: string[]): Promise<Float32Array[]> {\n const extractor = await this.getExtractor();\n const output = await extractor(texts, {\n pooling: \"mean\",\n normalize: true,\n });\n const vectors = output.tolist();\n return vectors.map((v: number[]) => new Float32Array(v));\n }\n\n private async getExtractor() {\n if (this.extractor) return this.extractor;\n\n let transformers: { pipeline: Pipeline };\n try {\n // @ts-ignore - optional peer dependency\n transformers = await import(\"@xenova/transformers\");\n } catch {\n throw new Error(\n \"Install @xenova/transformers for local embeddings: npm install @xenova/transformers\",\n );\n }\n\n this.extractor = await transformers.pipeline(\n \"feature-extraction\",\n \"Xenova/all-MiniLM-L6-v2\",\n );\n return this.extractor;\n }\n}\n","import type { EmbeddingProvider } from \"../../types.js\";\nimport { detectEmbeddingProvider, getEnvVar } from \"../../config.js\";\nimport { GeminiEmbeddingProvider } from \"./gemini.js\";\nimport { OpenAIEmbeddingProvider } from \"./openai.js\";\nimport { VoyageEmbeddingProvider } from \"./voyage.js\";\nimport { CohereEmbeddingProvider } from \"./cohere.js\";\nimport { OpenRouterEmbeddingProvider } from \"./openrouter.js\";\nimport { LocalEmbeddingProvider } from \"./local.js\";\n\nexport {\n GeminiEmbeddingProvider,\n OpenAIEmbeddingProvider,\n VoyageEmbeddingProvider,\n CohereEmbeddingProvider,\n OpenRouterEmbeddingProvider,\n LocalEmbeddingProvider,\n};\n\nexport function createEmbeddingProvider(): EmbeddingProvider | null {\n const detected = detectEmbeddingProvider();\n if (!detected) return null;\n\n switch (detected) {\n case \"gemini\":\n return new GeminiEmbeddingProvider(getEnvVar(\"GEMINI_API_KEY\")!);\n case \"openai\":\n return new OpenAIEmbeddingProvider(getEnvVar(\"OPENAI_API_KEY\")!);\n case \"voyage\":\n return new VoyageEmbeddingProvider(getEnvVar(\"VOYAGE_API_KEY\")!);\n case \"cohere\":\n return new CohereEmbeddingProvider(getEnvVar(\"COHERE_API_KEY\")!);\n case \"openrouter\":\n return new OpenRouterEmbeddingProvider(getEnvVar(\"OPENROUTER_API_KEY\")!);\n case \"local\":\n return new LocalEmbeddingProvider();\n default:\n return null;\n }\n}\n","import type {\n MemoryProvider,\n ProviderConfig,\n FallbackConfig,\n} from \"../types.js\";\nimport { AgentSDKProvider } from \"./agent-sdk.js\";\nimport { AnthropicProvider } from \"./anthropic.js\";\nimport { OpenRouterProvider } from \"./openrouter.js\";\nimport { ResilientProvider } from \"./resilient.js\";\nimport { FallbackChainProvider } from \"./fallback-chain.js\";\nimport { getEnvVar } from \"../config.js\";\n\nexport { createEmbeddingProvider } from \"./embedding/index.js\";\n\nfunction requireEnvVar(key: string): string {\n const value = getEnvVar(key);\n if (!value) {\n throw new Error(\n `Missing required environment variable: ${key}. Set it in ~/.agentmemory/.env or as an environment variable.`,\n );\n }\n return value;\n}\n\nexport function createProvider(config: ProviderConfig): ResilientProvider {\n return new ResilientProvider(createBaseProvider(config));\n}\n\nexport function createFallbackProvider(\n config: ProviderConfig,\n fallbackConfig: FallbackConfig,\n): ResilientProvider {\n if (fallbackConfig.providers.length === 0) {\n return createProvider(config);\n }\n\n const providers: MemoryProvider[] = [createBaseProvider(config)];\n for (const providerType of fallbackConfig.providers) {\n if (providerType === config.provider) continue;\n try {\n const fbConfig: ProviderConfig = {\n provider: providerType,\n model: config.model,\n maxTokens: config.maxTokens,\n };\n providers.push(createBaseProvider(fbConfig));\n } catch {\n // skip unavailable fallback providers\n }\n }\n\n if (providers.length > 1) {\n return new ResilientProvider(new FallbackChainProvider(providers));\n }\n return new ResilientProvider(providers[0]);\n}\n\nfunction createBaseProvider(config: ProviderConfig): MemoryProvider {\n switch (config.provider) {\n case \"anthropic\":\n return new AnthropicProvider(\n requireEnvVar(\"ANTHROPIC_API_KEY\"),\n config.model,\n config.maxTokens,\n );\n case \"gemini\":\n return new OpenRouterProvider(\n requireEnvVar(\"GEMINI_API_KEY\"),\n config.model,\n config.maxTokens,\n \"https://generativelanguage.googleapis.com/v1beta/openai/chat/completions\",\n );\n case \"openrouter\":\n return new OpenRouterProvider(\n requireEnvVar(\"OPENROUTER_API_KEY\"),\n config.model,\n config.maxTokens,\n \"https://openrouter.ai/api/v1/chat/completions\",\n );\n case \"agent-sdk\":\n default:\n return new AgentSDKProvider();\n }\n}\n","import type { ISdk } from 'iii-sdk'\n\nexport class StateKV {\n constructor(private sdk: ISdk) {}\n\n async get<T = unknown>(scope: string, key: string): Promise<T | null> {\n return this.sdk.trigger<{ scope: string; key: string }, T | null>(\n 'state::get',\n { scope, key },\n )\n }\n\n async set<T = unknown>(scope: string, key: string, data: T): Promise<T> {\n return this.sdk.trigger<{ scope: string; key: string; data: T }, T>(\n 'state::set',\n { scope, key, data },\n )\n }\n\n async delete(scope: string, key: string): Promise<void> {\n return this.sdk.trigger<{ scope: string; key: string }, void>(\n 'state::delete',\n { scope, key },\n )\n }\n\n async list<T = unknown>(scope: string): Promise<T[]> {\n return this.sdk.trigger<{ scope: string }, T[]>(\n 'state::list',\n { scope },\n )\n }\n}\n","function float32ToBase64(arr: Float32Array): string {\n return Buffer.from(arr.buffer).toString(\"base64\");\n}\n\nfunction base64ToFloat32(b64: string): Float32Array {\n return new Float32Array(Buffer.from(b64, \"base64\").buffer);\n}\n\nfunction cosineSimilarity(a: Float32Array, b: Float32Array): number {\n if (a.length !== b.length) return 0;\n let dot = 0;\n let normA = 0;\n let normB = 0;\n for (let i = 0; i < a.length; i++) {\n dot += a[i] * b[i];\n normA += a[i] * a[i];\n normB += b[i] * b[i];\n }\n const denom = Math.sqrt(normA) * Math.sqrt(normB);\n return denom === 0 ? 0 : dot / denom;\n}\n\nexport class VectorIndex {\n private vectors: Map<string, { embedding: Float32Array; sessionId: string }> =\n new Map();\n\n add(obsId: string, sessionId: string, embedding: Float32Array): void {\n this.vectors.set(obsId, { embedding, sessionId });\n }\n\n remove(obsId: string): void {\n this.vectors.delete(obsId);\n }\n\n search(\n query: Float32Array,\n limit = 20,\n ): Array<{ obsId: string; sessionId: string; score: number }> {\n const results: Array<{\n obsId: string;\n sessionId: string;\n score: number;\n }> = [];\n let minScore = -Infinity;\n\n for (const [obsId, entry] of this.vectors) {\n const score = cosineSimilarity(query, entry.embedding);\n if (results.length < limit) {\n results.push({ obsId, sessionId: entry.sessionId, score });\n if (results.length === limit) {\n results.sort((a, b) => a.score - b.score);\n minScore = results[0].score;\n }\n } else if (score > minScore) {\n results[0] = { obsId, sessionId: entry.sessionId, score };\n results.sort((a, b) => a.score - b.score);\n minScore = results[0].score;\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results;\n }\n\n get size(): number {\n return this.vectors.size;\n }\n\n clear(): void {\n this.vectors.clear();\n }\n\n restoreFrom(other: VectorIndex): void {\n const src = (other as any).vectors as Map<\n string,\n { embedding: Float32Array; sessionId: string }\n >;\n this.vectors = new Map();\n for (const [obsId, entry] of src) {\n this.vectors.set(obsId, {\n embedding: new Float32Array(entry.embedding),\n sessionId: entry.sessionId,\n });\n }\n }\n\n serialize(): string {\n const data: Array<[string, { embedding: string; sessionId: string }]> = [];\n for (const [obsId, entry] of this.vectors) {\n data.push([\n obsId,\n {\n embedding: float32ToBase64(entry.embedding),\n sessionId: entry.sessionId,\n },\n ]);\n }\n return JSON.stringify(data);\n }\n\n static deserialize(json: string): VectorIndex {\n const idx = new VectorIndex();\n let data: unknown;\n try {\n data = JSON.parse(json);\n } catch {\n return idx;\n }\n if (!Array.isArray(data)) return idx;\n for (const row of data) {\n try {\n if (!Array.isArray(row) || row.length < 2) continue;\n const [obsId, entry] = row;\n if (\n typeof obsId !== \"string\" ||\n typeof entry?.embedding !== \"string\" ||\n typeof entry?.sessionId !== \"string\"\n )\n continue;\n idx.vectors.set(obsId, {\n embedding: base64ToFloat32(entry.embedding),\n sessionId: entry.sessionId,\n });\n } catch {\n continue;\n }\n }\n return idx;\n }\n}\n","import { createHash } from \"node:crypto\";\n\nexport const KV = {\n sessions: \"mem:sessions\",\n observations: (sessionId: string) => `mem:obs:${sessionId}`,\n memories: \"mem:memories\",\n summaries: \"mem:summaries\",\n config: \"mem:config\",\n metrics: \"mem:metrics\",\n health: \"mem:health\",\n embeddings: (obsId: string) => `mem:emb:${obsId}`,\n bm25Index: \"mem:index:bm25\",\n relations: \"mem:relations\",\n profiles: \"mem:profiles\",\n claudeBridge: \"mem:claude-bridge\",\n graphNodes: \"mem:graph:nodes\",\n graphEdges: \"mem:graph:edges\",\n semantic: \"mem:semantic\",\n procedural: \"mem:procedural\",\n teamShared: (teamId: string) => `mem:team:${teamId}:shared`,\n teamUsers: (teamId: string, userId: string) =>\n `mem:team:${teamId}:users:${userId}`,\n teamProfile: (teamId: string) => `mem:team:${teamId}:profile`,\n audit: \"mem:audit\",\n actions: \"mem:actions\",\n actionEdges: \"mem:action-edges\",\n leases: \"mem:leases\",\n routines: \"mem:routines\",\n routineRuns: \"mem:routine-runs\",\n signals: \"mem:signals\",\n checkpoints: \"mem:checkpoints\",\n mesh: \"mem:mesh\",\n sketches: \"mem:sketches\",\n facets: \"mem:facets\",\n sentinels: \"mem:sentinels\",\n crystals: \"mem:crystals\",\n lessons: \"mem:lessons\",\n graphEdgeHistory: \"mem:graph:edge-history\",\n enrichedChunks: (sessionId: string) => `mem:enriched:${sessionId}`,\n latentEmbeddings: (obsId: string) => `mem:latent:${obsId}`,\n retentionScores: \"mem:retention\",\n} as const;\n\nexport const STREAM = {\n name: \"mem-live\",\n group: (sessionId: string) => sessionId,\n viewerGroup: \"viewer\",\n} as const;\n\nexport function generateId(prefix: string): string {\n const ts = Date.now().toString(36);\n const rand = crypto.randomUUID().replace(/-/g, \"\").slice(0, 12);\n return `${prefix}_${ts}_${rand}`;\n}\n\nexport function fingerprintId(prefix: string, content: string): string {\n const hash = createHash(\"sha256\").update(content).digest(\"hex\");\n return `${prefix}_${hash.slice(0, 16)}`;\n}\n\nexport function jaccardSimilarity(a: string, b: string): number {\n const setA = new Set(a.split(/\\s+/).filter((t) => t.length > 2));\n const setB = new Set(b.split(/\\s+/).filter((t) => t.length > 2));\n if (setA.size === 0 && setB.size === 0) return 1;\n if (setA.size === 0 || setB.size === 0) return 0;\n let intersection = 0;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n return intersection / (setA.size + setB.size - intersection);\n}\n","import type {\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nexport interface GraphRetrievalResult {\n obsId: string;\n sessionId: string;\n score: number;\n graphContext: string;\n pathLength: number;\n}\n\nfunction buildGraphContext(\n path: Array<{ node: GraphNode; edge?: GraphEdge }>,\n): string {\n const parts: string[] = [];\n for (const step of path) {\n const props = Object.entries(step.node.properties)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${v}`)\n .join(\", \");\n let line = `[${step.node.type}] ${step.node.name}`;\n if (props) line += ` (${props})`;\n if (step.edge) {\n line += ` --${step.edge.type}-->`;\n if (step.edge.context?.reasoning) {\n line += ` [${step.edge.context.reasoning}]`;\n }\n if (step.edge.tvalid) {\n line += ` @${step.edge.tvalid}`;\n }\n }\n parts.push(line);\n }\n return parts.join(\" \");\n}\n\nexport class GraphRetrieval {\n constructor(private kv: StateKV) {}\n\n async searchByEntities(\n entityNames: string[],\n maxDepth = 2,\n maxResults = 20,\n ): Promise<GraphRetrievalResult[]> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const matchingNodes = allNodes.filter((n) => {\n const nameLower = n.name.toLowerCase();\n return entityNames.some(\n (e) =>\n nameLower.includes(e.toLowerCase()) ||\n e.toLowerCase().includes(nameLower),\n );\n });\n\n if (matchingNodes.length === 0) return [];\n\n const results: GraphRetrievalResult[] = [];\n const visitedObs = new Set<string>();\n\n for (const startNode of matchingNodes) {\n const paths = this.bfsTraversal(\n startNode,\n allNodes,\n allEdges,\n maxDepth,\n );\n\n for (const path of paths) {\n const lastNode = path[path.length - 1].node;\n for (const obsId of lastNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n\n const pathLength = path.length;\n const edgeWeights = path\n .filter((s) => s.edge)\n .map((s) => s.edge!.weight);\n const avgWeight =\n edgeWeights.length > 0\n ? edgeWeights.reduce((a, b) => a + b, 0) / edgeWeights.length\n : 0.5;\n const score = avgWeight * (1 / pathLength);\n\n results.push({\n obsId,\n sessionId: \"\",\n score,\n graphContext: buildGraphContext(path),\n pathLength,\n });\n }\n }\n\n for (const obsId of startNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n results.push({\n obsId,\n sessionId: \"\",\n score: 1.0,\n graphContext: `[${startNode.type}] ${startNode.name}`,\n pathLength: 0,\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n }\n\n async expandFromChunks(\n obsIds: string[],\n maxDepth = 1,\n maxResults = 10,\n ): Promise<GraphRetrievalResult[]> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const linkedNodes = allNodes.filter((n) =>\n n.sourceObservationIds.some((id) => obsIds.includes(id)),\n );\n\n const results: GraphRetrievalResult[] = [];\n const visitedObs = new Set<string>(obsIds);\n\n for (const node of linkedNodes) {\n const paths = this.bfsTraversal(node, allNodes, allEdges, maxDepth);\n for (const path of paths) {\n const lastNode = path[path.length - 1].node;\n for (const obsId of lastNode.sourceObservationIds) {\n if (visitedObs.has(obsId)) continue;\n visitedObs.add(obsId);\n\n const pathLength = path.length;\n const score = 0.5 * (1 / (pathLength + 1));\n\n results.push({\n obsId,\n sessionId: \"\",\n score,\n graphContext: buildGraphContext(path),\n pathLength,\n });\n }\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, maxResults);\n }\n\n async temporalQuery(\n entityName: string,\n asOf?: string,\n ): Promise<{\n entity: GraphNode | null;\n currentState: GraphEdge[];\n history: GraphEdge[];\n }> {\n const allNodes = (await this.kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await this.kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n\n const entity = allNodes.find(\n (n) => n.name.toLowerCase() === entityName.toLowerCase(),\n );\n if (!entity) return { entity: null, currentState: [], history: [] };\n\n const relatedEdges = allEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n if (!asOf) {\n const latestEdges = this.getLatestEdges(relatedEdges);\n const historicalEdges = relatedEdges.filter(\n (e) => !latestEdges.some((le) => le.id === e.id),\n );\n return { entity, currentState: latestEdges, history: historicalEdges };\n }\n\n const asOfDate = new Date(asOf).getTime();\n const validEdges = relatedEdges.filter((e) => {\n const commitDate = new Date(e.tcommit || e.createdAt).getTime();\n if (commitDate > asOfDate) return false;\n if (e.tvalid) {\n const validDate = new Date(e.tvalid).getTime();\n if (validDate > asOfDate) return false;\n }\n if (e.tvalidEnd) {\n const endDate = new Date(e.tvalidEnd).getTime();\n if (endDate < asOfDate) return false;\n }\n return true;\n });\n\n return {\n entity,\n currentState: this.getLatestEdges(validEdges),\n history: validEdges,\n };\n }\n\n private getLatestEdges(edges: GraphEdge[]): GraphEdge[] {\n const byKey = new Map<string, GraphEdge[]>();\n for (const e of edges) {\n const key = `${e.sourceNodeId}|${e.targetNodeId}|${e.type}`;\n if (!byKey.has(key)) byKey.set(key, []);\n byKey.get(key)!.push(e);\n }\n\n const latest: GraphEdge[] = [];\n for (const group of byKey.values()) {\n if (group.length === 0) continue;\n group.sort(\n (a, b) =>\n new Date(b.tcommit || b.createdAt).getTime() -\n new Date(a.tcommit || a.createdAt).getTime(),\n );\n const newest = group.find((e) => e.isLatest !== false) || group[0];\n latest.push(newest);\n }\n return latest;\n }\n\n private bfsTraversal(\n startNode: GraphNode,\n allNodes: GraphNode[],\n allEdges: GraphEdge[],\n maxDepth: number,\n ): Array<Array<{ node: GraphNode; edge?: GraphEdge }>> {\n const paths: Array<Array<{ node: GraphNode; edge?: GraphEdge }>> = [];\n const visited = new Set<string>();\n const queue: Array<{\n nodeId: string;\n depth: number;\n path: Array<{ node: GraphNode; edge?: GraphEdge }>;\n }> = [{ nodeId: startNode.id, depth: 0, path: [{ node: startNode }] }];\n\n visited.add(startNode.id);\n\n while (queue.length > 0) {\n const { nodeId, depth, path } = queue.shift()!;\n paths.push(path);\n\n if (depth >= maxDepth) continue;\n\n const neighborEdges = allEdges.filter(\n (e) => e.sourceNodeId === nodeId || e.targetNodeId === nodeId,\n );\n\n for (const edge of neighborEdges) {\n const nextId =\n edge.sourceNodeId === nodeId\n ? edge.targetNodeId\n : edge.sourceNodeId;\n if (visited.has(nextId)) continue;\n visited.add(nextId);\n\n const nextNode = allNodes.find((n) => n.id === nextId);\n if (!nextNode) continue;\n\n queue.push({\n nodeId: nextId,\n depth: depth + 1,\n path: [...path, { node: nextNode, edge }],\n });\n }\n }\n\n return paths;\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { MemoryProvider, QueryExpansion } from \"../types.js\";\n\nconst QUERY_EXPANSION_SYSTEM = `You are a query expansion engine for a memory retrieval system. Given a user query, generate diverse reformulations to maximize recall.\n\nOutput EXACTLY this XML:\n<expansion>\n <reformulations>\n <query>semantically diverse rephrasing 1</query>\n <query>semantically diverse rephrasing 2</query>\n <query>semantically diverse rephrasing 3</query>\n </reformulations>\n <temporal>\n <query>time-concretized version if applicable</query>\n </temporal>\n <entities>\n <entity>extracted entity name 1</entity>\n <entity>extracted entity name 2</entity>\n </entities>\n</expansion>\n\nRules:\n- Generate 3-5 reformulations capturing different interpretations\n- Include paraphrases, domain-specific restatements, and abstract/concrete variants\n- Extract any named entities (people, files, projects, libraries, concepts)\n- If the query mentions time (\"last week\", \"recently\"), generate temporal concretizations\n- Each reformulation should capture a distinct facet of intent\n- Keep reformulations concise (under 100 chars each)`;\n\nfunction parseExpansionXml(xml: string): QueryExpansion | null {\n const reformulations: string[] = [];\n const queryRegex =\n /<reformulations>[\\s\\S]*?<\\/reformulations>/;\n const reformBlock = xml.match(queryRegex);\n if (reformBlock) {\n const qRegex = /<query>([^<]+)<\\/query>/g;\n let match;\n while ((match = qRegex.exec(reformBlock[0])) !== null) {\n reformulations.push(match[1].trim());\n }\n }\n\n const temporalConcretizations: string[] = [];\n const tempBlock = xml.match(/<temporal>[\\s\\S]*?<\\/temporal>/);\n if (tempBlock) {\n const qRegex = /<query>([^<]+)<\\/query>/g;\n let match;\n while ((match = qRegex.exec(tempBlock[0])) !== null) {\n temporalConcretizations.push(match[1].trim());\n }\n }\n\n const entityExtractions: string[] = [];\n const entityRegex = /<entity>([^<]+)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n entityExtractions.push(match[1].trim());\n }\n\n return {\n original: \"\",\n reformulations,\n temporalConcretizations,\n entityExtractions,\n };\n}\n\nexport function registerQueryExpansionFunction(\n sdk: ISdk,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::expand-query\",\n description:\n \"Generate diverse query reformulations for improved recall\",\n },\n async (data: { query: string; maxReformulations?: number }) => {\n const ctx = getContext();\n const maxR = data.maxReformulations ?? 5;\n\n try {\n const response = await provider.compress(\n QUERY_EXPANSION_SYSTEM,\n `Expand this query for memory retrieval:\\n\\n\"${data.query}\"`,\n );\n\n const parsed = parseExpansionXml(response);\n if (!parsed) {\n ctx.logger.warn(\"Failed to parse query expansion\");\n return {\n success: true,\n expansion: {\n original: data.query,\n reformulations: [],\n temporalConcretizations: [],\n entityExtractions: [],\n },\n };\n }\n\n parsed.original = data.query;\n parsed.reformulations = parsed.reformulations.slice(0, maxR);\n\n ctx.logger.info(\"Query expanded\", {\n original: data.query,\n reformulations: parsed.reformulations.length,\n entities: parsed.entityExtractions.length,\n });\n\n return { success: true, expansion: parsed };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Query expansion failed\", { error: msg });\n return {\n success: true,\n expansion: {\n original: data.query,\n reformulations: [],\n temporalConcretizations: [],\n entityExtractions: [],\n },\n };\n }\n },\n );\n}\n\nexport function extractEntitiesFromQuery(query: string): string[] {\n const entities: string[] = [];\n const quoted = query.match(/\"([^\"]+)\"/g);\n if (quoted) {\n for (const q of quoted) {\n entities.push(q.replace(/\"/g, \"\"));\n }\n }\n const capitalized = query.match(/\\b[A-Z][a-zA-Z0-9_.-]+\\b/g);\n if (capitalized) {\n const stopWords = new Set([\n \"The\",\n \"This\",\n \"That\",\n \"What\",\n \"When\",\n \"Where\",\n \"How\",\n \"Why\",\n \"Who\",\n \"Which\",\n \"Did\",\n \"Does\",\n \"Do\",\n \"Is\",\n \"Are\",\n \"Was\",\n \"Were\",\n \"Has\",\n \"Have\",\n \"Had\",\n \"Can\",\n \"Could\",\n \"Would\",\n \"Should\",\n \"Will\",\n \"May\",\n \"Might\",\n \"If\",\n \"And\",\n \"But\",\n \"Or\",\n \"Not\",\n \"For\",\n \"From\",\n \"With\",\n \"About\",\n \"After\",\n \"Before\",\n \"Between\",\n ]);\n for (const c of capitalized) {\n if (!stopWords.has(c)) entities.push(c);\n }\n }\n return [...new Set(entities)];\n}\n","import { SearchIndex } from \"./search-index.js\";\nimport { VectorIndex } from \"./vector-index.js\";\nimport type {\n EmbeddingProvider,\n HybridSearchResult,\n CompressedObservation,\n QueryExpansion,\n} from \"../types.js\";\nimport type { StateKV } from \"./kv.js\";\nimport { KV } from \"./schema.js\";\nimport {\n GraphRetrieval,\n type GraphRetrievalResult,\n} from \"../functions/graph-retrieval.js\";\nimport { extractEntitiesFromQuery } from \"../functions/query-expansion.js\";\n\nconst RRF_K = 60;\n\nexport class HybridSearch {\n private graphRetrieval: GraphRetrieval;\n\n constructor(\n private bm25: SearchIndex,\n private vector: VectorIndex | null,\n private embeddingProvider: EmbeddingProvider | null,\n private kv: StateKV,\n private bm25Weight = 0.4,\n private vectorWeight = 0.6,\n private graphWeight = 0.3,\n ) {\n this.graphRetrieval = new GraphRetrieval(kv);\n }\n\n async search(query: string, limit = 20): Promise<HybridSearchResult[]> {\n return this.tripleStreamSearch(query, limit);\n }\n\n async searchWithExpansion(\n query: string,\n limit: number,\n expansion: QueryExpansion,\n ): Promise<HybridSearchResult[]> {\n const allQueries = [\n query,\n ...expansion.reformulations,\n ...expansion.temporalConcretizations,\n ];\n\n const allEntities = [\n ...expansion.entityExtractions,\n ...extractEntitiesFromQuery(query),\n ];\n\n const resultSets = await Promise.all(\n allQueries.map((q) => this.tripleStreamSearch(q, limit, allEntities)),\n );\n\n const merged = new Map<string, HybridSearchResult>();\n for (const results of resultSets) {\n for (const r of results) {\n const existing = merged.get(r.observation.id);\n if (!existing || r.combinedScore > existing.combinedScore) {\n merged.set(r.observation.id, r);\n }\n }\n }\n\n return Array.from(merged.values())\n .sort((a, b) => b.combinedScore - a.combinedScore)\n .slice(0, limit);\n }\n\n private async tripleStreamSearch(\n query: string,\n limit: number,\n entityHints?: string[],\n ): Promise<HybridSearchResult[]> {\n const bm25Results = this.bm25.search(query, limit * 2);\n\n let vectorResults: Array<{\n obsId: string;\n sessionId: string;\n score: number;\n }> = [];\n let queryEmbedding: Float32Array | null = null;\n\n if (this.vector && this.embeddingProvider && this.vector.size > 0) {\n try {\n queryEmbedding = await this.embeddingProvider.embed(query);\n vectorResults = this.vector.search(queryEmbedding, limit * 2);\n } catch {\n // fall through to BM25-only\n }\n }\n\n const entities =\n entityHints && entityHints.length > 0\n ? entityHints\n : extractEntitiesFromQuery(query);\n let graphResults: GraphRetrievalResult[] = [];\n if (entities.length > 0) {\n try {\n graphResults = await this.graphRetrieval.searchByEntities(\n entities,\n 2,\n limit,\n );\n } catch {\n // graph search is best-effort\n }\n }\n\n const topVectorObs = vectorResults.slice(0, 5).map((r) => r.obsId);\n if (topVectorObs.length > 0) {\n try {\n const expansionResults =\n await this.graphRetrieval.expandFromChunks(topVectorObs, 1, 5);\n graphResults = [...graphResults, ...expansionResults];\n } catch {\n // expansion is best-effort\n }\n }\n\n const scores = new Map<\n string,\n {\n bm25Rank: number;\n vectorRank: number;\n graphRank: number;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n graphContext?: string;\n }\n >();\n\n bm25Results.forEach((r, i) => {\n scores.set(r.obsId, {\n bm25Rank: i + 1,\n vectorRank: Infinity,\n graphRank: Infinity,\n sessionId: r.sessionId,\n bm25Score: r.score,\n vectorScore: 0,\n graphScore: 0,\n });\n });\n\n vectorResults.forEach((r, i) => {\n const existing = scores.get(r.obsId);\n if (existing) {\n existing.vectorRank = i + 1;\n existing.vectorScore = r.score;\n } else {\n scores.set(r.obsId, {\n bm25Rank: Infinity,\n vectorRank: i + 1,\n graphRank: Infinity,\n sessionId: r.sessionId,\n bm25Score: 0,\n vectorScore: r.score,\n graphScore: 0,\n });\n }\n });\n\n graphResults.forEach((r, i) => {\n const existing = scores.get(r.obsId);\n if (existing) {\n existing.graphRank = Math.min(existing.graphRank, i + 1);\n existing.graphScore = Math.max(existing.graphScore, r.score);\n if (r.graphContext && !existing.graphContext) {\n existing.graphContext = r.graphContext;\n }\n } else {\n scores.set(r.obsId, {\n bm25Rank: Infinity,\n vectorRank: Infinity,\n graphRank: i + 1,\n sessionId: r.sessionId,\n bm25Score: 0,\n vectorScore: 0,\n graphScore: r.score,\n graphContext: r.graphContext,\n });\n }\n });\n\n const hasVector = vectorResults.length > 0;\n const hasGraph = graphResults.length > 0;\n\n let effectiveBm25W = this.bm25Weight;\n let effectiveVectorW = hasVector ? this.vectorWeight : 0;\n let effectiveGraphW = hasGraph ? this.graphWeight : 0;\n\n const totalW = effectiveBm25W + effectiveVectorW + effectiveGraphW;\n if (totalW > 0) {\n effectiveBm25W /= totalW;\n effectiveVectorW /= totalW;\n effectiveGraphW /= totalW;\n }\n\n const combined = Array.from(scores.entries()).map(([obsId, s]) => ({\n obsId,\n sessionId: s.sessionId,\n bm25Score: s.bm25Score,\n vectorScore: s.vectorScore,\n graphScore: s.graphScore,\n graphContext: s.graphContext,\n combinedScore:\n effectiveBm25W * (1 / (RRF_K + s.bm25Rank)) +\n effectiveVectorW * (1 / (RRF_K + s.vectorRank)) +\n effectiveGraphW * (1 / (RRF_K + s.graphRank)),\n }));\n\n combined.sort((a, b) => b.combinedScore - a.combinedScore);\n const diversified = this.diversifyBySession(combined, limit);\n return this.enrichResults(diversified, limit);\n }\n\n private diversifyBySession(\n results: Array<{\n obsId: string;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n combinedScore: number;\n graphContext?: string;\n }>,\n limit: number,\n maxPerSession = 3,\n ): typeof results {\n const selected: typeof results = [];\n const sessionCounts = new Map<string, number>();\n\n for (const r of results) {\n const count = sessionCounts.get(r.sessionId) || 0;\n if (count >= maxPerSession) continue;\n selected.push(r);\n sessionCounts.set(r.sessionId, count + 1);\n if (selected.length >= limit) break;\n }\n\n if (selected.length < limit) {\n for (const r of results) {\n if (selected.length >= limit) break;\n if (!selected.some(s => s.obsId === r.obsId)) {\n selected.push(r);\n }\n }\n }\n\n return selected;\n }\n\n private async enrichResults(\n results: Array<{\n obsId: string;\n sessionId: string;\n bm25Score: number;\n vectorScore: number;\n graphScore: number;\n combinedScore: number;\n graphContext?: string;\n }>,\n limit: number,\n ): Promise<HybridSearchResult[]> {\n const sliced = results.slice(0, limit);\n const observations = await Promise.all(\n sliced.map((r) =>\n this.kv\n .get<CompressedObservation>(KV.observations(r.sessionId), r.obsId)\n .catch(() => null),\n ),\n );\n const enriched: HybridSearchResult[] = [];\n for (let i = 0; i < sliced.length; i++) {\n const obs = observations[i];\n if (obs) {\n enriched.push({\n observation: obs,\n bm25Score: sliced[i].bm25Score,\n vectorScore: sliced[i].vectorScore,\n graphScore: sliced[i].graphScore,\n combinedScore: sliced[i].combinedScore,\n sessionId: sliced[i].sessionId,\n graphContext: sliced[i].graphContext,\n });\n }\n }\n return enriched;\n }\n}\n","const step2map: Record<string, string> = {\n ational: \"ate\", tional: \"tion\", enci: \"ence\", anci: \"ance\",\n izer: \"ize\", iser: \"ise\", abli: \"able\", alli: \"al\",\n entli: \"ent\", eli: \"e\", ousli: \"ous\", ization: \"ize\",\n isation: \"ise\", ation: \"ate\", ator: \"ate\", alism: \"al\",\n iveness: \"ive\", fulness: \"ful\", ousness: \"ous\", aliti: \"al\",\n iviti: \"ive\", biliti: \"ble\",\n};\n\nconst step3map: Record<string, string> = {\n icate: \"ic\", ative: \"\", alize: \"al\", alise: \"al\",\n iciti: \"ic\", ical: \"ic\", ful: \"\", ness: \"\",\n};\n\nfunction hasVowel(s: string): boolean {\n return /[aeiou]/.test(s);\n}\n\nfunction measure(s: string): number {\n const reduced = s.replace(/[^aeiouy]+/g, \"C\").replace(/[aeiouy]+/g, \"V\");\n const m = reduced.match(/VC/g);\n return m ? m.length : 0;\n}\n\nfunction endsDoubleConsonant(s: string): boolean {\n return s.length >= 2 && s[s.length - 1] === s[s.length - 2] && !/[aeiou]/.test(s[s.length - 1]);\n}\n\nfunction endsCVC(s: string): boolean {\n if (s.length < 3) return false;\n const c1 = s[s.length - 3], v = s[s.length - 2], c2 = s[s.length - 1];\n return !/[aeiou]/.test(c1) && /[aeiou]/.test(v) && !/[aeiouwxy]/.test(c2);\n}\n\nexport function stem(word: string): string {\n if (word.length <= 2) return word;\n\n let w = word;\n\n if (w.endsWith(\"sses\")) w = w.slice(0, -2);\n else if (w.endsWith(\"ies\")) w = w.slice(0, -2);\n else if (!w.endsWith(\"ss\") && w.endsWith(\"s\")) w = w.slice(0, -1);\n\n if (w.endsWith(\"eed\")) {\n if (measure(w.slice(0, -3)) > 0) w = w.slice(0, -1);\n } else if (w.endsWith(\"ed\") && hasVowel(w.slice(0, -2))) {\n w = w.slice(0, -2);\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w += \"e\";\n else if (endsDoubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && endsCVC(w)) w += \"e\";\n } else if (w.endsWith(\"ing\") && hasVowel(w.slice(0, -3))) {\n w = w.slice(0, -3);\n if (w.endsWith(\"at\") || w.endsWith(\"bl\") || w.endsWith(\"iz\")) w += \"e\";\n else if (endsDoubleConsonant(w) && !/[lsz]$/.test(w)) w = w.slice(0, -1);\n else if (measure(w) === 1 && endsCVC(w)) w += \"e\";\n }\n\n if (w.endsWith(\"y\") && hasVowel(w.slice(0, -1))) {\n w = w.slice(0, -1) + \"i\";\n }\n\n for (const [suffix, replacement] of Object.entries(step2map)) {\n if (w.endsWith(suffix)) {\n const base = w.slice(0, -suffix.length);\n if (measure(base) > 0) w = base + replacement;\n break;\n }\n }\n\n for (const [suffix, replacement] of Object.entries(step3map)) {\n if (w.endsWith(suffix)) {\n const base = w.slice(0, -suffix.length);\n if (measure(base) > 0) w = base + replacement;\n break;\n }\n }\n\n if (w.endsWith(\"al\") || w.endsWith(\"ance\") || w.endsWith(\"ence\") ||\n w.endsWith(\"er\") || w.endsWith(\"ic\") || w.endsWith(\"able\") ||\n w.endsWith(\"ible\") || w.endsWith(\"ant\") || w.endsWith(\"ement\") ||\n w.endsWith(\"ment\") || w.endsWith(\"ent\") || w.endsWith(\"tion\") ||\n w.endsWith(\"sion\") || w.endsWith(\"ou\") || w.endsWith(\"ism\") ||\n w.endsWith(\"ate\") || w.endsWith(\"iti\") || w.endsWith(\"ous\") ||\n w.endsWith(\"ive\") || w.endsWith(\"ize\") || w.endsWith(\"ise\")) {\n const suffixLen = w.match(/(ement|ment|tion|sion|ance|ence|able|ible|ism|ate|iti|ous|ive|ize|ise|ant|ent|al|er|ic|ou)$/)?.[0]?.length ?? 0;\n if (suffixLen > 0) {\n const base = w.slice(0, -suffixLen);\n if (measure(base) > 1) w = base;\n }\n }\n\n if (w.endsWith(\"e\")) {\n const base = w.slice(0, -1);\n if (measure(base) > 1 || (measure(base) === 1 && !endsCVC(base))) {\n w = base;\n }\n }\n\n if (endsDoubleConsonant(w) && w.endsWith(\"l\") && measure(w.slice(0, -1)) > 1) {\n w = w.slice(0, -1);\n }\n\n return w;\n}\n","import { stem } from \"./stemmer.js\";\n\nconst SYNONYM_GROUPS: string[][] = [\n [\"auth\", \"authentication\", \"authn\", \"authenticating\"],\n [\"authz\", \"authorization\", \"authorizing\"],\n [\"db\", \"database\", \"datastore\"],\n [\"perf\", \"performance\", \"latency\", \"throughput\", \"slow\", \"bottleneck\"],\n [\"optim\", \"optimization\", \"optimizing\", \"optimise\", \"query-optimization\"],\n [\"k8s\", \"kubernetes\", \"kube\"],\n [\"config\", \"configuration\", \"configuring\", \"setup\"],\n [\"deps\", \"dependencies\", \"dependency\"],\n [\"env\", \"environment\"],\n [\"fn\", \"function\"],\n [\"impl\", \"implementation\", \"implementing\"],\n [\"msg\", \"message\", \"messaging\"],\n [\"repo\", \"repository\"],\n [\"req\", \"request\"],\n [\"res\", \"response\"],\n [\"ts\", \"typescript\"],\n [\"js\", \"javascript\"],\n [\"pg\", \"postgres\", \"postgresql\"],\n [\"err\", \"error\", \"errors\"],\n [\"api\", \"endpoint\", \"endpoints\"],\n [\"ci\", \"continuous-integration\"],\n [\"cd\", \"continuous-deployment\"],\n [\"test\", \"testing\", \"tests\"],\n [\"doc\", \"documentation\", \"docs\"],\n [\"infra\", \"infrastructure\"],\n [\"deploy\", \"deployment\", \"deploying\"],\n [\"cache\", \"caching\", \"cached\"],\n [\"log\", \"logging\", \"logs\"],\n [\"monitor\", \"monitoring\"],\n [\"observe\", \"observability\"],\n [\"sec\", \"security\", \"secure\"],\n [\"validate\", \"validation\", \"validating\"],\n [\"migrate\", \"migration\", \"migrations\"],\n [\"debug\", \"debugging\"],\n [\"container\", \"containerization\", \"docker\"],\n [\"crash\", \"crashloop\", \"crashloopbackoff\"],\n [\"webhook\", \"webhooks\", \"callback\"],\n [\"middleware\", \"mw\"],\n [\"paginate\", \"pagination\"],\n [\"serialize\", \"serialization\"],\n [\"encrypt\", \"encryption\"],\n [\"hash\", \"hashing\"],\n];\n\nconst synonymMap = new Map<string, Set<string>>();\n\nfor (const group of SYNONYM_GROUPS) {\n const stemmed = group.map(t => stem(t.toLowerCase()));\n for (const s of stemmed) {\n if (!synonymMap.has(s)) synonymMap.set(s, new Set());\n for (const other of stemmed) {\n if (other !== s) synonymMap.get(s)!.add(other);\n }\n }\n}\n\nexport function getSynonyms(stemmedTerm: string): string[] {\n const syns = synonymMap.get(stemmedTerm);\n return syns ? [...syns] : [];\n}\n","import type { CompressedObservation } from \"../types.js\";\nimport { stem } from \"./stemmer.js\";\nimport { getSynonyms } from \"./synonyms.js\";\n\ninterface IndexEntry {\n obsId: string;\n sessionId: string;\n termCount: number;\n}\n\nexport class SearchIndex {\n private entries: Map<string, IndexEntry> = new Map();\n private invertedIndex: Map<string, Set<string>> = new Map();\n private docTermCounts: Map<string, Map<string, number>> = new Map();\n private totalDocLength = 0;\n private sortedTerms: string[] | null = null;\n\n private readonly k1 = 1.2;\n private readonly b = 0.75;\n\n add(obs: CompressedObservation): void {\n const terms = this.extractTerms(obs);\n const termFreq = new Map<string, number>();\n let termCount = 0;\n\n for (const term of terms) {\n termFreq.set(term, (termFreq.get(term) || 0) + 1);\n termCount++;\n }\n\n this.entries.set(obs.id, {\n obsId: obs.id,\n sessionId: obs.sessionId,\n termCount,\n });\n this.docTermCounts.set(obs.id, termFreq);\n this.totalDocLength += termCount;\n\n for (const term of termFreq.keys()) {\n if (!this.invertedIndex.has(term)) {\n this.invertedIndex.set(term, new Set());\n }\n this.invertedIndex.get(term)!.add(obs.id);\n }\n\n this.sortedTerms = null;\n }\n\n search(\n query: string,\n limit = 20,\n ): Array<{ obsId: string; sessionId: string; score: number }> {\n const rawTerms = this.tokenize(query.toLowerCase());\n if (rawTerms.length === 0) return [];\n\n const N = this.entries.size;\n if (N === 0) return [];\n const avgDocLen = this.totalDocLength / N;\n\n const queryTerms: Array<{ term: string; weight: number }> = [];\n const seen = new Set<string>();\n for (const term of rawTerms) {\n if (!seen.has(term)) {\n seen.add(term);\n queryTerms.push({ term, weight: 1.0 });\n }\n for (const syn of getSynonyms(term)) {\n if (!seen.has(syn)) {\n seen.add(syn);\n queryTerms.push({ term: syn, weight: 0.7 });\n }\n }\n }\n\n const scores = new Map<string, number>();\n const sorted = this.getSortedTerms();\n\n for (const { term, weight } of queryTerms) {\n const matchingDocs = this.invertedIndex.get(term);\n if (matchingDocs) {\n const df = matchingDocs.size;\n const idf = Math.log((N - df + 0.5) / (df + 0.5) + 1);\n\n for (const obsId of matchingDocs) {\n const entry = this.entries.get(obsId)!;\n const docTerms = this.docTermCounts.get(obsId);\n const tf = docTerms?.get(term) || 0;\n const docLen = entry.termCount;\n\n const numerator = tf * (this.k1 + 1);\n const denominator =\n tf + this.k1 * (1 - this.b + this.b * (docLen / avgDocLen));\n const bm25Score = idf * (numerator / denominator) * weight;\n\n scores.set(obsId, (scores.get(obsId) || 0) + bm25Score);\n }\n }\n\n const startIdx = this.lowerBound(sorted, term);\n for (let si = startIdx; si < sorted.length; si++) {\n const indexTerm = sorted[si];\n if (!indexTerm.startsWith(term)) break;\n if (indexTerm === term) continue;\n\n const obsIds = this.invertedIndex.get(indexTerm)!;\n const prefixDf = obsIds.size;\n const prefixIdf =\n Math.log((N - prefixDf + 0.5) / (prefixDf + 0.5) + 1) * 0.5;\n for (const obsId of obsIds) {\n const entry = this.entries.get(obsId)!;\n const docTerms = this.docTermCounts.get(obsId);\n const tf = docTerms?.get(indexTerm) || 0;\n const docLen = entry.termCount;\n const numerator = tf * (this.k1 + 1);\n const denominator =\n tf + this.k1 * (1 - this.b + this.b * (docLen / avgDocLen));\n scores.set(\n obsId,\n (scores.get(obsId) || 0) + prefixIdf * (numerator / denominator) * weight,\n );\n }\n }\n }\n\n return Array.from(scores.entries())\n .map(([obsId, score]) => {\n const entry = this.entries.get(obsId)!;\n return { obsId, sessionId: entry.sessionId, score };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, limit);\n }\n\n get size(): number {\n return this.entries.size;\n }\n\n clear(): void {\n this.entries.clear();\n this.invertedIndex.clear();\n this.docTermCounts.clear();\n this.totalDocLength = 0;\n this.sortedTerms = null;\n }\n\n restoreFrom(other: SearchIndex): void {\n this.entries = new Map(\n Array.from(other.entries.entries()).map(([k, v]) => [k, { ...v }]),\n );\n this.invertedIndex = new Map(\n Array.from(other.invertedIndex.entries()).map(([k, v]) => [\n k,\n new Set(v),\n ]),\n );\n this.docTermCounts = new Map(\n Array.from(other.docTermCounts.entries()).map(([k, v]) => [\n k,\n new Map(v),\n ]),\n );\n this.totalDocLength = other.totalDocLength;\n this.sortedTerms = null;\n }\n\n serialize(): string {\n const entries = Array.from(this.entries.entries());\n const inverted = Array.from(this.invertedIndex.entries()).map(\n ([term, ids]) => [term, Array.from(ids)] as [string, string[]],\n );\n const docTerms = Array.from(this.docTermCounts.entries()).map(\n ([id, counts]) =>\n [id, Array.from(counts.entries())] as [string, [string, number][]],\n );\n return JSON.stringify({\n v: 2,\n entries,\n inverted,\n docTerms,\n totalDocLength: this.totalDocLength,\n });\n }\n\n static deserialize(json: string): SearchIndex {\n try {\n const idx = new SearchIndex();\n const data = JSON.parse(json);\n if (!data?.entries || !data?.inverted || !data?.docTerms) return idx;\n for (const [key, val] of data.entries) {\n idx.entries.set(key, val);\n }\n for (const [term, ids] of data.inverted) {\n idx.invertedIndex.set(term, new Set(ids));\n }\n for (const [id, counts] of data.docTerms) {\n idx.docTermCounts.set(id, new Map(counts));\n }\n const rawLen = Number(data.totalDocLength);\n idx.totalDocLength =\n Number.isFinite(rawLen) && rawLen >= 0 ? Math.floor(rawLen) : 0;\n return idx;\n } catch {\n return new SearchIndex();\n }\n }\n\n private extractTerms(obs: CompressedObservation): string[] {\n const parts = [\n obs.title,\n obs.subtitle || \"\",\n obs.narrative,\n ...obs.facts,\n ...obs.concepts,\n ...obs.files,\n obs.type,\n ];\n return this.tokenize(parts.join(\" \").toLowerCase());\n }\n\n private tokenize(text: string): string[] {\n return text\n .replace(/[^\\w\\s/.\\-_]/g, \" \")\n .split(/\\s+/)\n .filter((t) => t.length > 1)\n .map((t) => stem(t));\n }\n\n private getSortedTerms(): string[] {\n if (!this.sortedTerms) {\n this.sortedTerms = Array.from(this.invertedIndex.keys()).sort();\n }\n return this.sortedTerms;\n }\n\n private lowerBound(arr: string[], target: string): number {\n let lo = 0;\n let hi = arr.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (arr[mid] < target) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n}\n","import { SearchIndex } from \"./search-index.js\";\nimport { VectorIndex } from \"./vector-index.js\";\nimport type { StateKV } from \"./kv.js\";\nimport { KV } from \"./schema.js\";\n\nconst DEBOUNCE_MS = 5000;\n\nexport class IndexPersistence {\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private kv: StateKV,\n private bm25: SearchIndex,\n private vector: VectorIndex | null,\n ) {}\n\n scheduleSave(): void {\n if (this.timer) clearTimeout(this.timer);\n this.timer = setTimeout(() => this.save(), DEBOUNCE_MS);\n }\n\n async save(): Promise<void> {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n await this.kv.set(KV.bm25Index, \"data\", this.bm25.serialize());\n if (this.vector && this.vector.size > 0) {\n await this.kv.set(KV.bm25Index, \"vectors\", this.vector.serialize());\n }\n }\n\n async load(): Promise<{\n bm25: SearchIndex | null;\n vector: VectorIndex | null;\n }> {\n let bm25: SearchIndex | null = null;\n let vector: VectorIndex | null = null;\n\n const bm25Data = await this.kv\n .get<string>(KV.bm25Index, \"data\")\n .catch(() => null);\n if (bm25Data && typeof bm25Data === \"string\") {\n bm25 = SearchIndex.deserialize(bm25Data);\n }\n\n const vecData = await this.kv\n .get<string>(KV.bm25Index, \"vectors\")\n .catch(() => null);\n if (vecData && typeof vecData === \"string\") {\n vector = VectorIndex.deserialize(vecData);\n }\n\n return { bm25, vector };\n }\n\n stop(): void {\n if (this.timer) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import type { ISdk } from \"iii-sdk\";\n\nconst PRIVATE_TAG_RE = /<private>[\\s\\S]*?<\\/private>/gi;\n\nconst SECRET_PATTERN_SOURCES = [\n /(?:api[_-]?key|secret|token|password|credential|auth)[\\s]*[=:]\\s*[\"']?[A-Za-z0-9_\\-/.+]{20,}[\"']?/gi,\n /(?:sk|pk|rk|ak)-[A-Za-z0-9]{20,}/g,\n /sk-ant-[A-Za-z0-9\\-_]{20,}/g,\n /ghp_[A-Za-z0-9]{36}/g,\n /github_pat_[A-Za-z0-9_]{22,}/g,\n /xoxb-[A-Za-z0-9\\-]+/g,\n /AKIA[0-9A-Z]{16}/g,\n /AIza[A-Za-z0-9\\-_]{35}/g,\n /eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}/g,\n /npm_[A-Za-z0-9]{36}/g,\n /glpat-[A-Za-z0-9\\-_]{20,}/g,\n /dop_v1_[A-Za-z0-9]{64}/g,\n];\n\nexport function stripPrivateData(input: string): string {\n let result = input.replace(PRIVATE_TAG_RE, \"[REDACTED]\");\n for (const source of SECRET_PATTERN_SOURCES) {\n const pattern = new RegExp(source.source, source.flags);\n result = result.replace(pattern, \"[REDACTED_SECRET]\");\n }\n return result;\n}\n\nexport function registerPrivacyFunction(sdk: ISdk): void {\n sdk.registerFunction(\n {\n id: \"mem::privacy\",\n description: \"Strip private tags and secrets from input\",\n },\n async (data: { input: string }) => {\n return { output: stripPrivateData(data.input) };\n },\n );\n}\n","const locks = new Map<string, Promise<void>>();\n\nexport function withKeyedLock<T>(\n key: string,\n fn: () => Promise<T>,\n): Promise<T> {\n const prev = locks.get(key) ?? Promise.resolve();\n const next = prev.then(fn, fn);\n const cleanup = next.then(\n () => {},\n () => {},\n );\n locks.set(key, cleanup);\n cleanup.then(() => {\n if (locks.get(key) === cleanup) locks.delete(key);\n });\n return next;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { RawObservation, HookPayload, Session } from \"../types.js\";\nimport { KV, STREAM, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { stripPrivateData } from \"./privacy.js\";\nimport { DedupMap } from \"./dedup.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nexport function registerObserveFunction(\n sdk: ISdk,\n kv: StateKV,\n dedupMap?: DedupMap,\n maxObservationsPerSession?: number,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::observe\",\n description: \"Capture and store a tool-use observation\",\n },\n async (payload: HookPayload) => {\n const ctx = getContext();\n\n if (\n !payload?.sessionId ||\n typeof payload.sessionId !== \"string\" ||\n !payload.hookType ||\n typeof payload.hookType !== \"string\" ||\n !payload.timestamp ||\n typeof payload.timestamp !== \"string\"\n ) {\n return {\n success: false,\n error:\n \"Invalid payload: sessionId, hookType, and timestamp are required\",\n };\n }\n\n const obsId = generateId(\"obs\");\n\n let dedupHash: string | undefined;\n if (dedupMap) {\n const d =\n typeof payload.data === \"object\" && payload.data !== null\n ? (payload.data as Record<string, unknown>)\n : {};\n const toolName = (d[\"tool_name\"] as string) || payload.hookType;\n dedupHash = dedupMap.computeHash(\n payload.sessionId,\n toolName,\n d[\"tool_input\"],\n );\n if (dedupMap.isDuplicate(dedupHash)) {\n return { deduplicated: true, sessionId: payload.sessionId };\n }\n }\n\n let sanitizedRaw: unknown = payload.data;\n try {\n const jsonStr = JSON.stringify(payload.data);\n const sanitized = stripPrivateData(jsonStr);\n sanitizedRaw = JSON.parse(sanitized);\n } catch {\n sanitizedRaw = stripPrivateData(String(payload.data));\n }\n\n const raw: RawObservation = {\n id: obsId,\n sessionId: payload.sessionId,\n timestamp: payload.timestamp,\n hookType: payload.hookType,\n raw: sanitizedRaw,\n };\n\n if (typeof sanitizedRaw === \"object\" && sanitizedRaw !== null) {\n const d = sanitizedRaw as Record<string, unknown>;\n if (\n payload.hookType === \"post_tool_use\" ||\n payload.hookType === \"post_tool_failure\"\n ) {\n raw.toolName = d[\"tool_name\"] as string | undefined;\n raw.toolInput = d[\"tool_input\"];\n raw.toolOutput = d[\"tool_output\"] || d[\"error\"];\n }\n if (payload.hookType === \"prompt_submit\") {\n raw.userPrompt = d[\"prompt\"] as string | undefined;\n }\n }\n\n return withKeyedLock(`obs:${payload.sessionId}`, async () => {\n if (maxObservationsPerSession && maxObservationsPerSession > 0) {\n const existing = await kv.list(KV.observations(payload.sessionId));\n if (existing.length >= maxObservationsPerSession) {\n return {\n success: false,\n error: `Session observation limit reached (${maxObservationsPerSession})`,\n };\n }\n }\n\n await kv.set(KV.observations(payload.sessionId), obsId, raw);\n\n if (dedupMap && dedupHash) {\n dedupMap.record(dedupHash);\n }\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.group(payload.sessionId),\n item_id: obsId,\n data: { type: \"raw\", observation: raw },\n });\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.viewerGroup,\n item_id: obsId,\n data: { type: \"raw\", observation: raw, sessionId: payload.sessionId },\n });\n\n const session = await kv.get<Session>(KV.sessions, payload.sessionId);\n if (session) {\n await kv.set(KV.sessions, payload.sessionId, {\n ...session,\n observationCount: (session.observationCount || 0) + 1,\n });\n }\n\n sdk.triggerVoid(\"mem::compress\", {\n observationId: obsId,\n sessionId: payload.sessionId,\n raw,\n });\n\n ctx.logger.info(\"Observation captured\", {\n obsId,\n sessionId: payload.sessionId,\n hook: payload.hookType,\n });\n return { observationId: obsId };\n });\n },\n );\n}\n","export const COMPRESSION_SYSTEM = `You are a memory compression engine for an AI coding agent. Your job is to extract the essential information from a tool usage observation and compress it into structured data.\n\nOutput EXACTLY this XML format with no additional text:\n\n<observation>\n <type>one of: file_read, file_write, file_edit, command_run, search, web_fetch, conversation, error, decision, discovery, subagent, notification, task, other</type>\n <title>Short descriptive title (max 80 chars)</title>\n <subtitle>One-line context (optional)</subtitle>\n <facts>\n <fact>Specific factual detail 1</fact>\n <fact>Specific factual detail 2</fact>\n </facts>\n <narrative>2-3 sentence summary of what happened and why it matters</narrative>\n <concepts>\n <concept>technical concept or pattern</concept>\n </concepts>\n <files>\n <file>path/to/file</file>\n </files>\n <importance>1-10 scale, 10 being critical architectural decision</importance>\n</observation>\n\nRules:\n- Be concise but preserve ALL technically relevant details\n- File paths must be exact\n- Importance: 1-3 for routine reads, 4-6 for edits/commands, 7-9 for architectural decisions, 10 for breaking changes\n- Concepts should be reusable search terms (e.g., \"React hooks\", \"SQL migration\", \"auth middleware\")\n- Strip any secrets, tokens, or credentials from the output`;\n\nexport function buildCompressionPrompt(observation: {\n hookType: string;\n toolName?: string;\n toolInput?: unknown;\n toolOutput?: unknown;\n userPrompt?: string;\n timestamp: string;\n}): string {\n const parts = [\n `Timestamp: ${observation.timestamp}`,\n `Hook: ${observation.hookType}`,\n ];\n\n if (observation.toolName) parts.push(`Tool: ${observation.toolName}`);\n if (observation.toolInput) {\n const input =\n typeof observation.toolInput === \"string\"\n ? observation.toolInput\n : JSON.stringify(observation.toolInput, null, 2);\n parts.push(`Input:\\n${truncate(input, 4000)}`);\n }\n if (observation.toolOutput) {\n const output =\n typeof observation.toolOutput === \"string\"\n ? observation.toolOutput\n : JSON.stringify(observation.toolOutput, null, 2);\n parts.push(`Output:\\n${truncate(output, 4000)}`);\n }\n if (observation.userPrompt) {\n parts.push(`User prompt:\\n${truncate(observation.userPrompt, 2000)}`);\n }\n\n return parts.join(\"\\n\\n\");\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? s.slice(0, max) + \"\\n[...truncated]\" : s;\n}\n","const VALID_TAG = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;\n\nexport function getXmlTag(xml: string, tag: string): string {\n if (!VALID_TAG.test(tag)) return \"\";\n const match = xml.match(new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`));\n return match ? match[1].trim() : \"\";\n}\n\nexport function getXmlChildren(\n xml: string,\n parentTag: string,\n childTag: string,\n): string[] {\n if (!VALID_TAG.test(parentTag) || !VALID_TAG.test(childTag)) return [];\n const parentMatch = xml.match(\n new RegExp(`<${parentTag}>([\\\\s\\\\S]*?)</${parentTag}>`),\n );\n if (!parentMatch) return [];\n const items: string[] = [];\n const re = new RegExp(`<${childTag}>([\\\\s\\\\S]*?)</${childTag}>`, \"g\");\n let m;\n while ((m = re.exec(parentMatch[1])) !== null) {\n items.push(m[1].trim());\n }\n return items;\n}\n","import type { ISdk } from 'iii-sdk'\nimport { getContext } from 'iii-sdk'\nimport type { CompressedObservation, SearchResult, Session } from '../types.js'\nimport { KV } from '../state/schema.js'\nimport { StateKV } from '../state/kv.js'\nimport { SearchIndex } from '../state/search-index.js'\n\nlet index: SearchIndex | null = null\n\nexport function getSearchIndex(): SearchIndex {\n if (!index) index = new SearchIndex()\n return index\n}\n\nexport async function rebuildIndex(kv: StateKV): Promise<number> {\n const idx = getSearchIndex()\n idx.clear()\n\n const sessions = await kv.list<Session>(KV.sessions)\n if (!sessions.length) return 0\n\n let count = 0\n const obsPerSession: CompressedObservation[][] = []\n const failedSessions: string[] = []\n for (let batch = 0; batch < sessions.length; batch += 10) {\n const chunk = sessions.slice(batch, batch + 10)\n const results = await Promise.all(\n chunk.map(async (s) => {\n try {\n return await kv.list<CompressedObservation>(KV.observations(s.id))\n } catch {\n failedSessions.push(s.id)\n return [] as CompressedObservation[]\n }\n })\n )\n obsPerSession.push(...results)\n }\n if (failedSessions.length > 0) {\n const ctx = getContext()\n ctx.logger.warn('rebuildIndex: failed to load observations for sessions', { failedSessions })\n }\n for (const observations of obsPerSession) {\n for (const obs of observations) {\n if (obs.title && obs.narrative) {\n idx.add(obs)\n count++\n }\n }\n }\n return count\n}\n\nexport function registerSearchFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: 'mem::search', description: 'Search observations by keyword' },\n async (data: { query: string; limit?: number }) => {\n const ctx = getContext()\n const idx = getSearchIndex()\n\n if (idx.size === 0) {\n const count = await rebuildIndex(kv)\n ctx.logger.info('Search index rebuilt', { entries: count })\n }\n\n const results = idx.search(data.query, data.limit || 20)\n\n const enriched: SearchResult[] = []\n for (const r of results) {\n const obs = await kv.get<CompressedObservation>(KV.observations(r.sessionId), r.obsId)\n if (obs) {\n enriched.push({ observation: obs, score: r.score, sessionId: r.sessionId })\n }\n }\n\n ctx.logger.info('Search completed', { query: data.query, results: enriched.length })\n return { results: enriched }\n }\n )\n}\n","import { z } from \"zod\";\n\nconst HookTypeEnum = z.enum([\n \"session_start\",\n \"prompt_submit\",\n \"pre_tool_use\",\n \"post_tool_use\",\n \"post_tool_failure\",\n \"pre_compact\",\n \"subagent_start\",\n \"subagent_stop\",\n \"notification\",\n \"task_completed\",\n \"stop\",\n \"session_end\",\n]);\n\nconst ObservationTypeEnum = z.enum([\n \"file_read\",\n \"file_write\",\n \"file_edit\",\n \"command_run\",\n \"search\",\n \"web_fetch\",\n \"conversation\",\n \"error\",\n \"decision\",\n \"discovery\",\n \"subagent\",\n \"notification\",\n \"task\",\n \"other\",\n]);\n\nexport const ObserveInputSchema = z.object({\n hookType: HookTypeEnum,\n sessionId: z.string().min(1),\n project: z.string().min(1),\n cwd: z.string().min(1),\n timestamp: z.string().min(1),\n data: z.unknown(),\n});\n\nexport const CompressOutputSchema = z.object({\n type: ObservationTypeEnum,\n title: z.string().min(1).max(120),\n subtitle: z.string().optional(),\n facts: z.array(z.string()).min(1),\n narrative: z.string().min(10),\n concepts: z.array(z.string()),\n files: z.array(z.string()),\n importance: z.number().int().min(1).max(10),\n});\n\nexport const SummaryOutputSchema = z.object({\n title: z.string().min(1),\n narrative: z.string().min(20),\n keyDecisions: z.array(z.string()),\n filesModified: z.array(z.string()),\n concepts: z.array(z.string()),\n});\n\nexport const SearchInputSchema = z.object({\n query: z.string().min(1),\n limit: z.number().int().positive().optional(),\n});\n\nexport const ContextInputSchema = z.object({\n sessionId: z.string().min(1),\n project: z.string().min(1),\n budget: z.number().positive().optional(),\n});\n\nexport const RememberInputSchema = z.object({\n content: z.string().min(1),\n type: z\n .enum([\"pattern\", \"preference\", \"architecture\", \"bug\", \"workflow\", \"fact\"])\n .optional(),\n concepts: z.array(z.string()).optional(),\n files: z.array(z.string()).optional(),\n});\n\nexport const SmartSearchInputSchema = z.object({\n query: z.string().optional(),\n expandIds: z.array(z.string()).optional(),\n limit: z.number().int().positive().optional(),\n});\n\nexport const TimelineInputSchema = z.object({\n anchor: z.string().min(1),\n project: z.string().optional(),\n before: z.number().int().nonnegative().optional(),\n after: z.number().int().nonnegative().optional(),\n});\n\nexport const ProfileInputSchema = z.object({\n project: z.string().min(1),\n refresh: z.boolean().optional(),\n});\n\nexport const RelateInputSchema = z.object({\n sourceId: z.string().min(1),\n targetId: z.string().min(1),\n type: z.enum([\"supersedes\", \"extends\", \"derives\", \"contradicts\", \"related\"]),\n});\n\nexport const EvolveInputSchema = z.object({\n memoryId: z.string().min(1),\n newContent: z.string().min(1),\n newTitle: z.string().optional(),\n});\n\nexport const ExportImportInputSchema = z.object({\n exportData: z.object({\n version: z.union([z.literal(\"0.3.0\"), z.literal(\"0.4.0\")]),\n exportedAt: z.string(),\n sessions: z.array(z.unknown()),\n observations: z.record(z.string(), z.array(z.unknown())),\n memories: z.array(z.unknown()),\n summaries: z.array(z.unknown()),\n profiles: z.array(z.unknown()).optional(),\n }),\n strategy: z.enum([\"merge\", \"replace\", \"skip\"]).optional(),\n});\n","import type { z } from \"zod\";\nimport type { EvalResult } from \"../types.js\";\n\nexport function validateInput<T>(\n schema: z.ZodType<T>,\n data: unknown,\n functionId: string,\n): { valid: true; data: T } | { valid: false; result: EvalResult } {\n const parsed = schema.safeParse(data);\n if (parsed.success) {\n return { valid: true, data: parsed.data };\n }\n return {\n valid: false,\n result: {\n valid: false,\n errors: parsed.error.issues.map((i) => `${i.path.join(\".\")}: ${i.message}`),\n qualityScore: 0,\n latencyMs: 0,\n functionId,\n },\n };\n}\n\nexport function validateOutput<T>(\n schema: z.ZodType<T>,\n data: unknown,\n functionId: string,\n): { valid: true; data: T } | { valid: false; result: EvalResult } {\n return validateInput(schema, data, functionId);\n}\n","export function scoreCompression(obs: {\n type?: string;\n title?: string;\n facts?: string[];\n narrative?: string;\n concepts?: string[];\n importance?: number;\n}): number {\n let score = 0;\n if (obs.facts && obs.facts.length > 0) score += 25;\n if (obs.facts && obs.facts.length >= 3) score += 10;\n if (obs.narrative && obs.narrative.length >= 20) score += 20;\n if (obs.narrative && obs.narrative.length >= 50) score += 5;\n if (obs.title && obs.title.length >= 5 && obs.title.length <= 120) score += 15;\n if (obs.concepts && obs.concepts.length > 0) score += 15;\n if (obs.importance && obs.importance >= 1 && obs.importance <= 10) score += 10;\n return Math.min(100, score);\n}\n\nexport function scoreSummary(summary: {\n title?: string;\n narrative?: string;\n keyDecisions?: string[];\n filesModified?: string[];\n concepts?: string[];\n}): number {\n let score = 0;\n if (summary.title && summary.title.length >= 5) score += 20;\n if (summary.narrative && summary.narrative.length >= 20) score += 25;\n if (summary.narrative && summary.narrative.length >= 100) score += 5;\n if (summary.keyDecisions && summary.keyDecisions.length > 0) score += 20;\n if (summary.filesModified && summary.filesModified.length > 0) score += 15;\n if (summary.concepts && summary.concepts.length > 0) score += 15;\n return Math.min(100, score);\n}\n\nexport function scoreContextRelevance(\n context: string,\n project: string,\n): number {\n let score = 0;\n if (context.length > 0) score += 20;\n if (project && context.toLowerCase().includes(project.toLowerCase())) score += 20;\n if (context.includes(\"<\")) score += 15;\n const sectionCount = (context.match(/<\\w+>/g) || []).length;\n if (sectionCount >= 2) score += 15;\n if (sectionCount >= 4) score += 10;\n if (context.length >= 100) score += 10;\n if (context.length >= 500) score += 10;\n return Math.min(100, score);\n}\n","import type { MemoryProvider } from \"../types.js\";\n\nconst STRICTER_SUFFIX = `\n\nIMPORTANT: Your previous response was invalid. Please ensure your output strictly follows the required XML format. Every required field must be present with valid values.`;\n\nexport async function compressWithRetry(\n provider: MemoryProvider,\n systemPrompt: string,\n userPrompt: string,\n validator: (response: string) => { valid: boolean; errors?: string[] },\n maxRetries = 1,\n): Promise<{ response: string; retried: boolean }> {\n const first = await provider.compress(systemPrompt, userPrompt);\n const result = validator(first);\n if (result.valid) return { response: first, retried: false };\n\n for (let i = 0; i < maxRetries; i++) {\n const retry = await provider.compress(\n systemPrompt + STRICTER_SUFFIX,\n userPrompt,\n );\n const retryResult = validator(retry);\n if (retryResult.valid) return { response: retry, retried: true };\n }\n\n return { response: first, retried: true };\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n RawObservation,\n CompressedObservation,\n ObservationType,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, STREAM } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport {\n COMPRESSION_SYSTEM,\n buildCompressionPrompt,\n} from \"../prompts/compression.js\";\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\nimport { getSearchIndex } from \"./search.js\";\nimport { CompressOutputSchema } from \"../eval/schemas.js\";\nimport { validateOutput } from \"../eval/validator.js\";\nimport { scoreCompression } from \"../eval/quality.js\";\nimport { compressWithRetry } from \"../eval/self-correct.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\n\nconst VALID_TYPES = new Set<string>([\n \"file_read\",\n \"file_write\",\n \"file_edit\",\n \"command_run\",\n \"search\",\n \"web_fetch\",\n \"conversation\",\n \"error\",\n \"decision\",\n \"discovery\",\n \"subagent\",\n \"notification\",\n \"task\",\n \"other\",\n]);\n\nfunction parseCompressionXml(\n xml: string,\n): Omit<CompressedObservation, \"id\" | \"sessionId\" | \"timestamp\"> | null {\n const rawType = getXmlTag(xml, \"type\");\n const title = getXmlTag(xml, \"title\");\n if (!rawType || !title) return null;\n const type = VALID_TYPES.has(rawType) ? rawType : \"other\";\n\n return {\n type: type as ObservationType,\n title,\n subtitle: getXmlTag(xml, \"subtitle\") || undefined,\n facts: getXmlChildren(xml, \"facts\", \"fact\"),\n narrative: getXmlTag(xml, \"narrative\"),\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n files: getXmlChildren(xml, \"files\", \"file\"),\n importance: Math.max(\n 1,\n Math.min(10, parseInt(getXmlTag(xml, \"importance\") || \"5\", 10) || 5),\n ),\n };\n}\n\nexport function registerCompressFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n metricsStore?: MetricsStore,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::compress\",\n description: \"Compress a raw observation using LLM\",\n },\n async (data: {\n observationId: string;\n sessionId: string;\n raw: RawObservation;\n }) => {\n const ctx = getContext();\n const startMs = Date.now();\n const prompt = buildCompressionPrompt({\n hookType: data.raw.hookType,\n toolName: data.raw.toolName,\n toolInput: data.raw.toolInput,\n toolOutput: data.raw.toolOutput,\n userPrompt: data.raw.userPrompt,\n timestamp: data.raw.timestamp,\n });\n\n try {\n const validator = (response: string) => {\n const parsed = parseCompressionXml(response);\n if (!parsed) return { valid: false, errors: [\"xml_parse_failed\"] };\n const result = validateOutput(\n CompressOutputSchema,\n parsed,\n \"mem::compress\",\n );\n return result.valid\n ? { valid: true }\n : { valid: false, errors: result.result.errors };\n };\n\n const { response, retried } = await compressWithRetry(\n provider,\n COMPRESSION_SYSTEM,\n prompt,\n validator,\n 1,\n );\n\n const parsed = parseCompressionXml(response);\n if (!parsed) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::compress\", latencyMs, false);\n }\n ctx.logger.warn(\"Failed to parse compression XML\", {\n obsId: data.observationId,\n retried,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const qualityScore = scoreCompression(parsed);\n\n const compressed: CompressedObservation = {\n id: data.observationId,\n sessionId: data.sessionId,\n timestamp: data.raw.timestamp,\n ...parsed,\n confidence: qualityScore / 100,\n };\n\n await kv.set(\n KV.observations(data.sessionId),\n data.observationId,\n compressed,\n );\n\n getSearchIndex().add(compressed);\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.group(data.sessionId),\n item_id: data.observationId,\n data: { type: \"compressed\", observation: compressed },\n });\n\n sdk.triggerVoid(\"stream::set\", {\n stream_name: STREAM.name,\n group_id: STREAM.viewerGroup,\n item_id: data.observationId,\n data: {\n type: \"compressed\",\n observation: compressed,\n sessionId: data.sessionId,\n },\n });\n\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\n \"mem::compress\",\n latencyMs,\n true,\n qualityScore,\n );\n }\n\n ctx.logger.info(\"Observation compressed\", {\n obsId: data.observationId,\n type: compressed.type,\n importance: compressed.importance,\n qualityScore,\n retried,\n });\n\n return { success: true, compressed, qualityScore };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::compress\", latencyMs, false);\n }\n ctx.logger.error(\"Compression failed\", {\n obsId: data.observationId,\n error: msg,\n });\n return { success: false, error: \"compression_failed\" };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n ContextBlock,\n ProjectProfile,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 3);\n}\n\nfunction escapeXmlAttr(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nexport function registerContextFunction(\n sdk: ISdk,\n kv: StateKV,\n tokenBudget: number,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::context\",\n description: \"Generate context for session injection\",\n },\n async (data: { sessionId: string; project: string; budget?: number }) => {\n const ctx = getContext();\n const budget = data.budget || tokenBudget;\n const blocks: ContextBlock[] = [];\n\n const profile = await kv\n .get<ProjectProfile>(KV.profiles, data.project)\n .catch(() => null);\n if (profile) {\n const profileParts = [];\n if (profile.topConcepts.length > 0) {\n profileParts.push(\n `Concepts: ${profile.topConcepts\n .slice(0, 8)\n .map((c) => c.concept)\n .join(\", \")}`,\n );\n }\n if (profile.topFiles.length > 0) {\n profileParts.push(\n `Key files: ${profile.topFiles\n .slice(0, 5)\n .map((f) => f.file)\n .join(\", \")}`,\n );\n }\n if (profile.conventions.length > 0) {\n profileParts.push(`Conventions: ${profile.conventions.join(\"; \")}`);\n }\n if (profile.commonErrors.length > 0) {\n profileParts.push(\n `Common errors: ${profile.commonErrors.slice(0, 3).join(\"; \")}`,\n );\n }\n if (profileParts.length > 0) {\n const profileContent = `## Project Profile\\n${profileParts.join(\"\\n\")}`;\n blocks.push({\n type: \"memory\",\n content: profileContent,\n tokens: estimateTokens(profileContent),\n recency: new Date(profile.updatedAt).getTime(),\n });\n }\n }\n\n const allSessions = await kv.list<Session>(KV.sessions);\n const sessions = allSessions\n .filter((s) => s.project === data.project && s.id !== data.sessionId)\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n )\n .slice(0, 10);\n\n const summariesPerSession = await Promise.all(\n sessions.map((s) =>\n kv.get<SessionSummary>(KV.summaries, s.id).catch(() => null),\n ),\n );\n\n const sessionsNeedingObs: number[] = [];\n for (let i = 0; i < sessions.length; i++) {\n const summary = summariesPerSession[i];\n if (summary) {\n const content = `## ${summary.title}\\n${summary.narrative}\\nDecisions: ${summary.keyDecisions.join(\"; \")}\\nFiles: ${summary.filesModified.join(\", \")}`;\n blocks.push({\n type: \"summary\",\n content,\n tokens: estimateTokens(content),\n recency: new Date(summary.createdAt).getTime(),\n });\n } else {\n sessionsNeedingObs.push(i);\n }\n }\n\n const obsResults = await Promise.all(\n sessionsNeedingObs.map((i) =>\n kv\n .list<CompressedObservation>(KV.observations(sessions[i].id))\n .catch(() => []),\n ),\n );\n\n for (let j = 0; j < sessionsNeedingObs.length; j++) {\n const i = sessionsNeedingObs[j];\n const observations = obsResults[j];\n const important = observations.filter(\n (o) => o.title && o.importance >= 5,\n );\n\n if (important.length > 0) {\n const items = important\n .sort((a, b) => b.importance - a.importance)\n .slice(0, 5)\n .map((o) => `- [${o.type}] ${o.title}: ${o.narrative}`)\n .join(\"\\n\");\n const content = `## Session ${sessions[i].id.slice(0, 8)} (${sessions[i].startedAt})\\n${items}`;\n blocks.push({\n type: \"observation\",\n content,\n tokens: estimateTokens(content),\n recency: new Date(sessions[i].startedAt).getTime(),\n });\n }\n }\n\n blocks.sort((a, b) => b.recency - a.recency);\n\n let usedTokens = 0;\n const selected: string[] = [];\n const header = `<agentmemory-context project=\"${escapeXmlAttr(data.project)}\">`;\n const footer = `</agentmemory-context>`;\n usedTokens += estimateTokens(header) + estimateTokens(footer);\n\n for (const block of blocks) {\n if (usedTokens + block.tokens > budget) break;\n selected.push(block.content);\n usedTokens += block.tokens;\n }\n\n if (selected.length === 0) {\n ctx.logger.info(\"No context available\", { project: data.project });\n return { context: \"\", blocks: 0, tokens: 0 };\n }\n\n const result = `${header}\\n${selected.join(\"\\n\\n\")}\\n${footer}`;\n ctx.logger.info(\"Context generated\", {\n blocks: selected.length,\n tokens: usedTokens,\n });\n return { context: result, blocks: selected.length, tokens: usedTokens };\n },\n );\n}\n","export const SUMMARY_SYSTEM = `You are a session summarizer for an AI coding agent's memory system. Given all compressed observations from a coding session, produce a concise session summary.\n\nOutput EXACTLY this XML format with no additional text:\n\n<summary>\n <title>Short session title (max 100 chars)</title>\n <narrative>3-5 sentence narrative of what was accomplished</narrative>\n <decisions>\n <decision>Key technical decision made</decision>\n </decisions>\n <files>\n <file>path/to/modified/file</file>\n </files>\n <concepts>\n <concept>key concept from session</concept>\n </concepts>\n</summary>\n\nRules:\n- Focus on outcomes, not individual tool calls\n- Highlight decisions and their rationale\n- List all files that were created or modified\n- Concepts should be searchable terms for future context retrieval`\n\nexport function buildSummaryPrompt(observations: Array<{\n type: string\n title: string\n facts: string[]\n narrative: string\n files: string[]\n concepts: string[]\n}>): string {\n const lines = observations.map((obs, i) => {\n const facts = obs.facts.map((f) => ` - ${f}`).join('\\n')\n return `[${i + 1}] ${obs.type}: ${obs.title}\\n${obs.narrative}\\nFacts:\\n${facts}\\nFiles: ${obs.files.join(', ')}`\n })\n return `Session observations (${observations.length} total):\\n\\n${lines.join('\\n\\n---\\n\\n')}`\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n SessionSummary,\n MemoryProvider,\n Session,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { SUMMARY_SYSTEM, buildSummaryPrompt } from \"../prompts/summary.js\";\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\nimport { SummaryOutputSchema } from \"../eval/schemas.js\";\nimport { validateOutput } from \"../eval/validator.js\";\nimport { scoreSummary } from \"../eval/quality.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\n\nfunction parseSummaryXml(\n xml: string,\n sessionId: string,\n project: string,\n obsCount: number,\n): SessionSummary | null {\n const title = getXmlTag(xml, \"title\");\n if (!title) return null;\n\n return {\n sessionId,\n project,\n createdAt: new Date().toISOString(),\n title,\n narrative: getXmlTag(xml, \"narrative\"),\n keyDecisions: getXmlChildren(xml, \"decisions\", \"decision\"),\n filesModified: getXmlChildren(xml, \"files\", \"file\"),\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n observationCount: obsCount,\n };\n}\n\nexport function registerSummarizeFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n metricsStore?: MetricsStore,\n): void {\n sdk.registerFunction(\n { id: \"mem::summarize\", description: \"Generate end-of-session summary\" },\n async (data: { sessionId: string }) => {\n const ctx = getContext();\n const startMs = Date.now();\n\n const session = await kv.get<Session>(KV.sessions, data.sessionId);\n if (!session) {\n ctx.logger.warn(\"Session not found for summarize\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"session_not_found\" };\n }\n\n const observations = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n const compressed = observations.filter((o) => o.title);\n\n if (compressed.length === 0) {\n ctx.logger.info(\"No observations to summarize\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"no_observations\" };\n }\n\n try {\n const prompt = buildSummaryPrompt(compressed);\n const response = await provider.summarize(SUMMARY_SYSTEM, prompt);\n const summary = parseSummaryXml(\n response,\n data.sessionId,\n session.project,\n compressed.length,\n );\n\n if (!summary) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.warn(\"Failed to parse summary XML\", {\n sessionId: data.sessionId,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const summaryForValidation = {\n title: summary.title,\n narrative: summary.narrative,\n keyDecisions: summary.keyDecisions,\n filesModified: summary.filesModified,\n concepts: summary.concepts,\n };\n const validation = validateOutput(\n SummaryOutputSchema,\n summaryForValidation,\n \"mem::summarize\",\n );\n\n if (!validation.valid) {\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.warn(\"Summary validation failed\", {\n sessionId: data.sessionId,\n errors: validation.result.errors,\n });\n return { success: false, error: \"validation_failed\" };\n }\n\n const qualityScore = scoreSummary(summaryForValidation);\n\n await kv.set(KV.summaries, data.sessionId, summary);\n\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\n \"mem::summarize\",\n latencyMs,\n true,\n qualityScore,\n );\n }\n\n ctx.logger.info(\"Session summarized\", {\n sessionId: data.sessionId,\n title: summary.title,\n decisions: summary.keyDecisions.length,\n qualityScore,\n valid: validation.valid,\n });\n\n return { success: true, summary, qualityScore };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n const latencyMs = Date.now() - startMs;\n if (metricsStore) {\n await metricsStore.record(\"mem::summarize\", latencyMs, false);\n }\n ctx.logger.error(\"Summarize failed\", {\n sessionId: data.sessionId,\n error: msg,\n });\n return { success: false, error: msg };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { resolve } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n} from \"../types.js\";\n\nconst ALLOWED_DIRS = [resolve(homedir(), \".agentmemory\")];\n\nfunction isAllowedPath(dbPath: string): boolean {\n const resolved = resolve(dbPath);\n return ALLOWED_DIRS.some((dir) => resolved.startsWith(dir + \"/\"));\n}\n\nexport function registerMigrateFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::migrate\",\n description: \"Import data from SQLite database\",\n },\n async (data: { dbPath: string }) => {\n const ctx = getContext();\n ctx.logger.info(\"Migration started\", { dbPath: data.dbPath });\n\n if (!isAllowedPath(data.dbPath)) {\n return {\n success: false,\n error: `Path not allowed. Must be under: ${ALLOWED_DIRS.join(\", \")}`,\n };\n }\n\n let Database: any;\n try {\n // @ts-expect-error optional dependency\n Database = (await import(\"better-sqlite3\")).default;\n } catch {\n return {\n success: false,\n error:\n \"better-sqlite3 not installed. Run: npm install better-sqlite3\",\n };\n }\n\n const fs = await import(\"node:fs\");\n if (!fs.existsSync(data.dbPath)) {\n return { success: false, error: `Database not found: ${data.dbPath}` };\n }\n\n try {\n const db = Database(data.dbPath, { readonly: true });\n let sessionCount = 0;\n let obsCount = 0;\n let summaryCount = 0;\n\n const sessions = db\n .prepare(\"SELECT * FROM sessions ORDER BY created_at DESC\")\n .all() as any[];\n for (const row of sessions) {\n const session: Session = {\n id: row.session_id || row.id,\n project: row.project_path || row.project || \"unknown\",\n cwd: row.cwd || row.project_path || \"\",\n startedAt:\n row.created_at || row.started_at || new Date().toISOString(),\n endedAt: row.ended_at || row.updated_at,\n status: \"completed\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, session.id, session);\n sessionCount++;\n }\n\n let observations: any[] = [];\n try {\n observations = db\n .prepare(\"SELECT * FROM observations ORDER BY created_at ASC\")\n .all() as any[];\n } catch {\n try {\n observations = db\n .prepare(\n \"SELECT * FROM compressed_observations ORDER BY created_at ASC\",\n )\n .all() as any[];\n } catch {\n ctx.logger.warn(\"No observation tables found\");\n }\n }\n\n for (const row of observations) {\n const sessionId = row.session_id || \"migrated\";\n const obs: CompressedObservation = {\n id: row.id || generateId(\"mig\"),\n sessionId,\n timestamp: row.created_at || new Date().toISOString(),\n type: row.type || \"other\",\n title: row.title || row.summary || \"Migrated observation\",\n subtitle: row.subtitle,\n facts: safeJsonParse(row.facts, []),\n narrative: row.narrative || row.content || \"\",\n concepts: safeJsonParse(row.concepts, []),\n files: safeJsonParse(row.files, []),\n importance: row.importance || 5,\n };\n await kv.set(KV.observations(sessionId), obs.id, obs);\n obsCount++;\n }\n\n let summaries: any[] = [];\n try {\n summaries = db\n .prepare(\"SELECT * FROM session_summaries\")\n .all() as any[];\n } catch {\n ctx.logger.warn(\"No summaries table found\");\n }\n\n for (const row of summaries) {\n const summary: SessionSummary = {\n sessionId: row.session_id,\n project: row.project || \"unknown\",\n createdAt: row.created_at || new Date().toISOString(),\n title: row.title || \"Migrated session\",\n narrative: row.narrative || row.summary || \"\",\n keyDecisions: safeJsonParse(row.key_decisions, []),\n filesModified: safeJsonParse(row.files_modified, []),\n concepts: safeJsonParse(row.concepts, []),\n observationCount: row.observation_count || 0,\n };\n await kv.set(KV.summaries, row.session_id, summary);\n summaryCount++;\n }\n\n db.close();\n ctx.logger.info(\"Migration complete\", {\n sessionCount,\n obsCount,\n summaryCount,\n });\n return { success: true, sessionCount, obsCount, summaryCount };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Migration failed\", { error: msg });\n return { success: false, error: \"Migration failed\" };\n }\n },\n );\n}\n\nfunction safeJsonParse<T>(value: unknown, fallback: T): T {\n if (Array.isArray(value)) return value as T;\n if (typeof value === \"string\") {\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n }\n return fallback;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { CompressedObservation, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface FileHistory {\n file: string;\n observations: Array<{\n sessionId: string;\n obsId: string;\n type: string;\n title: string;\n narrative: string;\n importance: number;\n timestamp: string;\n }>;\n}\n\nexport function registerFileIndexFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::file-context\" },\n async (data: { sessionId: string; files: string[]; project?: string }) => {\n const ctx = getContext();\n const results: FileHistory[] = [];\n\n const sessions = await kv.list<Session>(KV.sessions);\n let otherSessions = sessions.filter((s) => s.id !== data.sessionId);\n if (data.project) {\n otherSessions = otherSessions.filter((s) => s.project === data.project);\n }\n otherSessions = otherSessions\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n )\n .slice(0, 15);\n\n const obsCache = new Map<string, CompressedObservation[]>();\n for (const session of otherSessions) {\n obsCache.set(\n session.id,\n await kv.list<CompressedObservation>(KV.observations(session.id)),\n );\n }\n\n for (const file of data.files) {\n const history: FileHistory = { file, observations: [] };\n const normalizedFile = file.replace(/^\\.\\//, \"\");\n\n for (const session of otherSessions) {\n const observations = obsCache.get(session.id) || [];\n\n for (const obs of observations) {\n if (!obs.files || !obs.title) continue;\n const matches = obs.files.some(\n (f) =>\n f === file ||\n f === normalizedFile ||\n f.endsWith(`/${normalizedFile}`) ||\n normalizedFile.endsWith(`/${f}`),\n );\n if (matches && obs.importance >= 4) {\n history.observations.push({\n sessionId: session.id,\n obsId: obs.id,\n type: obs.type,\n title: obs.title,\n narrative: obs.narrative,\n importance: obs.importance,\n timestamp: obs.timestamp,\n });\n }\n }\n }\n\n history.observations.sort((a, b) => b.importance - a.importance);\n history.observations = history.observations.slice(0, 5);\n\n if (history.observations.length > 0) {\n results.push(history);\n }\n }\n\n if (results.length === 0) {\n return { context: \"\" };\n }\n\n const lines: string[] = [\"<agentmemory-file-context>\"];\n for (const fh of results) {\n lines.push(`## ${fh.file}`);\n for (const obs of fh.observations) {\n lines.push(`- [${obs.type}] ${obs.title}: ${obs.narrative}`);\n }\n }\n lines.push(\"</agentmemory-file-context>\");\n\n const context = lines.join(\"\\n\");\n ctx.logger.info(\"File context generated\", {\n files: data.files.length,\n results: results.length,\n });\n return { context };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Memory,\n Session,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst CONSOLIDATION_SYSTEM = `You are a memory consolidation engine. Given a set of related observations from coding sessions, synthesize them into a single long-term memory.\n\nOutput XML:\n<memory>\n <type>pattern|preference|architecture|bug|workflow|fact</type>\n <title>Concise memory title (max 80 chars)</title>\n <content>2-4 sentence description of the learned insight</content>\n <concepts>\n <concept>key term</concept>\n </concepts>\n <files>\n <file>relevant/file/path</file>\n </files>\n <strength>1-10 how confident/important this memory is</strength>\n</memory>`;\n\nimport { getXmlTag, getXmlChildren } from \"../prompts/xml.js\";\n\nfunction parseMemoryXml(\n xml: string,\n sessionIds: string[],\n): Omit<Memory, \"id\" | \"createdAt\" | \"updatedAt\"> | null {\n const type = getXmlTag(xml, \"type\");\n const title = getXmlTag(xml, \"title\");\n const content = getXmlTag(xml, \"content\");\n if (!type || !title || !content) return null;\n\n const validTypes = new Set([\n \"pattern\",\n \"preference\",\n \"architecture\",\n \"bug\",\n \"workflow\",\n \"fact\",\n ]);\n\n return {\n type: (validTypes.has(type) ? type : \"fact\") as Memory[\"type\"],\n title,\n content,\n concepts: getXmlChildren(xml, \"concepts\", \"concept\"),\n files: getXmlChildren(xml, \"files\", \"file\"),\n sessionIds,\n strength: Math.max(\n 1,\n Math.min(10, parseInt(getXmlTag(xml, \"strength\") || \"5\", 10) || 5),\n ),\n version: 1,\n isLatest: true,\n };\n}\n\nexport function registerConsolidateFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::consolidate\" },\n async (data: { project?: string; minObservations?: number }) => {\n const ctx = getContext();\n const minObs = data.minObservations ?? 10;\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const allObs: Array<CompressedObservation & { sid: string }> = [];\n const obsPerSession: CompressedObservation[][] = [];\n for (let batch = 0; batch < filtered.length; batch += 10) {\n const chunk = filtered.slice(batch, batch + 10);\n const results = await Promise.all(\n chunk.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n obsPerSession.push(...results);\n }\n for (let i = 0; i < filtered.length; i++) {\n for (const obs of obsPerSession[i]) {\n if (obs.title && obs.importance >= 5) {\n allObs.push({ ...obs, sid: filtered[i].id });\n }\n }\n }\n\n if (allObs.length < minObs) {\n return { consolidated: 0, reason: \"insufficient_observations\" };\n }\n\n const conceptGroups = new Map<string, typeof allObs>();\n for (const obs of allObs) {\n for (const concept of obs.concepts) {\n const key = concept.toLowerCase();\n if (!conceptGroups.has(key)) conceptGroups.set(key, []);\n conceptGroups.get(key)!.push(obs);\n }\n }\n\n let consolidated = 0;\n const existingMemories = await kv.list<Memory>(KV.memories);\n const existingTitles = new Set(\n existingMemories.map((m) => m.title.toLowerCase()),\n );\n\n const MAX_LLM_CALLS = 10;\n let llmCallCount = 0;\n\n const sortedGroups = [...conceptGroups.entries()]\n .filter(([, g]) => g.length >= 3)\n .sort((a, b) => b[1].length - a[1].length);\n\n for (const [concept, obsGroup] of sortedGroups) {\n if (llmCallCount >= MAX_LLM_CALLS) break;\n\n const top = obsGroup\n .sort((a, b) => b.importance - a.importance)\n .slice(0, 8);\n const sessionIds = [...new Set(top.map((o) => o.sid))];\n\n const prompt = top\n .map(\n (o) =>\n `[${o.type}] ${o.title}\\n${o.narrative}\\nFiles: ${o.files.join(\", \")}\\nImportance: ${o.importance}`,\n )\n .join(\"\\n\\n\");\n\n try {\n const response = await Promise.race([\n provider.compress(\n CONSOLIDATION_SYSTEM,\n `Concept: \"${concept}\"\\n\\nObservations:\\n${prompt}`,\n ),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"compress timeout\")), 30_000),\n ),\n ]);\n llmCallCount++;\n const parsed = parseMemoryXml(response, sessionIds);\n if (!parsed) continue;\n\n const existingMatch = existingMemories.find(\n (m) => m.title.toLowerCase() === parsed.title.toLowerCase(),\n );\n\n const now = new Date().toISOString();\n const obsIds = [...new Set(top.map((o) => o.id))];\n if (existingMatch) {\n existingMatch.isLatest = false;\n await kv.set(KV.memories, existingMatch.id, existingMatch);\n\n const evolved: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n ...parsed,\n version: (existingMatch.version || 1) + 1,\n parentId: existingMatch.id,\n supersedes: [\n existingMatch.id,\n ...(existingMatch.supersedes || []),\n ],\n sourceObservationIds: obsIds,\n isLatest: true,\n };\n await kv.set(KV.memories, evolved.id, evolved);\n existingTitles.add(evolved.title.toLowerCase());\n consolidated++;\n } else {\n const memory: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n ...parsed,\n sourceObservationIds: obsIds,\n version: 1,\n isLatest: true,\n };\n await kv.set(KV.memories, memory.id, memory);\n existingTitles.add(memory.title.toLowerCase());\n consolidated++;\n }\n } catch (err) {\n ctx.logger.warn(\"Consolidation failed for concept\", {\n concept,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n ctx.logger.info(\"Consolidation complete\", {\n consolidated,\n totalObs: allObs.length,\n });\n return { consolidated, totalObservations: allObs.length };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { CompressedObservation, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface Pattern {\n type: \"co_change\" | \"error_repeat\" | \"workflow\";\n description: string;\n files: string[];\n frequency: number;\n sessions: string[];\n}\n\nexport function registerPatternsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::patterns\" },\n async (data: { project?: string }) => {\n const ctx = getContext();\n const patterns: Pattern[] = [];\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const fileCoOccurrences = new Map<string, number>();\n const fileSessionMap = new Map<string, Set<string>>();\n const errorPatterns = new Map<\n string,\n { count: number; sessions: Set<string> }\n >();\n\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n if (!observations.length) continue;\n\n const sessionFiles = new Set<string>();\n for (const obs of observations) {\n if (!obs.files) continue;\n for (const f of obs.files) {\n sessionFiles.add(f);\n if (!fileSessionMap.has(f)) fileSessionMap.set(f, new Set());\n fileSessionMap.get(f)!.add(session.id);\n }\n\n if (obs.type === \"error\" && obs.title) {\n const key = obs.title.toLowerCase();\n if (!errorPatterns.has(key)) {\n errorPatterns.set(key, { count: 0, sessions: new Set() });\n }\n const ep = errorPatterns.get(key)!;\n ep.count++;\n ep.sessions.add(session.id);\n }\n }\n\n const fileList = [...sessionFiles].sort();\n for (let i = 0; i < fileList.length; i++) {\n for (let j = i + 1; j < fileList.length; j++) {\n const pair = `${fileList[i]}::${fileList[j]}`;\n fileCoOccurrences.set(pair, (fileCoOccurrences.get(pair) || 0) + 1);\n }\n }\n }\n\n for (const [pair, count] of fileCoOccurrences) {\n if (count < 3) continue;\n const [fileA, fileB] = pair.split(\"::\");\n const sessionsA = fileSessionMap.get(fileA) || new Set();\n const sessionsB = fileSessionMap.get(fileB) || new Set();\n const commonSessions = [...sessionsA].filter((s) => sessionsB.has(s));\n\n patterns.push({\n type: \"co_change\",\n description: `${fileA} and ${fileB} are frequently modified together`,\n files: [fileA, fileB],\n frequency: count,\n sessions: commonSessions,\n });\n }\n\n for (const [\n errorKey,\n { count, sessions: errorSessions },\n ] of errorPatterns) {\n if (count < 2) continue;\n patterns.push({\n type: \"error_repeat\",\n description: `Recurring error: ${errorKey}`,\n files: [],\n frequency: count,\n sessions: [...errorSessions],\n });\n }\n\n patterns.sort((a, b) => b.frequency - a.frequency);\n\n ctx.logger.info(\"Pattern detection complete\", {\n patterns: patterns.length,\n sessions: filtered.length,\n });\n\n return { patterns: patterns.slice(0, 20) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::generate-rules\" },\n async (data: { project?: string }) => {\n const ctx = getContext();\n const result = await sdk.trigger<\n { project?: string },\n { patterns: Pattern[] }\n >(\"mem::patterns\", data);\n\n const rules: string[] = [];\n\n for (const pattern of result.patterns) {\n if (pattern.type === \"co_change\" && pattern.frequency >= 4) {\n rules.push(\n `When modifying ${pattern.files[0]}, also check ${pattern.files[1]} (co-changed ${pattern.frequency} times).`,\n );\n }\n if (pattern.type === \"error_repeat\" && pattern.frequency >= 3) {\n rules.push(\n `Watch for: ${pattern.description} (occurred ${pattern.frequency} times across ${pattern.sessions.length} sessions).`,\n );\n }\n }\n\n ctx.logger.info(\"Rules generated\", { count: rules.length });\n return { rules };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory } from \"../types.js\";\nimport { KV, generateId, jaccardSimilarity } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nexport function registerRememberFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::remember\" },\n async (data: {\n content: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n ttlDays?: number;\n sourceObservationIds?: string[];\n }) => {\n const ctx = getContext();\n if (\n !data.content ||\n typeof data.content !== \"string\" ||\n !data.content.trim()\n ) {\n return { success: false, error: \"content is required\" };\n }\n if (data.files && !Array.isArray(data.files)) {\n return { success: false, error: \"files must be an array\" };\n }\n if (data.concepts && !Array.isArray(data.concepts)) {\n return { success: false, error: \"concepts must be an array\" };\n }\n if (data.sourceObservationIds && !Array.isArray(data.sourceObservationIds)) {\n return { success: false, error: \"sourceObservationIds must be an array\" };\n }\n const validTypes = new Set([\n \"pattern\",\n \"preference\",\n \"architecture\",\n \"bug\",\n \"workflow\",\n \"fact\",\n ]);\n const memType = validTypes.has(data.type || \"\")\n ? (data.type as Memory[\"type\"])\n : \"fact\";\n\n const now = new Date().toISOString();\n\n return withKeyedLock(\"mem:remember\", async () => {\n const existingMemories = await kv.list<Memory>(KV.memories);\n let supersededId: string | undefined;\n let supersededVersion = 1;\n let supersededMemory: Memory | undefined;\n const lowerContent = data.content.toLowerCase();\n for (const existing of existingMemories) {\n if (existing.isLatest === false) continue;\n const similarity = jaccardSimilarity(\n lowerContent,\n existing.content.toLowerCase(),\n );\n if (similarity > 0.7) {\n supersededId = existing.id;\n supersededVersion = existing.version ?? 1;\n supersededMemory = existing;\n break;\n }\n }\n\n const memory: Memory = {\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n type: memType,\n title: data.content.slice(0, 80),\n content: data.content,\n concepts: data.concepts || [],\n files: data.files || [],\n sessionIds: [],\n strength: 7,\n version: supersededId ? supersededVersion + 1 : 1,\n parentId: supersededId,\n supersedes: supersededId ? [supersededId] : [],\n sourceObservationIds: (data.sourceObservationIds || []).filter(\n (id): id is string => typeof id === \"string\" && id.length > 0,\n ),\n isLatest: true,\n };\n\n if (data.ttlDays && typeof data.ttlDays === \"number\" && data.ttlDays > 0) {\n memory.forgetAfter = new Date(Date.now() + data.ttlDays * 86400000).toISOString();\n }\n\n if (supersededMemory) {\n supersededMemory.isLatest = false;\n await kv.set(KV.memories, supersededMemory.id, supersededMemory);\n }\n await kv.set(KV.memories, memory.id, memory);\n\n if (supersededId) {\n sdk.triggerVoid(\"mem::cascade-update\", {\n supersededMemoryId: supersededId,\n });\n }\n\n ctx.logger.info(\"Memory saved\", {\n memId: memory.id,\n type: memory.type,\n });\n return { success: true, memory };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::forget\" },\n async (data: {\n sessionId?: string;\n observationIds?: string[];\n memoryId?: string;\n }) => {\n const ctx = getContext();\n let deleted = 0;\n\n if (data.memoryId) {\n await kv.delete(KV.memories, data.memoryId);\n deleted++;\n }\n\n if (\n data.sessionId &&\n data.observationIds &&\n data.observationIds.length > 0\n ) {\n for (const obsId of data.observationIds) {\n await kv.delete(KV.observations(data.sessionId), obsId);\n deleted++;\n }\n }\n\n if (\n data.sessionId &&\n (!data.observationIds || data.observationIds.length === 0) &&\n !data.memoryId\n ) {\n const observations = await kv.list<{ id: string }>(\n KV.observations(data.sessionId),\n );\n for (const obs of observations) {\n await kv.delete(KV.observations(data.sessionId), obs.id);\n deleted++;\n }\n await kv.delete(KV.sessions, data.sessionId);\n await kv.delete(KV.summaries, data.sessionId);\n deleted += 2;\n }\n\n ctx.logger.info(\"Memory forgotten\", { deleted });\n return { success: true, deleted };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n SessionSummary,\n Memory,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\ninterface EvictionConfig {\n staleSessionDays: number;\n lowImportanceMaxDays: number;\n lowImportanceThreshold: number;\n maxObservationsPerProject: number;\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\n\nconst DEFAULTS: EvictionConfig = {\n staleSessionDays: 30,\n lowImportanceMaxDays: 90,\n lowImportanceThreshold: 3,\n maxObservationsPerProject: 10_000,\n};\n\ninterface EvictionStats {\n staleSessions: number;\n lowImportanceObs: number;\n capEvictions: number;\n expiredMemories: number;\n nonLatestMemories: number;\n dryRun: boolean;\n}\n\nexport function registerEvictFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::evict\",\n description: \"Evict stale memories based on age and importance\",\n },\n async (data: { dryRun?: boolean }): Promise<EvictionStats> => {\n const ctx = getContext();\n const dryRun = data?.dryRun ?? false;\n\n const configOverride = await kv\n .get<Partial<EvictionConfig>>(KV.config, \"eviction\")\n .catch(() => null);\n const cfg = { ...DEFAULTS, ...configOverride };\n\n const now = Date.now();\n const stats: EvictionStats = {\n staleSessions: 0,\n lowImportanceObs: 0,\n capEvictions: 0,\n expiredMemories: 0,\n nonLatestMemories: 0,\n dryRun,\n };\n\n const sessions = await kv.list<Session>(KV.sessions).catch(() => []);\n const summaries = await kv\n .list<SessionSummary>(KV.summaries)\n .catch(() => []);\n const summaryIds = new Set(summaries.map((s) => s.sessionId));\n\n for (const session of sessions) {\n if (!session.startedAt) continue;\n const age = now - new Date(session.startedAt).getTime();\n const staleDays = cfg.staleSessionDays * MS_PER_DAY;\n if (age > staleDays && !summaryIds.has(session.id)) {\n stats.staleSessions++;\n if (!dryRun) {\n await kv.delete(KV.sessions, session.id).catch(() => {});\n }\n }\n }\n\n const projectObs = new Map<string, CompressedObservation[]>();\n for (const session of sessions) {\n const obs = await kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => []);\n const compressed = obs.filter((o) => o.title);\n\n for (const o of compressed) {\n if (!o.timestamp) continue;\n const age = now - new Date(o.timestamp).getTime();\n const maxAge = cfg.lowImportanceMaxDays * MS_PER_DAY;\n if (\n age > maxAge &&\n (o.importance ?? 5) < cfg.lowImportanceThreshold\n ) {\n stats.lowImportanceObs++;\n if (!dryRun) {\n await kv\n .delete(KV.observations(session.id), o.id)\n .catch(() => {});\n }\n }\n }\n\n const project = session.project || \"unknown\";\n const existing = projectObs.get(project) || [];\n existing.push(...compressed);\n projectObs.set(project, existing);\n }\n\n for (const [, obs] of projectObs) {\n if (obs.length > cfg.maxObservationsPerProject) {\n const sorted = obs.sort(\n (a, b) => (a.importance ?? 5) - (b.importance ?? 5),\n );\n const toEvict = sorted.slice(\n 0,\n obs.length - cfg.maxObservationsPerProject,\n );\n stats.capEvictions += toEvict.length;\n if (!dryRun) {\n for (const o of toEvict) {\n await kv\n .delete(KV.observations(o.sessionId), o.id)\n .catch(() => {});\n }\n }\n }\n }\n\n const memories = await kv.list<Memory>(KV.memories).catch(() => []);\n const evictedMemIds = new Set<string>();\n for (const mem of memories) {\n if (mem.forgetAfter) {\n const expiry = new Date(mem.forgetAfter).getTime();\n if (now > expiry) {\n stats.expiredMemories++;\n evictedMemIds.add(mem.id);\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id).catch(() => {});\n }\n }\n }\n\n if (\n !evictedMemIds.has(mem.id) &&\n mem.isLatest === false &&\n mem.createdAt\n ) {\n const age = now - new Date(mem.createdAt).getTime();\n if (age > cfg.lowImportanceMaxDays * MS_PER_DAY) {\n stats.nonLatestMemories++;\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id).catch(() => {});\n }\n }\n }\n }\n\n ctx.logger.info(\"Eviction complete\", { stats });\n return stats;\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, MemoryRelation } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\n\nfunction computeConfidence(\n source: Memory,\n target: Memory,\n relationType: MemoryRelation[\"type\"],\n): number {\n let score = 0.5;\n\n const sharedSessions = source.sessionIds.filter((sid) =>\n target.sessionIds.includes(sid),\n );\n score += Math.min(sharedSessions.length * 0.1, 0.3);\n\n const now = Date.now();\n const sourceAge = now - new Date(source.updatedAt).getTime();\n const targetAge = now - new Date(target.updatedAt).getTime();\n const sevenDays = 7 * 24 * 60 * 60 * 1000;\n const ninetyDays = 90 * 24 * 60 * 60 * 1000;\n if (sourceAge < sevenDays && targetAge < sevenDays) {\n score += 0.1;\n } else if (sourceAge > ninetyDays && targetAge > ninetyDays) {\n score -= 0.1;\n }\n\n if (relationType === \"supersedes\") score += 0.1;\n if (relationType === \"contradicts\") score -= 0.05;\n\n return Math.max(0, Math.min(1, score));\n}\n\nexport function registerRelationsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::relate\",\n description: \"Create a relationship between memories\",\n },\n async (data: {\n sourceId: string;\n targetId: string;\n type: MemoryRelation[\"type\"];\n confidence?: number;\n }) => {\n const ctx = getContext();\n const [firstId, secondId] = [data.sourceId, data.targetId].sort();\n\n return withKeyedLock(`mem:${firstId}`, () =>\n withKeyedLock(`mem:${secondId}`, async () => {\n const source = await kv.get<Memory>(KV.memories, data.sourceId);\n const target = await kv.get<Memory>(KV.memories, data.targetId);\n if (!source || !target) {\n return {\n success: false,\n error: \"source or target memory not found\",\n };\n }\n\n const confidence =\n data.confidence !== undefined\n ? Math.max(0, Math.min(1, data.confidence))\n : computeConfidence(source, target, data.type);\n\n const relation: MemoryRelation = {\n type: data.type,\n sourceId: data.sourceId,\n targetId: data.targetId,\n createdAt: new Date().toISOString(),\n confidence,\n };\n\n const relationId = generateId(\"rel\");\n await kv.set(KV.relations, relationId, relation);\n\n if (!source.relatedIds) source.relatedIds = [];\n if (!source.relatedIds.includes(data.targetId)) {\n source.relatedIds.push(data.targetId);\n await kv.set(KV.memories, data.sourceId, source);\n }\n\n if (!target.relatedIds) target.relatedIds = [];\n if (!target.relatedIds.includes(data.sourceId)) {\n target.relatedIds.push(data.sourceId);\n await kv.set(KV.memories, data.targetId, target);\n }\n\n ctx.logger.info(\"Memory relation created\", {\n relationId,\n type: data.type,\n source: data.sourceId,\n target: data.targetId,\n });\n return { success: true, relationId, relation };\n }),\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::evolve\", description: \"Create a new version of a memory\" },\n async (data: {\n memoryId: string;\n newContent: string;\n newTitle?: string;\n }) => {\n const ctx = getContext();\n\n const existing = await kv.get<Memory>(KV.memories, data.memoryId);\n if (!existing) {\n return { success: false, error: \"memory not found\" };\n }\n\n const now = new Date().toISOString();\n const evolved: Memory = {\n ...existing,\n id: generateId(\"mem\"),\n createdAt: now,\n updatedAt: now,\n title: data.newTitle || existing.title,\n content: data.newContent,\n version: (existing.version || 1) + 1,\n parentId: existing.id,\n supersedes: [existing.id, ...(existing.supersedes || [])],\n isLatest: true,\n };\n\n existing.isLatest = false;\n await kv.set(KV.memories, existing.id, existing);\n\n await kv.set(KV.memories, evolved.id, evolved);\n\n const relation: MemoryRelation = {\n type: \"supersedes\",\n sourceId: evolved.id,\n targetId: existing.id,\n createdAt: now,\n confidence: 1.0,\n };\n await kv.set(KV.relations, generateId(\"rel\"), relation);\n\n ctx.logger.info(\"Memory evolved\", {\n oldId: existing.id,\n newId: evolved.id,\n version: evolved.version,\n });\n return { success: true, memory: evolved, previousId: existing.id };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::get-related\",\n description: \"Get related memories within N hops\",\n },\n async (data: {\n memoryId: string;\n maxHops?: number;\n minConfidence?: number;\n }) => {\n const ctx = getContext();\n const maxHops = Math.min(data.maxHops ?? 2, 5);\n const MAX_VISITED = 500;\n const rawMinConf = Number(data.minConfidence);\n const minConfidence = Number.isFinite(rawMinConf)\n ? Math.max(0, Math.min(1, rawMinConf))\n : 0;\n\n const allRelations = await kv\n .list<MemoryRelation>(KV.relations)\n .catch(() => []);\n\n const visited = new Set<string>();\n const result: Array<{\n memory: Memory;\n hop: number;\n confidence: number;\n }> = [];\n const queue: Array<{ id: string; hop: number }> = [\n { id: data.memoryId, hop: 0 },\n ];\n\n while (queue.length > 0 && visited.size < MAX_VISITED) {\n const current = queue.shift()!;\n if (visited.has(current.id) || current.hop > maxHops) continue;\n visited.add(current.id);\n\n const memory = await kv.get<Memory>(KV.memories, current.id);\n if (!memory) continue;\n\n if (current.hop > 0) {\n const matchingRelations = allRelations.filter(\n (r) =>\n (r.sourceId === current.id && visited.has(r.targetId)) ||\n (r.targetId === current.id && visited.has(r.sourceId)),\n );\n const confidence =\n matchingRelations.length > 0\n ? Math.max(...matchingRelations.map((r) => r.confidence ?? 0.5))\n : 0.5;\n if (confidence >= minConfidence) {\n result.push({ memory, hop: current.hop, confidence });\n }\n }\n\n const relatedIds = memory.relatedIds || [];\n const supersedes = memory.supersedes || [];\n const parentId = memory.parentId ? [memory.parentId] : [];\n\n const kvLinked = allRelations\n .filter((r) => r.sourceId === current.id || r.targetId === current.id)\n .map((r) => (r.sourceId === current.id ? r.targetId : r.sourceId));\n\n const allLinks = [\n ...new Set([...relatedIds, ...supersedes, ...parentId, ...kvLinked]),\n ];\n\n for (const nextId of allLinks) {\n if (!visited.has(nextId)) {\n queue.push({ id: nextId, hop: current.hop + 1 });\n }\n }\n }\n\n result.sort((a, b) => b.confidence - a.confidence);\n\n ctx.logger.info(\"Related memories retrieved\", {\n memoryId: data.memoryId,\n found: result.length,\n });\n return { results: result };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Session,\n TimelineEntry,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerTimelineFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::timeline\",\n description: \"Get chronological observations around an anchor point\",\n },\n async (data: {\n anchor: string;\n project?: string;\n before?: number;\n after?: number;\n }) => {\n const ctx = getContext();\n const before = Math.max(0, Math.floor(data.before ?? 5));\n const after = Math.max(0, Math.floor(data.after ?? 5));\n\n if (!data.anchor || typeof data.anchor !== \"string\") {\n return { entries: [], anchor: data.anchor, reason: \"invalid_anchor\" };\n }\n\n let anchorTime: number;\n const isoPattern = /^\\d{4}-\\d{2}-\\d{2}/;\n if (isoPattern.test(data.anchor)) {\n anchorTime = new Date(data.anchor).getTime();\n if (isNaN(anchorTime)) {\n return { entries: [], anchor: data.anchor, reason: \"invalid_date\" };\n }\n } else {\n const searchResults = await findByKeyword(\n kv,\n data.anchor,\n data.project,\n );\n if (searchResults.length === 0) {\n return { entries: [], anchor: data.anchor, reason: \"no_match\" };\n }\n anchorTime = new Date(searchResults[0].timestamp).getTime();\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = data.project\n ? sessions.filter((s) => s.project === data.project)\n : sessions;\n\n const allObs: Array<CompressedObservation & { sid: string }> = [];\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n for (const obs of observations) {\n if (obs.title && obs.timestamp) {\n allObs.push({ ...obs, sid: session.id });\n }\n }\n }\n\n allObs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n let anchorIdx = 0;\n let minDist = Infinity;\n for (let i = 0; i < allObs.length; i++) {\n const dist = Math.abs(\n new Date(allObs[i].timestamp).getTime() - anchorTime,\n );\n if (dist < minDist) {\n minDist = dist;\n anchorIdx = i;\n }\n }\n\n const startIdx = Math.max(0, anchorIdx - before);\n const endIdx = Math.min(allObs.length - 1, anchorIdx + after);\n const entries: TimelineEntry[] = [];\n\n for (let i = startIdx; i <= endIdx; i++) {\n const obs = allObs[i];\n const { sid, ...observation } = obs;\n entries.push({\n observation,\n sessionId: sid,\n relativePosition: i - anchorIdx,\n });\n }\n\n ctx.logger.info(\"Timeline retrieved\", {\n anchor: data.anchor,\n entries: entries.length,\n });\n return { entries, anchorIndex: anchorIdx - startIdx };\n },\n );\n}\n\nasync function findByKeyword(\n kv: StateKV,\n keyword: string,\n project?: string,\n): Promise<CompressedObservation[]> {\n const sessions = await kv.list<Session>(KV.sessions);\n const filtered = project\n ? sessions.filter((s) => s.project === project)\n : sessions;\n\n const lower = keyword.toLowerCase();\n const matches: CompressedObservation[] = [];\n\n for (const session of filtered) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n for (const obs of observations) {\n if (\n obs.title?.toLowerCase().includes(lower) ||\n obs.narrative?.toLowerCase().includes(lower) ||\n obs.concepts?.some((c) => c.toLowerCase().includes(lower))\n ) {\n matches.push(obs);\n }\n }\n }\n\n return matches.sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompactSearchResult,\n CompressedObservation,\n HybridSearchResult,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerSmartSearchFunction(\n sdk: ISdk,\n kv: StateKV,\n searchFn: (query: string, limit: number) => Promise<HybridSearchResult[]>,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::smart-search\",\n description:\n \"Search with progressive disclosure: compact results first, expand specific IDs for full details\",\n },\n async (data: {\n query?: string;\n expandIds?: Array<string | { obsId: string; sessionId: string }>;\n limit?: number;\n }) => {\n const ctx = getContext();\n\n if (data.expandIds && data.expandIds.length > 0) {\n const raw = data.expandIds.slice(0, 20);\n const items = raw.map((entry) => {\n if (typeof entry === \"string\") return { obsId: entry, sessionId: undefined as string | undefined };\n if (entry && typeof entry === \"object\" && typeof (entry as any).obsId === \"string\") {\n return { obsId: (entry as any).obsId, sessionId: (entry as any).sessionId as string | undefined };\n }\n return null;\n }).filter((item): item is NonNullable<typeof item> => item !== null);\n\n const expanded: Array<{\n obsId: string;\n sessionId: string;\n observation: CompressedObservation;\n }> = [];\n\n const results = await Promise.all(\n items.map(({ obsId, sessionId }) =>\n findObservation(kv, obsId, sessionId).then((obs) =>\n obs ? { obsId, sessionId: obs.sessionId, observation: obs } : null,\n ),\n ),\n );\n for (const r of results) {\n if (r) expanded.push(r);\n }\n\n const truncated = data.expandIds.length > raw.length;\n ctx.logger.info(\"Smart search expanded\", {\n requested: data.expandIds.length,\n attempted: raw.length,\n returned: expanded.length,\n truncated,\n });\n return { mode: \"expanded\", results: expanded, truncated };\n }\n\n if (!data.query || typeof data.query !== \"string\" || !data.query.trim()) {\n return { mode: \"compact\", results: [], error: \"query is required\" };\n }\n\n const limit = Math.max(1, Math.min(data.limit ?? 20, 100));\n const hybridResults = await searchFn(data.query, limit);\n\n const compact: CompactSearchResult[] = hybridResults.map((r) => ({\n obsId: r.observation.id,\n sessionId: r.sessionId,\n title: r.observation.title,\n type: r.observation.type,\n score: r.combinedScore,\n timestamp: r.observation.timestamp,\n }));\n\n ctx.logger.info(\"Smart search compact\", {\n query: data.query,\n results: compact.length,\n });\n return { mode: \"compact\", results: compact };\n },\n );\n}\n\nasync function findObservation(\n kv: StateKV,\n obsId: string,\n sessionIdHint?: string,\n): Promise<CompressedObservation | null> {\n if (sessionIdHint) {\n const obs = await kv\n .get<CompressedObservation>(KV.observations(sessionIdHint), obsId)\n .catch(() => null);\n if (obs) return obs;\n }\n\n const sessions = await kv.list<{ id: string }>(KV.sessions);\n for (let i = 0; i < sessions.length; i += 5) {\n const batch = sessions.slice(i, i + 5);\n const results = await Promise.all(\n batch.map((s) =>\n kv.get<CompressedObservation>(KV.observations(s.id), obsId).catch(() => null),\n ),\n );\n const found = results.find((r) => r !== null);\n if (found) return found;\n }\n return null;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n Session,\n ProjectProfile,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerProfileFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::profile\",\n description: \"Generate or retrieve a project profile from aggregated data\",\n },\n async (data: { project: string; refresh?: boolean }) => {\n const ctx = getContext();\n\n if (!data.refresh) {\n const cached = await kv\n .get<ProjectProfile>(KV.profiles, data.project)\n .catch(() => null);\n if (cached) {\n const age = Date.now() - new Date(cached.updatedAt).getTime();\n if (age < 3600_000) {\n return { profile: cached, cached: true };\n }\n }\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const projectSessions = sessions.filter(\n (s) => s.project === data.project,\n );\n\n if (projectSessions.length === 0) {\n return { profile: null, reason: \"no_sessions\" };\n }\n\n const conceptFreq = new Map<string, number>();\n const fileFreq = new Map<string, number>();\n const errors: string[] = [];\n const recentActivity: string[] = [];\n let totalObs = 0;\n\n const sortedSessions = projectSessions.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n const top20Sessions = sortedSessions.slice(0, 20);\n const obsPerSession = await Promise.all(\n top20Sessions.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n\n for (let i = 0; i < top20Sessions.length; i++) {\n const session = top20Sessions[i];\n const observations = obsPerSession[i];\n totalObs += observations.length;\n\n for (const obs of observations) {\n for (const concept of obs.concepts || []) {\n conceptFreq.set(concept, (conceptFreq.get(concept) || 0) + 1);\n }\n for (const file of obs.files || []) {\n fileFreq.set(file, (fileFreq.get(file) || 0) + 1);\n }\n if (obs.type === \"error\") {\n errors.push(obs.title);\n }\n }\n\n const important = observations\n .filter((o) => o.importance >= 7)\n .sort((a, b) => b.importance - a.importance);\n if (important.length > 0) {\n recentActivity.push(\n `[${session.startedAt.slice(0, 10)}] ${important[0].title}`,\n );\n }\n }\n\n const topConcepts = Array.from(conceptFreq.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([concept, frequency]) => ({ concept, frequency }));\n\n const topFiles = Array.from(fileFreq.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 15)\n .map(([file, frequency]) => ({ file, frequency }));\n\n const uniqueErrors = [...new Set(errors)].slice(0, 10);\n\n const profile: ProjectProfile = {\n project: data.project,\n updatedAt: new Date().toISOString(),\n topConcepts,\n topFiles,\n conventions: extractConventions(topConcepts, topFiles),\n commonErrors: uniqueErrors,\n recentActivity: recentActivity.slice(0, 10),\n sessionCount: projectSessions.length,\n totalObservations: totalObs,\n };\n\n await kv.set(KV.profiles, data.project, profile);\n\n ctx.logger.info(\"Profile generated\", {\n project: data.project,\n sessions: projectSessions.length,\n observations: totalObs,\n });\n return { profile, cached: false };\n },\n );\n}\n\nfunction extractConventions(\n concepts: Array<{ concept: string; frequency: number }>,\n files: Array<{ file: string; frequency: number }>,\n): string[] {\n const conventions: string[] = [];\n\n const tsFiles = files.filter((f) => f.file.endsWith(\".ts\")).length;\n const jsFiles = files.filter((f) => f.file.endsWith(\".js\")).length;\n if (tsFiles > jsFiles && tsFiles > 0) {\n conventions.push(\"TypeScript project\");\n }\n\n const srcFiles = files.filter((f) => f.file.includes(\"/src/\")).length;\n if (srcFiles > files.length * 0.5) {\n conventions.push(\"Standard src/ directory structure\");\n }\n\n const testFiles = files.filter(\n (f) => f.file.includes(\"test\") || f.file.includes(\"spec\"),\n ).length;\n if (testFiles > 0) {\n conventions.push(\"Has test files\");\n }\n\n for (const { concept, frequency } of concepts.slice(0, 5)) {\n if (frequency >= 3) {\n conventions.push(`Frequently uses: ${concept}`);\n }\n }\n\n return conventions;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, CompressedObservation, Session } from \"../types.js\";\nimport { KV, jaccardSimilarity } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\nconst CONTRADICTION_THRESHOLD = 0.9;\n\ninterface AutoForgetResult {\n ttlExpired: string[];\n contradictions: Array<{\n memoryA: string;\n memoryB: string;\n similarity: number;\n }>;\n lowValueObs: string[];\n dryRun: boolean;\n}\n\nexport function registerAutoForgetFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::auto-forget\",\n description:\n \"Auto-forget expired (TTL), contradictory, and low-value data\",\n },\n async (data: { dryRun?: boolean }): Promise<AutoForgetResult> => {\n const ctx = getContext();\n const dryRun = data?.dryRun ?? false;\n const now = Date.now();\n\n const result: AutoForgetResult = {\n ttlExpired: [],\n contradictions: [],\n lowValueObs: [],\n dryRun,\n };\n\n const memories = await kv.list<Memory>(KV.memories);\n const deletedIds = new Set<string>();\n for (const mem of memories) {\n if (mem.forgetAfter) {\n const expiry = new Date(mem.forgetAfter).getTime();\n if (now > expiry) {\n result.ttlExpired.push(mem.id);\n deletedIds.add(mem.id);\n if (!dryRun) {\n await kv.delete(KV.memories, mem.id);\n }\n }\n }\n }\n\n const latestMemories = memories\n .filter((m) => m.isLatest !== false && !deletedIds.has(m.id))\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n )\n .slice(0, 1000);\n\n const tokenCache = new Map<string, Set<string>>();\n for (const mem of latestMemories) {\n tokenCache.set(\n mem.id,\n new Set(\n mem.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((t) => t.length > 2),\n ),\n );\n }\n\n const memById = new Map(latestMemories.map((m) => [m.id, m]));\n const conceptIndex = new Map<string, string[]>();\n for (const mem of latestMemories) {\n const concepts = mem.concepts || [];\n for (const c of concepts) {\n const key = c.toLowerCase();\n if (!conceptIndex.has(key)) conceptIndex.set(key, []);\n conceptIndex.get(key)!.push(mem.id);\n }\n }\n\n const compared = new Set<string>();\n for (const [, memIds] of conceptIndex) {\n for (let i = 0; i < memIds.length; i++) {\n for (let j = i + 1; j < memIds.length; j++) {\n const key =\n memIds[i] < memIds[j]\n ? `${memIds[i]}|${memIds[j]}`\n : `${memIds[j]}|${memIds[i]}`;\n if (compared.has(key)) continue;\n compared.add(key);\n\n const setA = tokenCache.get(memIds[i])!;\n const setB = tokenCache.get(memIds[j])!;\n let intersection = 0;\n if (setA.size === 0 && setB.size === 0) continue;\n if (setA.size === 0 || setB.size === 0) continue;\n for (const word of setA) {\n if (setB.has(word)) intersection++;\n }\n const sim =\n intersection / (setA.size + setB.size - intersection);\n\n if (sim > CONTRADICTION_THRESHOLD) {\n const memA = memById.get(memIds[i])!;\n const memB = memById.get(memIds[j])!;\n result.contradictions.push({\n memoryA: memA.id,\n memoryB: memB.id,\n similarity: sim,\n });\n\n if (!dryRun) {\n const older =\n new Date(memA.createdAt).getTime() <\n new Date(memB.createdAt).getTime()\n ? memA\n : memB;\n older.isLatest = false;\n await kv.set(KV.memories, older.id, older);\n }\n }\n }\n }\n }\n\n const sessions = await kv.list<Session>(KV.sessions);\n const obsPerSession: CompressedObservation[][] = [];\n for (let batch = 0; batch < sessions.length; batch += 10) {\n const chunk = sessions.slice(batch, batch + 10);\n const results = await Promise.all(\n chunk.map((s) =>\n kv\n .list<CompressedObservation>(KV.observations(s.id))\n .catch(() => [] as CompressedObservation[]),\n ),\n );\n obsPerSession.push(...results);\n }\n for (let i = 0; i < sessions.length; i++) {\n for (const obs of obsPerSession[i]) {\n if (!obs.timestamp) continue;\n const age = now - new Date(obs.timestamp).getTime();\n if (age > 180 * MS_PER_DAY && (obs.importance ?? 5) <= 2) {\n result.lowValueObs.push(obs.id);\n if (!dryRun) {\n await kv\n .delete(KV.observations(sessions[i].id), obs.id)\n .catch(() => {});\n }\n }\n }\n }\n\n ctx.logger.info(\"Auto-forget complete\", {\n ttlExpired: result.ttlExpired.length,\n contradictions: result.contradictions.length,\n lowValueObs: result.lowValueObs.length,\n dryRun,\n });\n return result;\n },\n );\n}\n","export const VERSION: \"0.3.0\" | \"0.4.0\" | \"0.5.0\" | \"0.6.0\" | \"0.6.1\" | \"0.7.0\" | \"0.7.2\" = \"0.7.2\";\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Session,\n CompressedObservation,\n Memory,\n SessionSummary,\n ProjectProfile,\n ExportData,\n GraphNode,\n GraphEdge,\n SemanticMemory,\n ProceduralMemory,\n Action,\n ActionEdge,\n Routine,\n Signal,\n Checkpoint,\n Sentinel,\n Sketch,\n Crystal,\n Facet,\n Lesson,\n ExportPagination,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { VERSION } from \"../version.js\";\n\nexport function registerExportImportFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::export\", description: \"Export all memory data as JSON\" },\n async (data?: { maxSessions?: number; offset?: number }) => {\n const ctx = getContext();\n const rawMax = Number(data?.maxSessions);\n const maxSessions = Number.isFinite(rawMax) && rawMax > 0 ? Math.min(Math.floor(rawMax), 1000) : undefined;\n const rawOffset = Number(data?.offset);\n const offset = Number.isFinite(rawOffset) && rawOffset >= 0 ? Math.floor(rawOffset) : 0;\n\n const allSessions = await kv.list<Session>(KV.sessions);\n const paginatedSessions = maxSessions !== undefined\n ? allSessions.slice(offset, offset + maxSessions)\n : allSessions;\n const memories = await kv.list<Memory>(KV.memories);\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n\n const observations: Record<string, CompressedObservation[]> = {};\n const obsResults = await Promise.all(\n paginatedSessions.map((session) =>\n kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => [] as CompressedObservation[])\n .then((obs) => ({ sessionId: session.id, obs })),\n ),\n );\n for (const { sessionId, obs } of obsResults) {\n if (obs.length > 0) {\n observations[sessionId] = obs;\n }\n }\n\n const profiles: ProjectProfile[] = [];\n const uniqueProjects = [...new Set(paginatedSessions.map((s) => s.project))];\n const profileResults = await Promise.all(\n uniqueProjects.map((project) =>\n kv.get<ProjectProfile>(KV.profiles, project).catch(() => null),\n ),\n );\n for (const profile of profileResults) {\n if (profile) profiles.push(profile);\n }\n\n const [\n graphNodes,\n graphEdges,\n semanticMemories,\n proceduralMemories,\n actions,\n actionEdges,\n sentinels,\n sketches,\n crystals,\n facets,\n lessons,\n routines,\n signals,\n checkpoints,\n ] = await Promise.all([\n kv.list<GraphNode>(KV.graphNodes).catch(() => []),\n kv.list<GraphEdge>(KV.graphEdges).catch(() => []),\n kv.list<SemanticMemory>(KV.semantic).catch(() => []),\n kv.list<ProceduralMemory>(KV.procedural).catch(() => []),\n kv.list<Action>(KV.actions).catch(() => []),\n kv.list<ActionEdge>(KV.actionEdges).catch(() => []),\n kv.list<Sentinel>(KV.sentinels).catch(() => []),\n kv.list<Sketch>(KV.sketches).catch(() => []),\n kv.list<Crystal>(KV.crystals).catch(() => []),\n kv.list<Facet>(KV.facets).catch(() => []),\n kv.list<Lesson>(KV.lessons).catch(() => []),\n kv.list<Routine>(KV.routines).catch(() => []),\n kv.list<Signal>(KV.signals).catch(() => []),\n kv.list<Checkpoint>(KV.checkpoints).catch(() => []),\n ]);\n\n const exportData: ExportData = {\n version: VERSION,\n exportedAt: new Date().toISOString(),\n sessions: paginatedSessions,\n observations,\n memories,\n summaries,\n profiles: profiles.length > 0 ? profiles : undefined,\n graphNodes: graphNodes.length > 0 ? graphNodes : undefined,\n graphEdges: graphEdges.length > 0 ? graphEdges : undefined,\n semanticMemories:\n semanticMemories.length > 0 ? semanticMemories : undefined,\n proceduralMemories:\n proceduralMemories.length > 0 ? proceduralMemories : undefined,\n actions: actions.length > 0 ? actions : undefined,\n actionEdges: actionEdges.length > 0 ? actionEdges : undefined,\n sentinels: sentinels.length > 0 ? sentinels : undefined,\n sketches: sketches.length > 0 ? sketches : undefined,\n crystals: crystals.length > 0 ? crystals : undefined,\n facets: facets.length > 0 ? facets : undefined,\n lessons: lessons.length > 0 ? lessons : undefined,\n routines: routines.length > 0 ? routines : undefined,\n signals: signals.length > 0 ? signals : undefined,\n checkpoints: checkpoints.length > 0 ? checkpoints : undefined,\n };\n\n if (maxSessions !== undefined) {\n exportData.pagination = {\n offset,\n limit: maxSessions,\n total: allSessions.length,\n hasMore: offset + maxSessions < allSessions.length,\n };\n }\n\n const totalObs = Object.values(observations).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n );\n ctx.logger.info(\"Export complete\", {\n sessions: paginatedSessions.length,\n totalSessions: allSessions.length,\n observations: totalObs,\n memories: memories.length,\n summaries: summaries.length,\n });\n\n return exportData;\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::import\",\n description: \"Import memory data from JSON export\",\n },\n async (data: {\n exportData: ExportData;\n strategy?: \"merge\" | \"replace\" | \"skip\";\n }) => {\n const ctx = getContext();\n const strategy = data.strategy || \"merge\";\n const importData = data.exportData;\n\n const supportedVersions = new Set([\"0.3.0\", \"0.4.0\", \"0.5.0\", \"0.6.0\", \"0.6.1\", \"0.7.0\", \"0.7.2\"]);\n if (!supportedVersions.has(importData.version)) {\n return {\n success: false,\n error: `Unsupported export version: ${importData.version}`,\n };\n }\n\n const MAX_SESSIONS = 10_000;\n const MAX_MEMORIES = 50_000;\n const MAX_SUMMARIES = 10_000;\n const MAX_OBS_PER_SESSION = 5_000;\n const MAX_TOTAL_OBSERVATIONS = 500_000;\n\n if (!Array.isArray(importData.sessions)) {\n return { success: false, error: \"sessions must be an array\" };\n }\n if (!Array.isArray(importData.memories)) {\n return { success: false, error: \"memories must be an array\" };\n }\n if (!Array.isArray(importData.summaries)) {\n return { success: false, error: \"summaries must be an array\" };\n }\n if (\n typeof importData.observations !== \"object\" ||\n importData.observations === null ||\n Array.isArray(importData.observations)\n ) {\n return { success: false, error: \"observations must be an object\" };\n }\n\n if (importData.sessions.length > MAX_SESSIONS) {\n return {\n success: false,\n error: `Too many sessions (max ${MAX_SESSIONS})`,\n };\n }\n if (importData.memories.length > MAX_MEMORIES) {\n return {\n success: false,\n error: `Too many memories (max ${MAX_MEMORIES})`,\n };\n }\n if (importData.summaries.length > MAX_SUMMARIES) {\n return {\n success: false,\n error: `Too many summaries (max ${MAX_SUMMARIES})`,\n };\n }\n const MAX_OBS_BUCKETS = 10_000;\n const obsBuckets = Object.keys(importData.observations);\n if (obsBuckets.length > MAX_OBS_BUCKETS) {\n return {\n success: false,\n error: `Too many observation buckets (max ${MAX_OBS_BUCKETS})`,\n };\n }\n\n let totalObservations = 0;\n for (const [, obs] of Object.entries(importData.observations)) {\n if (!Array.isArray(obs)) {\n return { success: false, error: \"observation values must be arrays\" };\n }\n if (obs.length > MAX_OBS_PER_SESSION) {\n return {\n success: false,\n error: `Too many observations per session (max ${MAX_OBS_PER_SESSION})`,\n };\n }\n totalObservations += obs.length;\n }\n if (totalObservations > MAX_TOTAL_OBSERVATIONS) {\n return {\n success: false,\n error: `Too many total observations (max ${MAX_TOTAL_OBSERVATIONS})`,\n };\n }\n\n const stats = {\n sessions: 0,\n observations: 0,\n memories: 0,\n summaries: 0,\n skipped: 0,\n };\n\n if (strategy === \"replace\") {\n const existing = await kv.list<Session>(KV.sessions);\n for (const session of existing) {\n await kv.delete(KV.sessions, session.id);\n const obs = await kv\n .list<CompressedObservation>(KV.observations(session.id))\n .catch(() => []);\n for (const o of obs) {\n await kv.delete(KV.observations(session.id), o.id);\n }\n }\n const existingMem = await kv.list<Memory>(KV.memories);\n for (const m of existingMem) {\n await kv.delete(KV.memories, m.id);\n }\n const existingSummaries = await kv.list<SessionSummary>(KV.summaries);\n for (const s of existingSummaries) {\n await kv.delete(KV.summaries, s.sessionId);\n }\n for (const a of await kv.list<Action>(KV.actions).catch(() => [])) {\n await kv.delete(KV.actions, a.id);\n }\n for (const e of await kv.list<ActionEdge>(KV.actionEdges).catch(() => [])) {\n await kv.delete(KV.actionEdges, e.id);\n }\n for (const r of await kv.list<Routine>(KV.routines).catch(() => [])) {\n await kv.delete(KV.routines, r.id);\n }\n for (const s of await kv.list<Signal>(KV.signals).catch(() => [])) {\n await kv.delete(KV.signals, s.id);\n }\n for (const c of await kv.list<Checkpoint>(KV.checkpoints).catch(() => [])) {\n await kv.delete(KV.checkpoints, c.id);\n }\n for (const s of await kv.list<Sentinel>(KV.sentinels).catch(() => [])) {\n await kv.delete(KV.sentinels, s.id);\n }\n for (const s of await kv.list<Sketch>(KV.sketches).catch(() => [])) {\n await kv.delete(KV.sketches, s.id);\n }\n for (const c of await kv.list<Crystal>(KV.crystals).catch(() => [])) {\n await kv.delete(KV.crystals, c.id);\n }\n for (const f of await kv.list<Facet>(KV.facets).catch(() => [])) {\n await kv.delete(KV.facets, f.id);\n }\n for (const l of await kv.list<Lesson>(KV.lessons).catch(() => [])) {\n await kv.delete(KV.lessons, l.id);\n }\n for (const n of await kv.list<{ id: string }>(KV.graphNodes).catch(() => [])) {\n await kv.delete(KV.graphNodes, n.id);\n }\n for (const e of await kv.list<{ id: string }>(KV.graphEdges).catch(() => [])) {\n await kv.delete(KV.graphEdges, e.id);\n }\n for (const s of await kv.list<{ id: string }>(KV.semantic).catch(() => [])) {\n await kv.delete(KV.semantic, s.id);\n }\n for (const p of await kv.list<{ id: string }>(KV.procedural).catch(() => [])) {\n await kv.delete(KV.procedural, p.id);\n }\n }\n\n for (const session of importData.sessions) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<Session>(KV.sessions, session.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.sessions, session.id, session);\n stats.sessions++;\n }\n\n for (const [sessionId, obs] of Object.entries(importData.observations)) {\n for (const o of obs) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<CompressedObservation>(KV.observations(sessionId), o.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.observations(sessionId), o.id, o);\n stats.observations++;\n }\n }\n\n for (const memory of importData.memories) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<Memory>(KV.memories, memory.id)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.memories, memory.id, memory);\n stats.memories++;\n }\n\n for (const summary of importData.summaries) {\n if (strategy === \"skip\") {\n const existing = await kv\n .get<SessionSummary>(KV.summaries, summary.sessionId)\n .catch(() => null);\n if (existing) {\n stats.skipped++;\n continue;\n }\n }\n await kv.set(KV.summaries, summary.sessionId, summary);\n stats.summaries++;\n }\n\n if (importData.graphNodes) {\n for (const node of importData.graphNodes) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.graphNodes, node.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.graphNodes, node.id, node);\n }\n }\n if (importData.graphEdges) {\n for (const edge of importData.graphEdges) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.graphEdges, edge.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.graphEdges, edge.id, edge);\n }\n }\n if (importData.semanticMemories) {\n for (const sem of importData.semanticMemories) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.semantic, sem.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.semantic, sem.id, sem);\n }\n }\n if (importData.proceduralMemories) {\n for (const proc of importData.proceduralMemories) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.procedural, proc.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.procedural, proc.id, proc);\n }\n }\n\n if (importData.actions) {\n for (const action of importData.actions) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.actions, action.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.actions, action.id, action);\n }\n }\n if (importData.actionEdges) {\n for (const edge of importData.actionEdges) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.actionEdges, edge.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n if (importData.routines) {\n for (const routine of importData.routines) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.routines, routine.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.routines, routine.id, routine);\n }\n }\n if (importData.signals) {\n for (const signal of importData.signals) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.signals, signal.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.signals, signal.id, signal);\n }\n }\n if (importData.checkpoints) {\n for (const checkpoint of importData.checkpoints) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.checkpoints, checkpoint.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n }\n }\n if (importData.sentinels) {\n for (const sentinel of importData.sentinels) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.sentinels, sentinel.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n }\n }\n if (importData.sketches) {\n for (const sketch of importData.sketches) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.sketches, sketch.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.sketches, sketch.id, sketch);\n }\n }\n if (importData.crystals) {\n for (const crystal of importData.crystals) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.crystals, crystal.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.crystals, crystal.id, crystal);\n }\n }\n if (importData.facets) {\n for (const facet of importData.facets) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.facets, facet.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.facets, facet.id, facet);\n }\n }\n if (importData.lessons) {\n for (const lesson of importData.lessons) {\n if (strategy === \"skip\") {\n const existing = await kv.get(KV.lessons, lesson.id).catch(() => null);\n if (existing) { stats.skipped++; continue; }\n }\n await kv.set(KV.lessons, lesson.id, lesson);\n }\n }\n\n ctx.logger.info(\"Import complete\", { strategy, ...stats });\n return { success: true, strategy, ...stats };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nconst MAX_CONTEXT_LENGTH = 4000;\n\nfunction escapeXml(s: string): string {\n return s\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&apos;\");\n}\n\nexport function registerEnrichFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n {\n id: \"mem::enrich\",\n description:\n \"Aggregate file context, relevant observations, and bug memories for pre-tool enrichment\",\n },\n async (data: {\n sessionId: string;\n files: string[];\n terms?: string[];\n toolName?: string;\n }) => {\n const ctx = getContext();\n const parts: string[] = [];\n\n const fileContextPromise = sdk\n .trigger<{ sessionId: string; files: string[] }, { context: string }>(\n \"mem::file-context\",\n {\n sessionId: data.sessionId,\n files: data.files,\n },\n )\n .catch(() => ({ context: \"\" }));\n\n const searchQueries: string[] = [\n ...data.files.map((f) => f.split(\"/\").pop() || f),\n ...(data.terms || []),\n ].filter((q) => q.length > 0);\n\n const searchPromise =\n searchQueries.length > 0\n ? sdk\n .trigger<\n { query: string; limit: number },\n { results: Array<{ observation: { narrative: string } }> }\n >(\"mem::search\", {\n query: searchQueries.join(\" \"),\n limit: 5,\n })\n .catch(() => ({ results: [] }))\n : Promise.resolve({ results: [] });\n\n const bugMemoriesPromise = kv\n .list<Memory>(KV.memories)\n .then((memories) =>\n memories\n .filter(\n (m) =>\n m.type === \"bug\" &&\n m.isLatest &&\n m.files.some((f) =>\n data.files.some((df) => f.includes(df) || df.includes(f)),\n ),\n )\n .sort(\n (a, b) =>\n new Date(b.updatedAt || b.createdAt).getTime() -\n new Date(a.updatedAt || a.createdAt).getTime(),\n ),\n )\n .catch(() => []);\n\n const [fileContext, searchResult, bugMemories] = await Promise.all([\n fileContextPromise,\n searchPromise,\n bugMemoriesPromise,\n ]);\n\n if (fileContext.context) {\n parts.push(fileContext.context);\n }\n\n if (searchResult.results.length > 0) {\n const observations = searchResult.results\n .map((r) => r.observation?.narrative)\n .filter(Boolean)\n .map((n) => escapeXml(n as string))\n .join(\"\\n\");\n if (observations) {\n parts.push(\n `<agentmemory-relevant-context>\\n${observations}\\n</agentmemory-relevant-context>`,\n );\n }\n }\n\n if (bugMemories.length > 0) {\n const bugs = bugMemories\n .slice(0, 3)\n .map((m) => `- ${escapeXml(m.title)}: ${escapeXml(m.content)}`)\n .join(\"\\n\");\n parts.push(\n `<agentmemory-past-errors>\\n${bugs}\\n</agentmemory-past-errors>`,\n );\n }\n\n let context = parts.join(\"\\n\\n\");\n let truncated = false;\n if (context.length > MAX_CONTEXT_LENGTH) {\n context = context.slice(0, MAX_CONTEXT_LENGTH);\n truncated = true;\n }\n\n ctx.logger.info(\"Enrichment completed\", {\n sessionId: data.sessionId,\n fileCount: data.files.length,\n contextLength: context.length,\n truncated,\n });\n\n return { context, truncated };\n },\n );\n}\n","import type { AuditEntry } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nexport async function recordAudit(\n kv: StateKV,\n operation: AuditEntry[\"operation\"],\n functionId: string,\n targetIds: string[],\n details: Record<string, unknown> = {},\n qualityScore?: number,\n userId?: string,\n): Promise<AuditEntry> {\n const entry: AuditEntry = {\n id: generateId(\"aud\"),\n timestamp: new Date().toISOString(),\n operation,\n userId,\n functionId,\n targetIds,\n details,\n qualityScore,\n };\n await kv.set(KV.audit, entry.id, entry);\n return entry;\n}\n\nexport async function queryAudit(\n kv: StateKV,\n filter?: {\n operation?: AuditEntry[\"operation\"];\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n },\n): Promise<AuditEntry[]> {\n const all = await kv.list<AuditEntry>(KV.audit);\n let entries = [...all].sort(\n (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(),\n );\n\n if (filter?.operation) {\n entries = entries.filter((e) => e.operation === filter.operation);\n }\n if (filter?.dateFrom) {\n const from = new Date(filter.dateFrom).getTime();\n if (Number.isNaN(from)) {\n throw new Error(`Invalid dateFrom: ${filter.dateFrom}`);\n }\n entries = entries.filter((e) => new Date(e.timestamp).getTime() >= from);\n }\n if (filter?.dateTo) {\n const to = new Date(filter.dateTo).getTime();\n if (Number.isNaN(to)) {\n throw new Error(`Invalid dateTo: ${filter.dateTo}`);\n }\n entries = entries.filter((e) => new Date(e.timestamp).getTime() <= to);\n }\n\n return entries.slice(0, filter?.limit || 100);\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { dirname } from \"node:path\";\nimport type { Memory, ClaudeBridgeConfig } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction parseMemoryMd(content: string): {\n sections: Map<string, string>;\n raw: string;\n} {\n const sections = new Map<string, string>();\n let currentSection = \"\";\n let currentContent: string[] = [];\n\n for (const line of content.split(\"\\n\")) {\n if (line.startsWith(\"## \")) {\n if (currentSection) {\n sections.set(currentSection, currentContent.join(\"\\n\").trim());\n }\n currentSection = line.slice(3).trim();\n currentContent = [];\n } else {\n currentContent.push(line);\n }\n }\n if (currentSection) {\n sections.set(currentSection, currentContent.join(\"\\n\").trim());\n }\n\n return { sections, raw: content };\n}\n\nfunction serializeToMemoryMd(\n memories: Memory[],\n projectSummary: string,\n lineBudget: number,\n): string {\n const lines: string[] = [];\n lines.push(\"# Agent Memory (auto-synced by agentmemory)\");\n lines.push(\"\");\n\n if (projectSummary) {\n lines.push(\"## Project Summary\");\n lines.push(projectSummary);\n lines.push(\"\");\n }\n\n lines.push(\"## Key Memories\");\n lines.push(\"\");\n\n const sorted = [...memories]\n .filter((m) => m.isLatest)\n .sort((a, b) => b.strength - a.strength);\n\n for (const mem of sorted) {\n if (lines.length >= lineBudget - 2) break;\n lines.push(`### ${mem.title}`);\n const contentLines = mem.content.split(\"\\n\");\n for (const cl of contentLines) {\n if (lines.length >= lineBudget - 1) break;\n lines.push(cl);\n }\n lines.push(\"\");\n }\n\n return lines.slice(0, lineBudget).join(\"\\n\");\n}\n\nexport function registerClaudeBridgeFunction(\n sdk: ISdk,\n kv: StateKV,\n config: ClaudeBridgeConfig,\n): void {\n sdk.registerFunction(\n { id: \"mem::claude-bridge-read\" },\n async () => {\n const ctx = getContext();\n if (!config.enabled || !config.memoryFilePath) {\n return { success: false, error: \"Claude bridge not configured\" };\n }\n\n try {\n if (!existsSync(config.memoryFilePath)) {\n return { success: true, content: \"\", parsed: false };\n }\n const content = readFileSync(config.memoryFilePath, \"utf-8\");\n const { sections } = parseMemoryMd(content);\n\n await kv.set(KV.claudeBridge, \"last-read\", {\n timestamp: new Date().toISOString(),\n sections: Object.fromEntries(sections),\n lineCount: content.split(\"\\n\").length,\n });\n\n ctx.logger.info(\"Claude bridge: read MEMORY.md\", {\n path: config.memoryFilePath,\n lines: content.split(\"\\n\").length,\n });\n return { success: true, content, sections: Object.fromEntries(sections) };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Claude bridge read failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::claude-bridge-sync\" },\n async () => {\n const ctx = getContext();\n if (!config.enabled || !config.memoryFilePath) {\n return { success: false, error: \"Claude bridge not configured\" };\n }\n\n try {\n const memories = await kv.list<Memory>(KV.memories);\n const latestMemories = memories.filter((m) => m.isLatest);\n\n let projectSummary = \"\";\n if (config.projectPath) {\n const profile = await kv\n .get<{ summary?: string }>(KV.profiles, config.projectPath)\n .catch(() => null);\n projectSummary = profile?.summary || \"\";\n }\n\n const md = serializeToMemoryMd(\n latestMemories,\n projectSummary,\n config.lineBudget,\n );\n\n const dir = dirname(config.memoryFilePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(config.memoryFilePath, md, \"utf-8\");\n\n await recordAudit(kv, \"export\", \"mem::claude-bridge-sync\", [], {\n path: config.memoryFilePath,\n memoryCount: latestMemories.length,\n lines: md.split(\"\\n\").length,\n });\n\n ctx.logger.info(\"Claude bridge: synced to MEMORY.md\", {\n path: config.memoryFilePath,\n memories: latestMemories.length,\n });\n return { success: true, path: config.memoryFilePath, lines: md.split(\"\\n\").length };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Claude bridge sync failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n}\n","export const GRAPH_EXTRACTION_SYSTEM = `You are a knowledge graph extraction engine. Given a compressed observation from a coding session, extract entities and relationships.\n\nOutput format (XML):\n<entities>\n <entity type=\"file|function|concept|error|decision|pattern|library|person\" name=\"exact name\">\n <property key=\"key\">value</property>\n </entity>\n</entities>\n<relationships>\n <relationship type=\"uses|imports|modifies|causes|fixes|depends_on|related_to\" source=\"entity name\" target=\"entity name\" weight=\"0.1-1.0\"/>\n</relationships>\n\nRules:\n- Extract concrete entities only (real file paths, function names, library names)\n- Use the most specific type available\n- Weight relationships by how strong/direct the connection is\n- If no entities found, output empty tags`;\n\nexport function buildGraphExtractionPrompt(\n observations: Array<{\n title: string;\n narrative: string;\n concepts: string[];\n files: string[];\n type: string;\n }>,\n): string {\n const items = observations\n .map(\n (o, i) =>\n `[${i + 1}] Type: ${o.type}\\nTitle: ${o.title}\\nNarrative: ${o.narrative}\\nConcepts: ${(o.concepts ?? []).join(\", \")}\\nFiles: ${(o.files ?? []).join(\", \")}`,\n )\n .join(\"\\n\\n\");\n return `Extract entities and relationships from these observations:\\n\\n${items}`;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n GraphNode,\n GraphEdge,\n GraphQueryResult,\n CompressedObservation,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport {\n GRAPH_EXTRACTION_SYSTEM,\n buildGraphExtractionPrompt,\n} from \"../prompts/graph-extraction.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction parseGraphXml(\n xml: string,\n observationIds: string[],\n): {\n nodes: GraphNode[];\n edges: GraphEdge[];\n} {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const now = new Date().toISOString();\n\n const entityRegex =\n /<entity\\s+type=\"([^\"]+)\"\\s+name=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n const type = match[1] as GraphNode[\"type\"];\n const name = match[2];\n const propsBlock = match[3];\n const properties: Record<string, string> = {};\n\n const propRegex = /<property\\s+key=\"([^\"]+)\">([^<]*)<\\/property>/g;\n let propMatch;\n while ((propMatch = propRegex.exec(propsBlock)) !== null) {\n properties[propMatch[1]] = propMatch[2];\n }\n\n nodes.push({\n id: generateId(\"gn\"),\n type,\n name,\n properties,\n sourceObservationIds: observationIds,\n createdAt: now,\n });\n }\n\n const relRegex =\n /<relationship\\s+type=\"([^\"]+)\"\\s+source=\"([^\"]+)\"\\s+target=\"([^\"]+)\"\\s+weight=\"([^\"]+)\"\\s*\\/>/g;\n while ((match = relRegex.exec(xml)) !== null) {\n const type = match[1] as GraphEdge[\"type\"];\n const sourceName = match[2];\n const targetName = match[3];\n const parsedWeight = parseFloat(match[4]);\n const weight = Number.isNaN(parsedWeight) ? 0.5 : parsedWeight;\n\n const sourceNode = nodes.find((n) => n.name === sourceName);\n const targetNode = nodes.find((n) => n.name === targetName);\n\n if (sourceNode && targetNode) {\n edges.push({\n id: generateId(\"ge\"),\n type,\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n weight: Math.max(0, Math.min(1, weight)),\n sourceObservationIds: observationIds,\n createdAt: now,\n });\n }\n }\n\n return { nodes, edges };\n}\n\nexport function registerGraphFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::graph-extract\" },\n async (data: { observations: CompressedObservation[] }) => {\n const ctx = getContext();\n if (!data.observations || data.observations.length === 0) {\n return { success: false, error: \"No observations provided\" };\n }\n\n const prompt = buildGraphExtractionPrompt(\n data.observations.map((o) => ({\n title: o.title,\n narrative: o.narrative,\n concepts: o.concepts,\n files: o.files,\n type: o.type,\n })),\n );\n\n try {\n const response = await provider.compress(\n GRAPH_EXTRACTION_SYSTEM,\n prompt,\n );\n\n const obsIds = data.observations.map((o) => o.id);\n const { nodes, edges } = parseGraphXml(response, obsIds);\n\n const existingNodes = await kv.list<GraphNode>(KV.graphNodes);\n const existingEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n for (const node of nodes) {\n const existing = existingNodes.find(\n (n) => n.name === node.name && n.type === node.type,\n );\n if (existing) {\n const merged = {\n ...existing,\n sourceObservationIds: [\n ...new Set([...existing.sourceObservationIds, ...obsIds]),\n ],\n properties: { ...existing.properties, ...node.properties },\n };\n await kv.set(KV.graphNodes, existing.id, merged);\n const idx = existingNodes.findIndex((n) => n.id === existing.id);\n if (idx !== -1) existingNodes[idx] = merged;\n } else {\n await kv.set(KV.graphNodes, node.id, node);\n existingNodes.push(node);\n }\n }\n\n for (const edge of edges) {\n const edgeKey = `${edge.sourceNodeId}|${edge.targetNodeId}|${edge.type}`;\n const existingEdge = existingEdges.find(\n (e) => `${e.sourceNodeId}|${e.targetNodeId}|${e.type}` === edgeKey,\n );\n if (existingEdge) {\n existingEdge.sourceObservationIds = [\n ...new Set([...existingEdge.sourceObservationIds, ...obsIds]),\n ];\n await kv.set(KV.graphEdges, existingEdge.id, existingEdge);\n } else {\n await kv.set(KV.graphEdges, edge.id, edge);\n existingEdges.push(edge);\n }\n }\n\n await recordAudit(kv, \"observe\", \"mem::graph-extract\", obsIds, {\n nodesExtracted: nodes.length,\n edgesExtracted: edges.length,\n });\n\n ctx.logger.info(\"Graph extraction complete\", {\n nodes: nodes.length,\n edges: edges.length,\n });\n return {\n success: true,\n nodesAdded: nodes.length,\n edgesAdded: edges.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Graph extraction failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::graph-query\" },\n async (data: {\n startNodeId?: string;\n nodeType?: string;\n maxDepth?: number;\n query?: string;\n }): Promise<GraphQueryResult> => {\n const allNodes = (await kv.list<GraphNode>(KV.graphNodes)).filter((n) => !n.stale);\n const allEdges = (await kv.list<GraphEdge>(KV.graphEdges)).filter((e) => !e.stale);\n const maxDepth = Math.min(data.maxDepth || 3, 5);\n\n if (data.query) {\n const lower = data.query.toLowerCase();\n const matchingNodes = allNodes.filter(\n (n) =>\n n.name.toLowerCase().includes(lower) ||\n Object.values(n.properties).some(\n (v) => typeof v === \"string\" && v.toLowerCase().includes(lower),\n ),\n );\n const nodeIds = new Set(matchingNodes.map((n) => n.id));\n const relatedEdges = allEdges.filter(\n (e) => nodeIds.has(e.sourceNodeId) || nodeIds.has(e.targetNodeId),\n );\n return { nodes: matchingNodes, edges: relatedEdges, depth: 0 };\n }\n\n if (data.startNodeId) {\n const visited = new Set<string>();\n const visitedEdges = new Set<string>();\n const resultNodes: GraphNode[] = [];\n const resultEdges: GraphEdge[] = [];\n const queue: Array<{ nodeId: string; depth: number }> = [\n { nodeId: data.startNodeId, depth: 0 },\n ];\n\n while (queue.length > 0) {\n const { nodeId, depth } = queue.shift()!;\n if (visited.has(nodeId) || depth > maxDepth) continue;\n visited.add(nodeId);\n\n const node = allNodes.find((n) => n.id === nodeId);\n if (node) {\n if (!data.nodeType || node.type === data.nodeType) {\n resultNodes.push(node);\n }\n }\n\n const neighborEdges = allEdges.filter(\n (e) => e.sourceNodeId === nodeId || e.targetNodeId === nodeId,\n );\n for (const edge of neighborEdges) {\n if (!visitedEdges.has(edge.id)) {\n visitedEdges.add(edge.id);\n resultEdges.push(edge);\n }\n const nextId =\n edge.sourceNodeId === nodeId\n ? edge.targetNodeId\n : edge.sourceNodeId;\n if (!visited.has(nextId)) {\n queue.push({ nodeId: nextId, depth: depth + 1 });\n }\n }\n }\n\n return { nodes: resultNodes, edges: resultEdges, depth: maxDepth };\n }\n\n let filtered = allNodes;\n if (data.nodeType) {\n filtered = allNodes.filter((n) => n.type === data.nodeType);\n }\n return { nodes: filtered, edges: allEdges, depth: 0 };\n },\n );\n\n sdk.registerFunction({ id: \"mem::graph-stats\" }, async () => {\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const nodesByType: Record<string, number> = {};\n for (const n of nodes) {\n nodesByType[n.type] = (nodesByType[n.type] || 0) + 1;\n }\n\n const edgesByType: Record<string, number> = {};\n for (const e of edges) {\n edgesByType[e.type] = (edgesByType[e.type] || 0) + 1;\n }\n\n return {\n totalNodes: nodes.length,\n totalEdges: edges.length,\n nodesByType,\n edgesByType,\n };\n });\n}\n","export const SEMANTIC_MERGE_SYSTEM = `You are a memory consolidation engine. Given overlapping episodic memories (session summaries), extract stable factual knowledge.\n\nOutput format (XML):\n<facts>\n <fact confidence=\"0.0-1.0\">Concise factual statement</fact>\n</facts>\n\nRules:\n- Extract only facts that appear in 2+ episodes or are highly confident\n- Confidence reflects how well-supported the fact is across episodes\n- Combine overlapping information into single concise facts\n- Skip ephemeral details (specific error messages, temporary states)`;\n\nexport function buildSemanticMergePrompt(\n episodes: Array<{ title: string; narrative: string; concepts: string[] }>,\n): string {\n const items = episodes\n .map(\n (e, i) =>\n `[Episode ${i + 1}]\\nTitle: ${e.title}\\nNarrative: ${e.narrative}\\nConcepts: ${e.concepts.join(\", \")}`,\n )\n .join(\"\\n\\n\");\n return `Consolidate these episodic memories into stable facts:\\n\\n${items}`;\n}\n\nexport const PROCEDURAL_EXTRACTION_SYSTEM = `You are a procedural memory extractor. Given repeated patterns and workflows observed across sessions, extract reusable procedures.\n\nOutput format (XML):\n<procedures>\n <procedure name=\"short descriptive name\" trigger=\"when to use this procedure\">\n <step>Step 1 description</step>\n <step>Step 2 description</step>\n </procedure>\n</procedures>\n\nRules:\n- Only extract procedures observed 2+ times\n- Steps should be concrete and actionable\n- Trigger condition should be specific enough to match automatically`;\n\nexport function buildProceduralExtractionPrompt(\n patterns: Array<{ content: string; frequency: number }>,\n): string {\n const items = patterns\n .map((p, i) => `[Pattern ${i + 1}] (seen ${p.frequency}x)\\n${p.content}`)\n .join(\"\\n\\n\");\n return `Extract reusable procedures from these recurring patterns:\\n\\n${items}`;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n SemanticMemory,\n ProceduralMemory,\n SessionSummary,\n Memory,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport {\n SEMANTIC_MERGE_SYSTEM,\n buildSemanticMergePrompt,\n PROCEDURAL_EXTRACTION_SYSTEM,\n buildProceduralExtractionPrompt,\n} from \"../prompts/consolidation.js\";\nimport { recordAudit } from \"./audit.js\";\nimport { getConsolidationDecayDays, isConsolidationEnabled } from \"../config.js\";\n\nfunction applyDecay(\n items: Array<{\n strength: number;\n lastAccessedAt?: string;\n updatedAt: string;\n }>,\n decayDays: number,\n): void {\n if (decayDays <= 0 || !Number.isFinite(decayDays)) return;\n const now = Date.now();\n for (const item of items) {\n const lastAccess = item.lastAccessedAt || item.updatedAt;\n const daysSince =\n (now - new Date(lastAccess).getTime()) / (1000 * 60 * 60 * 24);\n if (daysSince > decayDays) {\n const decayPeriods = Math.floor(daysSince / decayDays);\n item.strength = Math.max(\n 0.1,\n item.strength * Math.pow(0.9, decayPeriods),\n );\n }\n }\n}\n\nexport function registerConsolidationPipelineFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::consolidate-pipeline\" },\n async (data?: { tier?: string; force?: boolean }) => {\n if (!data?.force && !isConsolidationEnabled()) {\n return { success: false, skipped: true, reason: \"CONSOLIDATION_ENABLED is not set to true\" };\n }\n const ctx = getContext();\n const tier = data?.tier || \"all\";\n const decayDays = getConsolidationDecayDays();\n const results: Record<string, unknown> = {};\n\n if (tier === \"all\" || tier === \"semantic\") {\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const existingSemantic = await kv.list<SemanticMemory>(KV.semantic);\n\n if (summaries.length >= 5) {\n const recentSummaries = summaries\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n )\n .slice(0, 20);\n\n const prompt = buildSemanticMergePrompt(\n recentSummaries.map((s) => ({\n title: s.title,\n narrative: s.narrative,\n concepts: s.concepts,\n })),\n );\n\n try {\n const response = await provider.summarize(\n SEMANTIC_MERGE_SYSTEM,\n prompt,\n );\n\n const factRegex = /<fact\\s+confidence=\"([^\"]+)\">([^<]+)<\\/fact>/g;\n let match;\n let newFacts = 0;\n const now = new Date().toISOString();\n\n while ((match = factRegex.exec(response)) !== null) {\n const parsedConf = parseFloat(match[1]);\n const confidence = Number.isNaN(parsedConf) ? 0.5 : parsedConf;\n const fact = match[2].trim();\n\n const existing = existingSemantic.find(\n (s) => s.fact.toLowerCase() === fact.toLowerCase(),\n );\n if (existing) {\n existing.accessCount++;\n existing.lastAccessedAt = now;\n existing.updatedAt = now;\n existing.confidence = Math.max(existing.confidence, confidence);\n await kv.set(KV.semantic, existing.id, existing);\n } else {\n const sem: SemanticMemory = {\n id: generateId(\"sem\"),\n fact,\n confidence,\n sourceSessionIds: recentSummaries.map((s) => s.sessionId),\n sourceMemoryIds: [],\n accessCount: 1,\n lastAccessedAt: now,\n strength: confidence,\n createdAt: now,\n updatedAt: now,\n };\n await kv.set(KV.semantic, sem.id, sem);\n newFacts++;\n }\n }\n results.semantic = { newFacts, totalSummaries: summaries.length };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Semantic consolidation failed\", { error: msg });\n results.semantic = { error: msg };\n }\n } else {\n results.semantic = {\n skipped: true,\n reason: \"fewer than 5 summaries\",\n };\n }\n }\n\n if (tier === \"all\" || tier === \"procedural\") {\n const memories = await kv.list<Memory>(KV.memories);\n const patterns = memories\n .filter((m) => m.isLatest && m.type === \"pattern\")\n .map((m) => ({\n content: m.content,\n frequency: m.sessionIds.length || 1,\n }))\n .filter((p) => p.frequency >= 2);\n\n if (patterns.length >= 2) {\n const prompt = buildProceduralExtractionPrompt(patterns);\n\n try {\n const response = await provider.summarize(\n PROCEDURAL_EXTRACTION_SYSTEM,\n prompt,\n );\n\n const procRegex =\n /<procedure\\s+name=\"([^\"]+)\"\\s+trigger=\"([^\"]+)\">([\\s\\S]*?)<\\/procedure>/g;\n let match;\n let newProcs = 0;\n const now = new Date().toISOString();\n const existingProcs = await kv.list<ProceduralMemory>(\n KV.procedural,\n );\n\n while ((match = procRegex.exec(response)) !== null) {\n const name = match[1];\n const trigger = match[2];\n const stepsBlock = match[3];\n const steps: string[] = [];\n\n const stepRegex = /<step>([^<]+)<\\/step>/g;\n let stepMatch;\n while ((stepMatch = stepRegex.exec(stepsBlock)) !== null) {\n steps.push(stepMatch[1].trim());\n }\n\n const existing = existingProcs.find(\n (p) => p.name.toLowerCase() === name.toLowerCase(),\n );\n if (existing) {\n existing.frequency++;\n existing.updatedAt = now;\n existing.strength = Math.min(1, existing.strength + 0.1);\n await kv.set(KV.procedural, existing.id, existing);\n } else {\n const proc: ProceduralMemory = {\n id: generateId(\"proc\"),\n name,\n steps,\n triggerCondition: trigger,\n frequency: 1,\n sourceSessionIds: [],\n strength: 0.5,\n createdAt: now,\n updatedAt: now,\n };\n await kv.set(KV.procedural, proc.id, proc);\n newProcs++;\n }\n }\n results.procedural = {\n newProcedures: newProcs,\n patternsAnalyzed: patterns.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Procedural extraction failed\", { error: msg });\n results.procedural = { error: msg };\n }\n } else {\n results.procedural = {\n skipped: true,\n reason: \"fewer than 2 recurring patterns\",\n };\n }\n }\n\n if (tier === \"all\" || tier === \"decay\") {\n const semantic = await kv.list<SemanticMemory>(KV.semantic);\n applyDecay(semantic, decayDays);\n for (const s of semantic) {\n await kv.set(KV.semantic, s.id, s);\n }\n\n const procedural = await kv.list<ProceduralMemory>(KV.procedural);\n applyDecay(procedural, decayDays);\n for (const p of procedural) {\n await kv.set(KV.procedural, p.id, p);\n }\n\n results.decay = {\n semantic: semantic.length,\n procedural: procedural.length,\n };\n }\n\n if (process.env[\"OBSIDIAN_AUTO_EXPORT\"] === \"true\") {\n try {\n await sdk.trigger(\"mem::obsidian-export\", {});\n results.obsidianExport = { success: true };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.warn(\"Obsidian auto-export failed\", { error: msg });\n results.obsidianExport = { success: false, error: msg };\n }\n }\n\n await recordAudit(kv, \"consolidate\", \"mem::consolidate-pipeline\", [], {\n tier,\n results,\n });\n\n ctx.logger.info(\"Consolidation pipeline complete\", { tier, results });\n return { success: true, results };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n TeamConfig,\n TeamSharedItem,\n TeamProfile,\n Memory,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\n\nconst VALID_ITEM_TYPES = new Set([\"memory\", \"pattern\", \"observation\"]);\n\nexport function registerTeamFunction(\n sdk: ISdk,\n kv: StateKV,\n config: TeamConfig,\n): void {\n sdk.registerFunction(\n { id: \"mem::team-share\" },\n async (data: {\n itemId: string;\n itemType: \"memory\" | \"pattern\" | \"observation\";\n sessionId?: string;\n project?: string;\n }) => {\n const ctx = getContext();\n if (!data.itemId || !data.itemType) {\n return { success: false, error: \"itemId and itemType are required\" };\n }\n if (!VALID_ITEM_TYPES.has(data.itemType)) {\n return { success: false, error: `Invalid itemType: ${data.itemType}` };\n }\n\n let content: unknown;\n if (data.itemType === \"observation\") {\n if (!data.sessionId) {\n return {\n success: false,\n error: \"sessionId is required for observations\",\n };\n }\n content = await kv.get(KV.observations(data.sessionId), data.itemId);\n } else {\n content = await kv.get<Memory>(KV.memories, data.itemId);\n }\n if (!content) {\n return { success: false, error: \"Item not found\" };\n }\n\n const shared: TeamSharedItem = {\n id: generateId(\"ts\"),\n sharedBy: config.userId,\n sharedAt: new Date().toISOString(),\n type: data.itemType,\n content,\n project: data.project || \"\",\n visibility: \"shared\",\n };\n\n await kv.set(KV.teamShared(config.teamId), shared.id, shared);\n\n await recordAudit(kv, \"share\", \"mem::team-share\", [data.itemId], {\n teamId: config.teamId,\n userId: config.userId,\n itemType: data.itemType,\n });\n\n ctx.logger.info(\"Team share\", {\n teamId: config.teamId,\n itemId: data.itemId,\n });\n return { success: true, sharedItem: shared };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::team-feed\" },\n async (data?: { limit?: number }) => {\n const limit = data?.limit || 20;\n const items = await kv.list<TeamSharedItem>(KV.teamShared(config.teamId));\n\n const filtered = items.filter((i) => i.visibility === \"shared\");\n const sorted = filtered\n .sort(\n (a, b) =>\n new Date(b.sharedAt).getTime() - new Date(a.sharedAt).getTime(),\n )\n .slice(0, limit);\n\n return { items: sorted, total: filtered.length };\n },\n );\n\n sdk.registerFunction({ id: \"mem::team-profile\" }, async () => {\n const items = await kv.list<TeamSharedItem>(KV.teamShared(config.teamId));\n\n const members = [...new Set(items.map((i) => i.sharedBy))];\n\n const conceptCounts = new Map<string, number>();\n const fileCounts = new Map<string, number>();\n const patterns: string[] = [];\n\n for (const item of items) {\n if (item.type === \"memory\" || item.type === \"pattern\") {\n const mem = item.content as Memory;\n if (mem?.concepts) {\n for (const c of mem.concepts) {\n conceptCounts.set(c, (conceptCounts.get(c) || 0) + 1);\n }\n }\n if (mem?.files) {\n for (const f of mem.files) {\n fileCounts.set(f, (fileCounts.get(f) || 0) + 1);\n }\n }\n if (item.type === \"pattern\" && mem?.content) {\n patterns.push(mem.content.slice(0, 100));\n }\n }\n }\n\n const topConcepts = [...conceptCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([concept, frequency]) => ({ concept, frequency }));\n\n const topFiles = [...fileCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([file, frequency]) => ({ file, frequency }));\n\n const profile: TeamProfile = {\n teamId: config.teamId,\n members,\n topConcepts,\n topFiles,\n sharedPatterns: patterns.slice(0, 10),\n totalSharedItems: items.length,\n updatedAt: new Date().toISOString(),\n };\n\n await kv.set(KV.teamProfile(config.teamId), \"profile\", profile);\n return profile;\n });\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type { Memory, GovernanceFilter, AuditEntry } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit, queryAudit } from \"./audit.js\";\n\nexport function registerGovernanceFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::governance-delete\" },\n async (data: { memoryIds: string[]; reason?: string }) => {\n const ctx = getContext();\n if (\n !data.memoryIds ||\n !Array.isArray(data.memoryIds) ||\n data.memoryIds.length === 0\n ) {\n return { success: false, error: \"memoryIds array is required\" };\n }\n\n let deleted = 0;\n for (const id of data.memoryIds) {\n const mem = await kv.get<Memory>(KV.memories, id);\n if (mem) {\n await kv.delete(KV.memories, id);\n deleted++;\n }\n }\n\n await recordAudit(\n kv,\n \"delete\",\n \"mem::governance-delete\",\n data.memoryIds,\n {\n reason: data.reason || \"manual deletion\",\n deleted,\n },\n );\n\n ctx.logger.info(\"Governance delete\", {\n requested: data.memoryIds.length,\n deleted,\n });\n return { success: true, deleted, total: data.memoryIds.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::governance-bulk\" },\n async (data: GovernanceFilter & { dryRun?: boolean }) => {\n const ctx = getContext();\n\n const hasFilter =\n (data.type && data.type.length > 0) ||\n data.dateFrom ||\n data.dateTo ||\n data.qualityBelow !== undefined;\n if (!hasFilter && !data.dryRun) {\n return {\n success: false,\n error: \"At least one filter is required for non-dryRun bulk delete\",\n };\n }\n\n const memories = await kv.list<Memory>(KV.memories);\n let candidates = memories;\n\n if (data.type && data.type.length > 0) {\n candidates = candidates.filter((m) => data.type!.includes(m.type));\n }\n if (data.dateFrom) {\n const from = new Date(data.dateFrom).getTime();\n if (Number.isNaN(from)) {\n return { success: false, error: \"Invalid dateFrom format\" };\n }\n candidates = candidates.filter(\n (m) => new Date(m.createdAt).getTime() >= from,\n );\n }\n if (data.dateTo) {\n const to = new Date(data.dateTo).getTime();\n if (Number.isNaN(to)) {\n return { success: false, error: \"Invalid dateTo format\" };\n }\n candidates = candidates.filter(\n (m) => new Date(m.createdAt).getTime() <= to,\n );\n }\n if (data.qualityBelow !== undefined) {\n candidates = candidates.filter((m) => m.strength < data.qualityBelow!);\n }\n\n if (data.dryRun) {\n return {\n success: true,\n dryRun: true,\n wouldDelete: candidates.length,\n ids: candidates.map((m) => m.id),\n };\n }\n\n for (const mem of candidates) {\n await kv.delete(KV.memories, mem.id);\n }\n\n await recordAudit(\n kv,\n \"delete\",\n \"mem::governance-bulk\",\n candidates.map((m) => m.id),\n { filter: data, deleted: candidates.length },\n );\n\n ctx.logger.info(\"Governance bulk delete\", { deleted: candidates.length });\n return { success: true, deleted: candidates.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::audit-query\" },\n async (data?: {\n operation?: AuditEntry[\"operation\"];\n dateFrom?: string;\n dateTo?: string;\n limit?: number;\n }) => {\n return queryAudit(kv, data);\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { SnapshotMeta, Session, Memory, GraphNode } from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { recordAudit } from \"./audit.js\";\nimport { VERSION } from \"../version.js\";\n\nconst COMMIT_HASH_RE = /^[0-9a-f]{7,40}$/i;\n\nconst execFileAsync = promisify(execFile);\n\nasync function gitExec(dir: string, args: string[]): Promise<string> {\n const { stdout } = await execFileAsync(\"git\", args, { cwd: dir });\n return stdout.trim();\n}\n\nasync function ensureGitRepo(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n if (!existsSync(join(dir, \".git\"))) {\n await gitExec(dir, [\"init\"]);\n await gitExec(dir, [\"config\", \"user.email\", \"agentmemory@local\"]);\n await gitExec(dir, [\"config\", \"user.name\", \"agentmemory\"]);\n }\n}\n\nexport function registerSnapshotFunction(\n sdk: ISdk,\n kv: StateKV,\n snapshotDir: string,\n): void {\n sdk.registerFunction(\n { id: \"mem::snapshot-create\" },\n async (data?: { message?: string }) => {\n const ctx = getContext();\n\n try {\n await ensureGitRepo(snapshotDir);\n\n const sessions = await kv.list<Session>(KV.sessions);\n const memories = await kv.list<Memory>(KV.memories);\n const graphNodes = await kv.list<GraphNode>(KV.graphNodes);\n\n const observations: Record<string, unknown[]> = {};\n for (const session of sessions) {\n const obs = await kv\n .list(KV.observations(session.id))\n .catch(() => []);\n if (obs.length > 0) {\n observations[session.id] = obs;\n }\n }\n\n const state = {\n version: VERSION,\n timestamp: new Date().toISOString(),\n sessions,\n memories,\n graphNodes,\n observations,\n };\n\n writeFileSync(\n join(snapshotDir, \"state.json\"),\n JSON.stringify(state, null, 2),\n \"utf-8\",\n );\n\n await gitExec(snapshotDir, [\"add\", \".\"]);\n\n const message = data?.message || `Snapshot ${new Date().toISOString()}`;\n try {\n await gitExec(snapshotDir, [\"commit\", \"-m\", message]);\n } catch (commitErr) {\n const errMsg =\n commitErr instanceof Error ? commitErr.message : String(commitErr);\n if (errMsg.includes(\"nothing to commit\")) {\n return { success: true, message: \"No changes to snapshot\" };\n }\n throw commitErr;\n }\n\n const commitHash = await gitExec(snapshotDir, [\"rev-parse\", \"HEAD\"]);\n\n const meta: SnapshotMeta = {\n id: generateId(\"snap\"),\n commitHash,\n createdAt: new Date().toISOString(),\n message,\n stats: {\n sessions: sessions.length,\n observations: Object.values(observations).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n ),\n memories: memories.length,\n graphNodes: graphNodes.length,\n },\n };\n\n await recordAudit(kv, \"export\", \"mem::snapshot-create\", [meta.id], {\n commitHash,\n stats: meta.stats,\n });\n\n ctx.logger.info(\"Snapshot created\", { commitHash });\n return { success: true, snapshot: meta };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Snapshot failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction({ id: \"mem::snapshot-list\" }, async () => {\n try {\n if (!existsSync(join(snapshotDir, \".git\"))) {\n return { snapshots: [] };\n }\n const log = await gitExec(snapshotDir, [\n \"log\",\n \"--format=%H|%aI|%s\",\n \"-20\",\n ]);\n const snapshots = log\n .split(\"\\n\")\n .filter(Boolean)\n .map((line) => {\n const parts = line.split(\"|\");\n const [hash, date] = parts;\n const msg = parts.slice(2).join(\"|\");\n return { commitHash: hash, createdAt: date, message: msg };\n });\n return { snapshots };\n } catch {\n return { snapshots: [] };\n }\n });\n\n sdk.registerFunction(\n { id: \"mem::snapshot-restore\" },\n async (data: { commitHash: string }) => {\n const ctx = getContext();\n if (!data.commitHash) {\n return { success: false, error: \"commitHash is required\" };\n }\n if (!COMMIT_HASH_RE.test(data.commitHash)) {\n return { success: false, error: \"Invalid commitHash format\" };\n }\n\n try {\n await gitExec(snapshotDir, [\n \"checkout\",\n data.commitHash,\n \"--\",\n \"state.json\",\n ]);\n const content = readFileSync(join(snapshotDir, \"state.json\"), \"utf-8\");\n const state = JSON.parse(content) as {\n sessions?: Array<{ id: string } & Record<string, unknown>>;\n memories?: Array<{ id: string } & Record<string, unknown>>;\n graphNodes?: Array<{ id: string } & Record<string, unknown>>;\n observations?: Record<\n string,\n Array<{ id: string } & Record<string, unknown>>\n >;\n };\n\n if (state.sessions) {\n for (const session of state.sessions) {\n await kv.set(KV.sessions, session.id, session);\n }\n }\n if (state.memories) {\n for (const memory of state.memories) {\n await kv.set(KV.memories, memory.id, memory);\n }\n }\n if (state.graphNodes) {\n for (const node of state.graphNodes) {\n await kv.set(KV.graphNodes, node.id, node);\n }\n }\n if (state.observations) {\n for (const [sessionId, obs] of Object.entries(state.observations)) {\n for (const o of obs) {\n await kv.set(KV.observations(sessionId), o.id, o);\n }\n }\n }\n\n await gitExec(snapshotDir, [\"checkout\", \"HEAD\", \"--\", \"state.json\"]);\n\n await recordAudit(kv, \"import\", \"mem::snapshot-restore\", [], {\n commitHash: data.commitHash,\n sessions: state.sessions?.length || 0,\n memories: state.memories?.length || 0,\n graphNodes: state.graphNodes?.length || 0,\n });\n\n ctx.logger.info(\"Snapshot restored\", {\n commitHash: data.commitHash,\n });\n return { success: true, commitHash: data.commitHash };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Snapshot restore failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge } from \"../types.js\";\n\nexport function registerActionsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::action-create\" },\n async (data: {\n title: string;\n description?: string;\n priority?: number;\n createdBy?: string;\n project?: string;\n tags?: string[];\n parentId?: string;\n sourceObservationIds?: string[];\n sourceMemoryIds?: string[];\n edges?: Array<{ type: string; targetActionId: string }>;\n }) => {\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n return withKeyedLock(\"mem:actions\", async () => {\n const now = new Date().toISOString();\n const action: Action = {\n id: generateId(\"act\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n priority: Math.max(1, Math.min(10, data.priority || 5)),\n createdAt: now,\n updatedAt: now,\n createdBy: data.createdBy || \"unknown\",\n project: data.project,\n tags: data.tags || [],\n sourceObservationIds: data.sourceObservationIds || [],\n sourceMemoryIds: data.sourceMemoryIds || [],\n parentId: data.parentId,\n };\n\n if (data.parentId) {\n const parent = await kv.get<Action>(KV.actions, data.parentId);\n if (!parent) {\n return { success: false, error: \"parent action not found\" };\n }\n }\n\n const validEdgeTypes = [\n \"requires\",\n \"unlocks\",\n \"spawned_by\",\n \"gated_by\",\n \"conflicts_with\",\n ];\n const pendingEdges: ActionEdge[] = [];\n let hasRequires = false;\n if (data.edges && Array.isArray(data.edges)) {\n for (const e of data.edges) {\n if (!validEdgeTypes.includes(e.type)) {\n return { success: false, error: `invalid edge type: ${e.type}` };\n }\n const targetAction = await kv.get<Action>(KV.actions, e.targetActionId);\n if (!targetAction) {\n return { success: false, error: `target action not found: ${e.targetActionId}` };\n }\n if (e.type === \"requires\") hasRequires = true;\n pendingEdges.push({\n id: generateId(\"ae\"),\n type: e.type as ActionEdge[\"type\"],\n sourceActionId: action.id,\n targetActionId: e.targetActionId,\n createdAt: now,\n });\n }\n }\n\n if (hasRequires) {\n action.status = \"blocked\";\n }\n\n await kv.set(KV.actions, action.id, action);\n\n for (const edge of pendingEdges) {\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n\n return { success: true, action, edges: pendingEdges };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-update\" },\n async (data: {\n actionId: string;\n status?: Action[\"status\"];\n title?: string;\n description?: string;\n priority?: number;\n assignedTo?: string;\n result?: string;\n tags?: string[];\n }) => {\n if (!data.actionId) {\n return { success: false, error: \"actionId is required\" };\n }\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n\n if (data.status !== undefined) action.status = data.status;\n if (data.title !== undefined) action.title = data.title.trim();\n if (data.description !== undefined)\n action.description = data.description.trim();\n if (data.priority !== undefined)\n action.priority = Math.max(1, Math.min(10, data.priority));\n if (data.assignedTo !== undefined) action.assignedTo = data.assignedTo;\n if (data.result !== undefined) action.result = data.result;\n if (data.tags !== undefined) action.tags = data.tags;\n action.updatedAt = new Date().toISOString();\n\n await kv.set(KV.actions, action.id, action);\n\n if (data.status === \"done\") {\n await propagateCompletion(kv, action.id);\n }\n\n return { success: true, action };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-edge-create\" },\n async (data: {\n sourceActionId: string;\n targetActionId: string;\n type: string;\n metadata?: Record<string, unknown>;\n }) => {\n if (!data.sourceActionId || !data.targetActionId || !data.type) {\n return {\n success: false,\n error: \"sourceActionId, targetActionId, and type are required\",\n };\n }\n\n const validTypes = [\n \"requires\",\n \"unlocks\",\n \"spawned_by\",\n \"gated_by\",\n \"conflicts_with\",\n ];\n if (!validTypes.includes(data.type)) {\n return {\n success: false,\n error: `type must be one of: ${validTypes.join(\", \")}`,\n };\n }\n\n const sourceAction = await kv.get<Action>(KV.actions, data.sourceActionId);\n if (!sourceAction) {\n return { success: false, error: \"source action not found\" };\n }\n const targetAction = await kv.get<Action>(KV.actions, data.targetActionId);\n if (!targetAction) {\n return { success: false, error: \"target action not found\" };\n }\n\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: data.type as ActionEdge[\"type\"],\n sourceActionId: data.sourceActionId,\n targetActionId: data.targetActionId,\n createdAt: new Date().toISOString(),\n metadata: data.metadata,\n };\n\n await kv.set(KV.actionEdges, edge.id, edge);\n return { success: true, edge };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-list\" },\n async (data: {\n status?: string;\n project?: string;\n parentId?: string;\n tags?: string[];\n limit?: number;\n }) => {\n let actions = await kv.list<Action>(KV.actions);\n\n if (data.status) {\n actions = actions.filter((a) => a.status === data.status);\n }\n if (data.project) {\n actions = actions.filter((a) => a.project === data.project);\n }\n if (data.parentId) {\n actions = actions.filter((a) => a.parentId === data.parentId);\n }\n if (data.tags && data.tags.length > 0) {\n actions = actions.filter((a) =>\n data.tags!.some((t) => a.tags.includes(t)),\n );\n }\n\n actions.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n\n const limit = data.limit || 50;\n return { success: true, actions: actions.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::action-get\" },\n async (data: { actionId: string }) => {\n if (!data.actionId) {\n return { success: false, error: \"actionId is required\" };\n }\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const edges = allEdges.filter(\n (e) =>\n e.sourceActionId === data.actionId ||\n e.targetActionId === data.actionId,\n );\n\n const children = (await kv.list<Action>(KV.actions)).filter(\n (a) => a.parentId === data.actionId,\n );\n\n return { success: true, action, edges, children };\n },\n );\n}\n\nasync function propagateCompletion(\n kv: StateKV,\n completedActionId: string,\n): Promise<void> {\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const unlockEdges = allEdges.filter(\n (e) =>\n e.targetActionId === completedActionId &&\n (e.type === \"requires\" || e.type === \"unlocks\"),\n );\n\n const allActions = await kv.list<Action>(KV.actions);\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n\n for (const edge of unlockEdges) {\n const candidateId = edge.sourceActionId;\n await withKeyedLock(`mem:action:${candidateId}`, async () => {\n const action = await kv.get<Action>(KV.actions, candidateId);\n if (action && action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n }\n });\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Action, ActionEdge, Checkpoint, Lease } from \"../types.js\";\n\nexport interface FrontierItem {\n action: Action;\n score: number;\n blockers: string[];\n leased: boolean;\n}\n\nexport function registerFrontierFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::frontier\" },\n async (data: {\n project?: string;\n agentId?: string;\n limit?: number;\n includeLeasedByOthers?: boolean;\n }) => {\n const actions = await kv.list<Action>(KV.actions);\n const edges = await kv.list<ActionEdge>(KV.actionEdges);\n const leases = await kv.list<Lease>(KV.leases);\n const checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const now = Date.now();\n\n const activeLeaseMap = new Map<string, Lease>();\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() > now\n ) {\n activeLeaseMap.set(lease.actionId, lease);\n }\n }\n\n const checkpointMap = new Map<string, Checkpoint>();\n for (const cp of checkpoints) {\n checkpointMap.set(cp.id, cp);\n }\n\n const actionMap = new Map<string, Action>();\n for (const a of actions) actionMap.set(a.id, a);\n\n const frontier: FrontierItem[] = [];\n\n for (const action of actions) {\n if (action.status === \"done\" || action.status === \"cancelled\") continue;\n if (data.project && action.project !== data.project) continue;\n\n const blockers: string[] = [];\n const inEdges = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n\n for (const edge of inEdges) {\n const dep = actionMap.get(edge.targetActionId);\n if (dep && dep.status !== \"done\") {\n blockers.push(`requires:${dep.id}:${dep.title}`);\n }\n }\n\n const gateEdges = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"gated_by\",\n );\n for (const edge of gateEdges) {\n const cp = checkpointMap.get(edge.targetActionId);\n if (cp && cp.status !== \"passed\") {\n blockers.push(`checkpoint:${cp.id}:${cp.name}`);\n }\n }\n\n const conflictEdges = edges.filter(\n (e) =>\n (e.sourceActionId === action.id ||\n e.targetActionId === action.id) &&\n e.type === \"conflicts_with\",\n );\n for (const edge of conflictEdges) {\n const otherId =\n edge.sourceActionId === action.id\n ? edge.targetActionId\n : edge.sourceActionId;\n const other = actionMap.get(otherId);\n if (other && other.status === \"active\") {\n blockers.push(`conflict:${other.id}:${other.title}`);\n }\n }\n\n if (blockers.length > 0) continue;\n\n const lease = activeLeaseMap.get(action.id);\n const leasedByOther =\n lease && data.agentId && lease.agentId !== data.agentId;\n if (leasedByOther && !data.includeLeasedByOthers) continue;\n\n const score = computeScore(action, edges, now);\n\n frontier.push({\n action,\n score,\n blockers: [],\n leased: !!lease,\n });\n }\n\n frontier.sort((a, b) => b.score - a.score);\n const limit = data.limit || 20;\n\n return {\n success: true,\n frontier: frontier.slice(0, limit),\n totalActions: actions.length,\n totalUnblocked: frontier.length,\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::next\" },\n async (data: { project?: string; agentId?: string }) => {\n const result = await sdk.trigger<\n { project?: string; agentId?: string; limit?: number },\n {\n success: boolean;\n frontier: FrontierItem[];\n totalActions: number;\n totalUnblocked: number;\n }\n >(\"mem::frontier\", {\n project: data.project,\n agentId: data.agentId,\n limit: 1,\n });\n\n if (!result.success) {\n return {\n success: false,\n suggestion: null,\n message: \"Failed to compute frontier\",\n totalActions: 0,\n };\n }\n if (result.frontier.length === 0) {\n return {\n success: true,\n suggestion: null,\n message: \"No actionable work found\",\n totalActions: result.totalActions || 0,\n };\n }\n\n const top = result.frontier[0];\n return {\n success: true,\n suggestion: {\n actionId: top.action.id,\n title: top.action.title,\n description: top.action.description,\n priority: top.action.priority,\n score: top.score,\n tags: top.action.tags,\n },\n message: `Suggested: ${top.action.title} (priority ${top.action.priority}, score ${top.score.toFixed(2)})`,\n totalActions: result.totalActions,\n totalUnblocked: result.totalUnblocked,\n };\n },\n );\n}\n\nfunction computeScore(\n action: Action,\n edges: ActionEdge[],\n now: number,\n): number {\n let score = action.priority * 10;\n\n const ageHours =\n (now - new Date(action.createdAt).getTime()) / (1000 * 60 * 60);\n score += Math.min(ageHours * 0.5, 20);\n\n const unlockCount = edges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"unlocks\",\n ).length;\n score += unlockCount * 5;\n\n if (edges.some((e) => e.sourceActionId === action.id && e.type === \"spawned_by\")) {\n score += 3;\n }\n\n if (action.status === \"active\") score += 15;\n\n return Math.round(score * 100) / 100;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, Lease } from \"../types.js\";\n\nconst DEFAULT_LEASE_TTL_MS = 10 * 60 * 1000;\nconst MAX_LEASE_TTL_MS = 60 * 60 * 1000;\n\nexport function registerLeasesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::lease-acquire\" },\n async (data: { actionId: string; agentId: string; ttlMs?: number }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n const rawTtl = typeof data.ttlMs === \"number\" && Number.isFinite(data.ttlMs) && data.ttlMs > 0\n ? data.ttlMs\n : DEFAULT_LEASE_TTL_MS;\n const ttl = Math.min(rawTtl, MAX_LEASE_TTL_MS);\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (!action) {\n return { success: false, error: \"action not found\" };\n }\n if (action.status === \"done\" || action.status === \"cancelled\") {\n return { success: false, error: \"action already completed\" };\n }\n if (action.status === \"blocked\") {\n return { success: false, error: \"action is blocked\" };\n }\n\n const existingLeases = await kv.list<Lease>(KV.leases);\n const activeLease = existingLeases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (activeLease) {\n if (activeLease.agentId === data.agentId) {\n return {\n success: true,\n lease: activeLease,\n renewed: false,\n message: \"Already holding this lease\",\n };\n }\n return {\n success: false,\n error: \"action already leased\",\n heldBy: activeLease.agentId,\n expiresAt: activeLease.expiresAt,\n };\n }\n\n const now = new Date();\n const lease: Lease = {\n id: generateId(\"lse\"),\n actionId: data.actionId,\n agentId: data.agentId,\n acquiredAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + ttl).toISOString(),\n status: \"active\",\n };\n\n await kv.set(KV.leases, lease.id, lease);\n\n action.status = \"active\";\n action.assignedTo = data.agentId;\n action.updatedAt = now.toISOString();\n await kv.set(KV.actions, action.id, action);\n\n return { success: true, lease, renewed: false };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-release\" },\n async (data: { actionId: string; agentId: string; result?: string }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const activeLease = leases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.agentId === data.agentId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (!activeLease) {\n return { success: false, error: \"no active lease found for this agent\" };\n }\n\n activeLease.status = \"released\";\n await kv.set(KV.leases, activeLease.id, activeLease);\n\n const action = await kv.get<Action>(KV.actions, data.actionId);\n if (action && action.status === \"active\" && action.assignedTo === data.agentId) {\n if (data.result) {\n action.status = \"done\";\n action.result = data.result;\n } else {\n action.status = \"pending\";\n }\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n\n return { success: true, released: true };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-renew\" },\n async (data: { actionId: string; agentId: string; ttlMs?: number }) => {\n if (!data.actionId || !data.agentId) {\n return { success: false, error: \"actionId and agentId are required\" };\n }\n\n const rawTtl = typeof data.ttlMs === \"number\" && Number.isFinite(data.ttlMs) && data.ttlMs > 0\n ? data.ttlMs\n : DEFAULT_LEASE_TTL_MS;\n const ttl = Math.min(rawTtl, MAX_LEASE_TTL_MS);\n\n return withKeyedLock(`mem:action:${data.actionId}`, async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const activeLease = leases.find(\n (l) =>\n l.actionId === data.actionId &&\n l.agentId === data.agentId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n\n if (!activeLease) {\n return { success: false, error: \"no active (non-expired) lease to renew\" };\n }\n\n const now = new Date();\n const base = Math.max(now.getTime(), new Date(activeLease.expiresAt).getTime());\n activeLease.expiresAt = new Date(base + ttl).toISOString();\n activeLease.renewedAt = now.toISOString();\n await kv.set(KV.leases, activeLease.id, activeLease);\n\n return { success: true, lease: activeLease };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lease-cleanup\" },\n async () => {\n const leases = await kv.list<Lease>(KV.leases);\n const now = Date.now();\n let expired = 0;\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:action:${lease.actionId}`,\n async () => {\n const currentLease = await kv.get<Lease>(KV.leases, lease.id);\n if (\n !currentLease ||\n currentLease.status !== \"active\" ||\n new Date(currentLease.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n currentLease.status = \"expired\";\n await kv.set(KV.leases, currentLease.id, currentLease);\n\n const action = await kv.get<Action>(KV.actions, currentLease.actionId);\n const otherActiveLease = (await kv.list<Lease>(KV.leases)).some(\n (l) =>\n l.id !== currentLease.id &&\n l.actionId === currentLease.actionId &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > Date.now(),\n );\n if (\n action &&\n !otherActiveLease &&\n action.status === \"active\" &&\n action.assignedTo === currentLease.agentId\n ) {\n action.status = \"pending\";\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, Routine, RoutineStep, RoutineRun } from \"../types.js\";\n\nexport function registerRoutinesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::routine-create\" },\n async (data: {\n name: string;\n description?: string;\n steps: RoutineStep[];\n tags?: string[];\n frozen?: boolean;\n sourceProceduralIds?: string[];\n }) => {\n if (!data.name || !Array.isArray(data.steps) || data.steps.length === 0) {\n return { success: false, error: \"name and steps are required\" };\n }\n\n for (let i = 0; i < data.steps.length; i++) {\n if (!data.steps[i].title?.trim()) {\n return { success: false, error: `step ${i} must have a title` };\n }\n }\n\n const orders = data.steps.map((s, i) => s.order ?? i);\n const uniqueOrders = new Set(orders);\n if (uniqueOrders.size !== orders.length) {\n return { success: false, error: \"duplicate step orders\" };\n }\n for (const step of data.steps) {\n if (step.dependsOn) {\n for (const dep of step.dependsOn) {\n if (!uniqueOrders.has(dep)) {\n return { success: false, error: `step ${step.order ?? data.steps.indexOf(step)} depends on unknown order ${dep}` };\n }\n }\n }\n }\n\n const now = new Date().toISOString();\n const routine: Routine = {\n id: generateId(\"rtn\"),\n name: data.name.trim(),\n description: (data.description || \"\").trim(),\n steps: data.steps.map((s, i) => ({\n order: s.order ?? i,\n title: s.title,\n description: s.description || \"\",\n actionTemplate: s.actionTemplate || {},\n dependsOn: s.dependsOn || [],\n })),\n createdAt: now,\n updatedAt: now,\n frozen: data.frozen ?? true,\n tags: data.tags || [],\n sourceProceduralIds: data.sourceProceduralIds || [],\n };\n\n await kv.set(KV.routines, routine.id, routine);\n return { success: true, routine };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-list\" },\n async (data: { frozen?: boolean; tags?: string[] }) => {\n let routines = await kv.list<Routine>(KV.routines);\n if (data.frozen !== undefined) {\n routines = routines.filter((r) => r.frozen === data.frozen);\n }\n if (data.tags && data.tags.length > 0) {\n routines = routines.filter((r) =>\n data.tags!.some((t) => r.tags.includes(t)),\n );\n }\n routines.sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime(),\n );\n return { success: true, routines };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-run\" },\n async (data: {\n routineId: string;\n initiatedBy?: string;\n project?: string;\n overrides?: Record<number, Partial<Action>>;\n }) => {\n if (!data.routineId) {\n return { success: false, error: \"routineId is required\" };\n }\n\n return withKeyedLock(`mem:routine:${data.routineId}`, async () => {\n const routine = await kv.get<Routine>(KV.routines, data.routineId);\n if (!routine) {\n return { success: false, error: \"routine not found\" };\n }\n\n const now = new Date().toISOString();\n const stepOrderToActionId = new Map<number, string>();\n const actionIds: string[] = [];\n const stepStatus: Record<number, \"pending\" | \"active\" | \"done\" | \"failed\"> = {};\n\n for (const step of routine.steps) {\n const template = step.actionTemplate || {};\n const override = data.overrides?.[step.order] || {};\n\n const hasDeps = (step.dependsOn || []).length > 0;\n const action: Action = {\n id: generateId(\"act\"),\n title: override.title || template.title || step.title,\n description:\n override.description ||\n template.description ||\n step.description,\n status: hasDeps ? \"blocked\" : \"pending\",\n priority:\n override.priority ?? template.priority ?? 5,\n createdAt: now,\n updatedAt: now,\n createdBy: data.initiatedBy || \"routine\",\n project: data.project || template.project,\n tags: [\n ...(template.tags || []),\n ...(override.tags || []),\n `routine:${routine.id}`,\n ],\n sourceObservationIds: [],\n sourceMemoryIds: [],\n metadata: { routineId: routine.id, stepOrder: step.order },\n };\n\n await kv.set(KV.actions, action.id, action);\n stepOrderToActionId.set(step.order, action.id);\n actionIds.push(action.id);\n stepStatus[step.order] = \"pending\";\n }\n\n for (const step of routine.steps) {\n const actionId = stepOrderToActionId.get(step.order);\n if (!actionId) continue;\n\n for (const depOrder of step.dependsOn) {\n const depActionId = stepOrderToActionId.get(depOrder);\n if (!depActionId) continue;\n const edge = {\n id: generateId(\"ae\"),\n type: \"requires\" as const,\n sourceActionId: actionId,\n targetActionId: depActionId,\n createdAt: now,\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n\n const run: RoutineRun = {\n id: generateId(\"run\"),\n routineId: routine.id,\n status: \"running\",\n startedAt: now,\n actionIds,\n stepStatus,\n initiatedBy: data.initiatedBy || \"unknown\",\n };\n\n await kv.set(KV.routineRuns, run.id, run);\n\n return {\n success: true,\n run,\n actionsCreated: actionIds.length,\n };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-status\" },\n async (data: { runId: string }) => {\n if (!data.runId) {\n return { success: false, error: \"runId is required\" };\n }\n\n const run = await kv.get<RoutineRun>(KV.routineRuns, data.runId);\n if (!run) {\n return { success: false, error: \"run not found\" };\n }\n\n const actionStates: Array<{\n actionId: string;\n status: string;\n title: string;\n }> = [];\n let allDone = true;\n let anyFailed = false;\n\n let statusChanged = false;\n for (const actionId of run.actionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action) {\n actionStates.push({\n actionId: action.id,\n status: action.status,\n title: action.title,\n });\n if (action.status !== \"done\") allDone = false;\n if (action.status === \"cancelled\") anyFailed = true;\n\n const stepOrder = (action.metadata as { stepOrder?: number })?.stepOrder;\n if (stepOrder !== undefined && stepOrder in run.stepStatus) {\n let mapped: \"pending\" | \"active\" | \"done\" | \"failed\";\n if (action.status === \"cancelled\") {\n mapped = \"failed\";\n } else if (action.status === \"blocked\") {\n mapped = \"pending\";\n } else {\n mapped = action.status as \"pending\" | \"active\" | \"done\";\n }\n if (run.stepStatus[stepOrder] !== mapped) {\n run.stepStatus[stepOrder] = mapped;\n statusChanged = true;\n }\n }\n } else {\n actionStates.push({\n actionId,\n status: \"cancelled\",\n title: \"(missing)\",\n });\n allDone = false;\n anyFailed = true;\n }\n }\n\n if (allDone && run.status === \"running\") {\n run.status = \"completed\";\n run.completedAt = new Date().toISOString();\n statusChanged = true;\n } else if (anyFailed && run.status === \"running\") {\n run.status = \"failed\";\n statusChanged = true;\n }\n\n if (statusChanged) {\n await kv.set(KV.routineRuns, run.id, run);\n }\n\n return {\n success: true,\n run,\n actions: actionStates,\n progress: {\n total: run.actionIds.length,\n done: actionStates.filter((a) => a.status === \"done\").length,\n active: actionStates.filter((a) => a.status === \"active\").length,\n pending: actionStates.filter((a) => a.status === \"pending\").length,\n blocked: actionStates.filter((a) => a.status === \"blocked\").length,\n cancelled: actionStates.filter((a) => a.status === \"cancelled\").length,\n },\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::routine-freeze\" },\n async (data: { routineId: string }) => {\n if (!data.routineId) {\n return { success: false, error: \"routineId is required\" };\n }\n return withKeyedLock(`mem:routine:${data.routineId}`, async () => {\n const routine = await kv.get<Routine>(KV.routines, data.routineId);\n if (!routine) {\n return { success: false, error: \"routine not found\" };\n }\n routine.frozen = true;\n routine.updatedAt = new Date().toISOString();\n await kv.set(KV.routines, routine.id, routine);\n return { success: true, routine };\n });\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Signal } from \"../types.js\";\n\nexport function registerSignalsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::signal-send\" },\n async (data: {\n from: string;\n to?: string;\n content: string;\n type?: Signal[\"type\"];\n threadId?: string;\n replyTo?: string;\n metadata?: Record<string, unknown>;\n expiresInMs?: number;\n }) => {\n if (!data.from?.trim() || !data.content?.trim()) {\n return { success: false, error: \"from and non-empty content are required\" };\n }\n\n const now = new Date();\n let threadId = data.threadId;\n\n if (data.replyTo && !threadId) {\n const parent = await kv.get<Signal>(KV.signals, data.replyTo);\n if (parent) {\n threadId = parent.threadId || parent.id;\n }\n }\n\n const signal: Signal = {\n id: generateId(\"sig\"),\n from: data.from,\n to: data.to,\n content: data.content.trim(),\n type: data.type || \"info\",\n threadId: threadId || generateId(\"thr\"),\n replyTo: data.replyTo,\n metadata: data.metadata,\n createdAt: now.toISOString(),\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n await kv.set(KV.signals, signal.id, signal);\n\n return { success: true, signal };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-read\" },\n async (data: {\n agentId: string;\n unreadOnly?: boolean;\n threadId?: string;\n type?: string;\n limit?: number;\n }) => {\n if (!data.agentId) {\n return { success: false, error: \"agentId is required\" };\n }\n\n let signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n\n signals = signals.filter((s) => {\n if (s.expiresAt && new Date(s.expiresAt).getTime() <= now) return false;\n if (s.to && s.to !== data.agentId && s.from !== data.agentId)\n return false;\n if (!s.to && s.from !== data.agentId) return true;\n return true;\n });\n\n if (data.unreadOnly) {\n signals = signals.filter((s) => !s.readAt && s.to === data.agentId);\n }\n if (data.threadId) {\n signals = signals.filter((s) => s.threadId === data.threadId);\n }\n if (data.type) {\n signals = signals.filter((s) => s.type === data.type);\n }\n\n signals.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n const limit = data.limit || 50;\n const results = signals.slice(0, limit);\n\n for (const sig of results) {\n if (!sig.readAt && sig.to === data.agentId) {\n sig.readAt = new Date().toISOString();\n await kv.set(KV.signals, sig.id, sig);\n }\n }\n\n return { success: true, signals: results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-threads\" },\n async (data: { agentId: string; limit?: number }) => {\n if (!data.agentId) {\n return { success: false, error: \"agentId is required\" };\n }\n\n const signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n\n const relevant = signals.filter((s) => {\n if (s.expiresAt && new Date(s.expiresAt).getTime() <= now) return false;\n return (\n s.from === data.agentId ||\n s.to === data.agentId ||\n !s.to\n );\n });\n\n const threadMap = new Map<\n string,\n { threadId: string; messages: number; lastMessage: string; participants: Set<string> }\n >();\n\n for (const sig of relevant) {\n const tid = sig.threadId || sig.id;\n const existing = threadMap.get(tid);\n if (existing) {\n existing.messages++;\n existing.participants.add(sig.from);\n if (sig.to) existing.participants.add(sig.to);\n if (new Date(sig.createdAt) > new Date(existing.lastMessage)) {\n existing.lastMessage = sig.createdAt;\n }\n } else {\n const participants = new Set<string>([sig.from]);\n if (sig.to) participants.add(sig.to);\n threadMap.set(tid, {\n threadId: tid,\n messages: 1,\n lastMessage: sig.createdAt,\n participants,\n });\n }\n }\n\n const threads = Array.from(threadMap.values())\n .map((t) => ({\n ...t,\n participants: Array.from(t.participants),\n }))\n .sort(\n (a, b) =>\n new Date(b.lastMessage).getTime() -\n new Date(a.lastMessage).getTime(),\n )\n .slice(0, data.limit || 20);\n\n return { success: true, threads };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::signal-cleanup\" },\n async () => {\n const signals = await kv.list<Signal>(KV.signals);\n const now = Date.now();\n let removed = 0;\n\n for (const sig of signals) {\n if (sig.expiresAt && new Date(sig.expiresAt).getTime() <= now) {\n await kv.delete(KV.signals, sig.id);\n removed++;\n }\n }\n\n return { success: true, removed };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Checkpoint } from \"../types.js\";\n\nexport function registerCheckpointsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::checkpoint-create\" },\n async (data: {\n name: string;\n description?: string;\n type?: Checkpoint[\"type\"];\n linkedActionIds?: string[];\n expiresInMs?: number;\n }) => {\n if (!data.name) {\n return { success: false, error: \"name is required\" };\n }\n\n const validTypes: Checkpoint[\"type\"][] = [\"ci\", \"approval\", \"deploy\", \"external\", \"timer\"];\n if (data.type && !validTypes.includes(data.type)) {\n return { success: false, error: `invalid checkpoint type: ${data.type}. Must be one of: ${validTypes.join(\", \")}` };\n }\n\n const now = new Date();\n const checkpoint: Checkpoint = {\n id: generateId(\"ckpt\"),\n name: data.name.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n type: data.type || \"external\",\n createdAt: now.toISOString(),\n linkedActionIds: data.linkedActionIds || [],\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (!action) {\n return { success: false, error: `linked action not found: ${actionId}` };\n }\n }\n }\n\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"gated_by\",\n sourceActionId: actionId,\n targetActionId: checkpoint.id,\n createdAt: now.toISOString(),\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"pending\") {\n action.status = \"blocked\";\n action.updatedAt = now.toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n }\n }\n\n return { success: true, checkpoint };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-resolve\" },\n async (data: {\n checkpointId: string;\n status: \"passed\" | \"failed\";\n resolvedBy?: string;\n result?: unknown;\n }) => {\n if (!data.checkpointId || !data.status) {\n return {\n success: false,\n error: \"checkpointId and status are required\",\n };\n }\n\n return withKeyedLock(\n `mem:checkpoint:${data.checkpointId}`,\n async () => {\n const checkpoint = await kv.get<Checkpoint>(\n KV.checkpoints,\n data.checkpointId,\n );\n if (!checkpoint) {\n return { success: false, error: \"checkpoint not found\" };\n }\n if (checkpoint.status !== \"pending\") {\n return {\n success: false,\n error: `checkpoint already ${checkpoint.status}`,\n };\n }\n\n checkpoint.status = data.status;\n checkpoint.resolvedAt = new Date().toISOString();\n checkpoint.resolvedBy = data.resolvedBy;\n checkpoint.result = data.result;\n\n await kv.set(KV.checkpoints, checkpoint.id, checkpoint);\n\n let unblockedCount = 0;\n if (data.status === \"passed\" && checkpoint.linkedActionIds.length > 0) {\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const allCheckpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const cpMap = new Map(allCheckpoints.map((c) => [c.id, c]));\n\n for (const actionId of checkpoint.linkedActionIds) {\n await withKeyedLock(`mem:action:${actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"blocked\") {\n const gates = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"gated_by\",\n );\n const allGatesPassed = gates.every((g) => {\n const cp = cpMap.get(g.targetActionId);\n return cp && cp.status === \"passed\";\n });\n const requires = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"requires\",\n );\n const allActions = await kv.list<Action>(KV.actions);\n const actionMap = new Map(allActions.map((a) => [a.id, a]));\n const allRequiresMet = requires.every((r) => {\n const dep = actionMap.get(r.targetActionId);\n return dep && dep.status === \"done\";\n });\n if (allGatesPassed && allRequiresMet) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n unblockedCount++;\n }\n }\n });\n }\n }\n\n return { success: true, checkpoint, unblockedCount };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-list\" },\n async (data: { status?: string; type?: string }) => {\n let checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n\n if (data.status) {\n checkpoints = checkpoints.filter((c) => c.status === data.status);\n }\n if (data.type) {\n checkpoints = checkpoints.filter((c) => c.type === data.type);\n }\n\n checkpoints.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, checkpoints };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::checkpoint-expire\" },\n async () => {\n const checkpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const now = Date.now();\n let expired = 0;\n\n for (const cp of checkpoints) {\n if (\n cp.status === \"pending\" &&\n cp.expiresAt &&\n new Date(cp.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:checkpoint:${cp.id}`,\n async () => {\n const fresh = await kv.get<Checkpoint>(KV.checkpoints, cp.id);\n if (!fresh || fresh.status !== \"pending\") return false;\n fresh.status = \"expired\";\n fresh.resolvedAt = new Date().toISOString();\n await kv.set(KV.checkpoints, fresh.id, fresh);\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Action, ActionEdge, RoutineRun, MemoryProvider } from \"../types.js\";\n\nconst FLOW_COMPRESS_SYSTEM = `You are a workflow summarizer. Given a completed action chain, produce a concise summary capturing:\n1. The overall goal and outcome\n2. Key steps taken and their results\n3. Any notable decisions or discoveries\n4. Lessons learned\n\nOutput as XML:\n<summary>\n<goal>What was the workflow trying to achieve</goal>\n<outcome>What happened</outcome>\n<steps>Numbered list of key steps</steps>\n<discoveries>Any new insights or discoveries</discoveries>\n<lesson>What to remember for next time</lesson>\n</summary>`;\n\nexport function registerFlowCompressFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::flow-compress\" },\n async (data: { runId?: string; actionIds?: string[]; project?: string }) => {\n let actionsToCompress: Action[] = [];\n\n if (data.runId) {\n const run = await kv.get<RoutineRun>(KV.routineRuns, data.runId);\n if (!run) {\n return { success: false, error: \"run not found\" };\n }\n for (const id of run.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (action) actionsToCompress.push(action);\n }\n } else if (data.actionIds && data.actionIds.length > 0) {\n for (const id of data.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (action) actionsToCompress.push(action);\n }\n } else if (data.project) {\n const allActions = await kv.list<Action>(KV.actions);\n actionsToCompress = allActions.filter(\n (a) => a.project === data.project && a.status === \"done\",\n );\n } else {\n return {\n success: false,\n error: \"runId, actionIds, or project is required\",\n };\n }\n\n const doneActions = actionsToCompress.filter(\n (a) => a.status === \"done\",\n );\n if (doneActions.length === 0) {\n return {\n success: true,\n message: \"No completed actions to compress\",\n compressed: 0,\n };\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const relevantIds = new Set(doneActions.map((a) => a.id));\n const relevantEdges = allEdges.filter(\n (e) =>\n relevantIds.has(e.sourceActionId) ||\n relevantIds.has(e.targetActionId),\n );\n\n const prompt = buildFlowPrompt(doneActions, relevantEdges);\n\n try {\n const response = await provider.summarize(\n FLOW_COMPRESS_SYSTEM,\n prompt,\n );\n const summary = parseFlowSummary(response);\n\n const memory = {\n id: generateId(\"mem\"),\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n type: \"workflow\" as const,\n title: summary.goal || `Workflow: ${doneActions.length} actions`,\n content: formatSummary(summary),\n concepts: extractConcepts(doneActions),\n files: extractFiles(doneActions),\n sessionIds: [],\n strength: 1.0,\n version: 1,\n isLatest: true,\n metadata: {\n flowCompressed: true,\n actionCount: doneActions.length,\n actionIds: doneActions.map((a) => a.id),\n },\n };\n\n await kv.set(KV.memories, memory.id, memory);\n\n return {\n success: true,\n compressed: doneActions.length,\n memoryId: memory.id,\n summary,\n };\n } catch (err) {\n return {\n success: false,\n error: `compression failed: ${String(err)}`,\n compressed: 0,\n };\n }\n },\n );\n}\n\nfunction buildFlowPrompt(\n actions: Action[],\n edges: ActionEdge[],\n): string {\n const lines: string[] = [\"## Completed Action Chain\\n\"];\n\n const sorted = [...actions].sort(\n (a, b) =>\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n\n for (const action of sorted) {\n lines.push(`### ${action.title}`);\n if (action.description) lines.push(action.description);\n if (action.result) lines.push(`Result: ${action.result}`);\n lines.push(`Priority: ${action.priority}, Tags: ${(action.tags ?? []).join(\", \")}`);\n lines.push(\"\");\n }\n\n if (edges.length > 0) {\n lines.push(\"## Dependencies\");\n for (const edge of edges) {\n lines.push(`- ${edge.sourceActionId} --${edge.type}--> ${edge.targetActionId}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction parseFlowSummary(response: string): {\n goal: string;\n outcome: string;\n steps: string;\n discoveries: string;\n lesson: string;\n} {\n const extract = (tag: string): string => {\n const match = response.match(\n new RegExp(`<${tag}>([\\\\s\\\\S]*?)</${tag}>`),\n );\n return match ? match[1].trim() : \"\";\n };\n return {\n goal: extract(\"goal\"),\n outcome: extract(\"outcome\"),\n steps: extract(\"steps\"),\n discoveries: extract(\"discoveries\"),\n lesson: extract(\"lesson\"),\n };\n}\n\nfunction formatSummary(s: {\n goal: string;\n outcome: string;\n steps: string;\n discoveries: string;\n lesson: string;\n}): string {\n const parts: string[] = [];\n if (s.goal) parts.push(`Goal: ${s.goal}`);\n if (s.outcome) parts.push(`Outcome: ${s.outcome}`);\n if (s.steps) parts.push(`Steps: ${s.steps}`);\n if (s.discoveries) parts.push(`Discoveries: ${s.discoveries}`);\n if (s.lesson) parts.push(`Lesson: ${s.lesson}`);\n return parts.join(\"\\n\\n\");\n}\n\nfunction extractConcepts(actions: Action[]): string[] {\n const concepts = new Set<string>();\n for (const a of actions) {\n for (const tag of a.tags ?? []) {\n if (!tag.startsWith(\"routine:\")) concepts.add(tag);\n }\n }\n return Array.from(concepts);\n}\n\nfunction extractFiles(actions: Action[]): string[] {\n const files = new Set<string>();\n for (const a of actions) {\n if (a.metadata && typeof a.metadata === \"object\") {\n const meta = a.metadata as Record<string, unknown>;\n if (Array.isArray(meta.files)) {\n for (const f of meta.files) {\n if (typeof f === \"string\") files.add(f);\n }\n }\n }\n }\n return Array.from(files);\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type {\n MeshPeer,\n Memory,\n Action,\n SemanticMemory,\n ProceduralMemory,\n MemoryRelation,\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\n\nfunction isPrivateIP(ip: string): boolean {\n if (ip === \"127.0.0.1\" || ip === \"::1\" || ip === \"0.0.0.0\") return true;\n if (ip.startsWith(\"10.\") || ip.startsWith(\"192.168.\")) return true;\n if (/^172\\.(1[6-9]|2\\d|3[01])\\./.test(ip)) return true;\n if (ip === \"169.254.169.254\") return true;\n if (ip.startsWith(\"fe80:\") || ip.startsWith(\"fc00:\") || ip.startsWith(\"fd\")) return true;\n if (ip.startsWith(\"::ffff:\")) {\n const v4 = ip.slice(7);\n return isPrivateIP(v4);\n }\n return false;\n}\n\nasync function isAllowedUrl(urlStr: string): Promise<boolean> {\n try {\n const parsed = new URL(urlStr);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") return false;\n if (parsed.username || parsed.password) return false;\n const host = parsed.hostname.toLowerCase();\n\n if (host === \"localhost\") return false;\n if (isIP(host) && isPrivateIP(host)) return false;\n\n if (!isIP(host)) {\n try {\n const resolved = await lookup(host, { all: true });\n if (resolved.some((r) => isPrivateIP(r.address))) return false;\n } catch {\n // DNS resolution failed — allow the URL (the actual fetch will fail if unreachable)\n }\n }\n\n return true;\n } catch {\n return false;\n }\n}\n\nconst DEFAULT_SHARED_SCOPES = [\n \"memories\",\n \"actions\",\n \"semantic\",\n \"procedural\",\n \"relations\",\n \"graph:nodes\",\n \"graph:edges\",\n];\n\ninterface MeshSyncPayload {\n memories?: Memory[];\n actions?: Action[];\n semantic?: SemanticMemory[];\n procedural?: ProceduralMemory[];\n relations?: MemoryRelation[];\n graphNodes?: GraphNode[];\n graphEdges?: GraphEdge[];\n}\n\nasync function lwwMergeList<T extends { id: string }>(\n kv: StateKV,\n scope: string,\n items: T[] | undefined,\n lockPrefix: string,\n tsField: \"updatedAt\" | \"createdAt\",\n): Promise<number> {\n if (!items || !Array.isArray(items)) return 0;\n let count = 0;\n for (const item of items) {\n if (!item.id || typeof item.id !== \"string\") continue;\n const ts = (item as Record<string, unknown>)[tsField];\n if (typeof ts !== \"string\" || Number.isNaN(new Date(ts).getTime())) continue;\n const wrote = await withKeyedLock(`${lockPrefix}:${item.id}`, async () => {\n const existing = await kv.get<T>(scope, item.id);\n if (!existing) {\n await kv.set(scope, item.id, item);\n return true;\n }\n const existingTs = (existing as Record<string, unknown>)[tsField] as string;\n if (new Date(ts) > new Date(existingTs)) {\n await kv.set(scope, item.id, item);\n return true;\n }\n return false;\n });\n if (wrote) count++;\n }\n return count;\n}\n\nfunction graphNodeTs(node: GraphNode): string {\n return node.updatedAt || node.createdAt;\n}\n\nasync function lwwMergeGraphNodes(\n kv: StateKV,\n items: GraphNode[] | undefined,\n): Promise<number> {\n if (!items || !Array.isArray(items)) return 0;\n let count = 0;\n for (const item of items) {\n if (!item.id || typeof item.id !== \"string\") continue;\n const ts = graphNodeTs(item);\n if (!ts || Number.isNaN(new Date(ts).getTime())) continue;\n const wrote = await withKeyedLock(`mem:gnode:${item.id}`, async () => {\n const existing = await kv.get<GraphNode>(KV.graphNodes, item.id);\n if (!existing) {\n await kv.set(KV.graphNodes, item.id, item);\n return true;\n }\n if (new Date(ts) > new Date(graphNodeTs(existing))) {\n await kv.set(KV.graphNodes, item.id, item);\n return true;\n }\n return false;\n });\n if (wrote) count++;\n }\n return count;\n}\n\nexport function registerMeshFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::mesh-register\" },\n async (data: {\n url: string;\n name: string;\n sharedScopes?: string[];\n syncFilter?: { project?: string };\n }) => {\n if (!data.url || !data.name) {\n return { success: false, error: \"url and name are required\" };\n }\n\n if (!(await isAllowedUrl(data.url))) {\n return { success: false, error: \"URL blocked: private/local address not allowed\" };\n }\n\n const existing = await kv.list<MeshPeer>(KV.mesh);\n const duplicate = existing.find((p) => p.url === data.url);\n if (duplicate) {\n return { success: false, error: \"peer already registered\", peerId: duplicate.id };\n }\n\n const peer: MeshPeer = {\n id: generateId(\"peer\"),\n url: data.url,\n name: data.name,\n status: \"disconnected\",\n sharedScopes: data.sharedScopes || DEFAULT_SHARED_SCOPES,\n syncFilter: data.syncFilter,\n };\n\n await kv.set(KV.mesh, peer.id, peer);\n return { success: true, peer };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-list\" },\n async () => {\n const peers = await kv.list<MeshPeer>(KV.mesh);\n return { success: true, peers };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-sync\" },\n async (data: { peerId?: string; scopes?: string[]; direction?: \"push\" | \"pull\" | \"both\" }) => {\n const direction = data.direction || \"both\";\n let peers: MeshPeer[];\n\n if (data.peerId) {\n const peer = await kv.get<MeshPeer>(KV.mesh, data.peerId);\n if (!peer) return { success: false, error: \"peer not found\" };\n peers = [peer];\n } else {\n peers = await kv.list<MeshPeer>(KV.mesh);\n }\n\n const results: Array<{\n peerId: string;\n peerName: string;\n pushed: number;\n pulled: number;\n errors: string[];\n }> = [];\n\n for (const peer of peers) {\n const result = {\n peerId: peer.id,\n peerName: peer.name,\n pushed: 0,\n pulled: 0,\n errors: [] as string[],\n };\n\n peer.status = \"syncing\";\n await kv.set(KV.mesh, peer.id, peer);\n\n const scopes = data.scopes || peer.sharedScopes;\n\n try {\n if (!(await isAllowedUrl(peer.url))) {\n result.errors.push(\"peer URL blocked: private/local address not allowed\");\n peer.status = \"error\";\n await kv.set(KV.mesh, peer.id, peer);\n results.push(result);\n continue;\n }\n\n if (direction === \"push\" || direction === \"both\") {\n const pushData = await collectSyncData(kv, scopes, peer.lastSyncAt, peer.syncFilter);\n try {\n const response = await fetch(`${peer.url}/agentmemory/mesh/receive`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(pushData),\n signal: AbortSignal.timeout(30000),\n redirect: \"error\",\n });\n if (response.ok) {\n const body = (await response.json()) as { accepted: number };\n result.pushed = body.accepted || 0;\n } else {\n result.errors.push(`push failed: HTTP ${response.status}`);\n }\n } catch (err) {\n result.errors.push(`push failed: ${String(err)}`);\n }\n }\n\n if (direction === \"pull\" || direction === \"both\") {\n try {\n const response = await fetch(\n `${peer.url}/agentmemory/mesh/export?since=${peer.lastSyncAt || \"\"}`,\n { signal: AbortSignal.timeout(30000), redirect: \"error\" },\n );\n if (response.ok) {\n const pullData = (await response.json()) as {\n memories?: Memory[];\n actions?: Action[];\n };\n result.pulled = await applySyncData(kv, pullData, scopes);\n } else {\n result.errors.push(`pull failed: HTTP ${response.status}`);\n }\n } catch (err) {\n result.errors.push(`pull failed: ${String(err)}`);\n }\n }\n\n peer.status = result.errors.length > 0 ? \"error\" : \"connected\";\n if (result.errors.length === 0) {\n peer.lastSyncAt = new Date().toISOString();\n }\n } catch (err) {\n peer.status = \"disconnected\";\n result.errors.push(String(err));\n }\n\n await kv.set(KV.mesh, peer.id, peer);\n results.push(result);\n }\n\n return { success: true, results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-receive\" },\n async (data: MeshSyncPayload) => {\n let accepted = 0;\n\n accepted += await lwwMergeList(kv, KV.memories, data.memories, \"mem:memory\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.actions, data.actions, \"mem:action\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.semantic, data.semantic, \"mem:semantic\", \"updatedAt\");\n accepted += await lwwMergeList(kv, KV.procedural, data.procedural, \"mem:procedural\", \"updatedAt\");\n if (data.relations && Array.isArray(data.relations)) {\n for (const rel of data.relations) {\n if (!rel.sourceId || !rel.targetId || !rel.type) continue;\n const relKey = `${rel.sourceId}:${rel.targetId}:${rel.type}`;\n await withKeyedLock(`mem:relation:${relKey}`, async () => {\n const existing = await kv.get<MemoryRelation>(KV.relations, relKey);\n if (!existing) {\n await kv.set(KV.relations, relKey, rel);\n accepted++;\n }\n });\n }\n }\n accepted += await lwwMergeGraphNodes(kv, data.graphNodes);\n accepted += await lwwMergeList(kv, KV.graphEdges, data.graphEdges, \"mem:gedge\", \"createdAt\");\n\n return { success: true, accepted };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::mesh-remove\" },\n async (data: { peerId: string }) => {\n if (!data.peerId) {\n return { success: false, error: \"peerId is required\" };\n }\n await kv.delete(KV.mesh, data.peerId);\n return { success: true };\n },\n );\n}\n\nfunction deltaFilter<T>(\n items: T[],\n sinceTime: number,\n tsField: \"updatedAt\" | \"createdAt\",\n): T[] {\n return items.filter(\n (item) => new Date((item as Record<string, unknown>)[tsField] as string).getTime() > sinceTime,\n );\n}\n\nasync function collectSyncData(\n kv: StateKV,\n scopes: string[],\n since?: string,\n syncFilter?: { project?: string },\n): Promise<MeshSyncPayload> {\n const result: MeshSyncPayload = {};\n const parsed = since ? new Date(since).getTime() : 0;\n const sinceTime = Number.isNaN(parsed) ? 0 : parsed;\n\n if (scopes.includes(\"memories\")) {\n const all = await kv.list<Memory>(KV.memories);\n result.memories = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"actions\")) {\n let all = await kv.list<Action>(KV.actions);\n if (syncFilter?.project) {\n all = all.filter((a) => a.project === syncFilter.project);\n }\n result.actions = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n const projectScoped = !!syncFilter?.project;\n\n if (scopes.includes(\"semantic\") && !projectScoped) {\n const all = await kv.list<SemanticMemory>(KV.semantic);\n result.semantic = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"procedural\") && !projectScoped) {\n const all = await kv.list<ProceduralMemory>(KV.procedural);\n result.procedural = deltaFilter(all, sinceTime, \"updatedAt\");\n }\n\n if (scopes.includes(\"relations\") && !projectScoped) {\n const all = await kv.list<MemoryRelation>(KV.relations);\n result.relations = deltaFilter(all, sinceTime, \"createdAt\");\n }\n\n if (scopes.includes(\"graph:nodes\") && !projectScoped) {\n const all = await kv.list<GraphNode>(KV.graphNodes);\n result.graphNodes = all.filter(\n (n) => new Date(graphNodeTs(n)).getTime() > sinceTime,\n );\n }\n\n if (scopes.includes(\"graph:edges\") && !projectScoped) {\n const all = await kv.list<GraphEdge>(KV.graphEdges);\n result.graphEdges = deltaFilter(all, sinceTime, \"createdAt\");\n }\n\n return result;\n}\n\nasync function applySyncData(\n kv: StateKV,\n data: MeshSyncPayload,\n scopes: string[],\n): Promise<number> {\n let applied = 0;\n\n if (scopes.includes(\"memories\")) {\n applied += await lwwMergeList(kv, KV.memories, data.memories, \"mem:memory\", \"updatedAt\");\n }\n if (scopes.includes(\"actions\")) {\n applied += await lwwMergeList(kv, KV.actions, data.actions, \"mem:action\", \"updatedAt\");\n }\n if (scopes.includes(\"semantic\")) {\n applied += await lwwMergeList(kv, KV.semantic, data.semantic, \"mem:semantic\", \"updatedAt\");\n }\n if (scopes.includes(\"procedural\")) {\n applied += await lwwMergeList(kv, KV.procedural, data.procedural, \"mem:procedural\", \"updatedAt\");\n }\n if (scopes.includes(\"relations\") && data.relations) {\n for (const rel of data.relations) {\n if (!rel.sourceId || !rel.targetId || !rel.type) continue;\n const relKey = `${rel.sourceId}:${rel.targetId}:${rel.type}`;\n const wrote = await withKeyedLock(`mem:relation:${relKey}`, async () => {\n const existing = await kv.get<MemoryRelation>(KV.relations, relKey);\n if (!existing) {\n await kv.set(KV.relations, relKey, rel);\n return true;\n }\n return false;\n });\n if (wrote) applied++;\n }\n }\n if (scopes.includes(\"graph:nodes\")) {\n applied += await lwwMergeGraphNodes(kv, data.graphNodes);\n }\n if (scopes.includes(\"graph:edges\")) {\n applied += await lwwMergeList(kv, KV.graphEdges, data.graphEdges, \"mem:gedge\", \"createdAt\");\n }\n\n return applied;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Session } from \"../types.js\";\nimport { execFile } from \"node:child_process\";\nimport { resolve } from \"node:path\";\n\nfunction execAsync(\n cmd: string,\n args: string[],\n cwd: string,\n): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { cwd, timeout: 5000 }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout.trim());\n });\n });\n}\n\nexport function registerBranchAwareFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::detect-worktree\" },\n async (data: { cwd: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n try {\n const gitDir = await execAsync(\n \"git\",\n [\"rev-parse\", \"--git-dir\"],\n data.cwd,\n );\n const commonDir = await execAsync(\n \"git\",\n [\"rev-parse\", \"--git-common-dir\"],\n data.cwd,\n );\n const branch = await execAsync(\n \"git\",\n [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"],\n data.cwd,\n ).catch(() => \"detached\");\n\n const topLevel = await execAsync(\n \"git\",\n [\"rev-parse\", \"--show-toplevel\"],\n data.cwd,\n );\n\n const isWorktree = resolve(data.cwd, gitDir) !== resolve(data.cwd, commonDir);\n const mainRepoRoot = isWorktree\n ? resolve(data.cwd, commonDir, \"..\")\n : topLevel;\n\n return {\n success: true,\n isWorktree,\n branch,\n topLevel,\n mainRepoRoot,\n gitDir: resolve(data.cwd, gitDir),\n commonDir: resolve(data.cwd, commonDir),\n };\n } catch {\n return {\n success: true,\n isWorktree: false,\n branch: null,\n topLevel: data.cwd,\n mainRepoRoot: data.cwd,\n gitDir: null,\n commonDir: null,\n };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::list-worktrees\" },\n async (data: { cwd: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n try {\n const output = await execAsync(\n \"git\",\n [\"worktree\", \"list\", \"--porcelain\"],\n data.cwd,\n );\n\n const worktrees: Array<{\n path: string;\n head: string;\n branch: string;\n bare: boolean;\n }> = [];\n\n const blocks = output.split(\"\\n\\n\").filter(Boolean);\n for (const block of blocks) {\n const lines = block.split(\"\\n\");\n const wt: { path: string; head: string; branch: string; bare: boolean } = {\n path: \"\",\n head: \"\",\n branch: \"\",\n bare: false,\n };\n for (const line of lines) {\n if (line.startsWith(\"worktree \")) wt.path = line.slice(9);\n else if (line.startsWith(\"HEAD \")) wt.head = line.slice(5);\n else if (line.startsWith(\"branch \"))\n wt.branch = line.slice(7).replace(\"refs/heads/\", \"\");\n else if (line === \"bare\") wt.bare = true;\n }\n if (wt.path) worktrees.push(wt);\n }\n\n return { success: true, worktrees };\n } catch {\n return { success: true, worktrees: [] };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::branch-sessions\" },\n async (data: { cwd: string; branch?: string }) => {\n if (!data.cwd) {\n return { success: false, error: \"cwd is required\" };\n }\n\n const worktreeInfo = await sdk.trigger<\n { cwd: string },\n {\n success: boolean;\n isWorktree: boolean;\n mainRepoRoot: string;\n branch: string | null;\n }\n >(\"mem::detect-worktree\", { cwd: data.cwd });\n\n const projectRoot = worktreeInfo.mainRepoRoot || data.cwd;\n const branch = data.branch || worktreeInfo.branch;\n\n const sessions = await kv.list<Session>(KV.sessions);\n\n const matching = sessions.filter((s) => {\n if (s.project === projectRoot || s.cwd === projectRoot) return true;\n if (s.cwd.startsWith(projectRoot + \"/\")) return true;\n return false;\n });\n\n matching.sort(\n (a, b) =>\n new Date(b.startedAt).getTime() - new Date(a.startedAt).getTime(),\n );\n\n return {\n success: true,\n sessions: matching,\n projectRoot,\n branch,\n isWorktree: worktreeInfo.isWorktree,\n };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Checkpoint, CompressedObservation, FunctionMetrics, Sentinel, Session } from \"../types.js\";\n\nconst VALID_TYPES: Sentinel[\"type\"][] = [\n \"webhook\",\n \"timer\",\n \"threshold\",\n \"pattern\",\n \"approval\",\n \"custom\",\n];\n\nexport function registerSentinelsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::sentinel-create\" },\n async (data: {\n name: string;\n type: Sentinel[\"type\"];\n config?: Record<string, unknown>;\n linkedActionIds?: string[];\n expiresInMs?: number;\n }) => {\n if (!data.name || typeof data.name !== \"string\") {\n return { success: false, error: \"name is required\" };\n }\n if (!data.type || !VALID_TYPES.includes(data.type)) {\n return {\n success: false,\n error: `type must be one of: ${VALID_TYPES.join(\", \")}`,\n };\n }\n\n if (data.type === \"threshold\") {\n const cfg = data.config as\n | { metric?: string; operator?: string; value?: number }\n | undefined;\n if (\n !cfg ||\n !cfg.metric ||\n ![\"gt\", \"lt\", \"eq\"].includes(cfg.operator || \"\") ||\n typeof cfg.value !== \"number\"\n ) {\n return {\n success: false,\n error:\n \"threshold config requires metric, operator (gt|lt|eq), and numeric value\",\n };\n }\n }\n\n if (data.type === \"pattern\") {\n const cfg = data.config as { pattern?: string } | undefined;\n if (!cfg || !cfg.pattern || typeof cfg.pattern !== \"string\") {\n return {\n success: false,\n error: \"pattern config requires a pattern string\",\n };\n }\n }\n\n if (data.type === \"webhook\") {\n const cfg = data.config as { path?: string } | undefined;\n if (!cfg || !cfg.path || typeof cfg.path !== \"string\") {\n return {\n success: false,\n error: \"webhook config requires a path string\",\n };\n }\n }\n\n if (data.type === \"timer\") {\n const cfg = data.config as { durationMs?: number } | undefined;\n if (!cfg || typeof cfg.durationMs !== \"number\" || cfg.durationMs <= 0) {\n return {\n success: false,\n error: \"timer config requires a positive durationMs\",\n };\n }\n }\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (!action) {\n return {\n success: false,\n error: `linked action not found: ${actionId}`,\n };\n }\n }\n }\n\n const now = new Date();\n const sentinel: Sentinel = {\n id: generateId(\"snl\"),\n name: data.name.trim(),\n type: data.type,\n status: \"watching\",\n config: data.config || {},\n createdAt: now.toISOString(),\n linkedActionIds: data.linkedActionIds || [],\n expiresAt: data.expiresInMs\n ? new Date(now.getTime() + data.expiresInMs).toISOString()\n : undefined,\n };\n\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n if (data.linkedActionIds && data.linkedActionIds.length > 0) {\n for (const actionId of data.linkedActionIds) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"gated_by\",\n sourceActionId: actionId,\n targetActionId: sentinel.id,\n createdAt: now.toISOString(),\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n }\n }\n\n if (data.type === \"timer\") {\n const durationMs = (data.config as { durationMs: number }).durationMs;\n setTimeout(async () => {\n await withKeyedLock(`mem:sentinel:${sentinel.id}`, async () => {\n const fresh = await kv.get<Sentinel>(KV.sentinels, sentinel.id);\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = { reason: \"timer_elapsed\", durationMs };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n });\n }, durationMs);\n }\n\n return { success: true, sentinel };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-trigger\" },\n async (data: { sentinelId: string; result?: unknown }) => {\n if (!data.sentinelId) {\n return { success: false, error: \"sentinelId is required\" };\n }\n\n return withKeyedLock(\n `mem:sentinel:${data.sentinelId}`,\n async () => {\n const sentinel = await kv.get<Sentinel>(\n KV.sentinels,\n data.sentinelId,\n );\n if (!sentinel) {\n return { success: false, error: \"sentinel not found\" };\n }\n if (sentinel.status !== \"watching\") {\n return {\n success: false,\n error: `sentinel already ${sentinel.status}`,\n };\n }\n\n sentinel.status = \"triggered\";\n sentinel.triggeredAt = new Date().toISOString();\n sentinel.result = data.result;\n\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n let unblockedCount = 0;\n if (sentinel.linkedActionIds.length > 0) {\n unblockedCount = await unblockLinkedActions(kv, sentinel);\n }\n\n return { success: true, sentinel, unblockedCount };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-check\" },\n async () => {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const active = sentinels.filter((s) => s.status === \"watching\");\n const triggered: string[] = [];\n\n for (const sentinel of active) {\n if (sentinel.type === \"threshold\") {\n const cfg = sentinel.config as {\n metric: string;\n operator: \"gt\" | \"lt\" | \"eq\";\n value: number;\n };\n const metrics = await kv.get<FunctionMetrics>(\n KV.metrics,\n cfg.metric,\n );\n if (!metrics) continue;\n\n const current = metrics.totalCalls;\n let matched = false;\n if (cfg.operator === \"gt\") matched = current > cfg.value;\n else if (cfg.operator === \"lt\") matched = current < cfg.value;\n else if (cfg.operator === \"eq\") matched = current === cfg.value;\n\n if (matched) {\n await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = {\n reason: \"threshold_crossed\",\n metric: cfg.metric,\n currentValue: current,\n threshold: cfg.value,\n operator: cfg.operator,\n };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n },\n );\n triggered.push(sentinel.id);\n }\n }\n\n if (sentinel.type === \"pattern\") {\n const cfg = sentinel.config as { pattern: string };\n const regex = new RegExp(cfg.pattern, \"i\");\n const sessions = await kv.list<Session>(KV.sessions);\n let matchedObs: CompressedObservation | null = null;\n\n for (const session of sessions) {\n const observations = await kv.list<CompressedObservation>(\n KV.observations(session.id),\n );\n const recent = observations\n .filter(\n (o) =>\n new Date(o.timestamp).getTime() >=\n new Date(sentinel.createdAt).getTime(),\n )\n .find((o) => regex.test(o.title));\n if (recent) {\n matchedObs = recent;\n break;\n }\n }\n\n if (matchedObs) {\n await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return;\n fresh.status = \"triggered\";\n fresh.triggeredAt = new Date().toISOString();\n fresh.result = {\n reason: \"pattern_matched\",\n pattern: cfg.pattern,\n matchedObservationId: matchedObs!.id,\n matchedTitle: matchedObs!.title,\n };\n await kv.set(KV.sentinels, fresh.id, fresh);\n await unblockLinkedActions(kv, fresh);\n },\n );\n triggered.push(sentinel.id);\n }\n }\n }\n\n return { success: true, triggered, checkedCount: active.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-cancel\" },\n async (data: { sentinelId: string }) => {\n if (!data.sentinelId) {\n return { success: false, error: \"sentinelId is required\" };\n }\n\n return withKeyedLock(\n `mem:sentinel:${data.sentinelId}`,\n async () => {\n const sentinel = await kv.get<Sentinel>(\n KV.sentinels,\n data.sentinelId,\n );\n if (!sentinel) {\n return { success: false, error: \"sentinel not found\" };\n }\n if (sentinel.status !== \"watching\") {\n return {\n success: false,\n error: `cannot cancel sentinel with status ${sentinel.status}`,\n };\n }\n\n sentinel.status = \"cancelled\";\n await kv.set(KV.sentinels, sentinel.id, sentinel);\n\n return { success: true, sentinel };\n },\n );\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-list\" },\n async (data: { status?: string; type?: string }) => {\n let sentinels = await kv.list<Sentinel>(KV.sentinels);\n\n if (data.status) {\n sentinels = sentinels.filter((s) => s.status === data.status);\n }\n if (data.type) {\n sentinels = sentinels.filter((s) => s.type === data.type);\n }\n\n sentinels.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, sentinels };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sentinel-expire\" },\n async () => {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const now = Date.now();\n let expired = 0;\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n const didExpire = await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return false;\n fresh.status = \"expired\";\n fresh.triggeredAt = new Date().toISOString();\n await kv.set(KV.sentinels, fresh.id, fresh);\n return true;\n },\n );\n if (didExpire) expired++;\n }\n }\n\n return { success: true, expired };\n },\n );\n}\n\nasync function unblockLinkedActions(\n kv: StateKV,\n sentinel: Sentinel,\n): Promise<number> {\n if (sentinel.linkedActionIds.length === 0) return 0;\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const allSentinels = await kv.list<Sentinel>(KV.sentinels);\n const allCheckpoints = await kv.list<Checkpoint>(KV.checkpoints);\n const gateMap = new Map<string, { status: string }>();\n for (const s of allSentinels) gateMap.set(s.id, { status: s.status === \"triggered\" ? \"passed\" : s.status });\n for (const c of allCheckpoints) gateMap.set(c.id, { status: c.status });\n\n let unblockedCount = 0;\n\n for (const actionId of sentinel.linkedActionIds) {\n await withKeyedLock(`mem:action:${actionId}`, async () => {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action && action.status === \"blocked\") {\n const gates = allEdges.filter(\n (e) => e.sourceActionId === actionId && e.type === \"gated_by\",\n );\n const allPassed = gates.every((g) => {\n const gate = gateMap.get(g.targetActionId);\n return gate && gate.status === \"passed\";\n });\n if (allPassed) {\n action.status = \"pending\";\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n unblockedCount++;\n }\n }\n });\n }\n\n return unblockedCount;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type { Action, ActionEdge, Sketch } from \"../types.js\";\n\nexport function registerSketchesFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::sketch-create\" },\n async (data: {\n title: string;\n description?: string;\n expiresInMs?: number;\n project?: string;\n }) => {\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n const now = new Date();\n const expiresInMs = data.expiresInMs || 3600000;\n const sketch: Sketch = {\n id: generateId(\"sk\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"active\",\n actionIds: [],\n project: data.project,\n createdAt: now.toISOString(),\n expiresAt: new Date(now.getTime() + expiresInMs).toISOString(),\n };\n\n await kv.set(KV.sketches, sketch.id, sketch);\n return { success: true, sketch };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-add\" },\n async (data: {\n sketchId: string;\n title: string;\n description?: string;\n priority?: number;\n dependsOn?: string[];\n }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n if (!data.title || typeof data.title !== \"string\") {\n return { success: false, error: \"title is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const now = new Date().toISOString();\n const action: Action = {\n id: generateId(\"act\"),\n title: data.title.trim(),\n description: (data.description || \"\").trim(),\n status: \"pending\",\n priority: Math.max(1, Math.min(10, data.priority || 5)),\n createdAt: now,\n updatedAt: now,\n createdBy: \"sketch\",\n project: sketch.project,\n tags: [],\n sourceObservationIds: [],\n sourceMemoryIds: [],\n sketchId: data.sketchId,\n };\n\n if (data.dependsOn && data.dependsOn.length > 0) {\n const sketchActionSet = new Set(sketch.actionIds);\n for (const depId of data.dependsOn) {\n if (!sketchActionSet.has(depId)) {\n return {\n success: false,\n error: `dependency ${depId} not found in this sketch`,\n };\n }\n }\n }\n\n await kv.set(KV.actions, action.id, action);\n\n const createdEdges: ActionEdge[] = [];\n if (data.dependsOn && data.dependsOn.length > 0) {\n for (const depId of data.dependsOn) {\n const edge: ActionEdge = {\n id: generateId(\"ae\"),\n type: \"requires\",\n sourceActionId: action.id,\n targetActionId: depId,\n createdAt: now,\n };\n await kv.set(KV.actionEdges, edge.id, edge);\n createdEdges.push(edge);\n }\n }\n\n sketch.actionIds.push(action.id);\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, action, edges: createdEdges };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-promote\" },\n async (data: { sketchId: string; project?: string }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const promotedIds: string[] = [];\n for (const actionId of sketch.actionIds) {\n const action = await kv.get<Action>(KV.actions, actionId);\n if (action) {\n delete action.sketchId;\n if (data.project) {\n action.project = data.project;\n }\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n promotedIds.push(action.id);\n }\n }\n\n sketch.status = \"promoted\";\n sketch.promotedAt = new Date().toISOString();\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, promotedIds };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-discard\" },\n async (data: { sketchId: string }) => {\n if (!data.sketchId) {\n return { success: false, error: \"sketchId is required\" };\n }\n\n return withKeyedLock(`mem:sketch:${data.sketchId}`, async () => {\n const sketch = await kv.get<Sketch>(KV.sketches, data.sketchId);\n if (!sketch) {\n return { success: false, error: \"sketch not found\" };\n }\n if (sketch.status !== \"active\") {\n return { success: false, error: \"sketch is not active\" };\n }\n\n const actionIdSet = new Set(sketch.actionIds);\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n\n for (const actionId of sketch.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n sketch.status = \"discarded\";\n sketch.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, sketch.id, sketch);\n\n return { success: true, discardedCount: sketch.actionIds.length };\n });\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-list\" },\n async (data: { status?: string; project?: string }) => {\n let sketches = await kv.list<Sketch>(KV.sketches);\n\n if (data.status) {\n sketches = sketches.filter((s) => s.status === data.status);\n }\n if (data.project) {\n sketches = sketches.filter((s) => s.project === data.project);\n }\n\n sketches.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n const results = sketches.map((s) => ({\n ...s,\n actionCount: s.actionIds.length,\n }));\n\n return { success: true, sketches: results };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::sketch-gc\" },\n async () => {\n const sketches = await kv.list<Sketch>(KV.sketches);\n const now = Date.now();\n let collected = 0;\n\n for (const sketch of sketches) {\n if (\n sketch.status !== \"active\" ||\n new Date(sketch.expiresAt).getTime() > now\n ) {\n continue;\n }\n\n await withKeyedLock(`mem:sketch:${sketch.id}`, async () => {\n const current = await kv.get<Sketch>(KV.sketches, sketch.id);\n if (\n !current ||\n current.status !== \"active\" ||\n new Date(current.expiresAt).getTime() > now\n ) {\n return;\n }\n\n const actionIdSet = new Set(current.actionIds);\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n\n for (const actionId of current.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n current.status = \"discarded\";\n current.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, current.id, current);\n collected++;\n });\n }\n\n return { success: true, collected };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Action, ActionEdge, Crystal, MemoryProvider } from \"../types.js\";\n\ninterface CrystalDigest {\n narrative: string;\n keyOutcomes: string[];\n filesAffected: string[];\n lessons: string[];\n}\n\nconst CRYSTALLIZE_SYSTEM = `You are summarizing a completed chain of agent actions into a compact digest.\nExtract: (1) what was accomplished in 1-2 sentences, (2) key decisions as bullet points,\n(3) files affected, (4) any lessons or patterns worth remembering.\nReturn as JSON: { \"narrative\": \"...\", \"keyOutcomes\": [\"...\"], \"filesAffected\": [\"...\"], \"lessons\": [\"...\"] }`;\n\nexport function registerCrystallizeFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n { id: \"mem::crystallize\" },\n async (data: {\n actionIds: string[];\n sessionId?: string;\n project?: string;\n }) => {\n if (!data.actionIds || data.actionIds.length === 0) {\n return { success: false, error: \"actionIds is required\" };\n }\n\n const actions: Action[] = [];\n for (const id of data.actionIds) {\n const action = await kv.get<Action>(KV.actions, id);\n if (!action) {\n return { success: false, error: `action not found: ${id}` };\n }\n if (action.status !== \"done\" && action.status !== \"cancelled\") {\n return {\n success: false,\n error: `action ${id} has status \"${action.status}\", expected \"done\" or \"cancelled\"`,\n };\n }\n actions.push(action);\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const idSet = new Set(data.actionIds);\n const relevantEdges = allEdges.filter(\n (e) => idSet.has(e.sourceActionId) || idSet.has(e.targetActionId),\n );\n\n const prompt = buildChainText(actions, relevantEdges);\n\n try {\n const response = await provider.summarize(CRYSTALLIZE_SYSTEM, prompt);\n const digest = parseDigest(response);\n\n const crystal: Crystal = {\n id: generateId(\"crys\"),\n narrative: digest.narrative,\n keyOutcomes: digest.keyOutcomes,\n filesAffected: digest.filesAffected,\n lessons: digest.lessons,\n sourceActionIds: data.actionIds,\n sessionId: data.sessionId,\n project: data.project,\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(KV.crystals, crystal.id, crystal);\n\n await Promise.all(\n digest.lessons.map((lesson) =>\n sdk.trigger(\"mem::lesson-save\", {\n content: lesson,\n context: crystal.narrative,\n confidence: 0.6,\n project: data.project,\n tags: [],\n source: \"crystal\",\n sourceIds: [crystal.id],\n }).catch(() => {}),\n ),\n );\n\n for (const action of actions) {\n const updated = { ...action, crystallizedInto: crystal.id };\n await kv.set(KV.actions, action.id, updated);\n }\n\n return { success: true, crystal };\n } catch (err) {\n return {\n success: false,\n error: `crystallization failed: ${String(err)}`,\n };\n }\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::crystal-list\" },\n async (data: {\n project?: string;\n sessionId?: string;\n limit?: number;\n }) => {\n const limit = data.limit ?? 20;\n let crystals = await kv.list<Crystal>(KV.crystals);\n\n if (data.project) {\n crystals = crystals.filter((c) => c.project === data.project);\n }\n if (data.sessionId) {\n crystals = crystals.filter((c) => c.sessionId === data.sessionId);\n }\n\n crystals.sort(\n (a, b) =>\n new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime(),\n );\n\n return { success: true, crystals: crystals.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::crystal-get\" },\n async (data: { crystalId: string }) => {\n if (!data.crystalId) {\n return { success: false, error: \"crystalId is required\" };\n }\n\n const crystal = await kv.get<Crystal>(KV.crystals, data.crystalId);\n if (!crystal) {\n return { success: false, error: \"crystal not found\" };\n }\n\n return { success: true, crystal };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::auto-crystallize\" },\n async (data: {\n olderThanDays?: number;\n project?: string;\n dryRun?: boolean;\n }) => {\n const olderThanDays = data.olderThanDays ?? 7;\n const dryRun = data.dryRun ?? false;\n const cutoff = Date.now() - olderThanDays * 24 * 60 * 60 * 1000;\n\n let allActions = await kv.list<CrystallizableAction>(KV.actions);\n\n allActions = allActions.filter(\n (a) =>\n a.status === \"done\" &&\n !a.crystallizedInto &&\n new Date(a.createdAt).getTime() < cutoff,\n );\n\n if (data.project) {\n allActions = allActions.filter((a) => a.project === data.project);\n }\n\n if (allActions.length === 0) {\n return { success: true, groupCount: 0, crystalIds: [] };\n }\n\n const groups = new Map<string, Action[]>();\n for (const action of allActions) {\n const key = action.parentId ?? action.project ?? \"_ungrouped\";\n const group = groups.get(key);\n if (group) {\n group.push(action);\n } else {\n groups.set(key, [action]);\n }\n }\n\n if (dryRun) {\n const groupSummaries = Array.from(groups.entries()).map(\n ([key, actions]) => ({\n groupKey: key,\n actionCount: actions.length,\n actionIds: actions.map((a) => a.id),\n }),\n );\n return {\n success: true,\n dryRun: true,\n groupCount: groups.size,\n groups: groupSummaries,\n crystalIds: [],\n };\n }\n\n const crystalIds: string[] = [];\n for (const [, groupActions] of groups) {\n const actionIds = groupActions.map((a) => a.id);\n const project = groupActions[0].project;\n\n try {\n const result = (await sdk.trigger(\"mem::crystallize\", {\n actionIds,\n project,\n })) as { success: boolean; crystal?: Crystal };\n\n if (result.success && result.crystal) {\n crystalIds.push(result.crystal.id);\n }\n } catch {\n continue;\n }\n }\n\n return {\n success: true,\n groupCount: groups.size,\n crystalIds,\n };\n },\n );\n}\n\nfunction buildChainText(actions: Action[], edges: ActionEdge[]): string {\n const lines: string[] = [\"## Completed Action Chain\\n\"];\n\n const sorted = [...actions].sort(\n (a, b) =>\n new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),\n );\n\n for (const action of sorted) {\n lines.push(`### ${action.title}`);\n if (action.description) lines.push(action.description);\n if (action.result) lines.push(`Result: ${action.result}`);\n lines.push(\n `Tags: ${(action.tags ?? []).join(\", \")}`,\n );\n lines.push(\"\");\n }\n\n if (edges.length > 0) {\n lines.push(\"## Dependencies\");\n for (const edge of edges) {\n lines.push(\n `- ${edge.sourceActionId} --${edge.type}--> ${edge.targetActionId}`,\n );\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction parseDigest(response: string): CrystalDigest {\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return {\n narrative: response,\n keyOutcomes: [],\n filesAffected: [],\n lessons: [],\n };\n }\n const parsed = JSON.parse(jsonMatch[0]) as Record<string, unknown>;\n return {\n narrative:\n typeof parsed.narrative === \"string\" ? parsed.narrative : response,\n keyOutcomes: Array.isArray(parsed.keyOutcomes)\n ? (parsed.keyOutcomes as string[])\n : [],\n filesAffected: Array.isArray(parsed.filesAffected)\n ? (parsed.filesAffected as string[])\n : [],\n lessons: Array.isArray(parsed.lessons)\n ? (parsed.lessons as string[])\n : [],\n };\n } catch {\n return {\n narrative: response,\n keyOutcomes: [],\n filesAffected: [],\n lessons: [],\n };\n }\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport { withKeyedLock } from \"../state/keyed-mutex.js\";\nimport type {\n Action,\n ActionEdge,\n DiagnosticCheck,\n Lease,\n Checkpoint,\n Signal,\n Sentinel,\n Sketch,\n MeshPeer,\n Session,\n Memory,\n} from \"../types.js\";\n\nconst ALL_CATEGORIES = [\n \"actions\",\n \"leases\",\n \"sentinels\",\n \"sketches\",\n \"signals\",\n \"sessions\",\n \"memories\",\n \"mesh\",\n];\n\nconst TWENTY_FOUR_HOURS_MS = 24 * 60 * 60 * 1000;\nconst ONE_HOUR_MS = 60 * 60 * 1000;\n\nexport function registerDiagnosticsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::diagnose\" },\n async (data: { categories?: string[] }) => {\n const categories = data.categories && data.categories.length > 0\n ? data.categories.filter((c) => ALL_CATEGORIES.includes(c))\n : ALL_CATEGORIES;\n\n const checks: DiagnosticCheck[] = [];\n const now = Date.now();\n\n if (categories.includes(\"actions\")) {\n const actions = await kv.list<Action>(KV.actions);\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const leases = await kv.list<Lease>(KV.leases);\n const actionMap = new Map(actions.map((a) => [a.id, a]));\n\n for (const action of actions) {\n if (action.status === \"active\") {\n const hasActiveLease = leases.some(\n (l) =>\n l.actionId === action.id &&\n l.status === \"active\" &&\n new Date(l.expiresAt).getTime() > now,\n );\n if (!hasActiveLease) {\n checks.push({\n name: `active-no-lease:${action.id}`,\n category: \"actions\",\n status: \"warn\",\n message: `Action \"${action.title}\" is active but has no active lease`,\n fixable: false,\n });\n }\n }\n\n if (action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n checks.push({\n name: `blocked-deps-done:${action.id}`,\n category: \"actions\",\n status: \"fail\",\n message: `Action \"${action.title}\" is blocked but all dependencies are done`,\n fixable: true,\n });\n }\n }\n }\n\n if (action.status === \"pending\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const hasUnsatisfied = deps.some((d) => {\n const target = actionMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (hasUnsatisfied) {\n checks.push({\n name: `pending-unsatisfied-deps:${action.id}`,\n category: \"actions\",\n status: \"fail\",\n message: `Action \"${action.title}\" is pending but has unsatisfied dependencies`,\n fixable: true,\n });\n }\n }\n }\n }\n\n if (\n !checks.some((c) => c.category === \"actions\" && c.status !== \"pass\")\n ) {\n checks.push({\n name: \"actions-ok\",\n category: \"actions\",\n status: \"pass\",\n message: `All ${actions.length} actions are consistent`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"leases\")) {\n const leases = await kv.list<Lease>(KV.leases);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n let leaseIssues = 0;\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-lease:${lease.id}`,\n category: \"leases\",\n status: \"fail\",\n message: `Lease ${lease.id} for action ${lease.actionId} expired at ${lease.expiresAt}`,\n fixable: true,\n });\n leaseIssues++;\n }\n\n if (!actionIds.has(lease.actionId)) {\n checks.push({\n name: `orphaned-lease:${lease.id}`,\n category: \"leases\",\n status: \"fail\",\n message: `Lease ${lease.id} references non-existent action ${lease.actionId}`,\n fixable: true,\n });\n leaseIssues++;\n }\n }\n\n if (leaseIssues === 0) {\n checks.push({\n name: \"leases-ok\",\n category: \"leases\",\n status: \"pass\",\n message: `All ${leases.length} leases are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sentinels\")) {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n let sentinelIssues = 0;\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-sentinel:${sentinel.id}`,\n category: \"sentinels\",\n status: \"fail\",\n message: `Sentinel \"${sentinel.name}\" expired at ${sentinel.expiresAt}`,\n fixable: true,\n });\n sentinelIssues++;\n }\n\n for (const actionId of sentinel.linkedActionIds) {\n if (!actionIds.has(actionId)) {\n checks.push({\n name: `sentinel-missing-action:${sentinel.id}:${actionId}`,\n category: \"sentinels\",\n status: \"warn\",\n message: `Sentinel \"${sentinel.name}\" references non-existent action ${actionId}`,\n fixable: false,\n });\n sentinelIssues++;\n }\n }\n }\n\n if (sentinelIssues === 0) {\n checks.push({\n name: \"sentinels-ok\",\n category: \"sentinels\",\n status: \"pass\",\n message: `All ${sentinels.length} sentinels are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sketches\")) {\n const sketches = await kv.list<Sketch>(KV.sketches);\n let sketchIssues = 0;\n\n for (const sketch of sketches) {\n if (\n sketch.status === \"active\" &&\n new Date(sketch.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-sketch:${sketch.id}`,\n category: \"sketches\",\n status: \"fail\",\n message: `Sketch \"${sketch.title}\" expired at ${sketch.expiresAt}`,\n fixable: true,\n });\n sketchIssues++;\n }\n }\n\n if (sketchIssues === 0) {\n checks.push({\n name: \"sketches-ok\",\n category: \"sketches\",\n status: \"pass\",\n message: `All ${sketches.length} sketches are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"signals\")) {\n const signals = await kv.list<Signal>(KV.signals);\n let signalIssues = 0;\n\n for (const signal of signals) {\n if (\n signal.expiresAt &&\n new Date(signal.expiresAt).getTime() <= now\n ) {\n checks.push({\n name: `expired-signal:${signal.id}`,\n category: \"signals\",\n status: \"fail\",\n message: `Signal from \"${signal.from}\" expired at ${signal.expiresAt}`,\n fixable: true,\n });\n signalIssues++;\n }\n }\n\n if (signalIssues === 0) {\n checks.push({\n name: \"signals-ok\",\n category: \"signals\",\n status: \"pass\",\n message: `All ${signals.length} signals are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"sessions\")) {\n const sessions = await kv.list<Session>(KV.sessions);\n let sessionIssues = 0;\n\n for (const session of sessions) {\n if (\n session.status === \"active\" &&\n now - new Date(session.startedAt).getTime() > TWENTY_FOUR_HOURS_MS\n ) {\n checks.push({\n name: `abandoned-session:${session.id}`,\n category: \"sessions\",\n status: \"warn\",\n message: `Session ${session.id} has been active for over 24 hours`,\n fixable: false,\n });\n sessionIssues++;\n }\n }\n\n if (sessionIssues === 0) {\n checks.push({\n name: \"sessions-ok\",\n category: \"sessions\",\n status: \"pass\",\n message: `All ${sessions.length} sessions are healthy`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"memories\")) {\n const memories = await kv.list<Memory>(KV.memories);\n const memoryIds = new Set(memories.map((m) => m.id));\n const supersededBy = new Map<string, string>();\n let memoryIssues = 0;\n\n for (const memory of memories) {\n if (memory.supersedes && memory.supersedes.length > 0) {\n for (const sid of memory.supersedes) {\n if (!memoryIds.has(sid)) {\n checks.push({\n name: `memory-missing-supersedes:${memory.id}:${sid}`,\n category: \"memories\",\n status: \"warn\",\n message: `Memory \"${memory.title}\" supersedes non-existent memory ${sid}`,\n fixable: false,\n });\n memoryIssues++;\n }\n supersededBy.set(sid, memory.id);\n }\n }\n }\n\n for (const memory of memories) {\n if (memory.isLatest && supersededBy.has(memory.id)) {\n checks.push({\n name: `memory-stale-latest:${memory.id}`,\n category: \"memories\",\n status: \"fail\",\n message: `Memory \"${memory.title}\" has isLatest=true but is superseded by ${supersededBy.get(memory.id)}`,\n fixable: true,\n });\n memoryIssues++;\n }\n }\n\n if (memoryIssues === 0) {\n checks.push({\n name: \"memories-ok\",\n category: \"memories\",\n status: \"pass\",\n message: `All ${memories.length} memories are consistent`,\n fixable: false,\n });\n }\n }\n\n if (categories.includes(\"mesh\")) {\n const peers = await kv.list<MeshPeer>(KV.mesh);\n let meshIssues = 0;\n\n for (const peer of peers) {\n if (\n peer.lastSyncAt &&\n now - new Date(peer.lastSyncAt).getTime() > ONE_HOUR_MS\n ) {\n checks.push({\n name: `stale-peer:${peer.id}`,\n category: \"mesh\",\n status: \"warn\",\n message: `Peer \"${peer.name}\" last synced over 1 hour ago`,\n fixable: false,\n });\n meshIssues++;\n }\n\n if (peer.status === \"error\") {\n checks.push({\n name: `error-peer:${peer.id}`,\n category: \"mesh\",\n status: \"warn\",\n message: `Peer \"${peer.name}\" is in error state`,\n fixable: false,\n });\n meshIssues++;\n }\n }\n\n if (meshIssues === 0) {\n checks.push({\n name: \"mesh-ok\",\n category: \"mesh\",\n status: \"pass\",\n message: `All ${peers.length} mesh peers are healthy`,\n fixable: false,\n });\n }\n }\n\n const summary = {\n pass: checks.filter((c) => c.status === \"pass\").length,\n warn: checks.filter((c) => c.status === \"warn\").length,\n fail: checks.filter((c) => c.status === \"fail\").length,\n fixable: checks.filter((c) => c.fixable).length,\n };\n\n return { success: true, checks, summary };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::heal\" },\n async (data: { categories?: string[]; dryRun?: boolean }) => {\n const dryRun = data.dryRun ?? false;\n const categories = data.categories && data.categories.length > 0\n ? data.categories.filter((c) => ALL_CATEGORIES.includes(c))\n : ALL_CATEGORIES;\n\n let fixed = 0;\n let skipped = 0;\n const details: string[] = [];\n const now = Date.now();\n\n if (categories.includes(\"actions\")) {\n const actions = await kv.list<Action>(KV.actions);\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const actionMap = new Map(actions.map((a) => [a.id, a]));\n\n for (const action of actions) {\n if (action.status === \"blocked\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const allDone = deps.every((d) => {\n const target = actionMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (allDone) {\n if (dryRun) {\n details.push(\n `[dry-run] Would unblock action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:action:${action.id}`,\n async () => {\n const fresh = await kv.get<Action>(KV.actions, action.id);\n if (!fresh || fresh.status !== \"blocked\") return false;\n const freshEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const freshDeps = freshEdges.filter(\n (e) =>\n e.sourceActionId === fresh.id && e.type === \"requires\",\n );\n const freshActions = await kv.list<Action>(KV.actions);\n const freshMap = new Map(\n freshActions.map((a) => [a.id, a]),\n );\n const stillAllDone = freshDeps.every((d) => {\n const target = freshMap.get(d.targetActionId);\n return target && target.status === \"done\";\n });\n if (!stillAllDone) return false;\n fresh.status = \"pending\";\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Unblocked action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (action.status === \"pending\") {\n const deps = allEdges.filter(\n (e) => e.sourceActionId === action.id && e.type === \"requires\",\n );\n if (deps.length > 0) {\n const hasUnsatisfied = deps.some((d) => {\n const target = actionMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (hasUnsatisfied) {\n if (dryRun) {\n details.push(\n `[dry-run] Would block action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:action:${action.id}`,\n async () => {\n const fresh = await kv.get<Action>(KV.actions, action.id);\n if (!fresh || fresh.status !== \"pending\") return false;\n const freshEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const freshDeps = freshEdges.filter(\n (e) =>\n e.sourceActionId === fresh.id && e.type === \"requires\",\n );\n const freshActions = await kv.list<Action>(KV.actions);\n const freshMap = new Map(\n freshActions.map((a) => [a.id, a]),\n );\n const stillUnsatisfied = freshDeps.some((d) => {\n const target = freshMap.get(d.targetActionId);\n return !target || target.status !== \"done\";\n });\n if (!stillUnsatisfied) return false;\n fresh.status = \"blocked\";\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Blocked action \"${action.title}\" (${action.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n }\n }\n\n if (categories.includes(\"leases\")) {\n const leases = await kv.list<Lease>(KV.leases);\n const actions = await kv.list<Action>(KV.actions);\n const actionIds = new Set(actions.map((a) => a.id));\n\n for (const lease of leases) {\n if (\n lease.status === \"active\" &&\n new Date(lease.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would expire lease ${lease.id} for action ${lease.actionId}`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:lease:${lease.actionId}`,\n async () => {\n const fresh = await kv.get<Lease>(KV.leases, lease.id);\n if (\n !fresh ||\n fresh.status !== \"active\" ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n fresh.status = \"expired\";\n await kv.set(KV.leases, fresh.id, fresh);\n\n const action = await kv.get<Action>(KV.actions, fresh.actionId);\n if (\n action &&\n action.status === \"active\" &&\n action.assignedTo === fresh.agentId\n ) {\n action.status = \"pending\";\n action.assignedTo = undefined;\n action.updatedAt = new Date().toISOString();\n await kv.set(KV.actions, action.id, action);\n }\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Expired lease ${lease.id} for action ${lease.actionId}`,\n );\n fixed++;\n } else {\n skipped++;\n }\n continue;\n }\n\n if (!actionIds.has(lease.actionId)) {\n if (dryRun) {\n details.push(\n `[dry-run] Would delete orphaned lease ${lease.id}`,\n );\n fixed++;\n continue;\n }\n await kv.delete(KV.leases, lease.id);\n details.push(`Deleted orphaned lease ${lease.id}`);\n fixed++;\n }\n }\n }\n\n if (categories.includes(\"sentinels\")) {\n const sentinels = await kv.list<Sentinel>(KV.sentinels);\n\n for (const sentinel of sentinels) {\n if (\n sentinel.status === \"watching\" &&\n sentinel.expiresAt &&\n new Date(sentinel.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would expire sentinel \"${sentinel.name}\" (${sentinel.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:sentinel:${sentinel.id}`,\n async () => {\n const fresh = await kv.get<Sentinel>(\n KV.sentinels,\n sentinel.id,\n );\n if (!fresh || fresh.status !== \"watching\") return false;\n if (\n !fresh.expiresAt ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n fresh.status = \"expired\";\n await kv.set(KV.sentinels, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Expired sentinel \"${sentinel.name}\" (${sentinel.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (categories.includes(\"sketches\")) {\n const sketches = await kv.list<Sketch>(KV.sketches);\n\n for (const sketch of sketches) {\n if (\n sketch.status === \"active\" &&\n new Date(sketch.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would discard expired sketch \"${sketch.title}\" (${sketch.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:sketch:${sketch.id}`,\n async () => {\n const fresh = await kv.get<Sketch>(KV.sketches, sketch.id);\n if (\n !fresh ||\n fresh.status !== \"active\" ||\n new Date(fresh.expiresAt).getTime() > Date.now()\n ) {\n return false;\n }\n\n const allEdges = await kv.list<ActionEdge>(KV.actionEdges);\n const actionIdSet = new Set(fresh.actionIds);\n for (const edge of allEdges) {\n if (\n actionIdSet.has(edge.sourceActionId) ||\n actionIdSet.has(edge.targetActionId)\n ) {\n await kv.delete(KV.actionEdges, edge.id);\n }\n }\n for (const actionId of fresh.actionIds) {\n await kv.delete(KV.actions, actionId);\n }\n\n fresh.status = \"discarded\";\n fresh.discardedAt = new Date().toISOString();\n await kv.set(KV.sketches, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Discarded expired sketch \"${sketch.title}\" (${sketch.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n if (categories.includes(\"signals\")) {\n const signals = await kv.list<Signal>(KV.signals);\n\n for (const signal of signals) {\n if (\n signal.expiresAt &&\n new Date(signal.expiresAt).getTime() <= now\n ) {\n if (dryRun) {\n details.push(\n `[dry-run] Would delete expired signal ${signal.id}`,\n );\n fixed++;\n continue;\n }\n await kv.delete(KV.signals, signal.id);\n details.push(`Deleted expired signal ${signal.id}`);\n fixed++;\n }\n }\n }\n\n if (categories.includes(\"memories\")) {\n const memories = await kv.list<Memory>(KV.memories);\n const supersededBy = new Map<string, string>();\n\n for (const memory of memories) {\n if (memory.supersedes && memory.supersedes.length > 0) {\n for (const sid of memory.supersedes) {\n supersededBy.set(sid, memory.id);\n }\n }\n }\n\n for (const memory of memories) {\n if (memory.isLatest && supersededBy.has(memory.id)) {\n if (dryRun) {\n details.push(\n `[dry-run] Would set isLatest=false on memory \"${memory.title}\" (${memory.id})`,\n );\n fixed++;\n continue;\n }\n const didFix = await withKeyedLock(\n `mem:memory:${memory.id}`,\n async () => {\n const fresh = await kv.get<Memory>(KV.memories, memory.id);\n if (!fresh || !fresh.isLatest) return false;\n fresh.isLatest = false;\n fresh.updatedAt = new Date().toISOString();\n await kv.set(KV.memories, fresh.id, fresh);\n return true;\n },\n );\n if (didFix) {\n details.push(\n `Set isLatest=false on memory \"${memory.title}\" (${memory.id})`,\n );\n fixed++;\n } else {\n skipped++;\n }\n }\n }\n }\n\n return { success: true, fixed, skipped, details };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { Facet } from \"../types.js\";\n\nexport function registerFacetsFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::facet-tag\" },\n async (data: {\n targetId: string;\n targetType: string;\n dimension: string;\n value: string;\n }) => {\n if (!data.targetId || typeof data.targetId !== \"string\") {\n return { success: false, error: \"targetId is required\" };\n }\n\n const validTypes = [\"action\", \"memory\", \"observation\"];\n if (!validTypes.includes(data.targetType)) {\n return {\n success: false,\n error: `targetType must be one of: ${validTypes.join(\", \")}`,\n };\n }\n\n if (\n !data.dimension ||\n typeof data.dimension !== \"string\" ||\n data.dimension.trim() === \"\"\n ) {\n return { success: false, error: \"dimension is required\" };\n }\n\n if (\n !data.value ||\n typeof data.value !== \"string\" ||\n data.value.trim() === \"\"\n ) {\n return { success: false, error: \"value is required\" };\n }\n\n const dimension = data.dimension.trim();\n const value = data.value.trim();\n\n const existing = await kv.list<Facet>(KV.facets);\n const duplicate = existing.find(\n (f) =>\n f.targetId === data.targetId &&\n f.dimension === dimension &&\n f.value === value,\n );\n if (duplicate) {\n return { success: true, facet: duplicate, skipped: true };\n }\n\n const facet: Facet = {\n id: generateId(\"fct\"),\n targetId: data.targetId,\n targetType: data.targetType as Facet[\"targetType\"],\n dimension,\n value,\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(KV.facets, facet.id, facet);\n return { success: true, facet };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-untag\" },\n async (data: {\n targetId: string;\n dimension: string;\n value?: string;\n }) => {\n if (!data.targetId) {\n return { success: false, error: \"targetId is required\" };\n }\n if (!data.dimension) {\n return { success: false, error: \"dimension is required\" };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const matches = all.filter((f) => {\n if (f.targetId !== data.targetId || f.dimension !== data.dimension) {\n return false;\n }\n if (data.value !== undefined) {\n return f.value === data.value;\n }\n return true;\n });\n\n for (const f of matches) {\n await kv.delete(KV.facets, f.id);\n }\n\n return { success: true, removed: matches.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-query\" },\n async (data: {\n matchAll?: string[];\n matchAny?: string[];\n targetType?: string;\n limit?: number;\n }) => {\n if (\n (!data.matchAll || data.matchAll.length === 0) &&\n (!data.matchAny || data.matchAny.length === 0)\n ) {\n return {\n success: false,\n error: \"at least one of matchAll or matchAny is required\",\n };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const filtered = data.targetType\n ? all.filter((f) => f.targetType === data.targetType)\n : all;\n\n const targetFacetMap = new Map<string, { targetType: string; facetKeys: Set<string> }>();\n for (const f of filtered) {\n const key = `${f.dimension}:${f.value}`;\n let entry = targetFacetMap.get(f.targetId);\n if (!entry) {\n entry = { targetType: f.targetType, facetKeys: new Set() };\n targetFacetMap.set(f.targetId, entry);\n }\n entry.facetKeys.add(key);\n }\n\n const results: Array<{ targetId: string; targetType: string; matchedFacets: string[] }> = [];\n\n for (const [targetId, entry] of targetFacetMap) {\n const matched: string[] = [];\n\n if (data.matchAll && data.matchAll.length > 0) {\n const allPresent = data.matchAll.every((k) => entry.facetKeys.has(k));\n if (!allPresent) continue;\n for (const k of data.matchAll) {\n if (!matched.includes(k)) matched.push(k);\n }\n }\n\n if (data.matchAny && data.matchAny.length > 0) {\n const anyPresent = data.matchAny.filter((k) => entry.facetKeys.has(k));\n if (anyPresent.length === 0) continue;\n for (const k of anyPresent) {\n if (!matched.includes(k)) matched.push(k);\n }\n }\n\n results.push({\n targetId,\n targetType: entry.targetType,\n matchedFacets: matched,\n });\n }\n\n const limit = data.limit || 50;\n return { success: true, results: results.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-get\" },\n async (data: { targetId: string }) => {\n if (!data.targetId) {\n return { success: false, error: \"targetId is required\" };\n }\n\n const all = await kv.list<Facet>(KV.facets);\n const targetFacets = all.filter((f) => f.targetId === data.targetId);\n\n const dimMap = new Map<string, string[]>();\n for (const f of targetFacets) {\n let values = dimMap.get(f.dimension);\n if (!values) {\n values = [];\n dimMap.set(f.dimension, values);\n }\n values.push(f.value);\n }\n\n const dimensions = Array.from(dimMap.entries()).map(([dimension, values]) => ({\n dimension,\n values,\n }));\n\n return { success: true, dimensions };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-stats\" },\n async (data: { targetType?: string }) => {\n const all = await kv.list<Facet>(KV.facets);\n const filtered = data.targetType\n ? all.filter((f) => f.targetType === data.targetType)\n : all;\n\n const dimMap = new Map<string, Map<string, number>>();\n for (const f of filtered) {\n let valueMap = dimMap.get(f.dimension);\n if (!valueMap) {\n valueMap = new Map();\n dimMap.set(f.dimension, valueMap);\n }\n valueMap.set(f.value, (valueMap.get(f.value) || 0) + 1);\n }\n\n const dimensions = Array.from(dimMap.entries()).map(([dimension, valueMap]) => ({\n dimension,\n values: Array.from(valueMap.entries()).map(([value, count]) => ({\n value,\n count,\n })),\n }));\n\n return { success: true, dimensions, totalFacets: filtered.length };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::facet-dimensions\" },\n async () => {\n const all = await kv.list<Facet>(KV.facets);\n\n const counts = new Map<string, number>();\n for (const f of all) {\n counts.set(f.dimension, (counts.get(f.dimension) || 0) + 1);\n }\n\n const dimensions = Array.from(counts.entries()).map(([dimension, count]) => ({\n dimension,\n count,\n }));\n\n return { success: true, dimensions };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n Memory,\n CompressedObservation,\n Session,\n} from \"../types.js\";\n\nexport function registerVerifyFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::verify\" },\n async (data: { id: string }) => {\n if (!data.id || typeof data.id !== \"string\") {\n return { success: false, error: \"id is required\" };\n }\n\n const memory = await kv.get<Memory>(KV.memories, data.id);\n if (memory) {\n const observationIds = memory.sourceObservationIds || [];\n const observations: Array<{\n observation: CompressedObservation;\n session?: Session;\n }> = [];\n\n for (const obsId of observationIds) {\n const obs = await findObservation(kv, obsId, memory.sessionIds);\n if (obs) {\n const session = await kv.get<Session>(KV.sessions, obs.sessionId);\n observations.push({ observation: obs, session: session || undefined });\n }\n }\n\n return {\n success: true,\n type: \"memory\",\n memory: {\n id: memory.id,\n title: memory.title,\n type: memory.type,\n version: memory.version,\n strength: memory.strength,\n isLatest: memory.isLatest,\n createdAt: memory.createdAt,\n updatedAt: memory.updatedAt,\n supersedes: memory.supersedes,\n parentId: memory.parentId,\n },\n citations: observations.map((o) => ({\n observationId: o.observation.id,\n title: o.observation.title,\n type: o.observation.type,\n confidence: o.observation.confidence,\n timestamp: o.observation.timestamp,\n sessionId: o.observation.sessionId,\n sessionProject: o.session?.project,\n sessionStatus: o.session?.status,\n })),\n citationCount: observations.length,\n };\n }\n\n const obs = await findObservation(kv, data.id);\n if (obs) {\n const session = await kv.get<Session>(KV.sessions, obs.sessionId);\n return {\n success: true,\n type: \"observation\",\n observation: {\n id: obs.id,\n title: obs.title,\n type: obs.type,\n confidence: obs.confidence,\n importance: obs.importance,\n timestamp: obs.timestamp,\n sessionId: obs.sessionId,\n },\n session: session\n ? {\n id: session.id,\n project: session.project,\n status: session.status,\n startedAt: session.startedAt,\n }\n : null,\n citationCount: 0,\n citations: [],\n };\n }\n\n return { success: false, error: \"not found\" };\n },\n );\n}\n\nasync function findObservation(\n kv: StateKV,\n obsId: string,\n hintSessionIds?: string[],\n): Promise<CompressedObservation | null> {\n if (hintSessionIds) {\n for (const sid of hintSessionIds) {\n const obs = await kv.get<CompressedObservation>(KV.observations(sid), obsId);\n if (obs) return obs;\n }\n }\n const sessions = await kv.list<Session>(KV.sessions);\n for (const session of sessions) {\n if (hintSessionIds?.includes(session.id)) continue;\n const obs = await kv.get<CompressedObservation>(\n KV.observations(session.id),\n obsId,\n );\n if (obs) return obs;\n }\n return null;\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { Memory, GraphNode, GraphEdge } from \"../types.js\";\n\nexport function registerCascadeFunction(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::cascade-update\" },\n async (data: { supersededMemoryId: string }) => {\n if (!data.supersededMemoryId || typeof data.supersededMemoryId !== \"string\") {\n return { success: false, error: \"supersededMemoryId is required\" };\n }\n\n const superseded = await kv.get<Memory>(KV.memories, data.supersededMemoryId);\n if (!superseded) {\n return { success: false, error: \"superseded memory not found\" };\n }\n\n let flaggedNodes = 0;\n let flaggedEdges = 0;\n let flaggedMemories = 0;\n\n const obsIds = new Set(superseded.sourceObservationIds || []);\n\n if (obsIds.size > 0) {\n const now = new Date().toISOString();\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n for (const node of nodes) {\n if (node.stale) continue;\n const overlap = (node.sourceObservationIds ?? []).some((id) => obsIds.has(id));\n if (overlap) {\n node.stale = true;\n node.updatedAt = now;\n await kv.set(KV.graphNodes, node.id, node);\n flaggedNodes++;\n }\n }\n\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n for (const edge of edges) {\n if (edge.stale) continue;\n const overlap = (edge.sourceObservationIds ?? []).some((id) => obsIds.has(id));\n if (overlap) {\n edge.stale = true;\n await kv.set(KV.graphEdges, edge.id, edge);\n flaggedEdges++;\n }\n }\n }\n\n const supersededConcepts = new Set(\n (superseded.concepts ?? []).map((c) => c.toLowerCase()),\n );\n if (supersededConcepts.size >= 2) {\n const allMemories = await kv.list<Memory>(KV.memories);\n for (const mem of allMemories) {\n if (mem.id === data.supersededMemoryId) continue;\n if (!mem.isLatest) continue;\n\n const sharedCount = (mem.concepts ?? []).filter((c) =>\n supersededConcepts.has(c.toLowerCase()),\n ).length;\n if (sharedCount >= 2) {\n flaggedMemories++;\n }\n }\n }\n\n return {\n success: true,\n flagged: {\n nodes: flaggedNodes,\n edges: flaggedEdges,\n siblingMemories: flaggedMemories,\n },\n total: flaggedNodes + flaggedEdges + flaggedMemories,\n };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV, fingerprintId } from \"../state/schema.js\";\nimport type { Lesson } from \"../types.js\";\nimport { recordAudit } from \"./audit.js\";\n\nfunction reinforceLesson(lesson: Lesson): void {\n const now = new Date().toISOString();\n lesson.reinforcements++;\n lesson.confidence = Math.min(\n 1.0,\n lesson.confidence + 0.1 * (1 - lesson.confidence),\n );\n lesson.lastReinforcedAt = now;\n lesson.updatedAt = now;\n}\n\nexport function registerLessonsFunctions(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"mem::lesson-save\" },\n async (data: {\n content: string;\n context?: string;\n confidence?: number;\n project?: string;\n tags?: string[];\n source?: \"crystal\" | \"manual\" | \"consolidation\";\n sourceIds?: string[];\n }) => {\n if (!data.content?.trim()) {\n return { success: false, error: \"content is required\" };\n }\n\n const fp = fingerprintId(\"lsn\", data.content.trim().toLowerCase());\n const existing = await kv.get<Lesson>(KV.lessons, fp);\n\n if (existing && !existing.deleted) {\n reinforceLesson(existing);\n if (data.context && !existing.context) {\n existing.context = data.context;\n }\n await kv.set(KV.lessons, existing.id, existing);\n\n try {\n await recordAudit(kv, \"lesson_strengthen\", \"mem::lesson-save\", [\n existing.id,\n ]);\n } catch {}\n\n return {\n success: true,\n action: \"strengthened\",\n lesson: existing,\n };\n }\n\n const confidence =\n typeof data.confidence === \"number\" &&\n data.confidence >= 0 &&\n data.confidence <= 1\n ? data.confidence\n : 0.5;\n\n const now = new Date().toISOString();\n const lesson: Lesson = {\n id: fp,\n content: data.content.trim(),\n context: data.context?.trim() || \"\",\n confidence,\n reinforcements: 0,\n source: data.source || \"manual\",\n sourceIds: data.sourceIds || [],\n project: data.project,\n tags: data.tags || [],\n createdAt: now,\n updatedAt: now,\n decayRate: 0.05,\n };\n\n await kv.set(KV.lessons, lesson.id, lesson);\n\n try {\n await recordAudit(kv, \"lesson_save\", \"mem::lesson-save\", [lesson.id]);\n } catch {}\n\n return { success: true, action: \"created\", lesson };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-recall\" },\n async (data: {\n query: string;\n project?: string;\n minConfidence?: number;\n limit?: number;\n }) => {\n if (!data.query?.trim()) {\n return { success: false, error: \"query is required\" };\n }\n\n const query = data.query.toLowerCase();\n const minConfidence = data.minConfidence ?? 0.1;\n const limit = data.limit ?? 10;\n\n let lessons = await kv.list<Lesson>(KV.lessons);\n\n lessons = lessons.filter(\n (l) => !l.deleted && l.confidence >= minConfidence,\n );\n\n if (data.project) {\n lessons = lessons.filter((l) => l.project === data.project);\n }\n\n const scored = lessons\n .map((l) => {\n const text = `${l.content} ${l.context} ${l.tags.join(\" \")}`.toLowerCase();\n const terms = query.split(/\\s+/).filter((t) => t.length > 1);\n const matchCount = terms.filter((t) => text.includes(t)).length;\n if (matchCount === 0) return null;\n\n const relevance = matchCount / terms.length;\n const daysSinceReinforced = l.lastReinforcedAt\n ? (Date.now() - new Date(l.lastReinforcedAt).getTime()) /\n (1000 * 60 * 60 * 24)\n : (Date.now() - new Date(l.createdAt).getTime()) /\n (1000 * 60 * 60 * 24);\n const recencyBoost = 1 / (1 + daysSinceReinforced * 0.01);\n const score = l.confidence * relevance * recencyBoost;\n\n return { lesson: l, score };\n })\n .filter(Boolean) as Array<{ lesson: Lesson; score: number }>;\n\n scored.sort((a, b) => b.score - a.score);\n\n try {\n await recordAudit(kv, \"lesson_recall\", \"mem::lesson-recall\", [], {\n query: data.query,\n resultCount: scored.length,\n });\n } catch {}\n\n return {\n success: true,\n lessons: scored.slice(0, limit).map((s) => ({\n ...s.lesson,\n score: Math.round(s.score * 1000) / 1000,\n })),\n };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-list\" },\n async (data: {\n project?: string;\n source?: string;\n minConfidence?: number;\n limit?: number;\n }) => {\n const limit = data.limit ?? 50;\n const minConfidence = data.minConfidence ?? 0;\n let lessons = await kv.list<Lesson>(KV.lessons);\n\n lessons = lessons.filter(\n (l) => !l.deleted && l.confidence >= minConfidence,\n );\n\n if (data.project) {\n lessons = lessons.filter((l) => l.project === data.project);\n }\n if (data.source) {\n lessons = lessons.filter((l) => l.source === data.source);\n }\n\n lessons.sort((a, b) => b.confidence - a.confidence);\n\n return { success: true, lessons: lessons.slice(0, limit) };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-strengthen\" },\n async (data: { lessonId: string }) => {\n if (!data.lessonId) {\n return { success: false, error: \"lessonId is required\" };\n }\n\n const lesson = await kv.get<Lesson>(KV.lessons, data.lessonId);\n if (!lesson || lesson.deleted) {\n return { success: false, error: \"lesson not found\" };\n }\n\n reinforceLesson(lesson);\n\n await kv.set(KV.lessons, lesson.id, lesson);\n\n try {\n await recordAudit(kv, \"lesson_strengthen\", \"mem::lesson-strengthen\", [\n lesson.id,\n ]);\n } catch {}\n\n return { success: true, lesson };\n },\n );\n\n sdk.registerFunction(\n { id: \"mem::lesson-decay-sweep\" },\n async () => {\n const lessons = await kv.list<Lesson>(KV.lessons);\n let decayed = 0;\n let softDeleted = 0;\n const now = Date.now();\n const timestamp = new Date().toISOString();\n const dirty: Lesson[] = [];\n\n for (const lesson of lessons) {\n if (lesson.deleted) continue;\n\n const baseline = lesson.lastDecayedAt || lesson.lastReinforcedAt || lesson.createdAt;\n const weeksSinceBaseline =\n (now - new Date(baseline).getTime()) / (1000 * 60 * 60 * 24 * 7);\n\n if (weeksSinceBaseline < 1) continue;\n\n const decay = lesson.decayRate * weeksSinceBaseline;\n const newConfidence = Math.max(0.05, lesson.confidence - decay);\n\n if (newConfidence !== lesson.confidence) {\n lesson.confidence = Math.round(newConfidence * 1000) / 1000;\n lesson.lastDecayedAt = timestamp;\n lesson.updatedAt = timestamp;\n\n if (lesson.confidence <= 0.1 && lesson.reinforcements === 0) {\n lesson.deleted = true;\n softDeleted++;\n } else {\n decayed++;\n }\n\n dirty.push(lesson);\n }\n }\n\n await Promise.all(dirty.map((l) => kv.set(KV.lessons, l.id, l)));\n\n return { success: true, decayed, softDeleted, total: lessons.length };\n },\n );\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { ISdk } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n Memory,\n Lesson,\n Crystal,\n Session,\n} from \"../types.js\";\nimport { recordAudit } from \"./audit.js\";\n\nconst DEFAULT_VAULT = join(homedir(), \".agentmemory\", \"vault\");\n\nfunction sanitize(name: string): string {\n return name.replace(/[<>:\"/\\\\|?*\\x00-\\x1f]/g, \"_\").slice(0, 100);\n}\n\nfunction toFrontmatter(obj: Record<string, unknown>): string {\n const lines = [\"---\"];\n for (const [key, value] of Object.entries(obj)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n lines.push(`${key}: [${value.map((v) => JSON.stringify(String(v))).join(\", \")}]`);\n } else {\n lines.push(`${key}: ${JSON.stringify(value)}`);\n }\n }\n lines.push(\"---\");\n return lines.join(\"\\n\");\n}\n\nfunction memoryToMd(m: Memory): string {\n const fm = toFrontmatter({\n id: m.id,\n type: m.type,\n created: m.createdAt,\n updated: m.updatedAt,\n strength: m.strength,\n version: m.version,\n concepts: m.concepts,\n files: m.files,\n });\n\n const related = (m.relatedIds || [])\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n const supersedes = (m.supersedes || [])\n .map((id) => `- [[${id}]] (superseded)`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# ${m.title}`,\n \"\",\n m.content,\n ];\n\n if (m.concepts.length > 0) {\n sections.push(\"\", \"## Concepts\", m.concepts.map((c) => `#${c.replace(/\\s+/g, \"-\")}`).join(\" \"));\n }\n if (related) {\n sections.push(\"\", \"## Related\", related);\n }\n if (supersedes) {\n sections.push(\"\", \"## Supersedes\", supersedes);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction lessonToMd(l: Lesson): string {\n const fm = toFrontmatter({\n id: l.id,\n type: \"lesson\",\n source: l.source,\n confidence: l.confidence,\n reinforcements: l.reinforcements,\n created: l.createdAt,\n updated: l.updatedAt,\n project: l.project,\n tags: l.tags,\n decayRate: l.decayRate,\n });\n\n const sourceLinks = l.sourceIds\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# Lesson: ${l.content.slice(0, 80)}`,\n \"\",\n l.content,\n ];\n\n if (l.context) {\n sections.push(\"\", \"## Context\", l.context);\n }\n if (l.tags.length > 0) {\n sections.push(\"\", \"## Tags\", l.tags.map((t) => `#${t.replace(/\\s+/g, \"-\")}`).join(\" \"));\n }\n if (sourceLinks) {\n sections.push(\"\", \"## Sources\", sourceLinks);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction crystalToMd(c: Crystal): string {\n const fm = toFrontmatter({\n id: c.id,\n type: \"crystal\",\n created: c.createdAt,\n project: c.project,\n sessionId: c.sessionId,\n filesAffected: c.filesAffected,\n });\n\n const actionLinks = c.sourceActionIds\n .map((id) => `- [[${id}]]`)\n .join(\"\\n\");\n\n const sections = [\n fm,\n \"\",\n `# Crystal: ${c.narrative.slice(0, 80)}`,\n \"\",\n c.narrative,\n \"\",\n \"## Key Outcomes\",\n ...c.keyOutcomes.map((o) => `- ${o}`),\n ];\n\n if (c.lessons.length > 0) {\n sections.push(\"\", \"## Lessons\", ...c.lessons.map((l) => `- ${l}`));\n }\n if (c.filesAffected.length > 0) {\n sections.push(\"\", \"## Files\", ...c.filesAffected.map((f) => `- \\`${f}\\``));\n }\n if (actionLinks) {\n sections.push(\"\", \"## Source Actions\", actionLinks);\n }\n\n return sections.join(\"\\n\");\n}\n\nfunction sessionToMd(s: Session): string {\n const fm = toFrontmatter({\n id: s.id,\n type: \"session\",\n project: s.project,\n status: s.status,\n started: s.startedAt,\n ended: s.endedAt,\n observations: s.observationCount,\n });\n\n return [\n fm,\n \"\",\n `# Session: ${s.project}`,\n \"\",\n `**Status:** ${s.status}`,\n `**Started:** ${s.startedAt}`,\n s.endedAt ? `**Ended:** ${s.endedAt}` : \"\",\n `**Observations:** ${s.observationCount}`,\n `**CWD:** \\`${s.cwd}\\``,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\ninterface ExportError {\n id: string;\n path: string;\n error: string;\n}\n\nexport function registerObsidianExportFunction(\n sdk: ISdk,\n kv: StateKV,\n): void {\n sdk.registerFunction(\n { id: \"mem::obsidian-export\" },\n async (data: { vaultDir?: string; types?: string[] }) => {\n const vaultDir = data.vaultDir || DEFAULT_VAULT;\n const exportTypes = new Set(\n data.types || [\"memories\", \"lessons\", \"crystals\", \"sessions\"],\n );\n\n const dirs = {\n memories: join(vaultDir, \"memories\"),\n lessons: join(vaultDir, \"lessons\"),\n crystals: join(vaultDir, \"crystals\"),\n sessions: join(vaultDir, \"sessions\"),\n };\n\n await Promise.all(\n Object.values(dirs).map((dir) => mkdir(dir, { recursive: true })),\n );\n\n const stats = { memories: 0, lessons: 0, crystals: 0, sessions: 0 };\n const errors: ExportError[] = [];\n const memoryMoc: string[] = [];\n const lessonMoc: string[] = [];\n const crystalMoc: string[] = [];\n const sessionMoc: string[] = [];\n\n const [memories, lessons, crystals, sessions] = await Promise.all([\n exportTypes.has(\"memories\") ? kv.list<Memory>(KV.memories) : Promise.resolve([] as Memory[]),\n exportTypes.has(\"lessons\") ? kv.list<Lesson>(KV.lessons) : Promise.resolve([] as Lesson[]),\n exportTypes.has(\"crystals\") ? kv.list<Crystal>(KV.crystals) : Promise.resolve([] as Crystal[]),\n exportTypes.has(\"sessions\") ? kv.list<Session>(KV.sessions) : Promise.resolve([] as Session[]),\n ]);\n\n for (const m of memories.filter((m) => m.isLatest)) {\n const filename = `${sanitize(m.id)}.md`;\n const filepath = join(dirs.memories, filename);\n try {\n await writeFile(filepath, memoryToMd(m));\n stats.memories++;\n memoryMoc.push(`- [[memories/${sanitize(m.id)}|${m.title}]] (${m.type}, strength: ${m.strength})`);\n } catch (err) {\n errors.push({ id: m.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n for (const l of lessons.filter((l) => !l.deleted)) {\n const filename = `${sanitize(l.id)}.md`;\n const filepath = join(dirs.lessons, filename);\n try {\n await writeFile(filepath, lessonToMd(l));\n stats.lessons++;\n lessonMoc.push(`- [[lessons/${sanitize(l.id)}|${l.content.slice(0, 60)}]] (confidence: ${l.confidence})`);\n } catch (err) {\n errors.push({ id: l.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n for (const c of crystals) {\n const filename = `${sanitize(c.id)}.md`;\n const filepath = join(dirs.crystals, filename);\n try {\n await writeFile(filepath, crystalToMd(c));\n stats.crystals++;\n crystalMoc.push(`- [[crystals/${sanitize(c.id)}|${c.narrative.slice(0, 60)}]]`);\n } catch (err) {\n errors.push({ id: c.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n const recent = sessions\n .sort(\n (a, b) =>\n new Date(b.startedAt).getTime() -\n new Date(a.startedAt).getTime(),\n )\n .slice(0, 50);\n for (const s of recent) {\n const filename = `${sanitize(s.id)}.md`;\n const filepath = join(dirs.sessions, filename);\n try {\n await writeFile(filepath, sessionToMd(s));\n stats.sessions++;\n sessionMoc.push(`- [[sessions/${sanitize(s.id)}|${s.project} (${s.status})]]`);\n } catch (err) {\n errors.push({ id: s.id, path: filepath, error: err instanceof Error ? err.message : String(err) });\n }\n }\n\n const exportedAt = new Date().toISOString();\n const moc = [\n \"---\",\n \"type: moc\",\n `exported: ${exportedAt}`,\n \"---\",\n \"\",\n \"# agentmemory vault\",\n \"\",\n `Exported: ${exportedAt}`,\n \"\",\n `## Memories (${stats.memories})`,\n ...memoryMoc,\n \"\",\n `## Lessons (${stats.lessons})`,\n ...lessonMoc,\n \"\",\n `## Crystals (${stats.crystals})`,\n ...crystalMoc,\n \"\",\n `## Sessions (${stats.sessions})`,\n ...sessionMoc,\n ].join(\"\\n\");\n\n await writeFile(join(vaultDir, \"MOC.md\"), moc);\n\n await recordAudit(kv, \"obsidian_export\", \"mem::obsidian-export\", [], {\n vaultDir,\n stats,\n });\n\n return { success: true, exported: stats, errors: errors.length > 0 ? errors : undefined, vaultDir };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n CompressedObservation,\n EnrichedChunk,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst SLIDING_WINDOW_SYSTEM = `You are a contextual enrichment engine. Given a primary observation and its surrounding context window (previous and next observations from the same session), produce an enriched version.\n\nYour tasks:\n1. ENTITY RESOLUTION: Replace all pronouns, implicit references (\"that framework\", \"the file\", \"it\", \"he/she\") with the explicit entity names found in the context window.\n2. PREFERENCE MAPPING: Extract any user preferences, constraints, or opinions expressed directly or indirectly.\n3. CONTEXT BRIDGES: Add brief contextual links that make this chunk self-contained without reading adjacent chunks.\n\nOutput EXACTLY this XML:\n<enriched>\n <content>The fully enriched, self-contained text with all references resolved</content>\n <resolved_entities>\n <entity original=\"pronoun or reference\" resolved=\"explicit entity name\"/>\n </resolved_entities>\n <preferences>\n <preference>extracted user preference or constraint</preference>\n </preferences>\n <context_bridges>\n <bridge>contextual link to adjacent information</bridge>\n </context_bridges>\n</enriched>\n\nRules:\n- The enriched content MUST be understandable in complete isolation\n- Resolve ALL ambiguous references using the context window\n- Do not hallucinate entities not present in the window\n- Preserve factual accuracy while adding clarity`;\n\nfunction buildWindowPrompt(\n primary: CompressedObservation,\n before: CompressedObservation[],\n after: CompressedObservation[],\n): string {\n const parts: string[] = [];\n\n if (before.length > 0) {\n parts.push(\"=== PRECEDING CONTEXT ===\");\n for (const obs of before) {\n parts.push(`[${obs.type}] ${obs.title}: ${obs.narrative}`);\n if (obs.facts.length > 0) parts.push(`Facts: ${obs.facts.join(\"; \")}`);\n if (obs.concepts.length > 0)\n parts.push(`Concepts: ${obs.concepts.join(\", \")}`);\n }\n }\n\n parts.push(\"\\n=== PRIMARY OBSERVATION (enrich this) ===\");\n parts.push(`Type: ${primary.type}`);\n parts.push(`Title: ${primary.title}`);\n if (primary.subtitle) parts.push(`Subtitle: ${primary.subtitle}`);\n parts.push(`Narrative: ${primary.narrative}`);\n if (primary.facts.length > 0)\n parts.push(`Facts: ${primary.facts.join(\"; \")}`);\n if (primary.concepts.length > 0)\n parts.push(`Concepts: ${primary.concepts.join(\", \")}`);\n if (primary.files.length > 0)\n parts.push(`Files: ${primary.files.join(\", \")}`);\n\n if (after.length > 0) {\n parts.push(\"\\n=== FOLLOWING CONTEXT ===\");\n for (const obs of after) {\n parts.push(`[${obs.type}] ${obs.title}: ${obs.narrative}`);\n if (obs.facts.length > 0) parts.push(`Facts: ${obs.facts.join(\"; \")}`);\n }\n }\n\n return parts.join(\"\\n\");\n}\n\nfunction parseEnrichedXml(xml: string): {\n content: string;\n resolvedEntities: Record<string, string>;\n preferences: string[];\n contextBridges: string[];\n} | null {\n const contentMatch = xml.match(/<content>([\\s\\S]*?)<\\/content>/);\n if (!contentMatch) return null;\n\n const resolvedEntities: Record<string, string> = {};\n const entityRegex =\n /<entity\\s+original=\"([^\"]+)\"\\s+resolved=\"([^\"]+)\"\\s*\\/>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n resolvedEntities[match[1]] = match[2];\n }\n\n const preferences: string[] = [];\n const prefRegex = /<preference>([^<]+)<\\/preference>/g;\n while ((match = prefRegex.exec(xml)) !== null) {\n preferences.push(match[1]);\n }\n\n const contextBridges: string[] = [];\n const bridgeRegex = /<bridge>([^<]+)<\\/bridge>/g;\n while ((match = bridgeRegex.exec(xml)) !== null) {\n contextBridges.push(match[1]);\n }\n\n return {\n content: contentMatch[1].trim(),\n resolvedEntities,\n preferences,\n contextBridges,\n };\n}\n\nexport function registerSlidingWindowFunction(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::enrich-window\",\n description:\n \"Enrich observation using sliding window context for self-containment\",\n },\n async (data: {\n observationId: string;\n sessionId: string;\n lookback?: number;\n lookahead?: number;\n }) => {\n const ctx = getContext();\n const hprev = data.lookback ?? 3;\n const hnext = data.lookahead ?? 2;\n\n const allObs = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n allObs.sort(\n (a, b) =>\n new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),\n );\n\n const primaryIdx = allObs.findIndex((o) => o.id === data.observationId);\n if (primaryIdx === -1) {\n return { success: false, error: \"Observation not found\" };\n }\n\n const primary = allObs[primaryIdx];\n const before = allObs.slice(Math.max(0, primaryIdx - hprev), primaryIdx);\n const after = allObs.slice(primaryIdx + 1, primaryIdx + 1 + hnext);\n\n if (before.length === 0 && after.length === 0) {\n return {\n success: true,\n enriched: null,\n reason: \"No adjacent context available\",\n };\n }\n\n try {\n const prompt = buildWindowPrompt(primary, before, after);\n const response = await provider.compress(\n SLIDING_WINDOW_SYSTEM,\n prompt,\n );\n const parsed = parseEnrichedXml(response);\n\n if (!parsed) {\n ctx.logger.warn(\"Failed to parse enrichment XML\", {\n obsId: data.observationId,\n });\n return { success: false, error: \"parse_failed\" };\n }\n\n const enriched: EnrichedChunk = {\n id: generateId(\"ec\"),\n originalObsId: data.observationId,\n sessionId: data.sessionId,\n content: parsed.content,\n resolvedEntities: parsed.resolvedEntities,\n preferences: parsed.preferences,\n contextBridges: parsed.contextBridges,\n windowStart: Math.max(0, primaryIdx - hprev),\n windowEnd: Math.min(allObs.length - 1, primaryIdx + hnext),\n createdAt: new Date().toISOString(),\n };\n\n await kv.set(\n KV.enrichedChunks(data.sessionId),\n data.observationId,\n enriched,\n );\n\n ctx.logger.info(\"Observation enriched via sliding window\", {\n obsId: data.observationId,\n entitiesResolved: Object.keys(parsed.resolvedEntities).length,\n preferencesFound: parsed.preferences.length,\n bridges: parsed.contextBridges.length,\n });\n\n return { success: true, enriched };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Sliding window enrichment failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::enrich-session\",\n description: \"Enrich all observations in a session using sliding windows\",\n },\n async (data: {\n sessionId: string;\n lookback?: number;\n lookahead?: number;\n minImportance?: number;\n }) => {\n const ctx = getContext();\n const allObs = await kv.list<CompressedObservation>(\n KV.observations(data.sessionId),\n );\n const minImp = data.minImportance ?? 4;\n const toEnrich = allObs.filter((o) => o.importance >= minImp);\n\n let enriched = 0;\n let failed = 0;\n\n for (const obs of toEnrich) {\n try {\n const result = (await sdk.trigger(\"mem::enrich-window\", {\n observationId: obs.id,\n sessionId: data.sessionId,\n lookback: data.lookback ?? 3,\n lookahead: data.lookahead ?? 2,\n })) as { success?: boolean } | undefined;\n if (result?.success) enriched++;\n else failed++;\n } catch {\n failed++;\n }\n }\n\n ctx.logger.info(\"Session enrichment complete\", {\n sessionId: data.sessionId,\n total: toEnrich.length,\n enriched,\n failed,\n });\n\n return { success: true, total: toEnrich.length, enriched, failed };\n },\n );\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n GraphNode,\n GraphEdge,\n GraphEdgeType,\n EdgeContext,\n TemporalState,\n MemoryProvider,\n} from \"../types.js\";\nimport { KV, generateId } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst TEMPORAL_EXTRACTION_SYSTEM = `You are a temporal knowledge extraction engine. Given observations, extract entities AND their temporal relationships with full context metadata.\n\nFor each relationship, you MUST provide:\n1. Semantic relation type\n2. Temporal validity (when this fact became true in the real world)\n3. Context metadata: WHY this relationship exists, what reasoning led to it, what alternatives were considered\n\nOutput EXACTLY this XML:\n<temporal_graph>\n <entities>\n <entity type=\"file|function|concept|error|decision|pattern|library|person|project|preference|location|organization|event\" name=\"exact name\">\n <property key=\"key\">value</property>\n <alias>alternate name</alias>\n </entity>\n </entities>\n <relationships>\n <relationship type=\"uses|imports|modifies|causes|fixes|depends_on|related_to|works_at|prefers|blocked_by|caused_by|optimizes_for|rejected|avoids|located_in|succeeded_by\"\n source=\"entity name\" target=\"entity name\" weight=\"0.1-1.0\"\n valid_from=\"ISO date or 'unknown'\" valid_to=\"ISO date or 'current'\">\n <reasoning>WHY this relationship exists</reasoning>\n <sentiment>positive|negative|neutral</sentiment>\n <alternatives>\n <alt>alternative that was considered</alt>\n </alternatives>\n </relationship>\n </relationships>\n</temporal_graph>\n\nRules:\n- NEVER overwrite existing relationships — always create new versioned edges\n- Extract temporal validity from context clues (\"since last month\", \"in 2024\", \"currently\")\n- Capture reasoning/motivation behind each relationship\n- Weight relationships by directness: 1.0 = explicit statement, 0.5 = inferred, 0.1 = speculative`;\n\nfunction parseTemporalGraphXml(\n xml: string,\n observationIds: string[],\n): { nodes: GraphNode[]; edges: GraphEdge[] } {\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const now = new Date().toISOString();\n\n const entityRegex =\n /<entity\\s+type=\"([^\"]+)\"\\s+name=\"([^\"]+)\"[^>]*>([\\s\\S]*?)<\\/entity>/g;\n let match;\n while ((match = entityRegex.exec(xml)) !== null) {\n const type = match[1] as GraphNode[\"type\"];\n const name = match[2];\n const propsBlock = match[3];\n const properties: Record<string, string> = {};\n const aliases: string[] = [];\n\n const propRegex = /<property\\s+key=\"([^\"]+)\">([^<]*)<\\/property>/g;\n let propMatch;\n while ((propMatch = propRegex.exec(propsBlock)) !== null) {\n properties[propMatch[1]] = propMatch[2];\n }\n\n const aliasRegex = /<alias>([^<]+)<\\/alias>/g;\n while ((propMatch = aliasRegex.exec(propsBlock)) !== null) {\n aliases.push(propMatch[1]);\n }\n\n nodes.push({\n id: generateId(\"gn\"),\n type,\n name,\n properties,\n sourceObservationIds: observationIds,\n createdAt: now,\n aliases: aliases.length > 0 ? aliases : undefined,\n });\n }\n\n const relRegex =\n /<relationship\\s+type=\"([^\"]+)\"\\s+source=\"([^\"]+)\"\\s+target=\"([^\"]+)\"\\s+weight=\"([^\"]+)\"(?:\\s+valid_from=\"([^\"]*)\")?(?:\\s+valid_to=\"([^\"]*)\")?[^>]*>([\\s\\S]*?)<\\/relationship>/g;\n while ((match = relRegex.exec(xml)) !== null) {\n const type = match[1] as GraphEdgeType;\n const sourceName = match[2];\n const targetName = match[3];\n const parsedWeight = parseFloat(match[4]);\n const weight = Number.isNaN(parsedWeight) ? 0.5 : parsedWeight;\n const validFrom = match[5] || undefined;\n const validTo = match[6] || undefined;\n const metaBlock = match[7] || \"\";\n\n const sourceNode = nodes.find(\n (n) =>\n n.name === sourceName ||\n (n.aliases && n.aliases.includes(sourceName)),\n );\n const targetNode = nodes.find(\n (n) =>\n n.name === targetName ||\n (n.aliases && n.aliases.includes(targetName)),\n );\n\n if (sourceNode && targetNode) {\n const reasoning =\n metaBlock.match(/<reasoning>([^<]*)<\\/reasoning>/)?.[1] || undefined;\n const sentiment =\n metaBlock.match(/<sentiment>([^<]*)<\\/sentiment>/)?.[1] || undefined;\n const alternatives: string[] = [];\n const altRegex = /<alt>([^<]+)<\\/alt>/g;\n let altMatch;\n while ((altMatch = altRegex.exec(metaBlock)) !== null) {\n alternatives.push(altMatch[1]);\n }\n\n const context: EdgeContext = {};\n if (reasoning) context.reasoning = reasoning;\n if (sentiment) context.sentiment = sentiment;\n if (alternatives.length > 0) context.alternatives = alternatives;\n context.confidence = Math.max(0, Math.min(1, weight));\n\n edges.push({\n id: generateId(\"ge\"),\n type,\n sourceNodeId: sourceNode.id,\n targetNodeId: targetNode.id,\n weight: Math.max(0, Math.min(1, weight)),\n sourceObservationIds: observationIds,\n createdAt: now,\n tcommit: now,\n tvalid:\n validFrom && validFrom !== \"unknown\" ? validFrom : undefined,\n tvalidEnd:\n validTo && validTo !== \"current\" ? validTo : undefined,\n context: Object.keys(context).length > 0 ? context : undefined,\n version: 1,\n isLatest: true,\n });\n }\n }\n\n return { nodes, edges };\n}\n\nexport function registerTemporalGraphFunctions(\n sdk: ISdk,\n kv: StateKV,\n provider: MemoryProvider,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::temporal-graph-extract\",\n description:\n \"Extract temporal knowledge graph with context metadata from observations\",\n },\n async (data: {\n observations: Array<{\n id: string;\n title: string;\n narrative: string;\n concepts: string[];\n files: string[];\n type: string;\n timestamp: string;\n }>;\n }) => {\n const ctx = getContext();\n if (!data.observations || data.observations.length === 0) {\n return { success: false, error: \"No observations provided\" };\n }\n\n const items = data.observations\n .map(\n (o, i) =>\n `[${i + 1}] Type: ${o.type}\\nTimestamp: ${o.timestamp}\\nTitle: ${o.title}\\nNarrative: ${o.narrative}\\nConcepts: ${(o.concepts ?? []).join(\", \")}\\nFiles: ${(o.files ?? []).join(\", \")}`,\n )\n .join(\"\\n\\n\");\n\n try {\n const response = await provider.compress(\n TEMPORAL_EXTRACTION_SYSTEM,\n `Extract temporal knowledge graph from:\\n\\n${items}`,\n );\n\n const obsIds = data.observations.map((o) => o.id);\n const { nodes, edges } = parseTemporalGraphXml(response, obsIds);\n\n const existingNodes = await kv.list<GraphNode>(KV.graphNodes);\n const existingEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const idRemap = new Map<string, string>();\n for (const node of nodes) {\n const existing = existingNodes.find(\n (n) =>\n n.name === node.name && n.type === node.type,\n );\n if (existing) {\n const oldId = node.id;\n const merged = {\n ...existing,\n sourceObservationIds: [\n ...new Set([\n ...existing.sourceObservationIds,\n ...obsIds,\n ]),\n ],\n properties: { ...existing.properties, ...node.properties },\n updatedAt: new Date().toISOString(),\n aliases: [\n ...new Set([\n ...(existing.aliases || []),\n ...(node.aliases || []),\n ]),\n ],\n };\n if (merged.aliases.length === 0) delete (merged as any).aliases;\n await kv.set(KV.graphNodes, existing.id, merged);\n node.id = existing.id;\n idRemap.set(oldId, existing.id);\n } else {\n await kv.set(KV.graphNodes, node.id, node);\n existingNodes.push(node);\n }\n }\n\n for (const edge of edges) {\n if (idRemap.has(edge.sourceNodeId)) {\n edge.sourceNodeId = idRemap.get(edge.sourceNodeId)!;\n }\n if (idRemap.has(edge.targetNodeId)) {\n edge.targetNodeId = idRemap.get(edge.targetNodeId)!;\n }\n const existingKey = `${edge.sourceNodeId}|${edge.targetNodeId}|${edge.type}`;\n const existingEdge = existingEdges.find(\n (e) =>\n `${e.sourceNodeId}|${e.targetNodeId}|${e.type}` ===\n existingKey,\n );\n\n if (existingEdge) {\n const updatedOld = {\n ...existingEdge,\n isLatest: false,\n tvalidEnd:\n existingEdge.tvalidEnd || new Date().toISOString(),\n supersededBy: edge.id,\n };\n await kv.set(KV.graphEdges, existingEdge.id, updatedOld);\n\n await kv.set(KV.graphEdgeHistory, existingEdge.id, updatedOld);\n\n edge.version = (existingEdge.version || 1) + 1;\n }\n\n await kv.set(KV.graphEdges, edge.id, edge);\n existingEdges.push(edge);\n }\n\n ctx.logger.info(\"Temporal graph extraction complete\", {\n nodes: nodes.length,\n edges: edges.length,\n });\n return {\n success: true,\n nodesAdded: nodes.length,\n edgesAdded: edges.length,\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n ctx.logger.error(\"Temporal graph extraction failed\", { error: msg });\n return { success: false, error: msg };\n }\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::temporal-query\",\n description:\n \"Query entity state at a specific point in time with full history\",\n },\n async (data: {\n entityName: string;\n asOf?: string;\n includeHistory?: boolean;\n }): Promise<TemporalState | { error: string }> => {\n const allNodes = await kv.list<GraphNode>(KV.graphNodes);\n const allEdges = await kv.list<GraphEdge>(KV.graphEdges);\n\n const entity = allNodes.find(\n (n) =>\n n.name.toLowerCase() === data.entityName.toLowerCase() ||\n (n.aliases &&\n n.aliases.some(\n (a) =>\n a.toLowerCase() === data.entityName.toLowerCase(),\n )),\n );\n\n if (!entity) {\n return { error: `Entity \"${data.entityName}\" not found` } as any;\n }\n\n const relatedEdges = allEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n const historicalEdges = await kv\n .list<GraphEdge>(KV.graphEdgeHistory)\n .catch(() => [] as GraphEdge[]);\n const entityHistory = historicalEdges.filter(\n (e) => e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n );\n\n const allEntityEdges = [...relatedEdges, ...entityHistory];\n\n if (data.asOf) {\n const asOfTime = new Date(data.asOf).getTime();\n const validEdges = allEntityEdges.filter((e) => {\n const commitTime = new Date(\n e.tcommit || e.createdAt,\n ).getTime();\n if (commitTime > asOfTime) return false;\n if (e.tvalid) {\n const validTime = new Date(e.tvalid).getTime();\n if (validTime > asOfTime) return false;\n }\n if (e.tvalidEnd) {\n const endTime = new Date(e.tvalidEnd).getTime();\n if (endTime < asOfTime) return false;\n }\n return true;\n });\n\n const currentEdges = getLatestByKey(validEdges);\n const historical = data.includeHistory ? validEdges : [];\n\n return {\n entity,\n currentEdges,\n historicalEdges: historical,\n timeline: buildTimeline(allEntityEdges),\n };\n }\n\n const currentEdges = relatedEdges.filter(\n (e) => e.isLatest !== false,\n );\n\n return {\n entity,\n currentEdges,\n historicalEdges: data.includeHistory ? entityHistory : [],\n timeline: buildTimeline(allEntityEdges),\n };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::differential-state\",\n description:\n \"Compute state changes between two entities over time\",\n },\n async (data: {\n entityName: string;\n from?: string;\n to?: string;\n }) => {\n const allNodes = await kv.list<GraphNode>(KV.graphNodes);\n const allEdges = await kv.list<GraphEdge>(KV.graphEdges);\n const historicalEdges = await kv\n .list<GraphEdge>(KV.graphEdgeHistory)\n .catch(() => [] as GraphEdge[]);\n\n const entity = allNodes.find(\n (n) => n.name.toLowerCase() === data.entityName.toLowerCase(),\n );\n if (!entity) return { error: \"Entity not found\" };\n\n const allEntityEdges = [\n ...allEdges.filter(\n (e) =>\n e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n ),\n ...historicalEdges.filter(\n (e) =>\n e.sourceNodeId === entity.id || e.targetNodeId === entity.id,\n ),\n ];\n\n allEntityEdges.sort(\n (a, b) =>\n new Date(a.tcommit || a.createdAt).getTime() -\n new Date(b.tcommit || b.createdAt).getTime(),\n );\n\n const fromTime = data.from\n ? new Date(data.from).getTime()\n : 0;\n const toTime = data.to\n ? new Date(data.to).getTime()\n : Date.now();\n\n const filtered = allEntityEdges.filter((e) => {\n const t = new Date(e.tcommit || e.createdAt).getTime();\n return t >= fromTime && t <= toTime;\n });\n\n const changes = filtered.map((e) => ({\n type: e.type,\n target:\n e.sourceNodeId === entity.id\n ? e.targetNodeId\n : e.sourceNodeId,\n validFrom: e.tvalid || e.createdAt,\n validTo: e.tvalidEnd,\n reasoning: e.context?.reasoning,\n sentiment: e.context?.sentiment,\n version: e.version || 1,\n isLatest: e.isLatest !== false,\n }));\n\n return {\n entity: entity.name,\n totalChanges: changes.length,\n changes,\n };\n },\n );\n}\n\nfunction getLatestByKey(edges: GraphEdge[]): GraphEdge[] {\n const byKey = new Map<string, GraphEdge>();\n for (const e of edges) {\n const key = `${e.sourceNodeId}|${e.targetNodeId}|${e.type}`;\n const existing = byKey.get(key);\n if (\n !existing ||\n new Date(e.tcommit || e.createdAt).getTime() >\n new Date(existing.tcommit || existing.createdAt).getTime()\n ) {\n byKey.set(key, e);\n }\n }\n return Array.from(byKey.values());\n}\n\nfunction buildTimeline(\n edges: GraphEdge[],\n): Array<{\n edge: GraphEdge;\n validFrom: string;\n validTo?: string;\n context?: EdgeContext;\n}> {\n const sorted = [...edges].sort(\n (a, b) =>\n new Date(a.tcommit || a.createdAt).getTime() -\n new Date(b.tcommit || b.createdAt).getTime(),\n );\n\n return sorted.map((e) => ({\n edge: e,\n validFrom: e.tvalid || e.createdAt,\n validTo: e.tvalidEnd,\n context: e.context,\n }));\n}\n","import type { ISdk } from \"iii-sdk\";\nimport { getContext } from \"iii-sdk\";\nimport type {\n Memory,\n SemanticMemory,\n RetentionScore,\n DecayConfig,\n} from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport type { StateKV } from \"../state/kv.js\";\n\nconst DEFAULT_DECAY: DecayConfig = {\n lambda: 0.01,\n sigma: 0.3,\n tierThresholds: {\n hot: 0.7,\n warm: 0.4,\n cold: 0.15,\n },\n};\n\nfunction computeRetention(\n salience: number,\n createdAt: string,\n accessTimestamps: number[],\n config: DecayConfig,\n): number {\n const now = Date.now();\n const deltaT = (now - new Date(createdAt).getTime()) / (1000 * 60 * 60 * 24);\n\n const temporalDecay = Math.exp(-config.lambda * deltaT);\n\n let reinforcementBoost = 0;\n for (const tAccess of accessTimestamps) {\n const daysSinceAccess =\n (now - tAccess) / (1000 * 60 * 60 * 24);\n if (daysSinceAccess > 0) {\n reinforcementBoost += 1 / daysSinceAccess;\n }\n }\n reinforcementBoost *= config.sigma;\n\n return Math.min(1, salience * temporalDecay + reinforcementBoost);\n}\n\nfunction computeSalience(\n memory: Memory | SemanticMemory,\n accessCount: number,\n): number {\n let baseSalience = 0.5;\n\n if (\"type\" in memory) {\n const typeWeights: Record<string, number> = {\n architecture: 0.9,\n bug: 0.7,\n pattern: 0.8,\n preference: 0.85,\n workflow: 0.6,\n fact: 0.5,\n };\n baseSalience = typeWeights[(memory as Memory).type] || 0.5;\n }\n\n if (\"confidence\" in memory) {\n baseSalience = Math.max(baseSalience, (memory as SemanticMemory).confidence);\n }\n\n const accessBonus = Math.min(0.2, accessCount * 0.02);\n return Math.min(1, baseSalience + accessBonus);\n}\n\nexport function registerRetentionFunctions(\n sdk: ISdk,\n kv: StateKV,\n): void {\n sdk.registerFunction(\n {\n id: \"mem::retention-score\",\n description:\n \"Compute retention scores for all memories using time-frequency decay\",\n },\n async (data: { config?: Partial<DecayConfig> }) => {\n const ctx = getContext();\n const config = { ...DEFAULT_DECAY, ...data.config };\n\n const memories = await kv.list<Memory>(KV.memories);\n const semanticMems = await kv.list<SemanticMemory>(KV.semantic);\n\n const scores: RetentionScore[] = [];\n\n for (const mem of memories) {\n if (!mem.isLatest) continue;\n const salience = computeSalience(mem, 0);\n const score = computeRetention(\n salience,\n mem.createdAt,\n [],\n config,\n );\n\n const entry: RetentionScore = {\n memoryId: mem.id,\n score,\n salience,\n temporalDecay: Math.exp(\n -config.lambda *\n ((Date.now() - new Date(mem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n reinforcementBoost: 0,\n lastAccessed: mem.updatedAt,\n accessCount: 0,\n };\n\n scores.push(entry);\n await kv.set(KV.retentionScores, mem.id, entry);\n }\n\n for (const sem of semanticMems) {\n const accessTimestamps = sem.lastAccessedAt\n ? [new Date(sem.lastAccessedAt).getTime()]\n : [];\n const salience = computeSalience(sem, sem.accessCount);\n const score = computeRetention(\n salience,\n sem.createdAt,\n accessTimestamps,\n config,\n );\n\n const entry: RetentionScore = {\n memoryId: sem.id,\n score,\n salience,\n temporalDecay: Math.exp(\n -config.lambda *\n ((Date.now() - new Date(sem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n reinforcementBoost:\n score - salience * Math.exp(\n -config.lambda *\n ((Date.now() - new Date(sem.createdAt).getTime()) /\n (1000 * 60 * 60 * 24)),\n ),\n lastAccessed: sem.lastAccessedAt,\n accessCount: sem.accessCount,\n };\n\n scores.push(entry);\n await kv.set(KV.retentionScores, sem.id, entry);\n }\n\n scores.sort((a, b) => b.score - a.score);\n\n const tiers = {\n hot: scores.filter((s) => s.score >= config.tierThresholds.hot)\n .length,\n warm: scores.filter(\n (s) =>\n s.score >= config.tierThresholds.warm &&\n s.score < config.tierThresholds.hot,\n ).length,\n cold: scores.filter(\n (s) =>\n s.score >= config.tierThresholds.cold &&\n s.score < config.tierThresholds.warm,\n ).length,\n evictable: scores.filter(\n (s) => s.score < config.tierThresholds.cold,\n ).length,\n };\n\n ctx.logger.info(\"Retention scores computed\", {\n total: scores.length,\n ...tiers,\n });\n\n return { success: true, total: scores.length, tiers, scores };\n },\n );\n\n sdk.registerFunction(\n {\n id: \"mem::retention-evict\",\n description:\n \"Evict memories below retention threshold (tiered storage)\",\n },\n async (data: {\n threshold?: number;\n dryRun?: boolean;\n maxEvict?: number;\n }) => {\n const ctx = getContext();\n const threshold = data.threshold ?? DEFAULT_DECAY.tierThresholds.cold;\n const maxEvict = data.maxEvict ?? 50;\n\n const allScores = await kv.list<RetentionScore>(KV.retentionScores);\n const candidates = allScores\n .filter((s) => s.score < threshold)\n .sort((a, b) => a.score - b.score)\n .slice(0, maxEvict);\n\n if (data.dryRun) {\n return {\n success: true,\n dryRun: true,\n wouldEvict: candidates.length,\n candidates: candidates.map((c) => ({\n id: c.memoryId,\n score: c.score,\n })),\n };\n }\n\n let evicted = 0;\n for (const candidate of candidates) {\n try {\n await kv.delete(KV.memories, candidate.memoryId);\n await kv.delete(KV.retentionScores, candidate.memoryId);\n evicted++;\n } catch {\n continue;\n }\n }\n\n ctx.logger.info(\"Retention-based eviction complete\", {\n evicted,\n threshold,\n });\n\n return { success: true, evicted };\n },\n );\n}\n","import type { HealthSnapshot } from \"../types.js\";\n\ninterface ThresholdConfig {\n eventLoopLagWarnMs: number;\n eventLoopLagCriticalMs: number;\n cpuWarnPercent: number;\n cpuCriticalPercent: number;\n memoryWarnPercent: number;\n memoryCriticalPercent: number;\n}\n\nconst DEFAULTS: ThresholdConfig = {\n eventLoopLagWarnMs: 100,\n eventLoopLagCriticalMs: 500,\n cpuWarnPercent: 80,\n cpuCriticalPercent: 90,\n memoryWarnPercent: 80,\n memoryCriticalPercent: 95,\n};\n\nexport function evaluateHealth(\n snapshot: HealthSnapshot,\n config: Partial<ThresholdConfig> = {},\n): { status: \"healthy\" | \"degraded\" | \"critical\"; alerts: string[] } {\n const cfg = { ...DEFAULTS, ...config };\n const alerts: string[] = [];\n let critical = false;\n let degraded = false;\n\n if (\n snapshot.connectionState === \"disconnected\" ||\n snapshot.connectionState === \"failed\"\n ) {\n alerts.push(`connection_${snapshot.connectionState}`);\n critical = true;\n } else if (snapshot.connectionState === \"reconnecting\") {\n alerts.push(\"connection_reconnecting\");\n degraded = true;\n }\n\n if (snapshot.eventLoopLagMs > cfg.eventLoopLagCriticalMs) {\n alerts.push(\n `event_loop_lag_critical_${Math.round(snapshot.eventLoopLagMs)}ms`,\n );\n critical = true;\n } else if (snapshot.eventLoopLagMs > cfg.eventLoopLagWarnMs) {\n alerts.push(`event_loop_lag_warn_${Math.round(snapshot.eventLoopLagMs)}ms`);\n degraded = true;\n }\n\n if (snapshot.cpu.percent > cfg.cpuCriticalPercent) {\n alerts.push(`cpu_critical_${Math.round(snapshot.cpu.percent)}%`);\n critical = true;\n } else if (snapshot.cpu.percent > cfg.cpuWarnPercent) {\n alerts.push(`cpu_warn_${Math.round(snapshot.cpu.percent)}%`);\n degraded = true;\n }\n\n const memPercent =\n snapshot.memory.heapTotal > 0\n ? (snapshot.memory.heapUsed / snapshot.memory.heapTotal) * 100\n : 0;\n if (memPercent > cfg.memoryCriticalPercent) {\n alerts.push(`memory_critical_${Math.round(memPercent)}%`);\n critical = true;\n } else if (memPercent > cfg.memoryWarnPercent) {\n alerts.push(`memory_warn_${Math.round(memPercent)}%`);\n degraded = true;\n }\n\n const status = critical ? \"critical\" : degraded ? \"degraded\" : \"healthy\";\n return { status, alerts };\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { HealthSnapshot } from \"../types.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport { evaluateHealth } from \"./thresholds.js\";\n\nexport function registerHealthMonitor(\n sdk: ISdk,\n kv: StateKV,\n): { stop: () => void } {\n let connectionState = \"connected\";\n let prevCpuUsage = process.cpuUsage();\n let prevCpuTime = Date.now();\n\n if (typeof sdk.on === \"function\") {\n sdk.on(\"connection_state\", (state?: unknown) => {\n connectionState = state as string;\n });\n }\n\n async function collectHealth(): Promise<HealthSnapshot> {\n const mem = process.memoryUsage();\n const currentCpu = process.cpuUsage();\n const now = Date.now();\n const uptime = process.uptime();\n\n const elapsedMs = now - prevCpuTime;\n const userDelta = currentCpu.user - prevCpuUsage.user;\n const systemDelta = currentCpu.system - prevCpuUsage.system;\n const cpuPercent =\n elapsedMs > 0 ? ((userDelta + systemDelta) / 1000 / elapsedMs) * 100 : 0;\n prevCpuUsage = currentCpu;\n prevCpuTime = now;\n\n const startMark = performance.now();\n await new Promise((resolve) => setImmediate(resolve));\n const eventLoopLagMs = performance.now() - startMark;\n\n let workers: HealthSnapshot[\"workers\"] = [];\n try {\n const result = await sdk.trigger<\n unknown,\n { workers?: HealthSnapshot[\"workers\"] }\n >(\"engine::workers::list\", {});\n if (result?.workers) workers = result.workers;\n } catch {}\n\n const KV_PROBE_TIMEOUT = 5000;\n let kvConnectivity: { status: string; latencyMs?: number; error?: string };\n const kvStart = performance.now();\n try {\n await Promise.race([\n (async () => {\n await kv.set(KV.health, \"_probe\", { ts: Date.now() });\n await kv.get(KV.health, \"_probe\");\n })(),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error(\"timeout\")), KV_PROBE_TIMEOUT),\n ),\n ]);\n kvConnectivity = { status: \"ok\", latencyMs: Math.round((performance.now() - kvStart) * 100) / 100 };\n } catch {\n kvConnectivity = { status: \"error\", error: \"kv_probe_failed\", latencyMs: Math.round((performance.now() - kvStart) * 100) / 100 };\n }\n\n const snapshot: HealthSnapshot = {\n connectionState,\n workers,\n memory: {\n heapUsed: mem.heapUsed,\n heapTotal: mem.heapTotal,\n rss: mem.rss,\n external: mem.external,\n },\n cpu: {\n userMicros: currentCpu.user,\n systemMicros: currentCpu.system,\n percent: Math.round(cpuPercent * 100) / 100,\n },\n eventLoopLagMs,\n uptimeSeconds: uptime,\n kvConnectivity,\n status: \"healthy\",\n alerts: [],\n };\n\n const evaluated = evaluateHealth(snapshot);\n snapshot.status = evaluated.status;\n snapshot.alerts = evaluated.alerts;\n\n await kv.set(KV.health, \"latest\", snapshot).catch(() => {});\n return snapshot;\n }\n\n collectHealth().catch(() => {});\n const interval = setInterval(() => {\n collectHealth().catch(() => {});\n }, 30_000);\n interval.unref();\n\n return {\n stop: () => clearInterval(interval),\n };\n}\n\nexport async function getLatestHealth(\n kv: StateKV,\n): Promise<HealthSnapshot | null> {\n return kv.get<HealthSnapshot>(KV.health, \"latest\");\n}\n","import { timingSafeEqual, createHmac, randomBytes } from \"node:crypto\";\n\nconst hmacKey = randomBytes(32);\n\nexport function timingSafeCompare(a: string, b: string): boolean {\n const hmacA = createHmac(\"sha256\", hmacKey).update(a).digest();\n const hmacB = createHmac(\"sha256\", hmacKey).update(b).digest();\n return timingSafeEqual(hmacA, hmacB);\n}\n\nexport const VIEWER_CSP =\n \"default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; connect-src 'self' ws://localhost:* wss://localhost:*; img-src 'self'; font-src 'self'\";\n","import type { ISdk, ApiRequest } from \"iii-sdk\";\nimport type { Session, CompressedObservation, HookPayload } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { getLatestHealth } from \"../health/monitor.js\";\nimport type { MetricsStore } from \"../eval/metrics-store.js\";\nimport type { ResilientProvider } from \"../providers/resilient.js\";\nimport { VERSION } from \"../version.js\";\nimport { timingSafeCompare, VIEWER_CSP } from \"../auth.js\";\n\ntype Response = {\n status_code: number;\n headers?: Record<string, string>;\n body: unknown;\n};\n\nfunction checkAuth(\n req: ApiRequest,\n secret: string | undefined,\n): Response | null {\n if (!secret) return null;\n const auth = req.headers?.[\"authorization\"] || req.headers?.[\"Authorization\"];\n if (\n typeof auth !== \"string\" ||\n !timingSafeCompare(auth, `Bearer ${secret}`)\n ) {\n return { status_code: 401, body: { error: \"unauthorized\" } };\n }\n return null;\n}\n\nexport function registerApiTriggers(\n sdk: ISdk,\n kv: StateKV,\n secret?: string,\n metricsStore?: MetricsStore,\n provider?: ResilientProvider | { circuitState?: unknown },\n): void {\n sdk.registerFunction(\n { id: \"api::liveness\" },\n async (): Promise<Response> => ({\n status_code: 200,\n body: { status: \"ok\", service: \"agentmemory\" },\n }),\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::liveness\",\n config: { api_path: \"/agentmemory/livez\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::health\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const health = await getLatestHealth(kv);\n const functionMetrics = metricsStore ? await metricsStore.getAll() : [];\n const circuitBreaker =\n provider && \"circuitState\" in provider ? provider.circuitState : null;\n\n const status = health?.status || \"healthy\";\n const statusCode = status === \"critical\" ? 503 : 200;\n\n return {\n status_code: statusCode,\n body: {\n status,\n service: \"agentmemory\",\n version: VERSION,\n health: health || null,\n functionMetrics,\n circuitBreaker,\n },\n };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::health\",\n config: { api_path: \"/agentmemory/health\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::observe\" },\n async (req: ApiRequest<HookPayload>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::observe\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::observe\",\n config: { api_path: \"/agentmemory/observe\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::context\" },\n async (\n req: ApiRequest<{ sessionId: string; project: string; budget?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::context\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::context\",\n config: { api_path: \"/agentmemory/context\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::search\" },\n async (\n req: ApiRequest<{ query: string; limit?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::search\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::search\",\n config: { api_path: \"/agentmemory/search\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::session::start\" },\n async (\n req: ApiRequest<{ sessionId: string; project: string; cwd: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const { sessionId, project, cwd } = req.body;\n const session: Session = {\n id: sessionId,\n project,\n cwd,\n startedAt: new Date().toISOString(),\n status: \"active\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, sessionId, session);\n const contextResult = await sdk.trigger<\n { sessionId: string; project: string },\n { context: string }\n >(\"mem::context\", { sessionId, project });\n return {\n status_code: 200,\n body: { session, context: contextResult.context },\n };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::session::start\",\n config: { api_path: \"/agentmemory/session/start\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::session::end\" },\n async (req: ApiRequest<{ sessionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const session = await kv.get<Session>(KV.sessions, req.body.sessionId);\n if (session) {\n await kv.set(KV.sessions, req.body.sessionId, {\n ...session,\n endedAt: new Date().toISOString(),\n status: \"completed\",\n });\n }\n return { status_code: 200, body: { success: true } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::session::end\",\n config: { api_path: \"/agentmemory/session/end\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::summarize\" },\n async (req: ApiRequest<{ sessionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::summarize\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::summarize\",\n config: { api_path: \"/agentmemory/summarize\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::sessions\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const sessions = await kv.list<Session>(KV.sessions);\n return { status_code: 200, body: { sessions } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::sessions\",\n config: { api_path: \"/agentmemory/sessions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::observations\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const sessionId = req.query_params[\"sessionId\"] as string;\n if (!sessionId)\n return { status_code: 400, body: { error: \"sessionId required\" } };\n const observations = await kv.list<CompressedObservation>(\n KV.observations(sessionId),\n );\n return { status_code: 200, body: { observations } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::observations\",\n config: { api_path: \"/agentmemory/observations\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::file-context\" },\n async (\n req: ApiRequest<{ sessionId: string; files: string[] }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::file-context\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::file-context\",\n config: { api_path: \"/agentmemory/file-context\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::enrich\" },\n async (\n req: ApiRequest<{\n sessionId: string;\n files: string[];\n terms?: string[];\n toolName?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.sessionId ||\n typeof req.body.sessionId !== \"string\" ||\n !Array.isArray(req.body?.files) ||\n req.body.files.length === 0 ||\n !req.body.files.every((f: unknown) => typeof f === \"string\")\n ) {\n return {\n status_code: 400,\n body: {\n error: \"sessionId (string) and files (string[]) are required\",\n },\n };\n }\n if (\n req.body.terms !== undefined &&\n (!Array.isArray(req.body.terms) ||\n !req.body.terms.every((t: unknown) => typeof t === \"string\"))\n ) {\n return {\n status_code: 400,\n body: { error: \"terms must be an array of strings\" },\n };\n }\n const result = await sdk.trigger(\"mem::enrich\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::enrich\",\n config: { api_path: \"/agentmemory/enrich\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::remember\" },\n async (\n req: ApiRequest<{\n content: string;\n type?: string;\n concepts?: string[];\n files?: string[];\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.content ||\n typeof req.body.content !== \"string\" ||\n !req.body.content.trim()\n ) {\n return { status_code: 400, body: { error: \"content is required\" } };\n }\n const result = await sdk.trigger(\"mem::remember\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::remember\",\n config: { api_path: \"/agentmemory/remember\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::forget\" },\n async (\n req: ApiRequest<{\n sessionId?: string;\n observationIds?: string[];\n memoryId?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sessionId && !req.body?.memoryId) {\n return {\n status_code: 400,\n body: { error: \"sessionId or memoryId is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::forget\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::forget\",\n config: { api_path: \"/agentmemory/forget\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::consolidate\" },\n async (\n req: ApiRequest<{ project?: string; minObservations?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::consolidate\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::consolidate\",\n config: { api_path: \"/agentmemory/consolidate\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::patterns\" },\n async (req: ApiRequest<{ project?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::patterns\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::patterns\",\n config: { api_path: \"/agentmemory/patterns\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::generate-rules\" },\n async (req: ApiRequest<{ project?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::generate-rules\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::generate-rules\",\n config: { api_path: \"/agentmemory/generate-rules\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::migrate\" },\n async (req: ApiRequest<{ dbPath: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.dbPath || typeof req.body.dbPath !== \"string\") {\n return { status_code: 400, body: { error: \"dbPath is required\" } };\n }\n const result = await sdk.trigger(\"mem::migrate\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::migrate\",\n config: { api_path: \"/agentmemory/migrate\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::evict\" },\n async (req: ApiRequest<{ dryRun?: boolean }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const dryRun =\n req.query_params?.[\"dryRun\"] === \"true\" || req.body?.dryRun === true;\n const result = await sdk.trigger(\"mem::evict\", { dryRun });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::evict\",\n config: { api_path: \"/agentmemory/evict\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::smart-search\" },\n async (\n req: ApiRequest<{ query?: string; expandIds?: string[]; limit?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !req.body?.query &&\n (!req.body?.expandIds || req.body.expandIds.length === 0)\n ) {\n return {\n status_code: 400,\n body: { error: \"query or expandIds is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::smart-search\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::smart-search\",\n config: { api_path: \"/agentmemory/smart-search\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::timeline\" },\n async (\n req: ApiRequest<{\n anchor: string;\n project?: string;\n before?: number;\n after?: number;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.anchor) {\n return { status_code: 400, body: { error: \"anchor is required\" } };\n }\n const result = await sdk.trigger(\"mem::timeline\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::timeline\",\n config: { api_path: \"/agentmemory/timeline\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::profile\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const project = req.query_params[\"project\"] as string;\n if (!project) {\n return {\n status_code: 400,\n body: { error: \"project query param is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::profile\", { project });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::profile\",\n config: { api_path: \"/agentmemory/profile\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::export\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::export\", {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::export\",\n config: { api_path: \"/agentmemory/export\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::import\" },\n async (\n req: ApiRequest<{\n exportData: unknown;\n strategy?: \"merge\" | \"replace\" | \"skip\";\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.exportData) {\n return { status_code: 400, body: { error: \"exportData is required\" } };\n }\n const result = await sdk.trigger(\"mem::import\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::import\",\n config: { api_path: \"/agentmemory/import\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::relations\" },\n async (\n req: ApiRequest<{ sourceId: string; targetId: string; type: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sourceId || !req.body?.targetId || !req.body?.type) {\n return {\n status_code: 400,\n body: { error: \"sourceId, targetId, and type are required\" },\n };\n }\n const result = await sdk.trigger(\"mem::relate\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::relations\",\n config: { api_path: \"/agentmemory/relations\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::evolve\" },\n async (\n req: ApiRequest<{\n memoryId: string;\n newContent: string;\n newTitle?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.memoryId || !req.body?.newContent) {\n return {\n status_code: 400,\n body: { error: \"memoryId and newContent are required\" },\n };\n }\n const result = await sdk.trigger(\"mem::evolve\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::evolve\",\n config: { api_path: \"/agentmemory/evolve\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::auto-forget\" },\n async (req: ApiRequest<{ dryRun?: boolean }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const dryRun =\n req.query_params?.[\"dryRun\"] === \"true\" || req.body?.dryRun === true;\n const result = await sdk.trigger(\"mem::auto-forget\", { dryRun });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::auto-forget\",\n config: { api_path: \"/agentmemory/auto-forget\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::claude-bridge-read\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::claude-bridge-read\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Claude bridge not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::claude-bridge-read\",\n config: { api_path: \"/agentmemory/claude-bridge/read\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::claude-bridge-sync\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::claude-bridge-sync\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Claude bridge not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::claude-bridge-sync\",\n config: {\n api_path: \"/agentmemory/claude-bridge/sync\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-query\" },\n async (\n req: ApiRequest<{\n startNodeId?: string;\n nodeType?: string;\n maxDepth?: number;\n query?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::graph-query\", req.body || {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-query\",\n config: { api_path: \"/agentmemory/graph/query\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-stats\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::graph-stats\", {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-stats\",\n config: { api_path: \"/agentmemory/graph/stats\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::graph-extract\" },\n async (req: ApiRequest<{ observations: unknown[] }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (\n !Array.isArray(req.body?.observations) ||\n req.body.observations.length === 0\n ) {\n return {\n status_code: 400,\n body: { error: \"observations array is required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::graph-extract\", req.body);\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Knowledge graph not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::graph-extract\",\n config: { api_path: \"/agentmemory/graph/extract\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::consolidate-pipeline\" },\n async (req: ApiRequest<{ tier?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\n \"mem::consolidate-pipeline\",\n req.body || {},\n );\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Consolidation pipeline not enabled\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::consolidate-pipeline\",\n config: {\n api_path: \"/agentmemory/consolidate-pipeline\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::team-share\" },\n async (\n req: ApiRequest<{ itemId: string; itemType: string; project?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.itemId || !req.body?.itemType) {\n return {\n status_code: 400,\n body: { error: \"itemId and itemType are required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::team-share\", req.body);\n return { status_code: 201, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-share\",\n config: { api_path: \"/agentmemory/team/share\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::team-feed\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const limit = parseInt(req.query_params?.[\"limit\"] as string) || 20;\n const result = await sdk.trigger(\"mem::team-feed\", { limit });\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-feed\",\n config: { api_path: \"/agentmemory/team/feed\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::team-profile\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::team-profile\", {});\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Team memory not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::team-profile\",\n config: { api_path: \"/agentmemory/team/profile\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::audit\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::audit-query\", {\n operation: req.query_params?.[\"operation\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || 50,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::audit\",\n config: { api_path: \"/agentmemory/audit\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::governance-delete\" },\n async (\n req: ApiRequest<{ memoryIds: string[]; reason?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.memoryIds || !Array.isArray(req.body.memoryIds)) {\n return {\n status_code: 400,\n body: { error: \"memoryIds array is required\" },\n };\n }\n const result = await sdk.trigger(\"mem::governance-delete\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::governance-delete\",\n config: {\n api_path: \"/agentmemory/governance/memories\",\n http_method: \"DELETE\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::governance-bulk\" },\n async (\n req: ApiRequest<{\n type?: string[];\n dateFrom?: string;\n dateTo?: string;\n qualityBelow?: number;\n dryRun?: boolean;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::governance-bulk\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::governance-bulk\",\n config: {\n api_path: \"/agentmemory/governance/bulk-delete\",\n http_method: \"POST\",\n },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshots\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::snapshot-list\", {});\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshots\",\n config: { api_path: \"/agentmemory/snapshots\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshot-create\" },\n async (req: ApiRequest<{ message?: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\n \"mem::snapshot-create\",\n req.body || {},\n );\n return { status_code: 201, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshot-create\",\n config: { api_path: \"/agentmemory/snapshot/create\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::snapshot-restore\" },\n async (req: ApiRequest<{ commitHash: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.commitHash) {\n return { status_code: 400, body: { error: \"commitHash is required\" } };\n }\n try {\n const result = await sdk.trigger(\"mem::snapshot-restore\", req.body);\n return { status_code: 200, body: result };\n } catch {\n return { status_code: 404, body: { error: \"Snapshots not enabled\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::snapshot-restore\",\n config: { api_path: \"/agentmemory/snapshot/restore\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::memories\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const memories = await kv.list<import(\"../types.js\").Memory>(KV.memories);\n const latest = req.query_params?.[\"latest\"] === \"true\";\n const filtered = latest ? memories.filter((m) => m.isLatest) : memories;\n return { status_code: 200, body: { memories: filtered } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::memories\",\n config: { api_path: \"/agentmemory/memories\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-create\" },\n async (\n req: ApiRequest<{\n title: string;\n description?: string;\n priority?: number;\n createdBy?: string;\n project?: string;\n tags?: string[];\n parentId?: string;\n edges?: Array<{ type: string; targetActionId: string }>;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.title) {\n return { status_code: 400, body: { error: \"title is required\" } };\n }\n const result = await sdk.trigger(\"mem::action-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-create\",\n config: { api_path: \"/agentmemory/actions\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-update\" },\n async (\n req: ApiRequest<{\n actionId: string;\n status?: string;\n title?: string;\n description?: string;\n priority?: number;\n result?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId) {\n return { status_code: 400, body: { error: \"actionId is required\" } };\n }\n const result = await sdk.trigger(\"mem::action-update\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-update\",\n config: { api_path: \"/agentmemory/actions/update\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::action-list\", {\n status: req.query_params?.[\"status\"],\n project: req.query_params?.[\"project\"],\n parentId: req.query_params?.[\"parentId\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-list\",\n config: { api_path: \"/agentmemory/actions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-get\" },\n async (req: ApiRequest<{ actionId: string }>): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const actionId = req.query_params?.[\"actionId\"] as string;\n if (!actionId) {\n return { status_code: 400, body: { error: \"actionId required\" } };\n }\n const result = await sdk.trigger(\"mem::action-get\", { actionId });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-get\",\n config: { api_path: \"/agentmemory/actions/get\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::action-edge\" },\n async (\n req: ApiRequest<{\n sourceActionId: string;\n targetActionId: string;\n type: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.sourceActionId || !req.body?.targetActionId || !req.body?.type) {\n return { status_code: 400, body: { error: \"sourceActionId, targetActionId, and type are required\" } };\n }\n const result = await sdk.trigger(\"mem::action-edge-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::action-edge\",\n config: { api_path: \"/agentmemory/actions/edges\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::frontier\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::frontier\", {\n project: req.query_params?.[\"project\"],\n agentId: req.query_params?.[\"agentId\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::frontier\",\n config: { api_path: \"/agentmemory/frontier\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::next\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::next\", {\n project: req.query_params?.[\"project\"],\n agentId: req.query_params?.[\"agentId\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::next\",\n config: { api_path: \"/agentmemory/next\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-acquire\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; ttlMs?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-acquire\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-acquire\",\n config: { api_path: \"/agentmemory/leases/acquire\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-release\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; result?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-release\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-release\",\n config: { api_path: \"/agentmemory/leases/release\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::lease-renew\" },\n async (\n req: ApiRequest<{ actionId: string; agentId: string; ttlMs?: number }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.actionId || !req.body?.agentId) {\n return { status_code: 400, body: { error: \"actionId and agentId are required\" } };\n }\n const result = await sdk.trigger(\"mem::lease-renew\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::lease-renew\",\n config: { api_path: \"/agentmemory/leases/renew\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-create\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.name) {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-create\",\n config: { api_path: \"/agentmemory/routines\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::routine-list\", {\n frozen: req.query_params?.[\"frozen\"] === \"true\" ? true : undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-list\",\n config: { api_path: \"/agentmemory/routines\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-run\" },\n async (\n req: ApiRequest<{ routineId: string; project?: string; initiatedBy?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.routineId) {\n return { status_code: 400, body: { error: \"routineId is required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-run\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-run\",\n config: { api_path: \"/agentmemory/routines/run\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::routine-status\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const runId = req.query_params?.[\"runId\"] as string;\n if (!runId) {\n return { status_code: 400, body: { error: \"runId query param required\" } };\n }\n const result = await sdk.trigger(\"mem::routine-status\", { runId });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::routine-status\",\n config: { api_path: \"/agentmemory/routines/status\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::signal-send\" },\n async (\n req: ApiRequest<{\n from: string;\n to?: string;\n content: string;\n type?: string;\n replyTo?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.from || !req.body?.content) {\n return { status_code: 400, body: { error: \"from and content are required\" } };\n }\n const result = await sdk.trigger(\"mem::signal-send\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::signal-send\",\n config: { api_path: \"/agentmemory/signals/send\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::signal-read\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const agentId = req.query_params?.[\"agentId\"] as string;\n if (!agentId) {\n return { status_code: 400, body: { error: \"agentId query param required\" } };\n }\n const result = await sdk.trigger(\"mem::signal-read\", {\n agentId,\n unreadOnly: req.query_params?.[\"unreadOnly\"] === \"true\",\n threadId: req.query_params?.[\"threadId\"],\n limit: parseInt(req.query_params?.[\"limit\"] as string) || undefined,\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::signal-read\",\n config: { api_path: \"/agentmemory/signals\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-create\" },\n async (\n req: ApiRequest<{\n name: string;\n description?: string;\n type?: string;\n linkedActionIds?: string[];\n expiresInMs?: number;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.name) {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n const result = await sdk.trigger(\"mem::checkpoint-create\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-create\",\n config: { api_path: \"/agentmemory/checkpoints\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-resolve\" },\n async (\n req: ApiRequest<{\n checkpointId: string;\n status: string;\n resolvedBy?: string;\n result?: unknown;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.checkpointId || !req.body?.status) {\n return { status_code: 400, body: { error: \"checkpointId and status are required\" } };\n }\n const result = await sdk.trigger(\"mem::checkpoint-resolve\", req.body);\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-resolve\",\n config: { api_path: \"/agentmemory/checkpoints/resolve\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::checkpoint-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::checkpoint-list\", {\n status: req.query_params?.[\"status\"],\n type: req.query_params?.[\"type\"],\n });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::checkpoint-list\",\n config: { api_path: \"/agentmemory/checkpoints\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-register\" },\n async (\n req: ApiRequest<{ url: string; name: string; sharedScopes?: string[] }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n if (!req.body?.url || !req.body?.name) {\n return { status_code: 400, body: { error: \"url and name are required\" } };\n }\n const result = await sdk.trigger(\"mem::mesh-register\", req.body);\n return { status_code: 201, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-register\",\n config: { api_path: \"/agentmemory/mesh/peers\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-list\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-list\", {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-list\",\n config: { api_path: \"/agentmemory/mesh/peers\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-sync\" },\n async (\n req: ApiRequest<{ peerId?: string; direction?: string }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-sync\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-sync\",\n config: { api_path: \"/agentmemory/mesh/sync\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-receive\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const result = await sdk.trigger(\"mem::mesh-receive\", req.body || {});\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-receive\",\n config: { api_path: \"/agentmemory/mesh/receive\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::mesh-export\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const since = req.query_params?.[\"since\"] as string;\n if (since) {\n const parsed = new Date(since).getTime();\n if (Number.isNaN(parsed)) {\n return { status_code: 400, body: { error: \"Invalid 'since' date format\" } };\n }\n }\n const project = req.query_params?.[\"project\"] as string | undefined;\n const sinceTime = since ? new Date(since).getTime() : 0;\n const df = <T>(items: T[], field: \"updatedAt\" | \"createdAt\") =>\n items.filter((i) => new Date((i as Record<string, unknown>)[field] as string).getTime() > sinceTime);\n const memories = await kv.list<import(\"../types.js\").Memory>(KV.memories);\n let actions = await kv.list<import(\"../types.js\").Action>(KV.actions);\n if (project) {\n actions = actions.filter((a) => a.project === project);\n }\n const body: Record<string, unknown> = {\n memories: df(memories, \"updatedAt\"),\n actions: df(actions, \"updatedAt\"),\n };\n if (!project) {\n const semantic = await kv.list<import(\"../types.js\").SemanticMemory>(KV.semantic);\n const procedural = await kv.list<import(\"../types.js\").ProceduralMemory>(KV.procedural);\n const relations = await kv.list<import(\"../types.js\").MemoryRelation>(KV.relations);\n const graphNodes = await kv.list<import(\"../types.js\").GraphNode>(KV.graphNodes);\n const graphEdges = await kv.list<import(\"../types.js\").GraphEdge>(KV.graphEdges);\n body.semantic = df(semantic, \"updatedAt\");\n body.procedural = df(procedural, \"updatedAt\");\n body.relations = df(relations, \"createdAt\");\n body.graphNodes = graphNodes.filter(\n (n) => new Date(n.updatedAt || n.createdAt).getTime() > sinceTime,\n );\n body.graphEdges = df(graphEdges, \"createdAt\");\n }\n return { status_code: 200, body };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::mesh-export\",\n config: { api_path: \"/agentmemory/mesh/export\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::flow-compress\" },\n async (\n req: ApiRequest<{\n runId?: string;\n actionIds?: string[];\n project?: string;\n }>,\n ): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n try {\n const result = await sdk.trigger(\"mem::flow-compress\", req.body || {});\n return { status_code: 200, body: result };\n } catch {\n return {\n status_code: 404,\n body: { error: \"Flow compression requires a provider\" },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::flow-compress\",\n config: { api_path: \"/agentmemory/flow/compress\", http_method: \"POST\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-detect\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::detect-worktree\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-detect\",\n config: { api_path: \"/agentmemory/branch/detect\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-worktrees\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::list-worktrees\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-worktrees\",\n config: { api_path: \"/agentmemory/branch/worktrees\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"api::branch-sessions\" },\n async (req: ApiRequest): Promise<Response> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n const cwd = (req.query_params?.[\"cwd\"] as string) || process.cwd();\n const result = await sdk.trigger(\"mem::branch-sessions\", { cwd });\n return { status_code: 200, body: result };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::branch-sessions\",\n config: { api_path: \"/agentmemory/branch/sessions\", http_method: \"GET\" },\n });\n\n sdk.registerFunction({ id: \"api::viewer\" }, async (): Promise<Response> => {\n const headers = {\n \"Content-Type\": \"text/html\",\n \"Content-Security-Policy\": VIEWER_CSP,\n };\n const base = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(base, \"..\", \"viewer\", \"index.html\"),\n join(base, \"..\", \"src\", \"viewer\", \"index.html\"),\n join(base, \"viewer\", \"index.html\"),\n ];\n for (const p of candidates) {\n try {\n const html = readFileSync(p, \"utf-8\");\n return { status_code: 200, headers, body: html };\n } catch {}\n }\n return {\n status_code: 404,\n headers,\n body: \"<!DOCTYPE html><html><body><h1>agentmemory</h1><p>viewer not found</p></body></html>\",\n };\n });\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"api::viewer\",\n config: { api_path: \"/agentmemory/viewer\", http_method: \"GET\" },\n });\n\n sdk.registerFunction({ id: \"api::sentinel-create\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.name) return { status_code: 400, body: { error: \"name is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-create\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-create\", config: { api_path: \"/agentmemory/sentinels\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-trigger\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sentinelId) return { status_code: 400, body: { error: \"sentinelId is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-trigger\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-trigger\", config: { api_path: \"/agentmemory/sentinels/trigger\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-check\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const result = await sdk.trigger(\"mem::sentinel-check\", {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-check\", config: { api_path: \"/agentmemory/sentinels/check\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-cancel\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sentinelId) return { status_code: 400, body: { error: \"sentinelId is required\" } };\n const result = await sdk.trigger(\"mem::sentinel-cancel\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-cancel\", config: { api_path: \"/agentmemory/sentinels/cancel\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sentinel-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::sentinel-list\", { status: params.status, type: params.type });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sentinel-list\", config: { api_path: \"/agentmemory/sentinels\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::sketch-create\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.title) return { status_code: 400, body: { error: \"title is required\" } };\n const result = await sdk.trigger(\"mem::sketch-create\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-create\", config: { api_path: \"/agentmemory/sketches\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-add\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId || !body?.title) return { status_code: 400, body: { error: \"sketchId and title are required\" } };\n const result = await sdk.trigger(\"mem::sketch-add\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-add\", config: { api_path: \"/agentmemory/sketches/add\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-promote\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId) return { status_code: 400, body: { error: \"sketchId is required\" } };\n const result = await sdk.trigger(\"mem::sketch-promote\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-promote\", config: { api_path: \"/agentmemory/sketches/promote\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-discard\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.sketchId) return { status_code: 400, body: { error: \"sketchId is required\" } };\n const result = await sdk.trigger(\"mem::sketch-discard\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-discard\", config: { api_path: \"/agentmemory/sketches/discard\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::sketch-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::sketch-list\", { status: params.status, project: params.project });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-list\", config: { api_path: \"/agentmemory/sketches\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::sketch-gc\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const result = await sdk.trigger(\"mem::sketch-gc\", {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::sketch-gc\", config: { api_path: \"/agentmemory/sketches/gc\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::crystallize\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.actionIds) return { status_code: 400, body: { error: \"actionIds is required\" } };\n const result = await sdk.trigger(\"mem::crystallize\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::crystallize\", config: { api_path: \"/agentmemory/crystals/create\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::crystal-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::crystal-list\", { project: params.project, sessionId: params.sessionId, limit: params.limit ? parseInt(params.limit as string) : undefined });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::crystal-list\", config: { api_path: \"/agentmemory/crystals\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::auto-crystallize\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::auto-crystallize\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::auto-crystallize\", config: { api_path: \"/agentmemory/crystals/auto\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::diagnose\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::diagnose\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::diagnose\", config: { api_path: \"/agentmemory/diagnostics\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::heal\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::heal\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::heal\", config: { api_path: \"/agentmemory/diagnostics/heal\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-tag\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.targetId || !body?.dimension || !body?.value) return { status_code: 400, body: { error: \"targetId, dimension, and value are required\" } };\n const result = await sdk.trigger(\"mem::facet-tag\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-tag\", config: { api_path: \"/agentmemory/facets\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-untag\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.targetId || !body?.dimension) return { status_code: 400, body: { error: \"targetId and dimension are required\" } };\n const result = await sdk.trigger(\"mem::facet-untag\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-untag\", config: { api_path: \"/agentmemory/facets/remove\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-query\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n const result = await sdk.trigger(\"mem::facet-query\", body || {});\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-query\", config: { api_path: \"/agentmemory/facets/query\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::facet-get\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n if (!params.targetId) return { status_code: 400, body: { error: \"targetId query param is required\" } };\n const result = await sdk.trigger(\"mem::facet-get\", { targetId: params.targetId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-get\", config: { api_path: \"/agentmemory/facets\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::facet-stats\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::facet-stats\", { targetType: params.targetType });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::facet-stats\", config: { api_path: \"/agentmemory/facets/stats\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::verify\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.id || typeof body.id !== \"string\") return { status_code: 400, body: { error: \"id is required\" } };\n const result = await sdk.trigger(\"mem::verify\", { id: body.id });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::verify\", config: { api_path: \"/agentmemory/verify\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::cascade-update\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.supersededMemoryId || typeof body.supersededMemoryId !== \"string\") {\n return { status_code: 400, body: { error: \"supersededMemoryId is required\" } };\n }\n const result = await sdk.trigger(\"mem::cascade-update\", { supersededMemoryId: body.supersededMemoryId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::cascade-update\", config: { api_path: \"/agentmemory/cascade-update\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-save\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.content || typeof body.content !== \"string\") return { status_code: 400, body: { error: \"content is required\" } };\n const tags = typeof body.tags === \"string\" ? (body.tags as string).split(\",\").map((t: string) => t.trim()).filter(Boolean) : Array.isArray(body.tags) ? body.tags : [];\n const result = await sdk.trigger(\"mem::lesson-save\", {\n content: body.content,\n context: body.context || \"\",\n confidence: typeof body.confidence === \"number\" ? body.confidence : undefined,\n project: typeof body.project === \"string\" ? body.project : undefined,\n tags,\n source: \"manual\",\n }) as { action?: string };\n const statusCode = result?.action === \"created\" ? 201 : 200;\n return { status_code: statusCode, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-save\", config: { api_path: \"/agentmemory/lessons\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-list\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const params = req.query_params || {};\n const result = await sdk.trigger(\"mem::lesson-list\", {\n project: params.project,\n source: params.source,\n minConfidence: params.minConfidence ? parseFloat(params.minConfidence as string) : undefined,\n limit: params.limit ? parseInt(params.limit as string, 10) : undefined,\n });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-list\", config: { api_path: \"/agentmemory/lessons\", http_method: \"GET\" } });\n\n sdk.registerFunction({ id: \"api::lesson-search\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.query || typeof body.query !== \"string\") return { status_code: 400, body: { error: \"query is required\" } };\n const result = await sdk.trigger(\"mem::lesson-recall\", body);\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-search\", config: { api_path: \"/agentmemory/lessons/search\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::lesson-strengthen\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = req.body as Record<string, unknown>;\n if (!body?.lessonId || typeof body.lessonId !== \"string\") return { status_code: 400, body: { error: \"lessonId is required\" } };\n const result = await sdk.trigger(\"mem::lesson-strengthen\", { lessonId: body.lessonId });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::lesson-strengthen\", config: { api_path: \"/agentmemory/lessons/strengthen\", http_method: \"POST\" } });\n\n sdk.registerFunction({ id: \"api::obsidian-export\" }, async (req: ApiRequest) => {\n const denied = checkAuth(req, secret);\n if (denied) return denied;\n const body = (req.body as Record<string, unknown>) || {};\n const types = typeof body.types === \"string\" ? body.types.split(\",\").map((t: string) => t.trim()).filter(Boolean) : undefined;\n const result = await sdk.trigger(\"mem::obsidian-export\", { vaultDir: body.vaultDir, types });\n return { status_code: 200, body: result };\n });\n sdk.registerTrigger({ type: \"http\", function_id: \"api::obsidian-export\", config: { api_path: \"/agentmemory/obsidian/export\", http_method: \"POST\" } });\n}\n","import type { ISdk } from \"iii-sdk\";\nimport type { HookPayload, Session } from \"../types.js\";\nimport { KV } from \"../state/schema.js\";\nimport { StateKV } from \"../state/kv.js\";\n\nexport function registerEventTriggers(sdk: ISdk, kv: StateKV): void {\n sdk.registerFunction(\n { id: \"event::session::started\" },\n async (data: { sessionId: string; project: string; cwd: string }) => {\n const session: Session = {\n id: data.sessionId,\n project: data.project,\n cwd: data.cwd,\n startedAt: new Date().toISOString(),\n status: \"active\",\n observationCount: 0,\n };\n await kv.set(KV.sessions, data.sessionId, session);\n const contextResult = await sdk.trigger<\n { sessionId: string; project: string },\n { context: string }\n >(\"mem::context\", { sessionId: data.sessionId, project: data.project });\n return { session, context: contextResult.context };\n },\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::started\",\n config: { topic: \"agentmemory.session.started\" },\n });\n\n sdk.registerFunction(\n { id: \"event::observation\" },\n async (data: HookPayload) => sdk.trigger(\"mem::observe\", data),\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::observation\",\n config: { topic: \"agentmemory.observation\" },\n });\n\n sdk.registerFunction(\n { id: \"event::session::stopped\" },\n async (data: { sessionId: string }) => sdk.trigger(\"mem::summarize\", data),\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::stopped\",\n config: { topic: \"agentmemory.session.stopped\" },\n });\n\n sdk.registerFunction(\n { id: \"event::session::ended\" },\n async (data: { sessionId: string }) => {\n const session = await kv.get<Session>(KV.sessions, data.sessionId);\n if (session) {\n await kv.set(KV.sessions, data.sessionId, {\n ...session,\n endedAt: new Date().toISOString(),\n status: \"completed\",\n });\n }\n return { success: true };\n },\n );\n sdk.registerTrigger({\n type: \"queue\",\n function_id: \"event::session::ended\",\n config: { topic: \"agentmemory.session.ended\" },\n });\n}\n","export type McpToolDef = {\n name: string;\n description: string;\n inputSchema: {\n type: \"object\";\n properties: Record<string, { type: string; description: string }>;\n required?: string[];\n };\n};\n\nexport const CORE_TOOLS: McpToolDef[] = [\n {\n name: \"memory_recall\",\n description:\n \"Search past session observations for relevant context. Use when you need to recall what happened in previous sessions, find past decisions, or look up how a file was modified before.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (keywords, file names, concepts)\",\n },\n limit: {\n type: \"number\",\n description: \"Max results to return (default 10)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_save\",\n description:\n \"Explicitly save an important insight, decision, or pattern to long-term memory.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"The insight or decision to remember\",\n },\n type: {\n type: \"string\",\n description:\n \"Memory type: pattern, preference, architecture, bug, workflow, or fact\",\n },\n concepts: {\n type: \"string\",\n description: \"Comma-separated key concepts\",\n },\n files: {\n type: \"string\",\n description: \"Comma-separated relevant file paths\",\n },\n },\n required: [\"content\"],\n },\n },\n {\n name: \"memory_file_history\",\n description: \"Get past observations about specific files.\",\n inputSchema: {\n type: \"object\",\n properties: {\n files: { type: \"string\", description: \"Comma-separated file paths\" },\n sessionId: {\n type: \"string\",\n description: \"Current session ID to exclude\",\n },\n },\n required: [\"files\"],\n },\n },\n {\n name: \"memory_patterns\",\n description: \"Detect recurring patterns across sessions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project path to analyze\" },\n },\n },\n },\n {\n name: \"memory_sessions\",\n description:\n \"List recent sessions with their status and observation counts.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"memory_smart_search\",\n description: \"Hybrid semantic+keyword search with progressive disclosure.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n expandIds: {\n type: \"string\",\n description: \"Comma-separated observation IDs to expand\",\n },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_timeline\",\n description: \"Chronological observations around an anchor point.\",\n inputSchema: {\n type: \"object\",\n properties: {\n anchor: {\n type: \"string\",\n description: \"Anchor point: ISO date or keyword\",\n },\n project: { type: \"string\", description: \"Filter by project path\" },\n before: {\n type: \"number\",\n description: \"Observations before anchor (default 5)\",\n },\n after: {\n type: \"number\",\n description: \"Observations after anchor (default 5)\",\n },\n },\n required: [\"anchor\"],\n },\n },\n {\n name: \"memory_profile\",\n description: \"User/project profile with top concepts and file patterns.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Project path\" },\n refresh: {\n type: \"string\",\n description: \"Set to 'true' to force rebuild\",\n },\n },\n required: [\"project\"],\n },\n },\n {\n name: \"memory_export\",\n description: \"Export all memory data as JSON.\",\n inputSchema: { type: \"object\", properties: {} },\n },\n {\n name: \"memory_relations\",\n description: \"Query the memory relationship graph.\",\n inputSchema: {\n type: \"object\",\n properties: {\n memoryId: {\n type: \"string\",\n description: \"Memory ID to find relations for\",\n },\n maxHops: {\n type: \"number\",\n description: \"Max traversal depth (default 2)\",\n },\n minConfidence: {\n type: \"number\",\n description: \"Min confidence (0-1, default 0)\",\n },\n },\n required: [\"memoryId\"],\n },\n },\n];\n\nexport const V040_TOOLS: McpToolDef[] = [\n {\n name: \"memory_claude_bridge_sync\",\n description:\n \"Sync memory state to/from Claude Code's native MEMORY.md file.\",\n inputSchema: {\n type: \"object\",\n properties: {\n direction: {\n type: \"string\",\n description:\n \"'read' to import from MEMORY.md, 'write' to export to MEMORY.md\",\n },\n },\n required: [\"direction\"],\n },\n },\n {\n name: \"memory_graph_query\",\n description: \"Query the knowledge graph for entities and relationships.\",\n inputSchema: {\n type: \"object\",\n properties: {\n startNodeId: {\n type: \"string\",\n description: \"Starting node ID for traversal\",\n },\n nodeType: { type: \"string\", description: \"Filter by node type\" },\n maxDepth: {\n type: \"number\",\n description: \"Max BFS depth (default 3, max 5)\",\n },\n query: { type: \"string\", description: \"Search nodes by name\" },\n },\n },\n },\n {\n name: \"memory_consolidate\",\n description:\n \"Run the 4-tier memory consolidation pipeline (working -> episodic -> semantic -> procedural).\",\n inputSchema: {\n type: \"object\",\n properties: {\n tier: {\n type: \"string\",\n description: \"Target tier: episodic, semantic, or procedural\",\n },\n },\n },\n },\n {\n name: \"memory_team_share\",\n description: \"Share a memory or observation with team members.\",\n inputSchema: {\n type: \"object\",\n properties: {\n itemId: {\n type: \"string\",\n description: \"ID of memory or observation to share\",\n },\n itemType: {\n type: \"string\",\n description: \"Type: observation, memory, or pattern\",\n },\n },\n required: [\"itemId\", \"itemType\"],\n },\n },\n {\n name: \"memory_team_feed\",\n description: \"Get recent shared items from all team members.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"Max items (default 20)\" },\n },\n },\n },\n {\n name: \"memory_audit\",\n description: \"View the audit trail of memory operations.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operation: { type: \"string\", description: \"Filter by operation type\" },\n limit: { type: \"number\", description: \"Max entries (default 50)\" },\n },\n },\n },\n {\n name: \"memory_governance_delete\",\n description: \"Delete specific memories with audit trail.\",\n inputSchema: {\n type: \"object\",\n properties: {\n memoryIds: {\n type: \"string\",\n description: \"Comma-separated memory IDs to delete\",\n },\n reason: { type: \"string\", description: \"Reason for deletion\" },\n },\n required: [\"memoryIds\"],\n },\n },\n {\n name: \"memory_snapshot_create\",\n description: \"Create a git-versioned snapshot of current memory state.\",\n inputSchema: {\n type: \"object\",\n properties: {\n message: { type: \"string\", description: \"Snapshot description\" },\n },\n },\n },\n];\n\nexport const V050_TOOLS: McpToolDef[] = [\n {\n name: \"memory_action_create\",\n description:\n \"Create an actionable work item with typed dependencies. Actions track what agents need to do and how work items relate to each other.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Action title\" },\n description: {\n type: \"string\",\n description: \"Detailed description of the work\",\n },\n priority: {\n type: \"number\",\n description: \"Priority 1-10 (10 highest)\",\n },\n project: { type: \"string\", description: \"Project path\" },\n tags: {\n type: \"string\",\n description: \"Comma-separated tags\",\n },\n parentId: {\n type: \"string\",\n description: \"Parent action ID for hierarchical actions\",\n },\n requires: {\n type: \"string\",\n description:\n \"Comma-separated action IDs that must complete before this\",\n },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"memory_action_update\",\n description:\n \"Update an action's status, priority, or details. Set status to 'done' to complete it and unblock dependent actions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionId: { type: \"string\", description: \"Action ID to update\" },\n status: {\n type: \"string\",\n description: \"New status: pending, active, done, blocked, cancelled\",\n },\n result: {\n type: \"string\",\n description: \"Outcome description (when completing)\",\n },\n priority: { type: \"number\", description: \"New priority 1-10\" },\n },\n required: [\"actionId\"],\n },\n },\n {\n name: \"memory_frontier\",\n description:\n \"Get all unblocked actions ranked by priority and urgency. Returns the frontier of actionable work with no unsatisfied dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Filter by project\" },\n agentId: {\n type: \"string\",\n description: \"Agent ID to check lease conflicts\",\n },\n limit: { type: \"number\", description: \"Max results (default 20)\" },\n },\n },\n },\n {\n name: \"memory_next\",\n description:\n \"Get the single most important next action to work on. Combines dependency resolution, priority, and recency into a score.\",\n inputSchema: {\n type: \"object\",\n properties: {\n project: { type: \"string\", description: \"Filter by project\" },\n agentId: { type: \"string\", description: \"Current agent ID\" },\n },\n },\n },\n {\n name: \"memory_lease\",\n description:\n \"Acquire, release, or renew an exclusive lease on an action. Prevents multiple agents from working on the same thing.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionId: { type: \"string\", description: \"Action ID\" },\n agentId: { type: \"string\", description: \"Agent claiming the action\" },\n operation: {\n type: \"string\",\n description: \"acquire, release, or renew\",\n },\n result: {\n type: \"string\",\n description: \"Result when releasing (marks action done)\",\n },\n ttlMs: {\n type: \"number\",\n description: \"Lease duration in ms (default 10min, max 1hr)\",\n },\n },\n required: [\"actionId\", \"agentId\", \"operation\"],\n },\n },\n {\n name: \"memory_routine_run\",\n description:\n \"Instantiate a frozen workflow routine, creating actions for each step with proper dependencies.\",\n inputSchema: {\n type: \"object\",\n properties: {\n routineId: { type: \"string\", description: \"Routine template ID\" },\n project: { type: \"string\", description: \"Project context\" },\n initiatedBy: { type: \"string\", description: \"Agent starting the run\" },\n },\n required: [\"routineId\"],\n },\n },\n {\n name: \"memory_signal_send\",\n description:\n \"Send a message to another agent or broadcast. Supports threading, typed messages, and TTL expiration.\",\n inputSchema: {\n type: \"object\",\n properties: {\n from: { type: \"string\", description: \"Sender agent ID\" },\n to: {\n type: \"string\",\n description: \"Recipient agent ID (omit for broadcast)\",\n },\n content: { type: \"string\", description: \"Message content\" },\n type: {\n type: \"string\",\n description: \"Message type: info, request, response, alert, handoff\",\n },\n replyTo: {\n type: \"string\",\n description: \"Signal ID to reply to (auto-threads)\",\n },\n },\n required: [\"from\", \"content\"],\n },\n },\n {\n name: \"memory_signal_read\",\n description:\n \"Read messages for an agent. Marks delivered messages as read.\",\n inputSchema: {\n type: \"object\",\n properties: {\n agentId: { type: \"string\", description: \"Agent to read messages for\" },\n unreadOnly: {\n type: \"string\",\n description: \"Set to 'true' for unread only\",\n },\n threadId: {\n type: \"string\",\n description: \"Filter by conversation thread\",\n },\n limit: { type: \"number\", description: \"Max messages (default 50)\" },\n },\n required: [\"agentId\"],\n },\n },\n {\n name: \"memory_checkpoint\",\n description:\n \"Create or resolve an external checkpoint (CI result, approval, deploy status) that gates action progress.\",\n inputSchema: {\n type: \"object\",\n properties: {\n operation: {\n type: \"string\",\n description: \"create, resolve, or list\",\n },\n name: { type: \"string\", description: \"Checkpoint name (for create)\" },\n checkpointId: {\n type: \"string\",\n description: \"Checkpoint ID (for resolve)\",\n },\n status: {\n type: \"string\",\n description: \"passed or failed (for resolve)\",\n },\n type: {\n type: \"string\",\n description: \"Checkpoint type: ci, approval, deploy, external, timer\",\n },\n linkedActionIds: {\n type: \"string\",\n description:\n \"Comma-separated action IDs this checkpoint gates (for create)\",\n },\n },\n required: [\"operation\"],\n },\n },\n {\n name: \"memory_mesh_sync\",\n description:\n \"Sync memories and actions with peer agentmemory instances for multi-agent collaboration.\",\n inputSchema: {\n type: \"object\",\n properties: {\n peerId: {\n type: \"string\",\n description: \"Specific peer ID (omit for all)\",\n },\n direction: {\n type: \"string\",\n description: \"push, pull, or both (default both)\",\n },\n },\n },\n },\n];\n\nexport const V051_TOOLS: McpToolDef[] = [\n {\n name: \"memory_sentinel_create\",\n description:\n \"Create an event-driven sentinel that watches for conditions (webhook, timer, threshold, pattern, approval) and auto-unblocks gated actions when triggered.\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Sentinel name\" },\n type: {\n type: \"string\",\n description: \"Type: webhook, timer, threshold, pattern, approval, custom\",\n },\n config: {\n type: \"string\",\n description: \"JSON config (timer: {durationMs}, threshold: {metric,operator,value}, pattern: {pattern}, webhook: {path})\",\n },\n linkedActionIds: {\n type: \"string\",\n description: \"Comma-separated action IDs to gate\",\n },\n expiresInMs: { type: \"number\", description: \"Auto-expire after ms\" },\n },\n required: [\"name\", \"type\"],\n },\n },\n {\n name: \"memory_sentinel_trigger\",\n description:\n \"Externally fire a sentinel, providing an optional result payload. Unblocks any gated actions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sentinelId: { type: \"string\", description: \"Sentinel ID to trigger\" },\n result: { type: \"string\", description: \"JSON result payload\" },\n },\n required: [\"sentinelId\"],\n },\n },\n {\n name: \"memory_sketch_create\",\n description:\n \"Create an ephemeral action graph for exploratory work. Auto-expires after TTL. Can be promoted to permanent actions or discarded.\",\n inputSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\", description: \"Sketch title\" },\n description: { type: \"string\", description: \"What this sketch explores\" },\n expiresInMs: { type: \"number\", description: \"TTL in ms (default 1 hour)\" },\n project: { type: \"string\", description: \"Project context\" },\n },\n required: [\"title\"],\n },\n },\n {\n name: \"memory_sketch_promote\",\n description:\n \"Promote a sketch's ephemeral actions to permanent actions. Makes the exploratory work official.\",\n inputSchema: {\n type: \"object\",\n properties: {\n sketchId: { type: \"string\", description: \"Sketch ID to promote\" },\n project: { type: \"string\", description: \"Override project for promoted actions\" },\n },\n required: [\"sketchId\"],\n },\n },\n {\n name: \"memory_crystallize\",\n description:\n \"Compress completed action chains into compact crystal digests using LLM summarization. Extracts narrative, key outcomes, files affected, and lessons.\",\n inputSchema: {\n type: \"object\",\n properties: {\n actionIds: {\n type: \"string\",\n description: \"Comma-separated completed action IDs to crystallize\",\n },\n project: { type: \"string\", description: \"Project context\" },\n sessionId: { type: \"string\", description: \"Session context\" },\n },\n required: [\"actionIds\"],\n },\n },\n {\n name: \"memory_diagnose\",\n description:\n \"Run health checks across all subsystems (actions, leases, sentinels, sketches, signals, sessions, memories, mesh). Identifies stuck, orphaned, and inconsistent state.\",\n inputSchema: {\n type: \"object\",\n properties: {\n categories: {\n type: \"string\",\n description: \"Comma-separated categories to check (default all)\",\n },\n },\n },\n },\n {\n name: \"memory_heal\",\n description:\n \"Auto-fix all fixable issues found by diagnostics. Unblocks stuck actions, expires stale leases, cleans up orphaned data.\",\n inputSchema: {\n type: \"object\",\n properties: {\n categories: {\n type: \"string\",\n description: \"Comma-separated categories to heal (default all)\",\n },\n dryRun: {\n type: \"string\",\n description: \"Set to 'true' for dry run (report but don't fix)\",\n },\n },\n },\n },\n {\n name: \"memory_facet_tag\",\n description:\n \"Attach a structured tag (dimension:value) to an action, memory, or observation for multi-dimensional categorization.\",\n inputSchema: {\n type: \"object\",\n properties: {\n targetId: { type: \"string\", description: \"ID of the target to tag\" },\n targetType: {\n type: \"string\",\n description: \"Type: action, memory, or observation\",\n },\n dimension: { type: \"string\", description: \"Tag dimension (e.g., priority, team, status)\" },\n value: { type: \"string\", description: \"Tag value (e.g., urgent, backend, reviewed)\" },\n },\n required: [\"targetId\", \"targetType\", \"dimension\", \"value\"],\n },\n },\n {\n name: \"memory_facet_query\",\n description:\n \"Query targets by facet tags with AND/OR logic. Find all actions tagged priority:urgent AND team:backend.\",\n inputSchema: {\n type: \"object\",\n properties: {\n matchAll: {\n type: \"string\",\n description: \"Comma-separated dimension:value pairs (AND logic)\",\n },\n matchAny: {\n type: \"string\",\n description: \"Comma-separated dimension:value pairs (OR logic)\",\n },\n targetType: {\n type: \"string\",\n description: \"Filter by type: action, memory, or observation\",\n },\n },\n },\n },\n];\n\nexport const V061_TOOLS: McpToolDef[] = [\n {\n name: \"memory_verify\",\n description:\n \"Verify a memory or observation by tracing its citation chain back to source observations and session context. Returns provenance information including confidence scores.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: {\n type: \"string\",\n description: \"Memory ID or observation ID to verify\",\n },\n },\n required: [\"id\"],\n },\n },\n];\n\nexport const V070_TOOLS: McpToolDef[] = [\n {\n name: \"memory_lesson_save\",\n description:\n \"Save a lesson learned from this session. Lessons have confidence scores that strengthen when reinforced and decay when not used. Duplicate content auto-strengthens the existing lesson.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: {\n type: \"string\",\n description: \"The lesson learned (what worked, what to avoid, when to use X approach)\",\n },\n context: {\n type: \"string\",\n description: \"When/where this lesson applies\",\n },\n confidence: {\n type: \"number\",\n description: \"Initial confidence 0.0-1.0 (default 0.5)\",\n },\n project: { type: \"string\", description: \"Project this lesson is about\" },\n tags: { type: \"string\", description: \"Comma-separated tags\" },\n },\n required: [\"content\"],\n },\n },\n {\n name: \"memory_lesson_recall\",\n description:\n \"Search lessons by query. Returns lessons sorted by confidence and recency. Use to check what the agent has learned before making decisions.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n project: { type: \"string\", description: \"Filter by project\" },\n minConfidence: {\n type: \"number\",\n description: \"Minimum confidence threshold (default 0.1)\",\n },\n limit: { type: \"number\", description: \"Max results (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"memory_obsidian_export\",\n description:\n \"Export memories, lessons, and crystals as Obsidian-compatible Markdown files with YAML frontmatter and wikilinks for graph view.\",\n inputSchema: {\n type: \"object\",\n properties: {\n vaultDir: {\n type: \"string\",\n description: \"Output directory (default ~/.agentmemory/vault/)\",\n },\n types: {\n type: \"string\",\n description: \"Comma-separated types to export: memories,lessons,crystals,sessions (default all)\",\n },\n },\n },\n },\n];\n\nconst ESSENTIAL_TOOLS = new Set([\n \"memory_save\",\n \"memory_recall\",\n \"memory_consolidate\",\n \"memory_smart_search\",\n \"memory_sessions\",\n \"memory_diagnose\",\n \"memory_lesson_save\",\n]);\n\nexport function getAllTools(): McpToolDef[] {\n return [...CORE_TOOLS, ...V040_TOOLS, ...V050_TOOLS, ...V051_TOOLS, ...V061_TOOLS, ...V070_TOOLS];\n}\n\nexport function getVisibleTools(): McpToolDef[] {\n const mode = process.env[\"AGENTMEMORY_TOOLS\"] || \"core\";\n if (mode === \"all\") return getAllTools();\n return getAllTools().filter((t) => ESSENTIAL_TOOLS.has(t.name));\n}\n","import type { ISdk, ApiRequest } from \"iii-sdk\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\nimport type {\n SessionSummary,\n Memory,\n Session,\n GraphNode,\n GraphEdge,\n} from \"../types.js\";\nimport { getVisibleTools } from \"./tools-registry.js\";\nimport { timingSafeCompare } from \"../auth.js\";\n\ntype McpResponse = {\n status_code: number;\n headers?: Record<string, string>;\n body: unknown;\n};\n\nexport function registerMcpEndpoints(\n sdk: ISdk,\n kv: StateKV,\n secret?: string,\n): void {\n function checkAuth(\n req: ApiRequest,\n sec: string | undefined,\n ): McpResponse | null {\n if (!sec) return null;\n const auth =\n req.headers?.[\"authorization\"] || req.headers?.[\"Authorization\"];\n if (typeof auth !== \"string\" || !timingSafeCompare(auth, `Bearer ${sec}`)) {\n return { status_code: 401, body: { error: \"unauthorized\" } };\n }\n return null;\n }\n\n sdk.registerFunction(\n { id: \"mcp::tools::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { tools: getVisibleTools() } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::tools::list\",\n config: { api_path: \"/agentmemory/mcp/tools\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::tools::call\" },\n async (\n req: ApiRequest<{ name: string; arguments: Record<string, unknown> }>,\n ): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n if (!req.body || typeof req.body.name !== \"string\") {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n\n const { name, arguments: args = {} } = req.body;\n\n try {\n switch (name) {\n case \"memory_recall\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return {\n status_code: 400,\n body: { error: \"query is required for memory_recall\" },\n };\n }\n const result = await sdk.trigger(\"mem::search\", {\n query: args.query,\n limit: (args.limit as number) || 10,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_save\": {\n if (typeof args.content !== \"string\" || !args.content.trim()) {\n return {\n status_code: 400,\n body: { error: \"content is required for memory_save\" },\n };\n }\n const type = (args.type as string) || \"fact\";\n const concepts =\n typeof args.concepts === \"string\"\n ? args.concepts.split(\",\").map((c: string) => c.trim()).filter(Boolean)\n : [];\n const files =\n typeof args.files === \"string\"\n ? args.files.split(\",\").map((f: string) => f.trim()).filter(Boolean)\n : [];\n\n const result = await sdk.trigger(\"mem::remember\", {\n content: args.content,\n type,\n concepts,\n files,\n });\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: JSON.stringify(result) }],\n },\n };\n }\n\n case \"memory_file_history\": {\n if (typeof args.files !== \"string\" || !args.files.trim()) {\n return {\n status_code: 400,\n body: { error: \"files is required for memory_file_history\" },\n };\n }\n const fileList = (args.files as string)\n .split(\",\")\n .map((f: string) => f.trim());\n const result = await sdk.trigger(\"mem::file-context\", {\n sessionId: (args.sessionId as string) || \"\",\n files: fileList,\n });\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text:\n (result as { context: string }).context ||\n \"No history found.\",\n },\n ],\n },\n };\n }\n\n case \"memory_patterns\": {\n const result = await sdk.trigger(\"mem::patterns\", {\n project: args.project as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_sessions\": {\n const sessions = await kv.list(KV.sessions);\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify({ sessions }, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_smart_search\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return {\n status_code: 400,\n body: { error: \"query is required for memory_smart_search\" },\n };\n }\n const expandIds =\n typeof args.expandIds === \"string\"\n ? args.expandIds.split(\",\").map((id: string) => id.trim()).slice(0, 20)\n : [];\n const result = await sdk.trigger(\"mem::smart-search\", {\n query: args.query,\n expandIds,\n limit: (args.limit as number) || 10,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_timeline\": {\n if (typeof args.anchor !== \"string\" || !args.anchor.trim()) {\n return {\n status_code: 400,\n body: { error: \"anchor is required for memory_timeline\" },\n };\n }\n const result = await sdk.trigger(\"mem::timeline\", {\n anchor: args.anchor,\n project: (args.project as string) || undefined,\n before: (args.before as number) || 5,\n after: (args.after as number) || 5,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_profile\": {\n if (typeof args.project !== \"string\" || !args.project.trim()) {\n return {\n status_code: 400,\n body: { error: \"project is required for memory_profile\" },\n };\n }\n const result = await sdk.trigger(\"mem::profile\", {\n project: args.project,\n refresh: args.refresh === \"true\",\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_export\": {\n const result = await sdk.trigger(\"mem::export\", {});\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_relations\": {\n if (typeof args.memoryId !== \"string\" || !args.memoryId.trim()) {\n return {\n status_code: 400,\n body: { error: \"memoryId is required for memory_relations\" },\n };\n }\n const rawMaxHops = Number(args.maxHops);\n const rawMinConf = Number(args.minConfidence);\n const result = await sdk.trigger(\"mem::get-related\", {\n memoryId: args.memoryId,\n maxHops: Number.isFinite(rawMaxHops) ? rawMaxHops : 2,\n minConfidence: Number.isFinite(rawMinConf)\n ? Math.max(0, Math.min(1, rawMinConf))\n : 0,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_claude_bridge_sync\": {\n const direction = (args.direction as string) || \"write\";\n const funcId =\n direction === \"read\"\n ? \"mem::claude-bridge-read\"\n : \"mem::claude-bridge-sync\";\n try {\n const result = await sdk.trigger(funcId, {});\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Claude bridge not enabled. Set CLAUDE_MEMORY_BRIDGE=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_graph_query\": {\n try {\n const result = await sdk.trigger(\"mem::graph-query\", {\n startNodeId: args.startNodeId as string,\n nodeType: args.nodeType as string,\n maxDepth: args.maxDepth as number,\n query: args.query as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Knowledge graph not enabled. Set GRAPH_EXTRACTION_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_consolidate\": {\n try {\n const result = await sdk.trigger(\"mem::consolidate-pipeline\", {\n tier: args.tier as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Consolidation not enabled. Set CONSOLIDATION_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_team_share\": {\n if (\n typeof args.itemId !== \"string\" ||\n typeof args.itemType !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"itemId and itemType are required\" },\n };\n }\n try {\n const result = await sdk.trigger(\"mem::team-share\", {\n itemId: args.itemId,\n itemType: args.itemType,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Team memory not enabled. Set TEAM_ID and USER_ID\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_team_feed\": {\n try {\n const result = await sdk.trigger(\"mem::team-feed\", {\n limit: (args.limit as number) || 20,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Team memory not enabled. Set TEAM_ID and USER_ID\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_audit\": {\n try {\n const result = await sdk.trigger(\"mem::audit-query\", {\n operation: args.operation as string,\n limit: (args.limit as number) || 50,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: \"Audit query failed\" }],\n isError: true,\n },\n };\n }\n }\n\n case \"memory_governance_delete\": {\n if (typeof args.memoryIds !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"memoryIds is required\" },\n };\n }\n const ids = (args.memoryIds as string)\n .split(\",\")\n .map((id) => id.trim())\n .filter(Boolean);\n try {\n const result = await sdk.trigger(\"mem::governance-delete\", {\n memoryIds: ids,\n reason: args.reason as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [{ type: \"text\", text: \"Governance delete failed\" }],\n isError: true,\n },\n };\n }\n }\n\n case \"memory_snapshot_create\": {\n try {\n const result = await sdk.trigger(\"mem::snapshot-create\", {\n message: args.message as string,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(result, null, 2) },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n content: [\n {\n type: \"text\",\n text: \"Snapshots not enabled. Set SNAPSHOT_ENABLED=true\",\n },\n ],\n },\n };\n }\n }\n\n case \"memory_action_create\": {\n if (typeof args.title !== \"string\" || !args.title.trim()) {\n return {\n status_code: 400,\n body: { error: \"title is required\" },\n };\n }\n const edges: Array<{ type: string; targetActionId: string }> = [];\n if (typeof args.requires === \"string\" && args.requires.trim()) {\n for (const id of args.requires.split(\",\").map((s: string) => s.trim()).filter(Boolean)) {\n edges.push({ type: \"requires\", targetActionId: id });\n }\n }\n const tags = typeof args.tags === \"string\" && args.tags.trim()\n ? args.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : [];\n const actionResult = await sdk.trigger(\"mem::action-create\", {\n title: args.title,\n description: args.description,\n priority: args.priority,\n project: args.project,\n tags,\n parentId: args.parentId,\n edges: edges.length > 0 ? edges : undefined,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(actionResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_action_update\": {\n if (typeof args.actionId !== \"string\" || !args.actionId.trim()) {\n return {\n status_code: 400,\n body: { error: \"actionId is required\" },\n };\n }\n const updateResult = await sdk.trigger(\"mem::action-update\", {\n actionId: args.actionId,\n status: args.status,\n result: args.result,\n priority: args.priority,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(updateResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_frontier\": {\n const frontierResult = await sdk.trigger(\"mem::frontier\", {\n project: args.project,\n agentId: args.agentId,\n limit: args.limit,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(frontierResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_next\": {\n const nextResult = await sdk.trigger(\"mem::next\", {\n project: args.project,\n agentId: args.agentId,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(nextResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_lease\": {\n if (\n typeof args.actionId !== \"string\" ||\n typeof args.agentId !== \"string\" ||\n typeof args.operation !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"actionId, agentId, and operation are required\" },\n };\n }\n const op = args.operation as string;\n let leaseResult;\n if (op === \"acquire\") {\n leaseResult = await sdk.trigger(\"mem::lease-acquire\", {\n actionId: args.actionId,\n agentId: args.agentId,\n ttlMs: args.ttlMs,\n });\n } else if (op === \"release\") {\n leaseResult = await sdk.trigger(\"mem::lease-release\", {\n actionId: args.actionId,\n agentId: args.agentId,\n result: args.result,\n });\n } else if (op === \"renew\") {\n leaseResult = await sdk.trigger(\"mem::lease-renew\", {\n actionId: args.actionId,\n agentId: args.agentId,\n ttlMs: args.ttlMs,\n });\n } else {\n return {\n status_code: 400,\n body: { error: \"operation must be acquire, release, or renew\" },\n };\n }\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(leaseResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_routine_run\": {\n if (typeof args.routineId !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"routineId is required\" },\n };\n }\n const runResult = await sdk.trigger(\"mem::routine-run\", {\n routineId: args.routineId,\n project: args.project,\n initiatedBy: args.initiatedBy,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(runResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_signal_send\": {\n if (\n typeof args.from !== \"string\" ||\n typeof args.content !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"from and content are required\" },\n };\n }\n const sigResult = await sdk.trigger(\"mem::signal-send\", {\n from: args.from,\n to: args.to,\n content: args.content,\n type: args.type,\n replyTo: args.replyTo,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(sigResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_signal_read\": {\n if (typeof args.agentId !== \"string\") {\n return {\n status_code: 400,\n body: { error: \"agentId is required\" },\n };\n }\n const readResult = await sdk.trigger(\"mem::signal-read\", {\n agentId: args.agentId,\n unreadOnly: args.unreadOnly === true || args.unreadOnly === \"true\",\n threadId: args.threadId,\n limit: args.limit,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(readResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_checkpoint\": {\n const cpOp = args.operation as string;\n if (!cpOp) {\n return {\n status_code: 400,\n body: { error: \"operation is required\" },\n };\n }\n let cpResult;\n if (cpOp === \"create\") {\n const linkedIds = typeof args.linkedActionIds === \"string\" && args.linkedActionIds.trim()\n ? args.linkedActionIds.split(\",\").map((s: string) => s.trim())\n : [];\n cpResult = await sdk.trigger(\"mem::checkpoint-create\", {\n name: args.name,\n description: args.description,\n type: args.type,\n linkedActionIds: linkedIds,\n });\n } else if (cpOp === \"resolve\") {\n if (typeof args.checkpointId !== \"string\" || !args.checkpointId.trim()) {\n return {\n status_code: 400,\n body: { error: \"checkpointId is required for resolve operation\" },\n };\n }\n cpResult = await sdk.trigger(\"mem::checkpoint-resolve\", {\n checkpointId: args.checkpointId,\n status: args.status,\n });\n } else if (cpOp === \"list\") {\n cpResult = await sdk.trigger(\"mem::checkpoint-list\", {\n status: args.status,\n type: args.type,\n });\n } else {\n return {\n status_code: 400,\n body: { error: \"operation must be create, resolve, or list\" },\n };\n }\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(cpResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_mesh_sync\": {\n const meshResult = await sdk.trigger(\"mem::mesh-sync\", {\n peerId: args.peerId,\n direction: args.direction,\n });\n return {\n status_code: 200,\n body: {\n content: [\n { type: \"text\", text: JSON.stringify(meshResult, null, 2) },\n ],\n },\n };\n }\n\n case \"memory_sentinel_create\": {\n let snlConfig: Record<string, unknown> = {};\n if (typeof args.config === \"object\" && args.config !== null) {\n snlConfig = args.config as Record<string, unknown>;\n } else if (typeof args.config === \"string\" && args.config.trim()) {\n try { snlConfig = JSON.parse(args.config); } catch { return { status_code: 400, body: { error: \"invalid config JSON\" } }; }\n }\n const snlLinked = typeof args.linkedActionIds === \"string\" && args.linkedActionIds.trim()\n ? args.linkedActionIds.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const snlResult = await sdk.trigger(\"mem::sentinel-create\", {\n name: args.name,\n type: args.type,\n config: snlConfig,\n linkedActionIds: snlLinked,\n expiresInMs: args.expiresInMs,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(snlResult, null, 2) }] } };\n }\n\n case \"memory_sentinel_trigger\": {\n let snlTrigPayload: unknown;\n if (args.result !== undefined && args.result !== null) {\n if (typeof args.result === \"string\") {\n try { snlTrigPayload = JSON.parse(args.result); } catch { return { status_code: 400, body: { error: \"invalid result JSON\" } }; }\n } else {\n snlTrigPayload = args.result;\n }\n }\n const snlTrigResult = await sdk.trigger(\"mem::sentinel-trigger\", {\n sentinelId: args.sentinelId,\n result: snlTrigPayload,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(snlTrigResult, null, 2) }] } };\n }\n\n case \"memory_sketch_create\": {\n const skResult = await sdk.trigger(\"mem::sketch-create\", {\n title: args.title,\n description: args.description,\n expiresInMs: args.expiresInMs,\n project: args.project,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(skResult, null, 2) }] } };\n }\n\n case \"memory_sketch_promote\": {\n const skpResult = await sdk.trigger(\"mem::sketch-promote\", {\n sketchId: args.sketchId,\n project: args.project,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(skpResult, null, 2) }] } };\n }\n\n case \"memory_crystallize\": {\n if (typeof args.actionIds !== \"string\" || !args.actionIds.trim()) {\n return { status_code: 400, body: { error: \"actionIds is required\" } };\n }\n const crysIds = args.actionIds.split(\",\").map((s: string) => s.trim()).filter(Boolean);\n const crysResult = await sdk.trigger(\"mem::crystallize\", {\n actionIds: crysIds,\n project: args.project,\n sessionId: args.sessionId,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(crysResult, null, 2) }] } };\n }\n\n case \"memory_diagnose\": {\n const diagCats = typeof args.categories === \"string\" && args.categories.trim()\n ? args.categories.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const diagResult = await sdk.trigger(\"mem::diagnose\", { categories: diagCats });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(diagResult, null, 2) }] } };\n }\n\n case \"memory_heal\": {\n const healCats = typeof args.categories === \"string\" && args.categories.trim()\n ? args.categories.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const healResult = await sdk.trigger(\"mem::heal\", {\n categories: healCats,\n dryRun: args.dryRun === true || args.dryRun === \"true\",\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(healResult, null, 2) }] } };\n }\n\n case \"memory_facet_tag\": {\n const fctResult = await sdk.trigger(\"mem::facet-tag\", {\n targetId: args.targetId,\n targetType: args.targetType,\n dimension: args.dimension,\n value: args.value,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(fctResult, null, 2) }] } };\n }\n\n case \"memory_facet_query\": {\n if (args.matchAll !== undefined && typeof args.matchAll !== \"string\") {\n return { status_code: 400, body: { error: \"matchAll must be a string\" } };\n }\n if (args.matchAny !== undefined && typeof args.matchAny !== \"string\") {\n return { status_code: 400, body: { error: \"matchAny must be a string\" } };\n }\n const fqAll = typeof args.matchAll === \"string\" && args.matchAll.trim()\n ? args.matchAll.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const fqAny = typeof args.matchAny === \"string\" && args.matchAny.trim()\n ? args.matchAny.split(\",\").map((s: string) => s.trim()).filter(Boolean)\n : undefined;\n const fqResult = await sdk.trigger(\"mem::facet-query\", {\n matchAll: fqAll,\n matchAny: fqAny,\n targetType: args.targetType,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(fqResult, null, 2) }] } };\n }\n\n case \"memory_verify\": {\n if (!args.id || typeof args.id !== \"string\") {\n return { status_code: 400, body: { error: \"id is required\" } };\n }\n const verifyResult = await sdk.trigger(\"mem::verify\", { id: args.id });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(verifyResult, null, 2) }] } };\n }\n\n case \"memory_lesson_save\": {\n if (typeof args.content !== \"string\" || !args.content.trim()) {\n return { status_code: 400, body: { error: \"content is required\" } };\n }\n const lessonTags = typeof args.tags === \"string\" && args.tags.trim()\n ? args.tags.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : [];\n const lessonSaveResult = await sdk.trigger(\"mem::lesson-save\", {\n content: args.content,\n context: args.context || \"\",\n confidence: args.confidence,\n project: args.project,\n tags: lessonTags,\n source: \"manual\",\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(lessonSaveResult, null, 2) }] } };\n }\n\n case \"memory_lesson_recall\": {\n if (typeof args.query !== \"string\" || !args.query.trim()) {\n return { status_code: 400, body: { error: \"query is required\" } };\n }\n const lessonRecallResult = await sdk.trigger(\"mem::lesson-recall\", {\n query: args.query,\n project: args.project,\n minConfidence: args.minConfidence,\n limit: args.limit,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(lessonRecallResult, null, 2) }] } };\n }\n\n case \"memory_obsidian_export\": {\n const exportTypes = typeof args.types === \"string\" && args.types.trim()\n ? args.types.split(\",\").map((t: string) => t.trim()).filter(Boolean)\n : undefined;\n const obsidianResult = await sdk.trigger(\"mem::obsidian-export\", {\n vaultDir: args.vaultDir,\n types: exportTypes,\n });\n return { status_code: 200, body: { content: [{ type: \"text\", text: JSON.stringify(obsidianResult, null, 2) }] } };\n }\n\n default:\n return {\n status_code: 400,\n body: { error: `Unknown tool: ${name}` },\n };\n }\n } catch (err) {\n return {\n status_code: 500,\n body: {\n error: \"Internal error\",\n },\n };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::tools::call\",\n config: { api_path: \"/agentmemory/mcp/call\", http_method: \"POST\" },\n });\n\n const MCP_RESOURCES = [\n {\n uri: \"agentmemory://status\",\n name: \"Agent Memory Status\",\n description: \"Current session count, memory count, and health status\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://project/{name}/profile\",\n name: \"Project Profile\",\n description:\n \"Top concepts, frequently modified files, and conventions for a project\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://project/{name}/recent\",\n name: \"Recent Sessions\",\n description: \"Last 5 session summaries for a project\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://memories/latest\",\n name: \"Latest Memories\",\n description: \"Top 10 latest memories with their type and strength\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://graph/stats\",\n name: \"Knowledge Graph Stats\",\n description: \"Node and edge counts by type in the knowledge graph\",\n mimeType: \"application/json\",\n },\n {\n uri: \"agentmemory://team/{id}/profile\",\n name: \"Team Profile\",\n description: \"Team memory profile with shared concepts and patterns\",\n mimeType: \"application/json\",\n },\n ];\n\n sdk.registerFunction(\n { id: \"mcp::resources::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { resources: MCP_RESOURCES } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::resources::list\",\n config: { api_path: \"/agentmemory/mcp/resources\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::resources::read\" },\n async (req: ApiRequest<{ uri: string }>): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const uri = req.body?.uri;\n if (!uri || typeof uri !== \"string\") {\n return { status_code: 400, body: { error: \"uri is required\" } };\n }\n\n try {\n if (uri === \"agentmemory://status\") {\n const sessions = await kv.list<Session>(KV.sessions);\n const memories = await kv.list<Memory>(KV.memories);\n const healthData = await kv.list(KV.health).catch(() => []);\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n sessionCount: sessions.length,\n memoryCount: memories.length,\n healthStatus:\n healthData.length > 0 ? \"available\" : \"no-data\",\n }),\n },\n ],\n },\n };\n }\n\n const projectProfileMatch = uri.match(\n /^agentmemory:\\/\\/project\\/(.+)\\/profile$/,\n );\n if (projectProfileMatch) {\n let projectName: string;\n try {\n projectName = decodeURIComponent(projectProfileMatch[1]);\n } catch {\n return {\n status_code: 400,\n body: { error: \"Invalid percent-encoding in URI\" },\n };\n }\n const profile = await sdk.trigger(\"mem::profile\", {\n project: projectName,\n });\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(profile),\n },\n ],\n },\n };\n }\n\n const projectRecentMatch = uri.match(\n /^agentmemory:\\/\\/project\\/(.+)\\/recent$/,\n );\n if (projectRecentMatch) {\n let projectName: string;\n try {\n projectName = decodeURIComponent(projectRecentMatch[1]);\n } catch {\n return {\n status_code: 400,\n body: { error: \"Invalid percent-encoding in URI\" },\n };\n }\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const filtered = summaries\n .filter((s) => s.project === projectName)\n .sort(\n (a, b) =>\n new Date(b.createdAt).getTime() -\n new Date(a.createdAt).getTime(),\n )\n .slice(0, 5);\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(filtered),\n },\n ],\n },\n };\n }\n\n if (uri === \"agentmemory://memories/latest\") {\n const memories = await kv.list<Memory>(KV.memories);\n const latest = memories\n .filter((m) => m.isLatest)\n .sort(\n (a, b) =>\n new Date(b.updatedAt).getTime() -\n new Date(a.updatedAt).getTime(),\n )\n .slice(0, 10)\n .map((m) => ({\n id: m.id,\n title: m.title,\n type: m.type,\n strength: m.strength,\n }));\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(latest),\n },\n ],\n },\n };\n }\n\n if (uri === \"agentmemory://graph/stats\") {\n try {\n const nodes = await kv.list<GraphNode>(KV.graphNodes);\n const edges = await kv.list<GraphEdge>(KV.graphEdges);\n const nodesByType: Record<string, number> = {};\n for (const n of nodes)\n nodesByType[n.type] = (nodesByType[n.type] || 0) + 1;\n const edgesByType: Record<string, number> = {};\n for (const e of edges)\n edgesByType[e.type] = (edgesByType[e.type] || 0) + 1;\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n totalNodes: nodes.length,\n totalEdges: edges.length,\n nodesByType,\n edgesByType,\n }),\n },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n totalNodes: 0,\n totalEdges: 0,\n }),\n },\n ],\n },\n };\n }\n }\n\n const teamProfileMatch = uri.match(\n /^agentmemory:\\/\\/team\\/(.+)\\/profile$/,\n );\n if (teamProfileMatch) {\n try {\n const teamId = decodeURIComponent(teamProfileMatch[1]);\n const items = await kv.list(KV.teamShared(teamId));\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n teamId,\n sharedItems: items.length,\n }),\n },\n ],\n },\n };\n } catch {\n return {\n status_code: 200,\n body: {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n teamId: teamProfileMatch[1],\n sharedItems: 0,\n }),\n },\n ],\n },\n };\n }\n }\n\n return {\n status_code: 404,\n body: { error: `Unknown resource: ${uri}` },\n };\n } catch {\n return { status_code: 500, body: { error: \"Internal error\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::resources::read\",\n config: {\n api_path: \"/agentmemory/mcp/resources/read\",\n http_method: \"POST\",\n },\n });\n\n const MCP_PROMPTS = [\n {\n name: \"recall_context\",\n description:\n \"Search observations and memories to build context for a task\",\n arguments: [\n {\n name: \"task_description\",\n description: \"What you are working on\",\n required: true,\n },\n ],\n },\n {\n name: \"session_handoff\",\n description:\n \"Generate a handoff summary for continuing work in a new session\",\n arguments: [\n {\n name: \"session_id\",\n description: \"Session ID to hand off from\",\n required: true,\n },\n ],\n },\n {\n name: \"detect_patterns\",\n description: \"Detect recurring patterns across sessions for a project\",\n arguments: [\n {\n name: \"project\",\n description: \"Project path to analyze (optional)\",\n required: false,\n },\n ],\n },\n ];\n\n sdk.registerFunction(\n { id: \"mcp::prompts::list\" },\n async (req: ApiRequest): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n return { status_code: 200, body: { prompts: MCP_PROMPTS } };\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::prompts::list\",\n config: { api_path: \"/agentmemory/mcp/prompts\", http_method: \"GET\" },\n });\n\n sdk.registerFunction(\n { id: \"mcp::prompts::get\" },\n async (\n req: ApiRequest<{ name: string; arguments?: Record<string, string> }>,\n ): Promise<McpResponse> => {\n const authErr = checkAuth(req, secret);\n if (authErr) return authErr;\n\n const promptName = req.body?.name;\n if (!promptName || typeof promptName !== \"string\") {\n return { status_code: 400, body: { error: \"name is required\" } };\n }\n\n const promptArgs = req.body?.arguments || {};\n\n try {\n switch (promptName) {\n case \"recall_context\": {\n const taskDesc = promptArgs.task_description;\n if (typeof taskDesc !== \"string\" || !taskDesc.trim()) {\n return {\n status_code: 400,\n body: {\n error:\n \"task_description argument is required and must be a string\",\n },\n };\n }\n const searchResult = await sdk\n .trigger(\"mem::search\", { query: taskDesc, limit: 10 })\n .catch(() => ({ results: [] }));\n const memories = await kv.list<Memory>(KV.memories);\n const relevant = memories.filter((m) => m.isLatest).slice(0, 5);\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `Here is relevant context from past sessions for the task: \"${taskDesc}\"\\n\\n## Past Observations\\n${JSON.stringify(searchResult, null, 2)}\\n\\n## Relevant Memories\\n${JSON.stringify(relevant, null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n case \"session_handoff\": {\n const sessionId = promptArgs.session_id;\n if (typeof sessionId !== \"string\" || !sessionId.trim()) {\n return {\n status_code: 400,\n body: {\n error: \"session_id argument is required and must be a string\",\n },\n };\n }\n const session = await kv.get<Session>(KV.sessions, sessionId);\n const summaries = await kv.list<SessionSummary>(KV.summaries);\n const summary = summaries.find((s) => s.sessionId === sessionId);\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `## Session Handoff\\n\\n### Session\\n${JSON.stringify(session, null, 2)}\\n\\n### Summary\\n${JSON.stringify(summary || \"No summary available\", null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n case \"detect_patterns\": {\n if (\n promptArgs.project !== undefined &&\n typeof promptArgs.project !== \"string\"\n ) {\n return {\n status_code: 400,\n body: { error: \"project argument must be a string\" },\n };\n }\n const result = await sdk.trigger(\"mem::patterns\", {\n project: promptArgs.project || undefined,\n });\n return {\n status_code: 200,\n body: {\n messages: [\n {\n role: \"user\",\n content: {\n type: \"text\",\n text: `## Pattern Analysis\\n\\n${JSON.stringify(result, null, 2)}`,\n },\n },\n ],\n },\n };\n }\n\n default:\n return {\n status_code: 400,\n body: { error: `Unknown prompt: ${promptName}` },\n };\n }\n } catch {\n return { status_code: 500, body: { error: \"Internal error\" } };\n }\n },\n );\n sdk.registerTrigger({\n type: \"http\",\n function_id: \"mcp::prompts::get\",\n config: { api_path: \"/agentmemory/mcp/prompts/get\", http_method: \"POST\" },\n });\n}\n","import {\n createServer,\n type Server,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport { readFileSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { timingSafeCompare, VIEWER_CSP } from \"../auth.js\";\n\nconst ALLOWED_ORIGINS = (\n process.env.VIEWER_ALLOWED_ORIGINS ||\n \"http://localhost:3111,http://localhost:3113,http://127.0.0.1:3111,http://127.0.0.1:3113\"\n)\n .split(\",\")\n .map((o) => o.trim());\n\nfunction corsHeaders(req: IncomingMessage): Record<string, string> {\n const origin = req.headers.origin || \"\";\n const allowed = ALLOWED_ORIGINS.includes(origin)\n ? origin\n : ALLOWED_ORIGINS[0];\n return {\n \"Access-Control-Allow-Origin\": allowed,\n \"Access-Control-Allow-Methods\": \"GET, POST, DELETE, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type, Authorization\",\n Vary: \"Origin\",\n };\n}\n\nfunction json(\n res: ServerResponse,\n status: number,\n data: unknown,\n req?: IncomingMessage,\n): void {\n const body = JSON.stringify(data);\n const cors = req\n ? corsHeaders(req)\n : { \"Access-Control-Allow-Origin\": ALLOWED_ORIGINS[0], Vary: \"Origin\" };\n res.writeHead(status, { ...cors, \"Content-Type\": \"application/json\" });\n res.end(body);\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n let size = 0;\n req.on(\"data\", (chunk: Buffer) => {\n size += chunk.length;\n if (size > 1_000_000) {\n req.destroy();\n reject(new Error(\"too large\"));\n return;\n }\n data += chunk.toString();\n });\n req.on(\"end\", () => resolve(data));\n req.on(\"error\", reject);\n });\n}\n\nfunction checkAuth(req: IncomingMessage, secret: string | undefined): boolean {\n if (!secret) return true;\n const auth = req.headers[\"authorization\"] || \"\";\n return (\n typeof auth === \"string\" && timingSafeCompare(auth, `Bearer ${secret}`)\n );\n}\n\nexport function startViewerServer(\n port: number,\n _kv: unknown,\n _sdk: unknown,\n secret?: string,\n restPort?: number,\n): Server {\n const resolvedRestPort = restPort ?? port - 2;\n\n const server = createServer(async (req, res) => {\n const raw = req.url || \"/\";\n const qIdx = raw.indexOf(\"?\");\n const pathname = qIdx >= 0 ? raw.slice(0, qIdx) : raw;\n const qs = qIdx >= 0 ? raw.slice(qIdx + 1) : \"\";\n const method = req.method || \"GET\";\n\n if (method === \"OPTIONS\") {\n res.writeHead(204, {\n ...corsHeaders(req),\n \"Access-Control-Max-Age\": \"86400\",\n });\n res.end();\n return;\n }\n\n if (\n method === \"GET\" &&\n (pathname === \"/\" ||\n pathname === \"/viewer\" ||\n pathname === \"/agentmemory/viewer\")\n ) {\n const base = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(base, \"..\", \"src\", \"viewer\", \"index.html\"),\n join(base, \"..\", \"viewer\", \"index.html\"),\n join(base, \"viewer\", \"index.html\"),\n ];\n for (const p of candidates) {\n try {\n const html = readFileSync(p, \"utf-8\");\n res.writeHead(200, {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Content-Security-Policy\": VIEWER_CSP,\n \"Cache-Control\": \"no-cache\",\n });\n res.end(html);\n return;\n } catch {}\n }\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"viewer not found\");\n return;\n }\n\n if (!checkAuth(req, secret)) {\n json(res, 401, { error: \"unauthorized\" }, req);\n return;\n }\n\n try {\n await proxyToRestApi(resolvedRestPort, pathname, qs, method, req, res, secret);\n } catch (err) {\n console.error(`[viewer] proxy error on ${method} ${pathname}:`, err);\n json(res, 502, { error: \"upstream error\" }, req);\n }\n });\n\n server.listen(port, \"127.0.0.1\", () => {\n console.log(`[agentmemory] Viewer: http://localhost:${port}`);\n });\n\n return server;\n}\n\nasync function proxyToRestApi(\n restPort: number,\n pathname: string,\n qs: string,\n method: string,\n req: IncomingMessage,\n res: ServerResponse,\n secret?: string,\n): Promise<void> {\n const upstreamPath = pathname.startsWith(\"/agentmemory/\")\n ? pathname\n : `/agentmemory${pathname.startsWith(\"/\") ? pathname : \"/\" + pathname}`;\n\n const upstreamUrl = `http://127.0.0.1:${restPort}${upstreamPath}${qs ? \"?\" + qs : \"\"}`;\n\n const headers: Record<string, string> = {};\n if (secret) {\n headers[\"Authorization\"] = `Bearer ${secret}`;\n }\n const ct = req.headers[\"content-type\"];\n if (ct) {\n headers[\"Content-Type\"] = ct;\n }\n\n let body: string | undefined;\n if (method === \"POST\" || method === \"PUT\" || method === \"DELETE\" || method === \"PATCH\") {\n body = await readBody(req);\n }\n\n const controller = new AbortController();\n const fetchTimeout = setTimeout(() => controller.abort(), 10000);\n let upstream: Response;\n try {\n upstream = await fetch(upstreamUrl, {\n method,\n headers,\n body: body || undefined,\n signal: controller.signal,\n });\n clearTimeout(fetchTimeout);\n } catch (err) {\n clearTimeout(fetchTimeout);\n if (err instanceof Error && err.name === \"AbortError\") {\n json(res, 504, { error: \"upstream timeout\" }, req);\n return;\n }\n throw err;\n }\n\n const cors = corsHeaders(req);\n const responseBody = await upstream.text();\n const responseHeaders: Record<string, string> = {\n ...cors,\n };\n const upstreamCt = upstream.headers.get(\"content-type\");\n if (upstreamCt) {\n responseHeaders[\"Content-Type\"] = upstreamCt;\n }\n\n res.writeHead(upstream.status, responseHeaders);\n res.end(responseBody);\n}\n","import type { FunctionMetrics } from \"../types.js\";\nimport type { StateKV } from \"../state/kv.js\";\nimport { KV } from \"../state/schema.js\";\n\nexport class MetricsStore {\n private cache = new Map<string, FunctionMetrics>();\n private qualityCallCounts = new Map<string, number>();\n\n constructor(private kv: StateKV) {}\n\n async record(\n functionId: string,\n latencyMs: number,\n success: boolean,\n qualityScore?: number,\n ): Promise<void> {\n let m = this.cache.get(functionId);\n if (!m) {\n m = (await this.kv.get<FunctionMetrics>(KV.metrics, functionId)) ?? {\n functionId,\n totalCalls: 0,\n successCount: 0,\n failureCount: 0,\n avgLatencyMs: 0,\n avgQualityScore: 0,\n };\n }\n\n const prev = m.totalCalls;\n m.totalCalls += 1;\n m.avgLatencyMs = (m.avgLatencyMs * prev + latencyMs) / m.totalCalls;\n if (success) {\n m.successCount += 1;\n } else {\n m.failureCount += 1;\n }\n if (qualityScore !== undefined) {\n const prevQualityCalls = this.qualityCallCounts.get(functionId) || 0;\n m.avgQualityScore =\n (m.avgQualityScore * prevQualityCalls + qualityScore) /\n (prevQualityCalls + 1);\n this.qualityCallCounts.set(functionId, prevQualityCalls + 1);\n }\n\n this.cache.set(functionId, m);\n await this.kv.set(KV.metrics, functionId, m).catch(() => {});\n }\n\n async get(functionId: string): Promise<FunctionMetrics | null> {\n return (\n this.cache.get(functionId) ??\n (await this.kv.get<FunctionMetrics>(KV.metrics, functionId))\n );\n }\n\n async getAll(): Promise<FunctionMetrics[]> {\n const kvMetrics = await this.kv\n .list<FunctionMetrics>(KV.metrics)\n .catch(() => []);\n const merged = new Map<string, FunctionMetrics>();\n for (const m of kvMetrics) merged.set(m.functionId, m);\n for (const [id, m] of this.cache) merged.set(id, m);\n return Array.from(merged.values());\n }\n}\n","import { createHash } from \"node:crypto\";\n\nconst TTL_MS = 5 * 60 * 1000;\nconst CLEANUP_INTERVAL_MS = 60_000;\n\ninterface DedupEntry {\n hash: string;\n expiresAt: number;\n}\n\nexport class DedupMap {\n private entries = new Map<string, DedupEntry>();\n private cleanupTimer: ReturnType<typeof setInterval>;\n\n constructor() {\n this.cleanupTimer = setInterval(() => this.cleanup(), CLEANUP_INTERVAL_MS);\n this.cleanupTimer.unref();\n }\n\n computeHash(sessionId: string, toolName: string, toolInput: unknown): string {\n const input =\n typeof toolInput === \"string\"\n ? toolInput.slice(0, 500)\n : JSON.stringify(toolInput ?? \"\").slice(0, 500);\n const raw = `${sessionId}:${toolName}:${input}`;\n return createHash(\"sha256\").update(raw).digest(\"hex\");\n }\n\n isDuplicate(hash: string): boolean {\n const entry = this.entries.get(hash);\n if (!entry) return false;\n if (Date.now() > entry.expiresAt) {\n this.entries.delete(hash);\n return false;\n }\n return true;\n }\n\n record(hash: string): void {\n this.entries.set(hash, { hash, expiresAt: Date.now() + TTL_MS });\n }\n\n private cleanup(): void {\n const now = Date.now();\n for (const [key, entry] of this.entries) {\n if (now > entry.expiresAt) this.entries.delete(key);\n }\n }\n\n stop(): void {\n clearInterval(this.cleanupTimer);\n }\n\n get size(): number {\n return this.entries.size;\n }\n}\n","import { VERSION } from \"../version.js\";\n\ninterface OtelConfig {\n serviceName: string;\n serviceVersion: string;\n metricsExportIntervalMs: number;\n}\n\nexport const OTEL_CONFIG: OtelConfig = {\n serviceName: \"agentmemory\",\n serviceVersion: VERSION,\n metricsExportIntervalMs: 30_000,\n};\n\ninterface Counter {\n add: (n: number) => void;\n}\ninterface Histogram {\n record: (v: number) => void;\n}\n\ninterface Counters {\n observationsTotal: Counter;\n compressionSuccess: Counter;\n compressionFailure: Counter;\n searchTotal: Counter;\n dedupSkipped: Counter;\n evictionTotal: Counter;\n circuitBreakerOpen: Counter;\n embeddingSuccess: Counter;\n embeddingFailure: Counter;\n vectorSearchTotal: Counter;\n autoForgetTotal: Counter;\n profileGenerated: Counter;\n claudeBridgeSync: Counter;\n graphExtraction: Counter;\n consolidationRun: Counter;\n teamShare: Counter;\n auditLog: Counter;\n snapshotCreate: Counter;\n governanceDelete: Counter;\n}\n\ninterface Histograms {\n compressionLatency: Histogram;\n searchLatency: Histogram;\n contextTokens: Histogram;\n qualityScore: Histogram;\n embeddingLatency: Histogram;\n vectorSearchLatency: Histogram;\n}\n\ntype Meter = {\n createCounter: (name: string) => Counter;\n createHistogram: (name: string) => Histogram;\n};\n\nlet counters: Counters | null = null;\nlet histograms: Histograms | null = null;\n\nconst NOOP_COUNTER: Counter = { add: () => {} };\nconst NOOP_HISTOGRAM: Histogram = { record: () => {} };\n\nconst COUNTER_NAMES: Array<[keyof Counters, string]> = [\n [\"observationsTotal\", \"observations.total\"],\n [\"compressionSuccess\", \"compression.success\"],\n [\"compressionFailure\", \"compression.failure\"],\n [\"searchTotal\", \"search.total\"],\n [\"dedupSkipped\", \"dedup.skipped\"],\n [\"evictionTotal\", \"eviction.total\"],\n [\"circuitBreakerOpen\", \"circuit_breaker.open\"],\n [\"embeddingSuccess\", \"embedding.success\"],\n [\"embeddingFailure\", \"embedding.failure\"],\n [\"vectorSearchTotal\", \"vector_search.total\"],\n [\"autoForgetTotal\", \"auto_forget.total\"],\n [\"profileGenerated\", \"profile.generated\"],\n [\"claudeBridgeSync\", \"claude_bridge.sync\"],\n [\"graphExtraction\", \"graph.extraction\"],\n [\"consolidationRun\", \"consolidation.run\"],\n [\"teamShare\", \"team.share\"],\n [\"auditLog\", \"audit.log\"],\n [\"snapshotCreate\", \"snapshot.create\"],\n [\"governanceDelete\", \"governance.delete\"],\n];\n\nconst HISTOGRAM_NAMES: Array<[keyof Histograms, string]> = [\n [\"compressionLatency\", \"compression.latency_ms\"],\n [\"searchLatency\", \"search.latency_ms\"],\n [\"contextTokens\", \"context.tokens\"],\n [\"qualityScore\", \"quality.score\"],\n [\"embeddingLatency\", \"embedding.latency_ms\"],\n [\"vectorSearchLatency\", \"vector_search.latency_ms\"],\n];\n\nexport function initMetrics(getMeter?: (name: string) => Meter): {\n counters: Counters;\n histograms: Histograms;\n} {\n const meter = getMeter?.(\"agentmemory\");\n\n counters = Object.fromEntries(\n COUNTER_NAMES.map(([key, name]) => [\n key,\n meter ? meter.createCounter(name) : NOOP_COUNTER,\n ]),\n ) as unknown as Counters;\n\n histograms = Object.fromEntries(\n HISTOGRAM_NAMES.map(([key, name]) => [\n key,\n meter ? meter.createHistogram(name) : NOOP_HISTOGRAM,\n ]),\n ) as unknown as Histograms;\n\n return { counters, histograms };\n}\n","import { init } from \"iii-sdk\";\nimport {\n loadConfig,\n getEnvVar,\n loadEmbeddingConfig,\n loadFallbackConfig,\n loadClaudeBridgeConfig,\n loadTeamConfig,\n loadSnapshotConfig,\n isGraphExtractionEnabled,\n isConsolidationEnabled,\n} from \"./config.js\";\nimport {\n createProvider,\n createFallbackProvider,\n createEmbeddingProvider,\n} from \"./providers/index.js\";\nimport { StateKV } from \"./state/kv.js\";\nimport { VectorIndex } from \"./state/vector-index.js\";\nimport { HybridSearch } from \"./state/hybrid-search.js\";\nimport { IndexPersistence } from \"./state/index-persistence.js\";\nimport { registerPrivacyFunction } from \"./functions/privacy.js\";\nimport { registerObserveFunction } from \"./functions/observe.js\";\nimport { registerCompressFunction } from \"./functions/compress.js\";\nimport {\n registerSearchFunction,\n rebuildIndex,\n getSearchIndex,\n} from \"./functions/search.js\";\nimport { registerContextFunction } from \"./functions/context.js\";\nimport { registerSummarizeFunction } from \"./functions/summarize.js\";\nimport { registerMigrateFunction } from \"./functions/migrate.js\";\nimport { registerFileIndexFunction } from \"./functions/file-index.js\";\nimport { registerConsolidateFunction } from \"./functions/consolidate.js\";\nimport { registerPatternsFunction } from \"./functions/patterns.js\";\nimport { registerRememberFunction } from \"./functions/remember.js\";\nimport { registerEvictFunction } from \"./functions/evict.js\";\nimport { registerRelationsFunction } from \"./functions/relations.js\";\nimport { registerTimelineFunction } from \"./functions/timeline.js\";\nimport { registerSmartSearchFunction } from \"./functions/smart-search.js\";\nimport { registerProfileFunction } from \"./functions/profile.js\";\nimport { registerAutoForgetFunction } from \"./functions/auto-forget.js\";\nimport { registerExportImportFunction } from \"./functions/export-import.js\";\nimport { registerEnrichFunction } from \"./functions/enrich.js\";\nimport { registerClaudeBridgeFunction } from \"./functions/claude-bridge.js\";\nimport { registerGraphFunction } from \"./functions/graph.js\";\nimport { registerConsolidationPipelineFunction } from \"./functions/consolidation-pipeline.js\";\nimport { registerTeamFunction } from \"./functions/team.js\";\nimport { registerGovernanceFunction } from \"./functions/governance.js\";\nimport { registerSnapshotFunction } from \"./functions/snapshot.js\";\nimport { registerActionsFunction } from \"./functions/actions.js\";\nimport { registerFrontierFunction } from \"./functions/frontier.js\";\nimport { registerLeasesFunction } from \"./functions/leases.js\";\nimport { registerRoutinesFunction } from \"./functions/routines.js\";\nimport { registerSignalsFunction } from \"./functions/signals.js\";\nimport { registerCheckpointsFunction } from \"./functions/checkpoints.js\";\nimport { registerFlowCompressFunction } from \"./functions/flow-compress.js\";\nimport { registerMeshFunction } from \"./functions/mesh.js\";\nimport { registerBranchAwareFunction } from \"./functions/branch-aware.js\";\nimport { registerSentinelsFunction } from \"./functions/sentinels.js\";\nimport { registerSketchesFunction } from \"./functions/sketches.js\";\nimport { registerCrystallizeFunction } from \"./functions/crystallize.js\";\nimport { registerDiagnosticsFunction } from \"./functions/diagnostics.js\";\nimport { registerFacetsFunction } from \"./functions/facets.js\";\nimport { registerVerifyFunction } from \"./functions/verify.js\";\nimport { registerCascadeFunction } from \"./functions/cascade.js\";\nimport { registerLessonsFunctions } from \"./functions/lessons.js\";\nimport { registerObsidianExportFunction } from \"./functions/obsidian-export.js\";\nimport { registerSlidingWindowFunction } from \"./functions/sliding-window.js\";\nimport { registerQueryExpansionFunction } from \"./functions/query-expansion.js\";\nimport { registerTemporalGraphFunctions } from \"./functions/temporal-graph.js\";\nimport { registerRetentionFunctions } from \"./functions/retention.js\";\nimport { registerApiTriggers } from \"./triggers/api.js\";\nimport { registerEventTriggers } from \"./triggers/events.js\";\nimport { registerMcpEndpoints } from \"./mcp/server.js\";\nimport { startViewerServer } from \"./viewer/server.js\";\nimport { MetricsStore } from \"./eval/metrics-store.js\";\nimport { DedupMap } from \"./functions/dedup.js\";\nimport { registerHealthMonitor } from \"./health/monitor.js\";\nimport { initMetrics, OTEL_CONFIG } from \"./telemetry/setup.js\";\nimport { VERSION } from \"./version.js\";\n\nasync function main() {\n const config = loadConfig();\n const embeddingConfig = loadEmbeddingConfig();\n const fallbackConfig = loadFallbackConfig();\n\n const provider =\n fallbackConfig.providers.length > 0\n ? createFallbackProvider(config.provider, fallbackConfig)\n : createProvider(config.provider);\n\n const embeddingProvider = createEmbeddingProvider();\n\n console.log(`[agentmemory] Starting worker v${VERSION}...`);\n console.log(`[agentmemory] Engine: ${config.engineUrl}`);\n console.log(\n `[agentmemory] Provider: ${config.provider.provider} (${config.provider.model})`,\n );\n if (embeddingProvider) {\n console.log(\n `[agentmemory] Embedding provider: ${embeddingProvider.name} (${embeddingProvider.dimensions} dims)`,\n );\n } else {\n console.log(`[agentmemory] Embedding provider: none (BM25-only mode)`);\n }\n console.log(\n `[agentmemory] REST API: http://localhost:${config.restPort}/agentmemory/*`,\n );\n console.log(`[agentmemory] Streams: ws://localhost:${config.streamsPort}`);\n\n const sdk = init(config.engineUrl, {\n workerName: \"agentmemory\",\n otel: {\n serviceName: OTEL_CONFIG.serviceName,\n serviceVersion: OTEL_CONFIG.serviceVersion,\n metricsExportIntervalMs: OTEL_CONFIG.metricsExportIntervalMs,\n },\n });\n\n const kv = new StateKV(sdk);\n const secret = getEnvVar(\"AGENTMEMORY_SECRET\");\n const metricsStore = new MetricsStore(kv);\n const dedupMap = new DedupMap();\n\n const vectorIndex = embeddingProvider ? new VectorIndex() : null;\n\n initMetrics(\n typeof (sdk as any).getMeter === \"function\"\n ? (sdk as any).getMeter.bind(sdk)\n : undefined,\n );\n\n registerPrivacyFunction(sdk);\n registerObserveFunction(sdk, kv, dedupMap, config.maxObservationsPerSession);\n registerCompressFunction(sdk, kv, provider, metricsStore);\n registerSearchFunction(sdk, kv);\n registerContextFunction(sdk, kv, config.tokenBudget);\n registerSummarizeFunction(sdk, kv, provider, metricsStore);\n registerMigrateFunction(sdk, kv);\n registerFileIndexFunction(sdk, kv);\n registerConsolidateFunction(sdk, kv, provider);\n registerPatternsFunction(sdk, kv);\n registerRememberFunction(sdk, kv);\n registerEvictFunction(sdk, kv);\n\n registerRelationsFunction(sdk, kv);\n registerTimelineFunction(sdk, kv);\n registerProfileFunction(sdk, kv);\n registerAutoForgetFunction(sdk, kv);\n registerExportImportFunction(sdk, kv);\n registerEnrichFunction(sdk, kv);\n\n const claudeBridgeConfig = loadClaudeBridgeConfig();\n if (claudeBridgeConfig.enabled) {\n registerClaudeBridgeFunction(sdk, kv, claudeBridgeConfig);\n console.log(\n `[agentmemory] Claude bridge: syncing to ${claudeBridgeConfig.memoryFilePath}`,\n );\n }\n\n if (isGraphExtractionEnabled()) {\n registerGraphFunction(sdk, kv, provider);\n console.log(`[agentmemory] Knowledge graph: extraction enabled`);\n }\n\n registerConsolidationPipelineFunction(sdk, kv, provider);\n console.log(`[agentmemory] Consolidation pipeline: registered (CONSOLIDATION_ENABLED=${isConsolidationEnabled() ? \"true\" : \"false\"})`);\n\n const teamConfig = loadTeamConfig();\n if (teamConfig) {\n registerTeamFunction(sdk, kv, teamConfig);\n console.log(\n `[agentmemory] Team memory: ${teamConfig.teamId} (${teamConfig.mode})`,\n );\n }\n\n registerGovernanceFunction(sdk, kv);\n\n registerActionsFunction(sdk, kv);\n registerFrontierFunction(sdk, kv);\n registerLeasesFunction(sdk, kv);\n registerRoutinesFunction(sdk, kv);\n registerSignalsFunction(sdk, kv);\n registerCheckpointsFunction(sdk, kv);\n registerMeshFunction(sdk, kv);\n registerBranchAwareFunction(sdk, kv);\n registerFlowCompressFunction(sdk, kv, provider);\n registerSentinelsFunction(sdk, kv);\n registerSketchesFunction(sdk, kv);\n registerCrystallizeFunction(sdk, kv, provider);\n registerDiagnosticsFunction(sdk, kv);\n registerFacetsFunction(sdk, kv);\n registerVerifyFunction(sdk, kv);\n registerLessonsFunctions(sdk, kv);\n registerObsidianExportFunction(sdk, kv);\n registerCascadeFunction(sdk, kv);\n\n registerSlidingWindowFunction(sdk, kv, provider);\n registerQueryExpansionFunction(sdk, provider);\n registerTemporalGraphFunctions(sdk, kv, provider);\n registerRetentionFunctions(sdk, kv);\n console.log(\n `[agentmemory] v0.6 advanced retrieval: sliding-window, query-expansion, temporal-graph, retention-scoring`,\n );\n console.log(\n `[agentmemory] Orchestration layer: actions, frontier, leases, routines, signals, checkpoints, flow-compress, mesh, branch-aware, sentinels, sketches, crystallize, diagnostics, facets`,\n );\n\n const snapshotConfig = loadSnapshotConfig();\n if (snapshotConfig.enabled) {\n registerSnapshotFunction(sdk, kv, snapshotConfig.dir);\n console.log(\n `[agentmemory] Git snapshots: ${snapshotConfig.dir} (every ${snapshotConfig.interval}s)`,\n );\n }\n\n const bm25Index = getSearchIndex();\n const graphWeight = parseFloat(getEnvVar(\"AGENTMEMORY_GRAPH_WEIGHT\") || \"0.3\");\n const hybridSearch = new HybridSearch(\n bm25Index,\n vectorIndex,\n embeddingProvider,\n kv,\n embeddingConfig.bm25Weight,\n embeddingConfig.vectorWeight,\n graphWeight,\n );\n\n registerSmartSearchFunction(sdk, kv, (query, limit) =>\n hybridSearch.search(query, limit),\n );\n\n registerApiTriggers(sdk, kv, secret, metricsStore, provider);\n registerEventTriggers(sdk, kv);\n registerMcpEndpoints(sdk, kv, secret);\n\n const healthMonitor = registerHealthMonitor(sdk, kv);\n\n const indexPersistence = new IndexPersistence(kv, bm25Index, vectorIndex);\n\n const loaded = await indexPersistence.load().catch((err) => {\n console.warn(`[agentmemory] Failed to load persisted index:`, err);\n return null;\n });\n if (loaded?.bm25 && loaded.bm25.size > 0) {\n bm25Index.restoreFrom(loaded.bm25);\n console.log(\n `[agentmemory] Loaded persisted BM25 index (${bm25Index.size} docs)`,\n );\n }\n if (loaded?.vector && vectorIndex && loaded.vector.size > 0) {\n vectorIndex.restoreFrom(loaded.vector);\n console.log(\n `[agentmemory] Loaded persisted vector index (${vectorIndex.size} vectors)`,\n );\n }\n\n const needsRebuild = bm25Index.size === 0;\n\n if (needsRebuild) {\n const indexCount = await rebuildIndex(kv).catch((err) => {\n console.warn(`[agentmemory] Failed to rebuild search index:`, err);\n return 0;\n });\n if (indexCount > 0) {\n console.log(\n `[agentmemory] Search index rebuilt: ${indexCount} observations`,\n );\n indexPersistence.scheduleSave();\n }\n }\n\n console.log(\n `[agentmemory] Ready. ${embeddingProvider ? \"Triple-stream (BM25+Vector+Graph)\" : \"BM25+Graph\"} search active.`,\n );\n console.log(\n `[agentmemory] Endpoints: 100 REST + 41 MCP tools + 6 MCP resources + 3 MCP prompts`,\n );\n\n const viewerPort = config.restPort + 2;\n const viewerServer = startViewerServer(\n viewerPort,\n kv,\n sdk,\n secret,\n config.restPort,\n );\n\n const autoForgetIntervalMs = parseInt(process.env.AUTO_FORGET_INTERVAL_MS || \"3600000\", 10);\n const consolidationIntervalMs = parseInt(process.env.CONSOLIDATION_INTERVAL_MS || \"7200000\", 10);\n\n if (process.env.AUTO_FORGET_ENABLED !== \"false\") {\n const autoForgetTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::auto-forget\", { dryRun: false });\n } catch {}\n }, autoForgetIntervalMs);\n autoForgetTimer.unref();\n console.log(`[agentmemory] Auto-forget: enabled (every ${autoForgetIntervalMs / 60000}m)`);\n }\n\n if (process.env.LESSON_DECAY_ENABLED !== \"false\") {\n const lessonDecayTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::lesson-decay-sweep\", {});\n } catch {}\n }, 86400000);\n lessonDecayTimer.unref();\n console.log(`[agentmemory] Lesson decay sweep: enabled (every 24h)`);\n }\n\n if (isConsolidationEnabled()) {\n const consolidationTimer = setInterval(async () => {\n try {\n await sdk.trigger(\"mem::consolidate-pipeline\", {});\n } catch {}\n }, consolidationIntervalMs);\n consolidationTimer.unref();\n console.log(`[agentmemory] Auto-consolidation: enabled (every ${consolidationIntervalMs / 60000}m)`);\n }\n\n const shutdown = async () => {\n console.log(`\\n[agentmemory] Shutting down...`);\n healthMonitor.stop();\n dedupMap.stop();\n indexPersistence.stop();\n await new Promise<void>((resolve) => viewerServer.close(() => resolve()));\n await indexPersistence.save().catch((err) => {\n console.warn(`[agentmemory] Failed to save index on shutdown:`, err);\n });\n await sdk.shutdown();\n process.exit(0);\n };\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n}\n\nmain().catch((err) => {\n console.error(`[agentmemory] Fatal:`, err);\n process.exit(1);\n});\n"],"mappings":"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,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,SAAS;IAAE,MAAM;IAAU,aAAa;IAA2B,EACpE;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GAAE,MAAM;GAAU,YAAY,EAAE;GAAE;EAChD;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAA0B;IAClE,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,SAAS;GACrB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgB;IACxD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GAAE,MAAM;GAAU,YAAY,EAAE;GAAE;EAChD;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,eAAe;KACb,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,WAAW;IACT,MAAM;IACN,aACE;IACH,EACF;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,aAAa;KACX,MAAM;KACN,aAAa;KACd;IACD,UAAU;KAAE,MAAM;KAAU,aAAa;KAAuB;IAChE,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAAwB;IAC/D;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,MAAM;IACJ,MAAM;IACN,aAAa;IACd,EACF;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,UAAU,WAAW;GACjC;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,OAAO;IAAE,MAAM;IAAU,aAAa;IAA0B,EACjE;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KAAE,MAAM;KAAU,aAAa;KAA4B;IACtE,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACF;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KAAE,MAAM;KAAU,aAAa;KAAuB;IAC/D;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;GACX,MAAM;GACN,YAAY,EACV,SAAS;IAAE,MAAM;IAAU,aAAa;IAAwB,EACjE;GACF;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,aAAa;KACX,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgB;IACxD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aACE;KACH;IACF;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAuB;IAChE,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,UAAU;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC/D;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,SAAS;KAAE,MAAM;KAAU,aAAa;KAAoB;IAC7D;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAa;IACtD,SAAS;KAAE,MAAM;KAAU,aAAa;KAA6B;IACrE,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU;IAAC;IAAY;IAAW;IAAY;GAC/C;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KAAE,MAAM;KAAU,aAAa;KAAuB;IACjE,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,aAAa;KAAE,MAAM;KAAU,aAAa;KAA0B;IACvE;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,aAAa;KAAmB;IACxD,IAAI;KACF,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACF;GACD,UAAU,CAAC,QAAQ,UAAU;GAC9B;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KAAE,MAAM;KAAU,aAAa;KAA8B;IACtE,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA6B;IACpE;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,MAAM;KAAE,MAAM;KAAU,aAAa;KAAgC;IACrE,cAAc;KACZ,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,iBAAiB;KACf,MAAM;KACN,aACE;KACH;IACF;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,MAAM;KAAE,MAAM;KAAU,aAAa;KAAiB;IACtD,MAAM;KACJ,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACD,iBAAiB;KACf,MAAM;KACN,aAAa;KACd;IACD,aAAa;KAAE,MAAM;KAAU,aAAa;KAAwB;IACrE;GACD,UAAU,CAAC,QAAQ,OAAO;GAC3B;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,YAAY;KAAE,MAAM;KAAU,aAAa;KAA0B;IACrE,QAAQ;KAAE,MAAM;KAAU,aAAa;KAAuB;IAC/D;GACD,UAAU,CAAC,aAAa;GACzB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,aAAa;KAAE,MAAM;KAAU,aAAa;KAA6B;IACzE,aAAa;KAAE,MAAM;KAAU,aAAa;KAA8B;IAC1E,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC5D;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAAwB;IACjE,SAAS;KAAE,MAAM;KAAU,aAAa;KAAyC;IAClF;GACD,UAAU,CAAC,WAAW;GACvB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,WAAW;KACT,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC3D,WAAW;KAAE,MAAM;KAAU,aAAa;KAAmB;IAC9D;GACD,UAAU,CAAC,YAAY;GACxB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY,EACV,YAAY;IACV,MAAM;IACN,aAAa;IACd,EACF;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,QAAQ;KACN,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KAAE,MAAM;KAAU,aAAa;KAA2B;IACpE,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,WAAW;KAAE,MAAM;KAAU,aAAa;KAAgD;IAC1F,OAAO;KAAE,MAAM;KAAU,aAAa;KAA+C;IACtF;GACD,UAAU;IAAC;IAAY;IAAc;IAAa;IAAQ;GAC3D;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAa,aAA2B,CACtC;CACE,MAAM;CACN,aACE;CACF,aAAa;EACX,MAAM;EACN,YAAY,EACV,IAAI;GACF,MAAM;GACN,aAAa;GACd,EACF;EACD,UAAU,CAAC,KAAK;EACjB;CACF,CACF;AAED,MAAa,aAA2B;CACtC;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,SAAS;KACP,MAAM;KACN,aAAa;KACd;IACD,YAAY;KACV,MAAM;KACN,aAAa;KACd;IACD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAgC;IACxE,MAAM;KAAE,MAAM;KAAU,aAAa;KAAwB;IAC9D;GACD,UAAU,CAAC,UAAU;GACtB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,OAAO;KAAE,MAAM;KAAU,aAAa;KAAgB;IACtD,SAAS;KAAE,MAAM;KAAU,aAAa;KAAqB;IAC7D,eAAe;KACb,MAAM;KACN,aAAa;KACd;IACD,OAAO;KAAE,MAAM;KAAU,aAAa;KAA4B;IACnE;GACD,UAAU,CAAC,QAAQ;GACpB;EACF;CACD;EACE,MAAM;EACN,aACE;EACF,aAAa;GACX,MAAM;GACN,YAAY;IACV,UAAU;KACR,MAAM;KACN,aAAa;KACd;IACD,OAAO;KACL,MAAM;KACN,aAAa;KACd;IACF;GACF;EACF;CACF;AAED,MAAM,kBAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CA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"}