@mandays/obsidian-memory-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/vault.ts","../src/core/markdown.ts","../src/core/entity-registry.ts","../src/core/predicate-registry.ts","../src/core/query-engine.ts","../src/core/hash.ts","../src/core/id-generator.ts","../src/core/operation-manager.ts","../src/core/schema-validator.ts","../src/core/view-generator.ts","../src/core/scaffold.ts","../src/server.ts","../src/tools/read.ts","../src/tools/write.ts","../src/tools/maintenance.ts","../src/tools/schema.ts","../src/tools/vault.ts","../src/tools/index.ts","../src/config.ts","../src/types/config.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport type { Config } from \"../types/index.js\";\n\nexport interface VaultPaths {\n root: string;\n memory: string;\n facts: string;\n events: string;\n schema: string;\n views: string;\n inbox: string;\n claims: string;\n ops: string;\n opsApplied: string;\n archive: string;\n entities: string;\n predicates: string;\n versionYaml: string;\n sources: string;\n people: string;\n projects: string;\n decisions: string;\n insights: string;\n context: string;\n}\n\nexport class Vault {\n readonly paths: VaultPaths;\n readonly config: Config;\n\n constructor(config: Config) {\n this.config = config;\n const root = path.resolve(config.vaultPath);\n const memory = path.join(root, \"memory\");\n this.paths = {\n root,\n memory,\n facts: path.join(memory, \"facts\"),\n events: path.join(memory, \"events\"),\n schema: path.join(memory, \"schema\"),\n views: path.join(memory, \"_views\"),\n inbox: path.join(memory, \"_inbox\"),\n claims: path.join(memory, \"_claims\"),\n ops: path.join(memory, \"_ops\"),\n opsApplied: path.join(memory, \"_ops\", \"applied\"),\n archive: path.join(memory, \"_archive\"),\n entities: path.join(memory, \"entities.md\"),\n predicates: path.join(memory, \"schema\", \"predicates.yaml\"),\n versionYaml: path.join(memory, \"schema\", \"version.yaml\"),\n sources: path.join(root, \"sources\"),\n people: path.join(memory, \"people\"),\n projects: path.join(memory, \"projects\"),\n decisions: path.join(memory, \"decisions\"),\n insights: path.join(memory, \"insights\"),\n context: path.join(memory, \"context\"),\n };\n }\n\n /**\n * Assert that the vault path exists and contains a valid v3 version marker.\n */\n async assertValid(): Promise<void> {\n try {\n await fs.access(this.paths.root);\n } catch {\n throw new VaultError(\n `Vault path does not exist: ${this.paths.root}`,\n \"VAULT_NOT_FOUND\",\n );\n }\n\n try {\n await fs.access(this.paths.memory);\n } catch {\n throw new VaultError(\n `No memory/ directory found in vault: ${this.paths.root}`,\n \"VAULT_INVALID\",\n );\n }\n\n try {\n const versionContent = await fs.readFile(\n this.paths.versionYaml,\n \"utf-8\",\n );\n const version = yaml.load(versionContent) as Record<string, unknown>;\n if (version?.spec_version !== \"3.0\") {\n throw new VaultError(\n `Expected spec_version: \"3.0\" in ${this.paths.versionYaml}, got: ${version?.spec_version}`,\n \"VAULT_VERSION_MISMATCH\",\n );\n }\n } catch (err) {\n if (err instanceof VaultError) throw err;\n throw new VaultError(\n `Cannot read version marker: ${this.paths.versionYaml}`,\n \"VAULT_INVALID\",\n );\n }\n }\n\n /**\n * Get the relative path from vault root.\n */\n relativePath(absolutePath: string): string {\n return path.relative(this.paths.root, absolutePath);\n }\n\n /**\n * Resolve a relative path to absolute from vault root.\n */\n resolvePath(relativePath: string): string {\n return path.resolve(this.paths.root, relativePath);\n }\n\n /**\n * Get the fact file path for a given entity and predicate.\n */\n factPath(entity: string, predicate: string, suffix?: string): string {\n const filename = suffix\n ? `${predicate}--${suffix}.md`\n : `${predicate}.md`;\n return path.join(this.paths.facts, entity, filename);\n }\n\n /**\n * Get the event directory path for a given date.\n */\n eventDir(date: string): string {\n return path.join(this.paths.events, date);\n }\n\n /**\n * Get the inbox ops path for a given agent and operation.\n */\n inboxOpPath(agentId: string, operationId: string): string {\n return path.join(this.paths.inbox, agentId, \"ops\", `${operationId}.md`);\n }\n\n /**\n * Get the applied operation receipt path.\n */\n appliedOpPath(operationId: string): string {\n return path.join(this.paths.opsApplied, `${operationId}.md`);\n }\n\n /**\n * Get the claim path for a target ID.\n */\n claimPath(targetId: string): string {\n return path.join(this.paths.claims, `${targetId}.yaml`);\n }\n\n /**\n * Get the archive path for a fact.\n */\n archivePath(year: string, entity: string, predicate: string): string {\n return path.join(this.paths.archive, year, \"facts\", entity, `${predicate}.md`);\n }\n\n /**\n * Get the view path for a named view.\n */\n viewPath(viewName: string): string {\n return path.join(this.paths.views, `${viewName}.md`);\n }\n\n /**\n * Get entity-specific view path.\n */\n entityViewPath(entity: string): string {\n return path.join(this.paths.views, \"by-entity\", `${entity}.md`);\n }\n}\n\nexport class VaultError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = \"VaultError\";\n this.code = code;\n }\n}\n","import matter from \"gray-matter\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\n\nexport interface ParsedMarkdown {\n data: Record<string, unknown>;\n content: string;\n path: string;\n}\n\n/**\n * Recursively convert Date objects in parsed YAML data back to ISO strings.\n * js-yaml (used by gray-matter) auto-parses ISO dates into Date objects,\n * but we want to keep them as strings for consistent handling.\n */\nfunction normalizeDates(obj: unknown): unknown {\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n if (Array.isArray(obj)) {\n return obj.map(normalizeDates);\n }\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n result[key] = normalizeDates(value);\n }\n return result;\n }\n return obj;\n}\n\n/**\n * Parse a markdown file's YAML frontmatter and body content.\n */\nexport async function parseMarkdownFile(\n filePath: string,\n): Promise<ParsedMarkdown> {\n const raw = await fs.readFile(filePath, \"utf-8\");\n const { data, content } = matter(raw);\n const normalized = normalizeDates(data) as Record<string, unknown>;\n return { data: normalized, content, path: filePath };\n}\n\n/**\n * Serialize frontmatter data and optional body into a markdown string.\n */\nexport function serializeMarkdown(\n data: Record<string, unknown>,\n body?: string,\n): string {\n const content = body ?? \"\";\n return matter.stringify(content, data);\n}\n\n/**\n * Write a markdown file atomically (write to .tmp then rename).\n */\nexport async function writeMarkdownFile(\n filePath: string,\n data: Record<string, unknown>,\n body?: string,\n): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n const content = serializeMarkdown(data, body);\n const tmpPath = `${filePath}.tmp`;\n await fs.writeFile(tmpPath, content, \"utf-8\");\n await fs.rename(tmpPath, filePath);\n}\n\n/**\n * Read only the frontmatter of a markdown file without the full body.\n */\nexport async function readFrontmatter(\n filePath: string,\n): Promise<Record<string, unknown>> {\n const raw = await fs.readFile(filePath, \"utf-8\");\n const { data } = matter(raw);\n return data as Record<string, unknown>;\n}\n\n/**\n * Check if a file exists.\n */\nexport async function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport matter from \"gray-matter\";\nimport type { Entity, EntityIndex, EntityKind } from \"../types/index.js\";\nimport type { Vault } from \"./vault.js\";\nimport { writeMarkdownFile } from \"./markdown.js\";\n\nexport class EntityRegistry {\n private cache: Entity[] | null = null;\n private readonly vault: Vault;\n\n constructor(vault: Vault) {\n this.vault = vault;\n }\n\n /**\n * Load all entities from entities.md. Uses cache if available.\n */\n async getAll(): Promise<Entity[]> {\n if (this.cache) return this.cache;\n const raw = await fs.readFile(this.vault.paths.entities, \"utf-8\");\n const { data } = matter(raw);\n const index = data as unknown as EntityIndex;\n this.cache = index.entities ?? [];\n return this.cache;\n }\n\n /**\n * Get entities filtered by kind.\n */\n async getByKind(kind: EntityKind): Promise<Entity[]> {\n const all = await this.getAll();\n return all.filter((e) => e.kind === kind);\n }\n\n /**\n * Find a single entity by ID.\n */\n async findById(id: string): Promise<Entity | undefined> {\n const all = await this.getAll();\n return all.find((e) => e.id === id);\n }\n\n /**\n * Check if an entity exists.\n */\n async exists(id: string): Promise<boolean> {\n const entity = await this.findById(id);\n return entity !== undefined;\n }\n\n /**\n * Add a new entity. Returns the updated list.\n */\n async add(entity: Entity): Promise<Entity[]> {\n const all = await this.getAll();\n if (all.some((e) => e.id === entity.id)) {\n throw new Error(`Entity already exists: ${entity.id}`);\n }\n all.push(entity);\n await this.save(all);\n return all;\n }\n\n /**\n * Invalidate the in-memory cache.\n */\n invalidate(): void {\n this.cache = null;\n }\n\n private async save(entities: Entity[]): Promise<void> {\n const raw = await fs.readFile(this.vault.paths.entities, \"utf-8\");\n const { content } = matter(raw);\n const data: EntityIndex = {\n type: \"entity-index\",\n entities,\n };\n await writeMarkdownFile(\n this.vault.paths.entities,\n data as unknown as Record<string, unknown>,\n content,\n );\n this.cache = entities;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as yaml from \"js-yaml\";\nimport type { Vault } from \"./vault.js\";\n\ninterface PredicateEntry {\n id: string;\n description?: string;\n}\n\nexport class PredicateRegistry {\n private cache: string[] | null = null;\n private readonly vault: Vault;\n\n constructor(vault: Vault) {\n this.vault = vault;\n }\n\n /**\n * Load all predicates from predicates.yaml.\n * Supports both formats:\n * - Flat array: [\"role\", \"base\", ...]\n * - Object with entries: { predicates: [{id: \"role\", description: \"...\"}] }\n */\n async getAll(): Promise<string[]> {\n if (this.cache) return this.cache;\n const raw = await fs.readFile(this.vault.paths.predicates, \"utf-8\");\n const parsed = yaml.load(raw);\n\n if (Array.isArray(parsed)) {\n // Flat array of strings\n this.cache = parsed as string[];\n } else if (parsed && typeof parsed === \"object\" && \"predicates\" in (parsed as object)) {\n // Object with predicates array of {id, description}\n const entries = (parsed as { predicates: PredicateEntry[] }).predicates;\n this.cache = entries.map((e) => (typeof e === \"string\" ? e : e.id));\n } else {\n this.cache = [];\n }\n return this.cache;\n }\n\n /**\n * Check if a predicate exists.\n */\n async exists(predicate: string): Promise<boolean> {\n const all = await this.getAll();\n return all.includes(predicate);\n }\n\n /**\n * Add a new predicate. Returns the updated list.\n */\n async add(predicate: string): Promise<string[]> {\n const all = await this.getAll();\n if (all.includes(predicate)) {\n throw new Error(`Predicate already exists: ${predicate}`);\n }\n all.push(predicate);\n all.sort();\n await this.save(all);\n return all;\n }\n\n /**\n * Invalidate the in-memory cache.\n */\n invalidate(): void {\n this.cache = null;\n }\n\n private async save(predicates: string[]): Promise<void> {\n // Read the current file to detect format\n const raw = await fs.readFile(this.vault.paths.predicates, \"utf-8\");\n const parsed = yaml.load(raw);\n\n let content: string;\n if (parsed && typeof parsed === \"object\" && \"predicates\" in (parsed as object)) {\n // Preserve the object format with id+description entries\n const existing = (parsed as { predicates: PredicateEntry[] }).predicates;\n const existingMap = new Map(existing.map((e) => [typeof e === \"string\" ? e : e.id, e]));\n const entries: PredicateEntry[] = predicates.map((id) => {\n const existing = existingMap.get(id);\n if (existing && typeof existing === \"object\") return existing;\n return { id };\n });\n content = yaml.dump({ predicates: entries }, { flowLevel: -1 });\n } else {\n // Flat array format\n content = yaml.dump(predicates, { flowLevel: -1 });\n }\n\n const tmpPath = `${this.vault.paths.predicates}.tmp`;\n await fs.writeFile(tmpPath, content, \"utf-8\");\n await fs.rename(tmpPath, this.vault.paths.predicates);\n this.cache = predicates;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { glob } from \"glob\";\nimport { parseISO, isValid, isBefore, isAfter, isEqual } from \"date-fns\";\nimport { parseMarkdownFile } from \"./markdown.js\";\nimport type { Vault } from \"./vault.js\";\nimport type { ParsedFact, ParsedEvent, Fact, Event } from \"../types/index.js\";\n\nexport interface FactFilter {\n entity?: string;\n predicate?: string;\n id?: string;\n onDate?: string;\n confidence?: string;\n tags?: string[];\n query?: string;\n limit?: number;\n}\n\nexport interface EventFilter {\n entity?: string;\n since?: string;\n until?: string;\n kind?: string;\n limit?: number;\n}\n\nexport class QueryEngine {\n private readonly vault: Vault;\n\n constructor(vault: Vault) {\n this.vault = vault;\n }\n\n /**\n * Find facts matching the given filters.\n */\n async findFacts(filter: FactFilter): Promise<ParsedFact[]> {\n // If entity+predicate given, try direct path first (O(1))\n if (filter.entity && filter.predicate && !filter.id) {\n const directPath = this.vault.factPath(filter.entity, filter.predicate);\n try {\n await fs.access(directPath);\n const parsed = await parseMarkdownFile(directPath);\n const fact = parsed.data as unknown as Fact;\n if (this.matchesFactFilter(fact, filter)) {\n return [{ data: fact, content: parsed.content, path: directPath }];\n }\n } catch {\n // Direct path not found, try with suffixes\n }\n\n // Try suffixed variants\n const pattern = path.join(\n this.vault.paths.facts,\n filter.entity,\n `${filter.predicate}*.md`,\n );\n const files = await glob(pattern);\n const results: ParsedFact[] = [];\n for (const file of files) {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (this.matchesFactFilter(fact, filter)) {\n results.push({ data: fact, content: parsed.content, path: file });\n }\n }\n return this.applyLimit(results, filter.limit);\n }\n\n // If ID given, scan for it\n if (filter.id) {\n const result = await this.findFactById(filter.id);\n return result ? [result] : [];\n }\n\n // Broad scan\n const pattern = filter.entity\n ? path.join(this.vault.paths.facts, filter.entity, \"*.md\")\n : path.join(this.vault.paths.facts, \"**\", \"*.md\");\n\n const files = await glob(pattern);\n const results: ParsedFact[] = [];\n\n for (const file of files) {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (fact.type !== \"fact\") continue;\n if (this.matchesFactFilter(fact, filter)) {\n results.push({ data: fact, content: parsed.content, path: file });\n }\n }\n\n return this.applyLimit(results, filter.limit);\n }\n\n /**\n * Find a fact by its stable ID.\n */\n async findFactById(id: string): Promise<ParsedFact | null> {\n const files = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n for (const file of files) {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (fact.id === id) {\n return { data: fact, content: parsed.content, path: file };\n }\n }\n return null;\n }\n\n /**\n * Find events matching the given filters.\n */\n async findEvents(filter: EventFilter): Promise<ParsedEvent[]> {\n const pattern = path.join(this.vault.paths.events, \"**\", \"*.md\");\n const files = await glob(pattern);\n const results: ParsedEvent[] = [];\n\n for (const file of files) {\n const parsed = await parseMarkdownFile(file);\n const event = parsed.data as unknown as Event;\n if (event.type !== \"event\") continue;\n if (this.matchesEventFilter(event, filter)) {\n results.push({ data: event, content: parsed.content, path: file });\n }\n }\n\n // Sort events reverse-chronologically\n results.sort((a, b) => {\n const dateA = String(a.data.occurred_at);\n const dateB = String(b.data.occurred_at);\n return dateB.localeCompare(dateA);\n });\n\n return this.applyLimit(results, filter.limit);\n }\n\n /**\n * Find any record (fact, event, operation) by its stable ID.\n */\n async findById(id: string): Promise<{ type: string; path: string; data: Record<string, unknown> } | null> {\n // Check facts\n const fact = await this.findFactById(id);\n if (fact) return { type: \"fact\", path: fact.path, data: fact.data as unknown as Record<string, unknown> };\n\n // Check events\n const eventFiles = await glob(path.join(this.vault.paths.events, \"**\", \"*.md\"));\n for (const file of eventFiles) {\n const parsed = await parseMarkdownFile(file);\n if ((parsed.data as Record<string, unknown>).id === id) {\n return { type: \"event\", path: file, data: parsed.data };\n }\n }\n\n // Check operations in inbox\n const inboxFiles = await glob(path.join(this.vault.paths.inbox, \"**\", \"*.md\"));\n for (const file of inboxFiles) {\n const parsed = await parseMarkdownFile(file);\n const data = parsed.data as Record<string, unknown>;\n if (data.operation_id === id || data.id === id) {\n return { type: \"operation\", path: file, data };\n }\n }\n\n // Check applied operations\n const appliedFiles = await glob(path.join(this.vault.paths.opsApplied, \"*.md\"));\n for (const file of appliedFiles) {\n const parsed = await parseMarkdownFile(file);\n const data = parsed.data as Record<string, unknown>;\n if (data.operation_id === id || data.id === id) {\n return { type: \"operation\", path: file, data };\n }\n }\n\n return null;\n }\n\n private matchesFactFilter(fact: Fact, filter: FactFilter): boolean {\n if (filter.entity && fact.entity !== filter.entity) return false;\n if (filter.predicate && fact.predicate !== filter.predicate) return false;\n if (filter.confidence && fact.confidence !== filter.confidence) return false;\n if (filter.tags && filter.tags.length > 0) {\n if (!fact.tags || !filter.tags.some((t) => fact.tags!.includes(t))) {\n return false;\n }\n }\n if (filter.query) {\n const q = filter.query.toLowerCase();\n const inValue = String(fact.value).toLowerCase().includes(q);\n const inEntity = fact.entity.toLowerCase().includes(q);\n const inPredicate = fact.predicate.toLowerCase().includes(q);\n if (!inValue && !inEntity && !inPredicate) return false;\n }\n if (filter.onDate) {\n if (!this.isTemporallyValid(fact, filter.onDate)) return false;\n }\n return true;\n }\n\n private matchesEventFilter(event: Event, filter: EventFilter): boolean {\n if (filter.entity) {\n if (!event.entities || !event.entities.includes(filter.entity)) {\n return false;\n }\n }\n if (filter.kind && event.kind !== filter.kind) return false;\n if (filter.since) {\n const since = parseISO(filter.since);\n const occurred = parseISO(String(event.occurred_at));\n if (isValid(since) && isValid(occurred) && isBefore(occurred, since)) {\n return false;\n }\n }\n if (filter.until) {\n const until = parseISO(filter.until);\n const occurred = parseISO(String(event.occurred_at));\n if (isValid(until) && isValid(occurred) && isAfter(occurred, until)) {\n return false;\n }\n }\n return true;\n }\n\n /**\n * Check if a fact is temporally valid on a given date.\n * valid_from <= date <= valid_to (with null meaning unbounded)\n */\n private isTemporallyValid(fact: Fact, dateStr: string): boolean {\n const date = parseISO(dateStr);\n if (!isValid(date)) return true;\n\n if (fact.valid_from) {\n const from = parseISO(fact.valid_from);\n if (isValid(from) && isBefore(date, from)) return false;\n }\n if (fact.valid_to) {\n const to = parseISO(fact.valid_to);\n if (isValid(to) && isAfter(date, to)) return false;\n }\n return true;\n }\n\n private applyLimit<T>(results: T[], limit?: number): T[] {\n if (limit && limit > 0) {\n return results.slice(0, limit);\n }\n return results;\n }\n}\n","import * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\n\n/**\n * Compute the SHA-256 hash of a file, returning \"sha256:{64-hex}\" format.\n */\nexport async function computeFileHash(filePath: string): Promise<string> {\n const content = await fs.readFile(filePath);\n const hash = crypto.createHash(\"sha256\").update(content).digest(\"hex\");\n return `sha256:${hash}`;\n}\n\n/**\n * Compute the SHA-256 hash of a string, returning \"sha256:{64-hex}\" format.\n */\nexport function computeStringHash(content: string): string {\n const hash = crypto.createHash(\"sha256\").update(content, \"utf-8\").digest(\"hex\");\n return `sha256:${hash}`;\n}\n\n/**\n * Validate that a hash string matches the expected pattern.\n */\nexport function isValidHash(hash: string): boolean {\n return /^sha256:[0-9a-f]{64}$/.test(hash);\n}\n","import * as crypto from \"node:crypto\";\n\n/**\n * Generate an operation ID matching the pattern: op-{YYYYMMDDTHHMMSSz}-{4-byte-hex}\n */\nexport function generateOperationId(): string {\n const now = new Date();\n const timestamp = now.toISOString().replace(/[-:]/g, \"\").replace(/\\.\\d+Z$/, \"z\").toLowerCase();\n const hex = crypto.randomBytes(4).toString(\"hex\").slice(0, 4);\n return `op-${timestamp}-${hex}`;\n}\n\n/**\n * Generate an agent ID matching the pattern: agent-{slug}-{8-char-hex}\n */\nexport function generateAgentId(name?: string): string {\n const slug = (name ?? \"mcp\")\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 20);\n const hex = crypto.randomBytes(4).toString(\"hex\");\n return `agent-${slug}-${hex}`;\n}\n\n/**\n * Generate a fact ID: fact-{entity}-{predicate}\n */\nexport function generateFactId(entity: string, predicate: string): string {\n return `fact-${entity}-${predicate}`;\n}\n\n/**\n * Generate an event ID: event-{YYYY-MM-DD}-{slug}\n */\nexport function generateEventId(date: string, slug: string): string {\n return `event-${date}-${slug}`;\n}\n\n/**\n * Slugify a string for use in filenames and IDs.\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 60);\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { glob } from \"glob\";\nimport * as yaml from \"js-yaml\";\nimport { format } from \"date-fns\";\nimport { parseMarkdownFile, writeMarkdownFile, fileExists } from \"./markdown.js\";\nimport { computeFileHash } from \"./hash.js\";\nimport { generateOperationId, generateFactId, generateEventId, slugify } from \"./id-generator.js\";\nimport type { Vault } from \"./vault.js\";\nimport type { Operation, ParsedOperation, Fact, Claim } from \"../types/index.js\";\n\nexport interface CreateFactParams {\n entity: string;\n predicate: string;\n value: string;\n confidence?: \"high\" | \"medium\" | \"low\";\n valid_from?: string | null;\n valid_to?: string | null;\n sources?: string[];\n tags?: string[];\n reason: string;\n id?: string;\n}\n\nexport interface UpdateFactParams {\n targetId?: string;\n targetPath?: string;\n value?: string;\n valid_to?: string | null;\n confidence?: \"high\" | \"medium\" | \"low\";\n tags?: string[];\n last_reviewed?: string;\n reason: string;\n}\n\nexport interface AddEventParams {\n summary: string;\n entities?: string[];\n kind?: \"conversation\" | \"decision\" | \"ingest\" | \"action\" | \"observation\";\n sources?: string[];\n body?: string;\n reason?: string;\n}\n\nexport interface ArchiveFactParams {\n targetId?: string;\n targetPath?: string;\n reason: string;\n}\n\nexport interface CompactResult {\n applied: number;\n conflicts: number;\n archived: number;\n errors: string[];\n}\n\nexport class OperationManager {\n private readonly vault: Vault;\n private readonly agentId: string;\n\n constructor(vault: Vault, agentId: string) {\n this.vault = vault;\n this.agentId = agentId;\n }\n\n /**\n * Create a fact directly (single-agent mode).\n */\n async createFactDirect(params: CreateFactParams): Promise<{ path: string; id: string }> {\n const factId = params.id ?? generateFactId(params.entity, params.predicate);\n const factPath = this.vault.factPath(params.entity, params.predicate);\n\n if (await fileExists(factPath)) {\n throw new OperationError(\n `Fact already exists at ${this.vault.relativePath(factPath)}. Use update_fact instead.`,\n \"FACT_EXISTS\",\n );\n }\n\n const now = new Date().toISOString();\n const data: Record<string, unknown> = {\n type: \"fact\",\n id: factId,\n entity: params.entity,\n predicate: params.predicate,\n value: params.value,\n valid_from: params.valid_from ?? null,\n valid_to: params.valid_to ?? null,\n recorded_at: now,\n confidence: params.confidence ?? \"medium\",\n sources: params.sources ?? [],\n last_reviewed: format(new Date(), \"yyyy-MM-dd\"),\n tags: params.tags ?? [],\n };\n\n await writeMarkdownFile(factPath, data);\n return { path: this.vault.relativePath(factPath), id: factId };\n }\n\n /**\n * Create an operation envelope for creating a fact (inbox mode).\n */\n async createFactEnvelope(params: CreateFactParams): Promise<{ path: string; operationId: string }> {\n const operationId = generateOperationId();\n const factId = params.id ?? generateFactId(params.entity, params.predicate);\n const targetPath = `memory/facts/${params.entity}/${params.predicate}.md`;\n const now = new Date().toISOString();\n\n const data: Record<string, unknown> = {\n type: \"operation\",\n operation_id: operationId,\n op: \"create_fact\",\n agent_id: this.agentId,\n created_at: now,\n target_id: factId,\n target_path: targetPath,\n precondition_hash: null,\n status: \"proposed\",\n reason: params.reason,\n sources: params.sources ?? [],\n payload: {\n type: \"fact\",\n id: factId,\n entity: params.entity,\n predicate: params.predicate,\n value: params.value,\n recorded_at: now,\n confidence: params.confidence ?? \"medium\",\n sources: params.sources ?? [],\n valid_from: params.valid_from ?? null,\n valid_to: params.valid_to ?? null,\n tags: params.tags ?? [],\n },\n };\n\n const opPath = this.vault.inboxOpPath(this.agentId, operationId);\n await writeMarkdownFile(opPath, data, `\\n# Create fact: ${params.entity}/${params.predicate}\\n\\n${params.reason}\\n`);\n return { path: this.vault.relativePath(opPath), operationId };\n }\n\n /**\n * Update a fact directly (single-agent mode).\n */\n async updateFactDirect(params: UpdateFactParams): Promise<{ path: string; hash: string }> {\n const factPath = await this.resolveFactPath(params);\n\n // Compute precondition hash before update\n const currentHash = await computeFileHash(factPath);\n const parsed = await parseMarkdownFile(factPath);\n const data = parsed.data;\n\n if (params.value !== undefined) data.value = params.value;\n if (params.valid_to !== undefined) data.valid_to = params.valid_to;\n if (params.confidence !== undefined) data.confidence = params.confidence;\n if (params.tags !== undefined) data.tags = params.tags;\n if (params.last_reviewed !== undefined) {\n data.last_reviewed = params.last_reviewed;\n } else {\n data.last_reviewed = format(new Date(), \"yyyy-MM-dd\");\n }\n\n await writeMarkdownFile(factPath, data, parsed.content);\n const newHash = await computeFileHash(factPath);\n return { path: this.vault.relativePath(factPath), hash: newHash };\n }\n\n /**\n * Create an operation envelope for updating a fact (inbox mode).\n */\n async updateFactEnvelope(params: UpdateFactParams): Promise<{ path: string; operationId: string }> {\n const factPath = await this.resolveFactPath(params);\n const operationId = generateOperationId();\n const currentHash = await computeFileHash(factPath);\n const parsed = await parseMarkdownFile(factPath);\n const now = new Date().toISOString();\n\n // Build updated payload\n const payload = { ...parsed.data };\n if (params.value !== undefined) payload.value = params.value;\n if (params.valid_to !== undefined) payload.valid_to = params.valid_to;\n if (params.confidence !== undefined) payload.confidence = params.confidence;\n if (params.tags !== undefined) payload.tags = params.tags;\n\n const data: Record<string, unknown> = {\n type: \"operation\",\n operation_id: operationId,\n op: \"update_fact\",\n agent_id: this.agentId,\n created_at: now,\n target_id: parsed.data.id ?? null,\n target_path: this.vault.relativePath(factPath),\n precondition_hash: currentHash,\n status: \"proposed\",\n reason: params.reason,\n sources: (parsed.data.sources as string[]) ?? [],\n payload,\n };\n\n const opPath = this.vault.inboxOpPath(this.agentId, operationId);\n await writeMarkdownFile(opPath, data, `\\n# Update fact\\n\\n${params.reason}\\n`);\n return { path: this.vault.relativePath(opPath), operationId };\n }\n\n /**\n * Add an event directly.\n */\n async addEventDirect(params: AddEventParams): Promise<{ path: string; id: string }> {\n const now = new Date();\n const dateStr = format(now, \"yyyy-MM-dd\");\n const slug = slugify(params.summary);\n const eventId = generateEventId(dateStr, slug);\n const eventDir = this.vault.eventDir(dateStr);\n const eventPath = path.join(eventDir, `${slug}.md`);\n\n const data: Record<string, unknown> = {\n type: \"event\",\n id: eventId,\n occurred_at: now.toISOString(),\n summary: params.summary,\n entities: params.entities ?? [],\n kind: params.kind ?? \"observation\",\n sources: params.sources ?? [],\n derived_facts: [],\n };\n\n await writeMarkdownFile(eventPath, data, params.body ? `\\n${params.body}\\n` : \"\");\n return { path: this.vault.relativePath(eventPath), id: eventId };\n }\n\n /**\n * Create an operation envelope for adding an event (inbox mode).\n */\n async addEventEnvelope(params: AddEventParams): Promise<{ path: string; operationId: string }> {\n const operationId = generateOperationId();\n const now = new Date();\n const dateStr = format(now, \"yyyy-MM-dd\");\n const slug = slugify(params.summary);\n\n const data: Record<string, unknown> = {\n type: \"operation\",\n operation_id: operationId,\n op: \"add_event\",\n agent_id: this.agentId,\n created_at: now.toISOString(),\n target_id: generateEventId(dateStr, slug),\n target_path: `memory/events/${dateStr}/${slug}.md`,\n precondition_hash: null,\n status: \"proposed\",\n reason: params.reason ?? params.summary,\n sources: params.sources ?? [],\n payload: {\n type: \"event\",\n occurred_at: now.toISOString(),\n summary: params.summary,\n entities: params.entities ?? [],\n kind: params.kind ?? \"observation\",\n sources: params.sources ?? [],\n body: params.body ?? \"\",\n },\n };\n\n const opPath = this.vault.inboxOpPath(this.agentId, operationId);\n await writeMarkdownFile(opPath, data, `\\n# Add event\\n\\n${params.summary}\\n`);\n return { path: this.vault.relativePath(opPath), operationId };\n }\n\n /**\n * Archive a fact directly.\n */\n async archiveFactDirect(params: ArchiveFactParams): Promise<{ archivePath: string }> {\n const factPath = await this.resolveFactPath(params);\n const parsed = await parseMarkdownFile(factPath);\n const fact = parsed.data as unknown as Fact;\n const year = format(new Date(), \"yyyy\");\n const archiveDest = this.vault.archivePath(year, fact.entity, fact.predicate);\n\n await fs.mkdir(path.dirname(archiveDest), { recursive: true });\n await fs.rename(factPath, archiveDest);\n\n return { archivePath: this.vault.relativePath(archiveDest) };\n }\n\n /**\n * Compact inbox: validate and apply all proposed operations.\n */\n async compact(autoApply: boolean = true): Promise<CompactResult> {\n const result: CompactResult = { applied: 0, conflicts: 0, archived: 0, errors: [] };\n const opFiles = await glob(path.join(this.vault.paths.inbox, \"**\", \"ops\", \"*.md\"));\n\n for (const opFile of opFiles) {\n const parsed = await parseMarkdownFile(opFile);\n const op = parsed.data as unknown as Operation;\n\n if (op.status !== \"proposed\") continue;\n\n // Check for active claims\n if (op.target_id) {\n const claimConflict = await this.checkClaim(op.target_id, op.agent_id);\n if (claimConflict) {\n await this.markConflict(opFile, parsed, `Blocked by active claim: ${claimConflict}`);\n result.conflicts++;\n continue;\n }\n }\n\n // Check precondition hash\n if (op.precondition_hash && op.target_path) {\n const targetAbsPath = this.vault.resolvePath(op.target_path);\n if (await fileExists(targetAbsPath)) {\n const currentHash = await computeFileHash(targetAbsPath);\n if (currentHash !== op.precondition_hash) {\n await this.markConflict(opFile, parsed, \"precondition hash mismatch\");\n result.conflicts++;\n continue;\n }\n }\n }\n\n if (!autoApply) continue;\n\n // Apply the operation\n try {\n await this.applyOperation(op, parsed.content);\n await this.moveToApplied(opFile, parsed);\n result.applied++;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n await this.markConflict(opFile, parsed, msg);\n result.conflicts++;\n result.errors.push(`${op.operation_id}: ${msg}`);\n }\n }\n\n // Archive expired facts\n const factFiles = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n const today = process.env.MEMORY_TODAY ?? format(new Date(), \"yyyy-MM-dd\");\n for (const file of factFiles) {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (fact.valid_to && fact.valid_to < today) {\n const year = fact.valid_to.slice(0, 4);\n const archiveDest = this.vault.archivePath(year, fact.entity, fact.predicate);\n await fs.mkdir(path.dirname(archiveDest), { recursive: true });\n await fs.rename(file, archiveDest);\n result.archived++;\n }\n }\n\n return result;\n }\n\n private async applyOperation(op: Operation, body: string): Promise<void> {\n const payload = op.payload as Record<string, unknown>;\n\n switch (op.op) {\n case \"create_fact\": {\n const targetPath = this.vault.resolvePath(op.target_path!);\n if (await fileExists(targetPath)) {\n throw new Error(`Target already exists: ${op.target_path}`);\n }\n const factData = { ...payload };\n if (!factData.last_reviewed) {\n factData.last_reviewed = format(new Date(), \"yyyy-MM-dd\");\n }\n await writeMarkdownFile(targetPath, factData);\n break;\n }\n case \"update_fact\": {\n const targetPath = this.vault.resolvePath(op.target_path!);\n if (!(await fileExists(targetPath))) {\n throw new Error(`Target not found: ${op.target_path}`);\n }\n const existing = await parseMarkdownFile(targetPath);\n const updated = { ...existing.data, ...payload };\n updated.last_reviewed = format(new Date(), \"yyyy-MM-dd\");\n const bodyContent = (payload.body as string) ?? existing.content;\n await writeMarkdownFile(targetPath, updated, bodyContent);\n break;\n }\n case \"add_event\": {\n const targetPath = this.vault.resolvePath(op.target_path!);\n const eventBody = (payload.body as string) ?? \"\";\n const eventData = { ...payload };\n delete eventData.body;\n await writeMarkdownFile(targetPath, eventData, eventBody ? `\\n${eventBody}\\n` : \"\");\n break;\n }\n case \"archive_fact\": {\n const targetPath = this.vault.resolvePath(op.target_path!);\n if (!(await fileExists(targetPath))) {\n throw new Error(`Target not found for archival: ${op.target_path}`);\n }\n const parsed = await parseMarkdownFile(targetPath);\n const fact = parsed.data as unknown as Fact;\n const year = format(new Date(), \"yyyy\");\n const archiveDest = this.vault.archivePath(year, fact.entity, fact.predicate);\n await fs.mkdir(path.dirname(archiveDest), { recursive: true });\n await fs.rename(targetPath, archiveDest);\n break;\n }\n default:\n throw new Error(`Unsupported operation type: ${op.op}`);\n }\n }\n\n private async markConflict(\n opFile: string,\n parsed: { data: Record<string, unknown>; content: string },\n reason: string,\n ): Promise<void> {\n parsed.data.status = \"conflict\";\n parsed.data.conflict_reason = reason;\n await writeMarkdownFile(opFile, parsed.data, parsed.content);\n }\n\n private async moveToApplied(\n opFile: string,\n parsed: { data: Record<string, unknown>; content: string },\n ): Promise<void> {\n const opId = parsed.data.operation_id as string;\n parsed.data.status = \"applied\";\n parsed.data.applied_at = new Date().toISOString();\n const receiptPath = this.vault.appliedOpPath(opId);\n await writeMarkdownFile(receiptPath, parsed.data, parsed.content);\n await fs.unlink(opFile);\n }\n\n private async checkClaim(targetId: string, agentId: string): Promise<string | null> {\n const claimPath = this.vault.claimPath(targetId);\n if (!(await fileExists(claimPath))) return null;\n\n const raw = await fs.readFile(claimPath, \"utf-8\");\n const claim = yaml.load(raw) as Claim;\n if (claim.status !== \"active\") return null;\n\n // Check if expired\n const now = new Date();\n const expires = new Date(claim.expires_at);\n if (now > expires) return null;\n\n // Same agent can proceed\n if (claim.agent_id === agentId) return null;\n\n return `${claim.agent_id} (expires ${claim.expires_at})`;\n }\n\n private async resolveFactPath(params: { targetId?: string; targetPath?: string }): Promise<string> {\n if (params.targetPath) {\n const absPath = this.vault.resolvePath(params.targetPath);\n if (await fileExists(absPath)) return absPath;\n throw new OperationError(`Fact not found: ${params.targetPath}`, \"FACT_NOT_FOUND\");\n }\n if (params.targetId) {\n const files = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n for (const file of files) {\n const parsed = await parseMarkdownFile(file);\n if ((parsed.data as Record<string, unknown>).id === params.targetId) {\n return file;\n }\n }\n throw new OperationError(`Fact not found with id: ${params.targetId}`, \"FACT_NOT_FOUND\");\n }\n throw new OperationError(\"Either targetId or targetPath is required\", \"INVALID_PARAMS\");\n }\n}\n\nexport class OperationError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = \"OperationError\";\n this.code = code;\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { glob } from \"glob\";\nimport * as yaml from \"js-yaml\";\nimport { parseMarkdownFile, fileExists } from \"./markdown.js\";\nimport type { Vault } from \"./vault.js\";\nimport type { EntityRegistry } from \"./entity-registry.js\";\nimport type { PredicateRegistry } from \"./predicate-registry.js\";\nimport type { Fact, Operation } from \"../types/index.js\";\n\nexport interface LintFinding {\n level: \"ERROR\" | \"WARN\";\n path: string;\n message: string;\n}\n\nexport class SchemaValidator {\n private readonly vault: Vault;\n private readonly entities: EntityRegistry;\n private readonly predicates: PredicateRegistry;\n\n constructor(vault: Vault, entities: EntityRegistry, predicates: PredicateRegistry) {\n this.vault = vault;\n this.entities = entities;\n this.predicates = predicates;\n }\n\n /**\n * Run full vault validation. Returns findings array. Empty = valid.\n */\n async lint(): Promise<LintFinding[]> {\n const findings: LintFinding[] = [];\n\n // 1. Check version marker\n await this.checkVersion(findings);\n\n // 2. Validate facts\n await this.validateFacts(findings);\n\n // 3. Validate events\n await this.validateEvents(findings);\n\n // 4. Validate operations\n await this.validateOperations(findings);\n\n // 5. Check for duplicate IDs\n await this.checkDuplicateIds(findings);\n\n // 6. Check contradictions\n await this.checkContradictions(findings);\n\n // 7. Validate wikilinks\n await this.validateWikilinks(findings);\n\n return findings;\n }\n\n private async checkVersion(findings: LintFinding[]): Promise<void> {\n try {\n const content = await fs.readFile(this.vault.paths.versionYaml, \"utf-8\");\n const version = yaml.load(content) as Record<string, unknown>;\n if (version?.spec_version !== \"3.0\") {\n findings.push({\n level: \"ERROR\",\n path: this.vault.relativePath(this.vault.paths.versionYaml),\n message: `missing v3 schema version marker (expected spec_version: \"3.0\")`,\n });\n }\n } catch {\n findings.push({\n level: \"ERROR\",\n path: \"memory/schema/version.yaml\",\n message: \"missing v3 schema version marker\",\n });\n }\n }\n\n private async validateFacts(findings: LintFinding[]): Promise<void> {\n const factFiles = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n\n for (const file of factFiles) {\n const relPath = this.vault.relativePath(file);\n try {\n const parsed = await parseMarkdownFile(file);\n const data = parsed.data as unknown as Fact;\n\n if (data.type !== \"fact\") {\n findings.push({ level: \"ERROR\", path: relPath, message: `expected type: fact, got: ${data.type}` });\n continue;\n }\n\n // Check required fields\n if (!data.entity) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: entity\" });\n }\n if (!data.predicate) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: predicate\" });\n }\n if (data.value === undefined || data.value === null) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: value\" });\n }\n if (!data.recorded_at) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: recorded_at\" });\n }\n\n // Check entity exists\n if (data.entity && !(await this.entities.exists(data.entity))) {\n findings.push({ level: \"ERROR\", path: relPath, message: `unknown entity '${data.entity}'` });\n }\n\n // Check predicate exists\n if (data.predicate && !(await this.predicates.exists(data.predicate))) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `unknown predicate '${data.predicate}' -- add it to memory/schema/predicates.yaml`,\n });\n }\n\n // Check path correctness\n const expectedDir = path.join(this.vault.paths.facts, data.entity);\n const actualDir = path.dirname(file);\n if (actualDir !== expectedDir) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `fact for entity '${data.entity}' should be in memory/facts/${data.entity}/`,\n });\n }\n\n // Check temporal validity\n if (data.valid_from && data.valid_to && data.valid_from > data.valid_to) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `valid_from (${data.valid_from}) must be <= valid_to (${data.valid_to})`,\n });\n }\n\n // Check sources exist\n if (data.sources) {\n for (const source of data.sources) {\n const sourcePath = this.vault.resolvePath(source);\n if (!(await fileExists(sourcePath))) {\n findings.push({ level: \"WARN\", path: relPath, message: `source not found: ${source}` });\n }\n }\n }\n } catch (err) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n }\n\n private async validateEvents(findings: LintFinding[]): Promise<void> {\n const eventFiles = await glob(path.join(this.vault.paths.events, \"**\", \"*.md\"));\n\n for (const file of eventFiles) {\n const relPath = this.vault.relativePath(file);\n try {\n const parsed = await parseMarkdownFile(file);\n const data = parsed.data as Record<string, unknown>;\n\n if (data.type !== \"event\") {\n findings.push({ level: \"ERROR\", path: relPath, message: `expected type: event, got: ${data.type}` });\n continue;\n }\n\n if (!data.occurred_at) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: occurred_at\" });\n }\n if (!data.summary) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: summary\" });\n }\n\n // Check entities reference known entities\n if (Array.isArray(data.entities)) {\n for (const entity of data.entities as string[]) {\n if (!(await this.entities.exists(entity))) {\n findings.push({ level: \"WARN\", path: relPath, message: `event references unknown entity '${entity}'` });\n }\n }\n }\n } catch (err) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n }\n\n private async validateOperations(findings: LintFinding[]): Promise<void> {\n const opFiles = await glob(path.join(this.vault.paths.inbox, \"**\", \"ops\", \"*.md\"));\n const appliedFiles = await glob(path.join(this.vault.paths.opsApplied, \"*.md\"));\n\n for (const file of [...opFiles, ...appliedFiles]) {\n const relPath = this.vault.relativePath(file);\n try {\n const parsed = await parseMarkdownFile(file);\n const data = parsed.data as unknown as Operation;\n\n if (data.type !== \"operation\") continue;\n\n if (!data.operation_id) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: operation_id\" });\n }\n if (!data.op) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: op\" });\n }\n if (!data.agent_id) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: agent_id\" });\n }\n if (!data.reason) {\n findings.push({ level: \"ERROR\", path: relPath, message: \"missing required field: reason\" });\n }\n\n // Validate agent_id pattern\n if (data.agent_id && !/^agent-[a-z0-9-]+-[a-f0-9]{8}$/.test(data.agent_id)) {\n findings.push({\n level: \"WARN\",\n path: relPath,\n message: `agent_id '${data.agent_id}' doesn't match pattern: agent-{slug}-{8hex}`,\n });\n }\n\n // Validate payload predicate if create_fact\n if (data.op === \"create_fact\" && data.payload) {\n const payload = data.payload as Record<string, unknown>;\n if (payload.predicate && typeof payload.predicate === \"string\") {\n if (!(await this.predicates.exists(payload.predicate))) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `payload unknown predicate '${payload.predicate}' -- add it to memory/schema/predicates.yaml`,\n });\n }\n }\n }\n } catch (err) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n }\n\n private async checkDuplicateIds(findings: LintFinding[]): Promise<void> {\n const idMap = new Map<string, string>();\n\n const allFiles = [\n ...(await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"))),\n ...(await glob(path.join(this.vault.paths.events, \"**\", \"*.md\"))),\n ];\n\n for (const file of allFiles) {\n try {\n const parsed = await parseMarkdownFile(file);\n const id = parsed.data.id as string | undefined;\n if (id) {\n const existing = idMap.get(id);\n if (existing) {\n findings.push({\n level: \"ERROR\",\n path: this.vault.relativePath(file),\n message: `duplicate id '${id}' (first seen in ${existing})`,\n });\n } else {\n idMap.set(id, this.vault.relativePath(file));\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n }\n\n private async checkContradictions(findings: LintFinding[]): Promise<void> {\n const factFiles = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n const factsByKey = new Map<string, Array<{ fact: Fact; path: string }>>();\n\n for (const file of factFiles) {\n try {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (fact.type !== \"fact\") continue;\n\n const key = `${fact.entity}/${fact.predicate}`;\n if (!factsByKey.has(key)) factsByKey.set(key, []);\n factsByKey.get(key)!.push({ fact, path: file });\n } catch {\n // Skip unparseable files\n }\n }\n\n for (const [key, facts] of factsByKey) {\n if (facts.length < 2) continue;\n\n for (let i = 0; i < facts.length; i++) {\n for (let j = i + 1; j < facts.length; j++) {\n const a = facts[i]!;\n const b = facts[j]!;\n\n // Skip if one supersedes the other\n if (a.fact.superseded_by || b.fact.superseded_by) continue;\n\n // Check if values differ and temporal ranges overlap\n if (String(a.fact.value) === String(b.fact.value)) continue;\n\n if (this.temporalOverlap(a.fact, b.fact)) {\n findings.push({\n level: \"ERROR\",\n path: this.vault.relativePath(b.path),\n message: `contradicts overlapping fact at ${this.vault.relativePath(a.path)}`,\n });\n }\n }\n }\n }\n }\n\n private temporalOverlap(a: Fact, b: Fact): boolean {\n // null means unbounded\n const aFrom = a.valid_from ?? \"0000-01-01\";\n const aTo = a.valid_to ?? \"9999-12-31\";\n const bFrom = b.valid_from ?? \"0000-01-01\";\n const bTo = b.valid_to ?? \"9999-12-31\";\n\n return aFrom <= bTo && bFrom <= aTo;\n }\n\n private async validateWikilinks(findings: LintFinding[]): Promise<void> {\n // Build set of all file stems for basename resolution\n const allFiles = await glob(path.join(this.vault.paths.memory, \"**\", \"*.md\"));\n const stemMap = new Map<string, string[]>();\n const fullPathSet = new Set<string>();\n\n for (const file of allFiles) {\n const relPath = this.vault.relativePath(file);\n fullPathSet.add(relPath);\n\n // Also allow resolution without .md extension\n const noExt = relPath.replace(/\\.md$/, \"\");\n fullPathSet.add(noExt);\n\n const stem = path.basename(file, \".md\");\n if (!stemMap.has(stem)) stemMap.set(stem, []);\n stemMap.get(stem)!.push(relPath);\n }\n\n // Scan files for wikilinks\n const wikilinkRegex = /\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?\\|?[^\\]]*\\]\\]/g;\n\n for (const file of allFiles) {\n // Skip generated views\n if (file.startsWith(this.vault.paths.views)) continue;\n\n const relPath = this.vault.relativePath(file);\n try {\n const content = await fs.readFile(file, \"utf-8\");\n let match: RegExpExecArray | null;\n wikilinkRegex.lastIndex = 0;\n\n while ((match = wikilinkRegex.exec(content)) !== null) {\n const target = match[1]!.trim();\n\n // Try full path resolution\n if (fullPathSet.has(target) || fullPathSet.has(`${target}.md`)) continue;\n\n // Try basename resolution\n const stem = path.basename(target, \".md\");\n const candidates = stemMap.get(stem);\n\n if (!candidates || candidates.length === 0) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `unresolved wikilink: ${target}`,\n });\n } else if (candidates.length > 1) {\n findings.push({\n level: \"ERROR\",\n path: relPath,\n message: `ambiguous wikilink: ${target} (resolves to ${candidates.length} files)`,\n });\n }\n }\n } catch {\n // Skip unreadable files\n }\n }\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { glob } from \"glob\";\nimport { format, differenceInDays, parseISO } from \"date-fns\";\nimport { parseMarkdownFile, fileExists } from \"./markdown.js\";\nimport type { Vault } from \"./vault.js\";\nimport type { Fact, Event, Operation, Claim } from \"../types/index.js\";\n\nexport class ViewGenerator {\n private readonly vault: Vault;\n private readonly staleDays: number;\n\n constructor(vault: Vault, staleDays: number = 180) {\n this.vault = vault;\n this.staleDays = staleDays;\n }\n\n /**\n * Rebuild all materialized views. Returns list of files written.\n */\n async rebuildAll(): Promise<string[]> {\n const written: string[] = [];\n await fs.mkdir(this.vault.paths.views, { recursive: true });\n await fs.mkdir(path.join(this.vault.paths.views, \"by-entity\"), { recursive: true });\n\n const facts = await this.loadAllFacts();\n const events = await this.loadAllEvents();\n const operations = await this.loadAllOperations();\n const claims = await this.loadAllClaims();\n\n // by-entity views\n const byEntity = this.groupByEntity(facts);\n for (const [entity, entityFacts] of byEntity) {\n const filePath = this.vault.entityViewPath(entity);\n await this.writeView(filePath, this.renderByEntity(entity, entityFacts));\n written.push(this.vault.relativePath(filePath));\n }\n\n // by-id view\n const byIdPath = this.vault.viewPath(\"by-id\");\n await this.writeView(byIdPath, this.renderById(facts, events, operations));\n written.push(this.vault.relativePath(byIdPath));\n\n // by-predicate view\n const byPredPath = this.vault.viewPath(\"by-predicate\");\n await this.writeView(byPredPath, this.renderByPredicate(facts));\n written.push(this.vault.relativePath(byPredPath));\n\n // timeline view\n const timelinePath = this.vault.viewPath(\"timeline\");\n await this.writeView(timelinePath, this.renderTimeline(events));\n written.push(this.vault.relativePath(timelinePath));\n\n // contradictions view\n const contradictionsPath = this.vault.viewPath(\"contradictions\");\n await this.writeView(contradictionsPath, this.renderContradictions(facts));\n written.push(this.vault.relativePath(contradictionsPath));\n\n // stale view\n const stalePath = this.vault.viewPath(\"stale\");\n await this.writeView(stalePath, this.renderStale(facts));\n written.push(this.vault.relativePath(stalePath));\n\n // graph view\n const graphPath = this.vault.viewPath(\"graph\");\n await this.writeView(graphPath, await this.renderGraph());\n written.push(this.vault.relativePath(graphPath));\n\n // inbox view\n const inboxPath = this.vault.viewPath(\"inbox\");\n await this.writeView(inboxPath, this.renderInbox(operations));\n written.push(this.vault.relativePath(inboxPath));\n\n // operations view\n const opsPath = this.vault.viewPath(\"operations\");\n await this.writeView(opsPath, this.renderOperations(operations));\n written.push(this.vault.relativePath(opsPath));\n\n // claims view\n const claimsPath = this.vault.viewPath(\"claims\");\n await this.writeView(claimsPath, this.renderClaims(claims));\n written.push(this.vault.relativePath(claimsPath));\n\n // conflicts view\n const conflictsPath = this.vault.viewPath(\"conflicts\");\n await this.writeView(conflictsPath, this.renderConflicts(operations));\n written.push(this.vault.relativePath(conflictsPath));\n\n return written;\n }\n\n private async writeView(filePath: string, content: string): Promise<void> {\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, content, \"utf-8\");\n }\n\n private async loadAllFacts(): Promise<Array<{ fact: Fact; path: string }>> {\n const files = await glob(path.join(this.vault.paths.facts, \"**\", \"*.md\"));\n const results: Array<{ fact: Fact; path: string }> = [];\n for (const file of files.sort()) {\n try {\n const parsed = await parseMarkdownFile(file);\n const fact = parsed.data as unknown as Fact;\n if (fact.type === \"fact\") {\n results.push({ fact, path: this.vault.relativePath(file) });\n }\n } catch { /* skip */ }\n }\n return results;\n }\n\n private async loadAllEvents(): Promise<Array<{ event: Event; path: string }>> {\n const files = await glob(path.join(this.vault.paths.events, \"**\", \"*.md\"));\n const results: Array<{ event: Event; path: string }> = [];\n for (const file of files.sort()) {\n try {\n const parsed = await parseMarkdownFile(file);\n const event = parsed.data as unknown as Event;\n if (event.type === \"event\") {\n results.push({ event, path: this.vault.relativePath(file) });\n }\n } catch { /* skip */ }\n }\n return results;\n }\n\n private async loadAllOperations(): Promise<Array<{ op: Operation; path: string }>> {\n const inboxFiles = await glob(path.join(this.vault.paths.inbox, \"**\", \"ops\", \"*.md\"));\n const appliedFiles = await glob(path.join(this.vault.paths.opsApplied, \"*.md\"));\n const results: Array<{ op: Operation; path: string }> = [];\n for (const file of [...inboxFiles, ...appliedFiles].sort()) {\n try {\n const parsed = await parseMarkdownFile(file);\n const op = parsed.data as unknown as Operation;\n if (op.type === \"operation\") {\n results.push({ op, path: this.vault.relativePath(file) });\n }\n } catch { /* skip */ }\n }\n return results;\n }\n\n private async loadAllClaims(): Promise<Array<{ claim: Claim; path: string }>> {\n const files = await glob(path.join(this.vault.paths.claims, \"*.yaml\"));\n const results: Array<{ claim: Claim; path: string }> = [];\n for (const file of files.sort()) {\n try {\n const raw = await fs.readFile(file, \"utf-8\");\n const claim = (await import(\"js-yaml\")).load(raw) as Claim;\n if (claim.type === \"claim\") {\n results.push({ claim, path: this.vault.relativePath(file) });\n }\n } catch { /* skip */ }\n }\n return results;\n }\n\n private groupByEntity(facts: Array<{ fact: Fact; path: string }>): Map<string, Array<{ fact: Fact; path: string }>> {\n const map = new Map<string, Array<{ fact: Fact; path: string }>>();\n for (const entry of facts) {\n const entity = entry.fact.entity;\n if (!map.has(entity)) map.set(entity, []);\n map.get(entity)!.push(entry);\n }\n return map;\n }\n\n private renderByEntity(entity: string, facts: Array<{ fact: Fact; path: string }>): string {\n const lines: string[] = [`# Facts \\u2014 ${entity}\\n`];\n const sorted = [...facts].sort((a, b) => a.fact.predicate.localeCompare(b.fact.predicate));\n for (const { fact, path: fpath } of sorted) {\n const from = fact.valid_from ?? \"unknown\";\n const to = fact.valid_to ?? \"present\";\n lines.push(`- **${fact.predicate}**: ${fact.value} (${from} \\u2192 ${to}) \\u2014 \\`${fpath}\\``);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderById(\n facts: Array<{ fact: Fact; path: string }>,\n events: Array<{ event: Event; path: string }>,\n operations: Array<{ op: Operation; path: string }>,\n ): string {\n const lines: string[] = [\"# Records by ID\\n\"];\n const allRecords: Array<{ id: string; type: string; path: string }> = [];\n\n for (const { fact, path: p } of facts) {\n if (fact.id) allRecords.push({ id: fact.id, type: \"fact\", path: p });\n }\n for (const { event, path: p } of events) {\n if (event.id) allRecords.push({ id: event.id, type: \"event\", path: p });\n }\n for (const { op, path: p } of operations) {\n if (op.operation_id) allRecords.push({ id: op.operation_id, type: \"operation\", path: p });\n }\n\n allRecords.sort((a, b) => a.id.localeCompare(b.id));\n for (const rec of allRecords) {\n lines.push(`- \\`${rec.id}\\`: ${rec.type} \\u2014 \\`${rec.path}\\``);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderByPredicate(facts: Array<{ fact: Fact; path: string }>): string {\n const lines: string[] = [\"# Facts by Predicate\\n\"];\n const byPred = new Map<string, Array<{ fact: Fact; path: string }>>();\n for (const entry of facts) {\n const pred = entry.fact.predicate;\n if (!byPred.has(pred)) byPred.set(pred, []);\n byPred.get(pred)!.push(entry);\n }\n\n const sortedPreds = [...byPred.keys()].sort();\n for (const pred of sortedPreds) {\n lines.push(`## ${pred}\\n`);\n const entries = byPred.get(pred)!.sort((a, b) => a.fact.entity.localeCompare(b.fact.entity));\n for (const { fact, path: p } of entries) {\n lines.push(`- ${fact.entity} = ${fact.value} \\u2014 \\`${p}\\``);\n }\n lines.push(\"\");\n }\n return lines.join(\"\\n\");\n }\n\n private renderTimeline(events: Array<{ event: Event; path: string }>): string {\n const lines: string[] = [\"# Timeline\\n\"];\n const sorted = [...events].sort((a, b) => String(b.event.occurred_at).localeCompare(String(a.event.occurred_at)));\n for (const { event, path: p } of sorted) {\n const date = String(event.occurred_at).slice(0, 10);\n const entities = event.entities?.join(\", \") ?? \"\";\n lines.push(`- **${date}** ${event.summary}${entities ? ` [${entities}]` : \"\"} \\u2014 \\`${p}\\``);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderContradictions(facts: Array<{ fact: Fact; path: string }>): string {\n const lines: string[] = [\"# Contradictions\\n\"];\n const byKey = new Map<string, Array<{ fact: Fact; path: string }>>();\n for (const entry of facts) {\n const key = `${entry.fact.entity}/${entry.fact.predicate}`;\n if (!byKey.has(key)) byKey.set(key, []);\n byKey.get(key)!.push(entry);\n }\n\n let found = false;\n for (const [key, entries] of byKey) {\n if (entries.length < 2) continue;\n for (let i = 0; i < entries.length; i++) {\n for (let j = i + 1; j < entries.length; j++) {\n const a = entries[i]!;\n const b = entries[j]!;\n if (a.fact.superseded_by || b.fact.superseded_by) continue;\n if (String(a.fact.value) === String(b.fact.value)) continue;\n const aFrom = a.fact.valid_from ?? \"0000-01-01\";\n const aTo = a.fact.valid_to ?? \"9999-12-31\";\n const bFrom = b.fact.valid_from ?? \"0000-01-01\";\n const bTo = b.fact.valid_to ?? \"9999-12-31\";\n if (aFrom <= bTo && bFrom <= aTo) {\n lines.push(`- **${key}**: \"${a.fact.value}\" vs \"${b.fact.value}\"`);\n lines.push(` - \\`${a.path}\\` vs \\`${b.path}\\``);\n found = true;\n }\n }\n }\n }\n if (!found) lines.push(\"No contradictions found.\\n\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderStale(facts: Array<{ fact: Fact; path: string }>): string {\n const lines: string[] = [\"# Stale Facts\\n\"];\n const today = process.env.MEMORY_TODAY ?? format(new Date(), \"yyyy-MM-dd\");\n const todayDate = parseISO(today);\n let found = false;\n\n for (const { fact, path: p } of facts) {\n if (!fact.last_reviewed) {\n lines.push(`- \\`${p}\\` \\u2014 no last_reviewed date`);\n found = true;\n continue;\n }\n const reviewed = parseISO(fact.last_reviewed);\n const days = differenceInDays(todayDate, reviewed);\n if (days > this.staleDays) {\n lines.push(`- \\`${p}\\` \\u2014 last reviewed ${fact.last_reviewed} (${days} days ago)`);\n found = true;\n }\n }\n if (!found) lines.push(\"No stale facts found.\\n\");\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private async renderGraph(): Promise<string> {\n const lines: string[] = [\"# Wikilink Graph\\n\"];\n const allFiles = await glob(path.join(this.vault.paths.memory, \"**\", \"*.md\"));\n const wikilinkRegex = /\\[\\[([^\\]|#]+)(?:#[^\\]|]*)?\\|?[^\\]]*\\]\\]/g;\n const edges: Array<{ from: string; to: string }> = [];\n\n for (const file of allFiles.sort()) {\n if (file.startsWith(this.vault.paths.views)) continue;\n const relPath = this.vault.relativePath(file);\n try {\n const content = await fs.readFile(file, \"utf-8\");\n let match: RegExpExecArray | null;\n wikilinkRegex.lastIndex = 0;\n while ((match = wikilinkRegex.exec(content)) !== null) {\n edges.push({ from: relPath, to: match[1]!.trim() });\n }\n } catch { /* skip */ }\n }\n\n if (edges.length === 0) {\n lines.push(\"No wikilinks found.\\n\");\n } else {\n for (const edge of edges) {\n lines.push(`- \\`${edge.from}\\` \\u2192 [[${edge.to}]]`);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderInbox(operations: Array<{ op: Operation; path: string }>): string {\n const lines: string[] = [\"# Inbox\\n\"];\n const proposed = operations.filter((o) => o.op.status === \"proposed\");\n if (proposed.length === 0) {\n lines.push(\"No pending operations.\\n\");\n } else {\n for (const { op, path: p } of proposed) {\n lines.push(`- **${op.op}** ${op.target_id ?? \"\"} (${op.agent_id}) \\u2014 \\`${p}\\``);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderOperations(operations: Array<{ op: Operation; path: string }>): string {\n const lines: string[] = [\"# Operations\\n\"];\n const sorted = [...operations].sort((a, b) => b.op.created_at.localeCompare(a.op.created_at));\n if (sorted.length === 0) {\n lines.push(\"No operations.\\n\");\n } else {\n for (const { op, path: p } of sorted) {\n lines.push(`- [${op.status}] **${op.op}** ${op.target_id ?? \"\"} (${op.agent_id}, ${op.created_at.slice(0, 10)}) \\u2014 \\`${p}\\``);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderClaims(claims: Array<{ claim: Claim; path: string }>): string {\n const lines: string[] = [\"# Claims\\n\"];\n const active = claims.filter((c) => c.claim.status === \"active\");\n if (active.length === 0) {\n lines.push(\"No active claims.\\n\");\n } else {\n for (const { claim, path: p } of active) {\n lines.push(`- **${claim.target_id}** by ${claim.agent_id} (expires ${claim.expires_at}) \\u2014 \\`${p}\\``);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private renderConflicts(operations: Array<{ op: Operation; path: string }>): string {\n const lines: string[] = [\"# Conflicts\\n\"];\n const conflicts = operations.filter((o) => o.op.status === \"conflict\");\n if (conflicts.length === 0) {\n lines.push(\"No conflicts.\\n\");\n } else {\n for (const { op, path: p } of conflicts) {\n lines.push(`- **${op.op}** ${op.target_id ?? \"\"} \\u2014 ${op.conflict_reason ?? \"unknown reason\"}`);\n lines.push(` \\`${p}\\``);\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n}\n","import * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport * as yaml from \"js-yaml\";\nimport { writeMarkdownFile } from \"./markdown.js\";\nimport type { Entity } from \"../types/index.js\";\n\nexport interface ScaffoldOptions {\n vaultPath: string;\n entities?: Entity[];\n predicates?: string[];\n}\n\nconst DEFAULT_PREDICATES = [\n \"base\",\n \"collaborator\",\n \"employer\",\n \"language\",\n \"primary-project\",\n \"publication-channel\",\n \"role\",\n \"tool\",\n];\n\nconst FACT_SCHEMA = `type: object\nrequired: [type, entity, predicate, value, recorded_at]\nproperties:\n type: { const: fact }\n id: { pattern: \"^[a-z0-9][a-z0-9_-]*$\" }\n entity: { pattern: \"^[a-z0-9-]+$\" }\n predicate: { pattern: \"^[a-z0-9-]+$\" }\n value: {}\n valid_from: { format: date, nullable: true }\n valid_to: { format: date, nullable: true }\n recorded_at: { format: date-time }\n confidence: { enum: [high, medium, low] }\n sources: { type: array }\n last_reviewed: { format: date }\n superseded_by: { type: string }\n tags: { type: array }\n decay: { type: object }\n`;\n\nconst EVENT_SCHEMA = `type: object\nrequired: [type, occurred_at, summary]\nproperties:\n type: { const: event }\n id: { pattern: \"^[a-z0-9][a-z0-9_-]*$\" }\n occurred_at: { format: date-time }\n summary: { type: string }\n entities: { type: array }\n kind: { enum: [conversation, decision, ingest, action, observation] }\n sources: { type: array }\n derived_facts: { type: array }\n`;\n\nconst OPERATION_SCHEMA = `type: object\nrequired: [type, operation_id, op, agent_id, created_at, status, reason]\nproperties:\n type: { const: operation }\n operation_id: { pattern: \"^op-[a-z0-9][a-z0-9_-]*$\" }\n op: { enum: [create_fact, update_fact, add_event, archive_fact, review_fact, rename_entity, add_entity, add_predicate] }\n agent_id: { pattern: \"^agent-[a-z0-9-]+-[a-f0-9]{8}$\" }\n created_at: { format: date-time }\n target_id: { type: string }\n target_path: { type: string }\n precondition_hash: { pattern: \"^sha256:[0-9a-f]{64}$\", nullable: true }\n status: { enum: [proposed, validated, applied, rejected, conflict, superseded] }\n reason: { type: string }\n sources: { type: array }\n payload: { type: object }\n`;\n\nconst CLAIM_SCHEMA = `type: object\nrequired: [type, target_id, operation_id, agent_id, created_at, expires_at, heartbeat_at]\nproperties:\n type: { const: claim }\n target_id: { pattern: \"^[a-z0-9][a-z0-9_-]*$\" }\n operation_id: { pattern: \"^op-[a-z0-9][a-z0-9_-]*$\" }\n agent_id: { pattern: \"^agent-[a-z0-9-]+-[a-f0-9]{8}$\" }\n created_at: { format: date-time }\n expires_at: { format: date-time }\n heartbeat_at: { format: date-time }\n status: { enum: [active, released, broken] }\n`;\n\nconst ENTITY_SCHEMA = `type: object\nrequired: [type, id, kind]\nproperties:\n type: { const: entity-index }\n id: { pattern: \"^[a-z0-9-]+$\" }\n kind: { enum: [person, project, org, place, concept, tool] }\n display: { type: string }\n aliases: { type: array }\n`;\n\nconst DECISION_SCHEMA = `type: object\nrequired: [type, id, status, decided_at, title]\nproperties:\n type: { const: decision }\n id: { pattern: \"^DEC-[0-9]{3}$\" }\n status: { enum: [accepted, pending, deprecated, superseded] }\n decided_at: { format: date }\n title: { type: string }\n entities: { type: array }\n sources: { type: array }\n`;\n\nconst INSIGHT_SCHEMA = `type: object\nrequired: [type, title, recorded_at, summary]\nproperties:\n type: { const: insight }\n id: { pattern: \"^[a-z0-9][a-z0-9_-]*$\" }\n title: { type: string }\n recorded_at: { format: date-time }\n summary: { type: string }\n entities: { type: array }\n sources: { type: array }\n confidence: { enum: [high, medium, low] }\n`;\n\n/**\n * Scaffold a new v3 vault with all required directories and schema files.\n */\nexport async function scaffoldVault(options: ScaffoldOptions): Promise<string[]> {\n const { vaultPath } = options;\n const predicates = options.predicates ?? DEFAULT_PREDICATES;\n const entities = options.entities ?? [];\n const created: string[] = [];\n\n // Create directories\n const dirs = [\n \"memory/schema\",\n \"memory/facts\",\n \"memory/events\",\n \"memory/decisions\",\n \"memory/insights\",\n \"memory/people\",\n \"memory/projects\",\n \"memory/context\",\n \"memory/_views/by-entity\",\n \"memory/_inbox\",\n \"memory/_claims\",\n \"memory/_ops/applied\",\n \"memory/_archive\",\n \"sources/articles\",\n \"sources/notes\",\n \"sources/assets\",\n ];\n\n for (const dir of dirs) {\n const fullPath = path.join(vaultPath, dir);\n await fs.mkdir(fullPath, { recursive: true });\n // Add .gitkeep for empty dirs\n const gitkeep = path.join(fullPath, \".gitkeep\");\n try {\n await fs.access(gitkeep);\n } catch {\n await fs.writeFile(gitkeep, \"\", \"utf-8\");\n }\n created.push(dir);\n }\n\n // Write version.yaml\n const versionPath = path.join(vaultPath, \"memory/schema/version.yaml\");\n await fs.writeFile(\n versionPath,\n yaml.dump({ spec_version: \"3.0\", schema_status: \"stable\", frozen_at: new Date().toISOString().slice(0, 10) }),\n \"utf-8\",\n );\n created.push(\"memory/schema/version.yaml\");\n\n // Write predicates.yaml\n const predicatesPath = path.join(vaultPath, \"memory/schema/predicates.yaml\");\n await fs.writeFile(predicatesPath, yaml.dump(predicates, { flowLevel: -1 }), \"utf-8\");\n created.push(\"memory/schema/predicates.yaml\");\n\n // Write schema files\n const schemas: Record<string, string> = {\n \"fact.schema.yaml\": FACT_SCHEMA,\n \"event.schema.yaml\": EVENT_SCHEMA,\n \"operation.schema.yaml\": OPERATION_SCHEMA,\n \"claim.schema.yaml\": CLAIM_SCHEMA,\n \"entity.schema.yaml\": ENTITY_SCHEMA,\n \"decision.schema.yaml\": DECISION_SCHEMA,\n \"insight.schema.yaml\": INSIGHT_SCHEMA,\n };\n\n for (const [filename, content] of Object.entries(schemas)) {\n const filePath = path.join(vaultPath, \"memory/schema\", filename);\n await fs.writeFile(filePath, content, \"utf-8\");\n created.push(`memory/schema/${filename}`);\n }\n\n // Write entities.md\n const entitiesPath = path.join(vaultPath, \"memory/entities.md\");\n const entitiesData = {\n type: \"entity-index\",\n entities: entities,\n };\n await writeMarkdownFile(\n entitiesPath,\n entitiesData as unknown as Record<string, unknown>,\n \"\\n# Entities\\n\\nCanonical entity list for this vault.\\n\",\n );\n created.push(\"memory/entities.md\");\n\n // Write AGENTS.md\n const agentsPath = path.join(vaultPath, \"AGENTS.md\");\n const agentsContent = `# Agent Instructions\n\n## Memory Protocol (v3 Atomic Markdown Memory)\n\nThis vault uses the v3 Atomic Markdown Memory system.\n\n### Key Rules\n- Facts live in \\`memory/facts/{entity}/{predicate}.md\\` (one fact per file)\n- Events are append-only in \\`memory/events/YYYY-MM-DD/{slug}.md\\`\n- Views in \\`memory/_views/\\` are generated — never edit them directly\n- Schemas in \\`memory/schema/\\` define allowed types and predicates\n- All entities must be registered in \\`memory/entities.md\\`\n- All predicates must be registered in \\`memory/schema/predicates.yaml\\`\n\n### Update Protocol\n1. To add a fact: use the \\`create_fact\\` MCP tool (or write to \\`memory/facts/\\`)\n2. To record an event: use the \\`add_event\\` MCP tool\n3. After writes: run \\`lint_vault\\` to validate, then \\`rebuild_views\\` to update views\n4. For multi-agent: write to \\`memory/_inbox/{agent-id}/ops/\\` and use \\`compact_inbox\\`\n`;\n await fs.writeFile(agentsPath, agentsContent, \"utf-8\");\n created.push(\"AGENTS.md\");\n\n // Write sources/README.md\n const sourcesReadme = path.join(vaultPath, \"sources/README.md\");\n await fs.writeFile(\n sourcesReadme,\n \"# Sources\\n\\nImmutable inputs. Drop articles, notes, and assets here.\\nAgents read but never modify source files.\\n\",\n \"utf-8\",\n );\n created.push(\"sources/README.md\");\n\n return created;\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Config } from \"./types/index.js\";\nimport { Vault } from \"./core/vault.js\";\nimport { EntityRegistry } from \"./core/entity-registry.js\";\nimport { PredicateRegistry } from \"./core/predicate-registry.js\";\nimport { QueryEngine } from \"./core/query-engine.js\";\nimport { OperationManager } from \"./core/operation-manager.js\";\nimport { SchemaValidator } from \"./core/schema-validator.js\";\nimport { ViewGenerator } from \"./core/view-generator.js\";\nimport { registerAllTools } from \"./tools/index.js\";\n\n/**\n * Create and configure the MCP server with all tools registered.\n */\nexport function createServer(config: Config): McpServer {\n const server = new McpServer({\n name: \"obsidian-memory\",\n version: \"0.1.0\",\n });\n\n // Initialize core services\n const vault = new Vault(config);\n const entities = new EntityRegistry(vault);\n const predicates = new PredicateRegistry(vault);\n const queryEngine = new QueryEngine(vault);\n const operationManager = new OperationManager(vault, config.agentId);\n const validator = new SchemaValidator(vault, entities, predicates);\n const viewGenerator = new ViewGenerator(vault, config.staleDays);\n\n // Register all tools\n registerAllTools(server, {\n vault,\n queryEngine,\n operationManager,\n validator,\n viewGenerator,\n entities,\n predicates,\n config,\n });\n\n return server;\n}\n\nexport { Vault } from \"./core/vault.js\";\nexport { EntityRegistry } from \"./core/entity-registry.js\";\nexport { PredicateRegistry } from \"./core/predicate-registry.js\";\nexport { QueryEngine } from \"./core/query-engine.js\";\nexport { OperationManager } from \"./core/operation-manager.js\";\nexport { SchemaValidator } from \"./core/schema-validator.js\";\nexport { ViewGenerator } from \"./core/view-generator.js\";\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { QueryEngine } from \"../core/query-engine.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport * as fs from \"node:fs/promises\";\n\nexport function registerReadTools(\n server: McpServer,\n vault: Vault,\n queryEngine: QueryEngine,\n): void {\n server.tool(\n \"read_fact\",\n \"Read a specific fact by entity+predicate or by ID. Optionally filter by temporal validity on a given date.\",\n {\n entity: z.string().optional().describe(\"Entity ID (e.g. 'elena-voss')\"),\n predicate: z.string().optional().describe(\"Predicate name (e.g. 'role')\"),\n id: z.string().optional().describe(\"Stable fact ID (e.g. 'fact-elena-voss-role')\"),\n on_date: z.string().optional().describe(\"Filter to facts valid on this date (YYYY-MM-DD)\"),\n },\n async (params) => {\n const facts = await queryEngine.findFacts({\n entity: params.entity,\n predicate: params.predicate,\n id: params.id,\n onDate: params.on_date,\n });\n\n if (facts.length === 0) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"No matching fact found\", code: \"NOT_FOUND\" }) }],\n isError: true,\n };\n }\n\n const results = facts.map((f) => ({\n ...f.data,\n _path: vault.relativePath(f.path),\n _body: f.content.trim() || undefined,\n }));\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(results.length === 1 ? results[0] : results, null, 2) }],\n };\n },\n );\n\n server.tool(\n \"read_entity\",\n \"Get all facts for a given entity. Returns a snapshot of everything known about the entity.\",\n {\n entity: z.string().describe(\"Entity ID (e.g. 'elena-voss')\"),\n on_date: z.string().optional().describe(\"Temporal snapshot date (YYYY-MM-DD)\"),\n },\n async (params) => {\n const facts = await queryEngine.findFacts({\n entity: params.entity,\n onDate: params.on_date,\n });\n\n if (facts.length === 0) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ entity: params.entity, facts: [], message: \"No facts found for this entity\" }) }],\n };\n }\n\n const result = {\n entity: params.entity,\n on_date: params.on_date ?? \"current\",\n facts: facts.map((f) => ({\n predicate: f.data.predicate,\n value: f.data.value,\n valid_from: f.data.valid_from,\n valid_to: f.data.valid_to,\n confidence: f.data.confidence,\n path: vault.relativePath(f.path),\n })),\n };\n\n return { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }] };\n },\n );\n\n server.tool(\n \"read_event\",\n \"Read events filtered by entity, date range, or kind.\",\n {\n entity: z.string().optional().describe(\"Filter events involving this entity\"),\n since: z.string().optional().describe(\"Events after this date (YYYY-MM-DD or ISO 8601)\"),\n until: z.string().optional().describe(\"Events before this date\"),\n kind: z.string().optional().describe(\"Event kind: conversation, decision, ingest, action, observation\"),\n limit: z.number().optional().describe(\"Maximum number of events to return\"),\n },\n async (params) => {\n const events = await queryEngine.findEvents({\n entity: params.entity,\n since: params.since,\n until: params.until,\n kind: params.kind,\n limit: params.limit,\n });\n\n const results = events.map((e) => ({\n ...e.data,\n _path: vault.relativePath(e.path),\n _body: e.content.trim() || undefined,\n }));\n\n return { content: [{ type: \"text\", text: JSON.stringify(results, null, 2) }] };\n },\n );\n\n server.tool(\n \"search_memory\",\n \"Search facts with flexible filters: text query, entity, predicate, date, confidence, tags.\",\n {\n query: z.string().optional().describe(\"Text search in fact values, entity names, and predicates\"),\n entity: z.string().optional().describe(\"Filter by entity\"),\n predicate: z.string().optional().describe(\"Filter by predicate\"),\n on_date: z.string().optional().describe(\"Filter to facts valid on this date (YYYY-MM-DD)\"),\n confidence: z.string().optional().describe(\"Filter by confidence: high, medium, low\"),\n tags: z.array(z.string()).optional().describe(\"Filter by tags (any match)\"),\n limit: z.number().optional().describe(\"Maximum results to return\"),\n },\n async (params) => {\n const facts = await queryEngine.findFacts({\n query: params.query,\n entity: params.entity,\n predicate: params.predicate,\n onDate: params.on_date,\n confidence: params.confidence,\n tags: params.tags,\n limit: params.limit,\n });\n\n const results = facts.map((f) => ({\n entity: f.data.entity,\n predicate: f.data.predicate,\n value: f.data.value,\n confidence: f.data.confidence,\n valid_from: f.data.valid_from,\n valid_to: f.data.valid_to,\n path: vault.relativePath(f.path),\n }));\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ count: results.length, results }, null, 2),\n }],\n };\n },\n );\n\n server.tool(\n \"get_view\",\n \"Read a materialized view. Views are pre-generated summaries of vault data.\",\n {\n view: z.enum([\n \"by-entity\", \"by-id\", \"by-predicate\", \"timeline\", \"contradictions\",\n \"stale\", \"graph\", \"inbox\", \"operations\", \"claims\", \"conflicts\",\n ]).describe(\"View name\"),\n entity: z.string().optional().describe(\"For by-entity view, the entity ID\"),\n },\n async (params) => {\n let viewPath: string;\n if (params.view === \"by-entity\" || params.entity) {\n if (!params.entity) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"entity parameter required for by-entity view\" }) }],\n isError: true,\n };\n }\n viewPath = vault.entityViewPath(params.entity);\n } else {\n viewPath = vault.viewPath(params.view);\n }\n\n try {\n const content = await fs.readFile(viewPath, \"utf-8\");\n return { content: [{ type: \"text\", text: content }] };\n } catch {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: `View not found: ${params.view}. Run rebuild_views to generate.`, code: \"VIEW_NOT_FOUND\" }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { OperationManager } from \"../core/operation-manager.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport type { EntityRegistry } from \"../core/entity-registry.js\";\nimport type { PredicateRegistry } from \"../core/predicate-registry.js\";\nimport type { Config } from \"../types/index.js\";\n\nexport function registerWriteTools(\n server: McpServer,\n vault: Vault,\n operationManager: OperationManager,\n entities: EntityRegistry,\n predicates: PredicateRegistry,\n config: Config,\n): void {\n server.tool(\n \"create_fact\",\n \"Create a new atomic fact about an entity. In direct mode, writes immediately. In inbox mode, creates an operation envelope for later application.\",\n {\n entity: z.string().describe(\"Entity ID (must be registered in entities.md)\"),\n predicate: z.string().describe(\"Predicate (must be in predicates.yaml)\"),\n value: z.string().describe(\"The fact value\"),\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional().describe(\"Confidence level\"),\n valid_from: z.string().nullable().optional().describe(\"Date when this fact became true (YYYY-MM-DD)\"),\n valid_to: z.string().nullable().optional().describe(\"Date when this fact stops being true (YYYY-MM-DD)\"),\n sources: z.array(z.string()).optional().describe(\"Source file paths (relative to vault root)\"),\n tags: z.array(z.string()).optional().describe(\"Tags for categorization\"),\n reason: z.string().describe(\"Why this fact is being recorded\"),\n },\n async (params) => {\n // Validate entity exists\n if (!(await entities.exists(params.entity))) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: `Unknown entity '${params.entity}'. Use add_entity first.`, code: \"ENTITY_NOT_FOUND\" }) }],\n isError: true,\n };\n }\n\n // Validate predicate exists\n if (!(await predicates.exists(params.predicate))) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: `Unknown predicate '${params.predicate}'. Use add_predicate first.`, code: \"PREDICATE_NOT_FOUND\" }) }],\n isError: true,\n };\n }\n\n try {\n if (config.writeMode === \"direct\") {\n const result = await operationManager.createFactDirect({\n entity: params.entity,\n predicate: params.predicate,\n value: params.value,\n confidence: params.confidence,\n valid_from: params.valid_from,\n valid_to: params.valid_to,\n sources: params.sources,\n tags: params.tags,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"direct\", ...result }, null, 2) }],\n };\n } else {\n const result = await operationManager.createFactEnvelope({\n entity: params.entity,\n predicate: params.predicate,\n value: params.value,\n confidence: params.confidence,\n valid_from: params.valid_from,\n valid_to: params.valid_to,\n sources: params.sources,\n tags: params.tags,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"inbox\", ...result }, null, 2) }],\n };\n }\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"OPERATION_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"update_fact\",\n \"Update an existing fact. Computes precondition hash for safety. Specify the fact by ID or path.\",\n {\n id: z.string().optional().describe(\"Stable fact ID\"),\n path: z.string().optional().describe(\"Relative path to the fact file\"),\n value: z.string().optional().describe(\"New value\"),\n valid_to: z.string().nullable().optional().describe(\"Update valid_to date\"),\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional().describe(\"Update confidence\"),\n tags: z.array(z.string()).optional().describe(\"Replace tags\"),\n reason: z.string().describe(\"Why this fact is being updated\"),\n },\n async (params) => {\n if (!params.id && !params.path) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"Either 'id' or 'path' is required\", code: \"INVALID_PARAMS\" }) }],\n isError: true,\n };\n }\n\n try {\n if (config.writeMode === \"direct\") {\n const result = await operationManager.updateFactDirect({\n targetId: params.id,\n targetPath: params.path,\n value: params.value,\n valid_to: params.valid_to,\n confidence: params.confidence,\n tags: params.tags,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"direct\", ...result }, null, 2) }],\n };\n } else {\n const result = await operationManager.updateFactEnvelope({\n targetId: params.id,\n targetPath: params.path,\n value: params.value,\n valid_to: params.valid_to,\n confidence: params.confidence,\n tags: params.tags,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"inbox\", ...result }, null, 2) }],\n };\n }\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"OPERATION_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"add_event\",\n \"Record an episodic event. Events are append-only and never edited after creation.\",\n {\n summary: z.string().describe(\"Short summary of what happened\"),\n entities: z.array(z.string()).optional().describe(\"Entity IDs involved in this event\"),\n kind: z.enum([\"conversation\", \"decision\", \"ingest\", \"action\", \"observation\"]).optional().describe(\"Event kind\"),\n sources: z.array(z.string()).optional().describe(\"Source file paths\"),\n body: z.string().optional().describe(\"Extended markdown body for the event\"),\n reason: z.string().optional().describe(\"Why this event is being recorded (for inbox mode)\"),\n },\n async (params) => {\n try {\n if (config.writeMode === \"direct\") {\n const result = await operationManager.addEventDirect({\n summary: params.summary,\n entities: params.entities,\n kind: params.kind,\n sources: params.sources,\n body: params.body,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"direct\", ...result }, null, 2) }],\n };\n } else {\n const result = await operationManager.addEventEnvelope({\n summary: params.summary,\n entities: params.entities,\n kind: params.kind,\n sources: params.sources,\n body: params.body,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, mode: \"inbox\", ...result }, null, 2) }],\n };\n }\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"OPERATION_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"archive_fact\",\n \"Archive a fact (move to _archive/). Use when a fact is no longer current.\",\n {\n id: z.string().optional().describe(\"Stable fact ID\"),\n path: z.string().optional().describe(\"Relative path to the fact file\"),\n reason: z.string().describe(\"Why this fact is being archived\"),\n },\n async (params) => {\n if (!params.id && !params.path) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: \"Either 'id' or 'path' is required\", code: \"INVALID_PARAMS\" }) }],\n isError: true,\n };\n }\n\n try {\n const result = await operationManager.archiveFactDirect({\n targetId: params.id,\n targetPath: params.path,\n reason: params.reason,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, ...result }, null, 2) }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"OPERATION_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { SchemaValidator } from \"../core/schema-validator.js\";\nimport type { ViewGenerator } from \"../core/view-generator.js\";\nimport type { OperationManager } from \"../core/operation-manager.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport type { Config } from \"../types/index.js\";\nimport { generateOperationId, generateEventId, slugify } from \"../core/id-generator.js\";\nimport { writeMarkdownFile } from \"../core/markdown.js\";\nimport { format } from \"date-fns\";\nimport * as path from \"node:path\";\n\nexport function registerMaintenanceTools(\n server: McpServer,\n vault: Vault,\n validator: SchemaValidator,\n viewGenerator: ViewGenerator,\n operationManager: OperationManager,\n config: Config,\n): void {\n server.tool(\n \"lint_vault\",\n \"Run full schema validation on the vault. Checks version, schemas, entities, predicates, temporal validity, wikilinks, contradictions, and duplicate IDs.\",\n {},\n async () => {\n try {\n const findings = await validator.lint();\n const errors = findings.filter((f) => f.level === \"ERROR\");\n const warnings = findings.filter((f) => f.level === \"WARN\");\n const passed = errors.length === 0;\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n passed,\n errors: errors.length,\n warnings: warnings.length,\n findings,\n }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"LINT_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"rebuild_views\",\n \"Regenerate all materialized views in memory/_views/. Views are derived from facts, events, and operations.\",\n {},\n async () => {\n try {\n const written = await viewGenerator.rebuildAll();\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ success: true, files_written: written.length, files: written }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"REBUILD_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"compact_inbox\",\n \"Apply proposed operations from the inbox. Validates precondition hashes and claim conflicts before applying.\",\n {\n auto_apply: z.boolean().optional().describe(\"Automatically apply valid operations (default: true)\"),\n },\n async (params) => {\n try {\n const result = await operationManager.compact(params.auto_apply ?? true);\n\n // Rebuild views after compaction\n if (result.applied > 0) {\n await viewGenerator.rebuildAll();\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n success: true,\n applied: result.applied,\n conflicts: result.conflicts,\n archived: result.archived,\n errors: result.errors.length > 0 ? result.errors : undefined,\n }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"COMPACT_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"reflect\",\n \"Create a reflection/observation event. Records a session summary or insight as an operation envelope.\",\n {\n summary: z.string().describe(\"Reflection summary text\"),\n entities: z.array(z.string()).optional().describe(\"Entities mentioned in the reflection\"),\n },\n async (params) => {\n try {\n const operationId = generateOperationId();\n const now = new Date();\n const dateStr = format(now, \"yyyy-MM-dd\");\n const slug = slugify(params.summary);\n\n const data: Record<string, unknown> = {\n type: \"operation\",\n operation_id: operationId,\n op: \"add_event\",\n agent_id: config.agentId,\n created_at: now.toISOString(),\n target_id: generateEventId(dateStr, slug),\n target_path: `memory/events/${dateStr}/${slug}.md`,\n precondition_hash: null,\n status: \"proposed\",\n reason: \"Session reflection\",\n sources: [],\n payload: {\n type: \"event\",\n occurred_at: now.toISOString(),\n summary: params.summary,\n entities: params.entities ?? [],\n kind: \"observation\",\n sources: [],\n },\n };\n\n const opPath = vault.inboxOpPath(config.agentId, operationId);\n await writeMarkdownFile(opPath, data, `\\n# Reflection\\n\\n${params.summary}\\n`);\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n success: true,\n operationId,\n path: vault.relativePath(opPath),\n message: \"Reflection created as operation envelope. Run compact_inbox to apply.\",\n }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"REFLECT_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport * as fs from \"node:fs/promises\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { EntityRegistry } from \"../core/entity-registry.js\";\nimport type { PredicateRegistry } from \"../core/predicate-registry.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport type { EntityKind } from \"../types/index.js\";\n\nexport function registerSchemaTools(\n server: McpServer,\n vault: Vault,\n entities: EntityRegistry,\n predicates: PredicateRegistry,\n): void {\n server.tool(\n \"list_entities\",\n \"List all registered entities in the vault.\",\n {\n kind: z.enum([\"person\", \"project\", \"org\", \"place\", \"concept\", \"tool\"]).optional().describe(\"Filter by entity kind\"),\n },\n async (params) => {\n const all = params.kind\n ? await entities.getByKind(params.kind as EntityKind)\n : await entities.getAll();\n\n return {\n content: [{ type: \"text\", text: JSON.stringify({ count: all.length, entities: all }, null, 2) }],\n };\n },\n );\n\n server.tool(\n \"list_predicates\",\n \"List all allowed predicates defined in the vault schema.\",\n {},\n async () => {\n const all = await predicates.getAll();\n return {\n content: [{ type: \"text\", text: JSON.stringify({ count: all.length, predicates: all }, null, 2) }],\n };\n },\n );\n\n server.tool(\n \"add_entity\",\n \"Register a new entity in the vault's entity index.\",\n {\n id: z.string().regex(/^[a-z0-9-]+$/).describe(\"Entity ID in kebab-case (e.g. 'john-doe')\"),\n kind: z.enum([\"person\", \"project\", \"org\", \"place\", \"concept\", \"tool\"]).describe(\"Entity kind\"),\n display: z.string().describe(\"Display name (e.g. 'John Doe')\"),\n aliases: z.array(z.string()).optional().describe(\"Alternative names\"),\n },\n async (params) => {\n try {\n const updated = await entities.add({\n id: params.id,\n kind: params.kind as EntityKind,\n display: params.display,\n aliases: params.aliases,\n });\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, entity: params.id, total: updated.length }, null, 2) }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"ADD_ENTITY_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"add_predicate\",\n \"Register a new predicate in the vault schema.\",\n {\n id: z.string().regex(/^[a-z0-9-]+$/).describe(\"Predicate ID in kebab-case (e.g. 'favorite-color')\"),\n },\n async (params) => {\n try {\n const updated = await predicates.add(params.id);\n return {\n content: [{ type: \"text\", text: JSON.stringify({ success: true, predicate: params.id, total: updated.length }, null, 2) }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"ADD_PREDICATE_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"get_schema\",\n \"Get the YAML schema definition for a given memory type.\",\n {\n type: z.enum([\"fact\", \"event\", \"operation\", \"claim\", \"entity\", \"decision\", \"insight\"]).describe(\"Schema type to retrieve\"),\n },\n async (params) => {\n const schemaFile = `${params.type}.schema.yaml`;\n const schemaPath = `${vault.paths.schema}/${schemaFile}`;\n try {\n const content = await fs.readFile(schemaPath, \"utf-8\");\n return {\n content: [{ type: \"text\", text: content }],\n };\n } catch {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: `Schema not found: ${schemaFile}`, code: \"SCHEMA_NOT_FOUND\" }) }],\n isError: true,\n };\n }\n },\n );\n}\n","import { z } from \"zod\";\nimport { glob } from \"glob\";\nimport * as path from \"node:path\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport { scaffoldVault } from \"../core/scaffold.js\";\nimport { parseMarkdownFile } from \"../core/markdown.js\";\nimport type { EntityKind } from \"../types/index.js\";\n\nexport function registerVaultTools(server: McpServer, vault: Vault): void {\n server.tool(\n \"vault_init\",\n \"Scaffold a new v3 Atomic Markdown Memory vault with all required directories, schemas, and configuration.\",\n {\n path: z.string().optional().describe(\"Vault path (defaults to configured vault path)\"),\n entities: z\n .array(\n z.object({\n id: z.string(),\n kind: z.enum([\"person\", \"project\", \"org\", \"place\", \"concept\", \"tool\"]),\n display: z.string(),\n aliases: z.array(z.string()).optional(),\n }),\n )\n .optional()\n .describe(\"Initial entities to register\"),\n predicates: z.array(z.string()).optional().describe(\"Initial predicates (defaults to standard set)\"),\n },\n async (params) => {\n const vaultPath = params.path ?? vault.paths.root;\n try {\n const created = await scaffoldVault({\n vaultPath,\n entities: params.entities?.map((e) => ({\n id: e.id,\n kind: e.kind as EntityKind,\n display: e.display,\n aliases: e.aliases,\n })),\n predicates: params.predicates,\n });\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ success: true, vault_path: vaultPath, created_count: created.length, created }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{ type: \"text\", text: JSON.stringify({ error: err instanceof Error ? err.message : String(err), code: \"INIT_FAILED\" }) }],\n isError: true,\n };\n }\n },\n );\n\n server.tool(\n \"vault_status\",\n \"Get vault health overview: counts, version, pending operations, and last modification info.\",\n {},\n async () => {\n try {\n await vault.assertValid();\n\n const factFiles = await glob(path.join(vault.paths.facts, \"**\", \"*.md\"));\n const eventFiles = await glob(path.join(vault.paths.events, \"**\", \"*.md\"));\n const inboxFiles = await glob(path.join(vault.paths.inbox, \"**\", \"ops\", \"*.md\"));\n const appliedFiles = await glob(path.join(vault.paths.opsApplied, \"*.md\"));\n const archiveFiles = await glob(path.join(vault.paths.archive, \"**\", \"*.md\"));\n\n // Count pending operations\n let pending = 0;\n for (const file of inboxFiles) {\n try {\n const parsed = await parseMarkdownFile(file);\n if ((parsed.data as Record<string, unknown>).status === \"proposed\") pending++;\n } catch { /* skip */ }\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n valid: true,\n vault_path: vault.paths.root,\n counts: {\n facts: factFiles.length,\n events: eventFiles.length,\n pending_operations: pending,\n applied_operations: appliedFiles.length,\n archived_facts: archiveFiles.length,\n },\n }, null, 2),\n }],\n };\n } catch (err) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n valid: false,\n error: err instanceof Error ? err.message : String(err),\n }, null, 2),\n }],\n isError: true,\n };\n }\n },\n );\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport type { Vault } from \"../core/vault.js\";\nimport type { QueryEngine } from \"../core/query-engine.js\";\nimport type { OperationManager } from \"../core/operation-manager.js\";\nimport type { SchemaValidator } from \"../core/schema-validator.js\";\nimport type { ViewGenerator } from \"../core/view-generator.js\";\nimport type { EntityRegistry } from \"../core/entity-registry.js\";\nimport type { PredicateRegistry } from \"../core/predicate-registry.js\";\nimport type { Config } from \"../types/index.js\";\nimport { registerReadTools } from \"./read.js\";\nimport { registerWriteTools } from \"./write.js\";\nimport { registerMaintenanceTools } from \"./maintenance.js\";\nimport { registerSchemaTools } from \"./schema.js\";\nimport { registerVaultTools } from \"./vault.js\";\n\nexport interface ToolServices {\n vault: Vault;\n queryEngine: QueryEngine;\n operationManager: OperationManager;\n validator: SchemaValidator;\n viewGenerator: ViewGenerator;\n entities: EntityRegistry;\n predicates: PredicateRegistry;\n config: Config;\n}\n\nexport function registerAllTools(server: McpServer, services: ToolServices): void {\n registerReadTools(server, services.vault, services.queryEngine);\n registerWriteTools(\n server,\n services.vault,\n services.operationManager,\n services.entities,\n services.predicates,\n services.config,\n );\n registerMaintenanceTools(\n server,\n services.vault,\n services.validator,\n services.viewGenerator,\n services.operationManager,\n services.config,\n );\n registerSchemaTools(server, services.vault, services.entities, services.predicates);\n registerVaultTools(server, services.vault);\n}\n","import * as os from \"node:os\";\nimport type { Config } from \"./types/index.js\";\nimport { DEFAULT_CONFIG } from \"./types/index.js\";\nimport { generateAgentId } from \"./core/id-generator.js\";\n\nexport interface ConfigInput {\n vault?: string;\n transport?: string;\n agentId?: string;\n mode?: string;\n port?: number;\n apiKey?: string;\n staleDays?: number;\n}\n\n/**\n * Resolve configuration from CLI args, env vars, and defaults.\n */\nexport function resolveConfig(input: ConfigInput): Config {\n const vaultPath =\n input.vault ??\n process.env.VAULT_PATH ??\n process.env.OBSIDIAN_VAULT_PATH;\n\n if (!vaultPath) {\n throw new Error(\n \"Vault path is required. Provide --vault flag or set VAULT_PATH environment variable.\",\n );\n }\n\n const transport = (input.transport ?? process.env.TRANSPORT ?? DEFAULT_CONFIG.transport) as\n | \"stdio\"\n | \"sse\";\n\n const agentId =\n input.agentId ??\n process.env.AGENT_ID ??\n generateAgentId(os.hostname().split(\".\")[0]);\n\n const writeMode = (input.mode ?? process.env.WRITE_MODE ?? DEFAULT_CONFIG.writeMode) as\n | \"direct\"\n | \"inbox\";\n\n const port = input.port ?? (process.env.PORT ? parseInt(process.env.PORT, 10) : DEFAULT_CONFIG.port);\n const staleDays = input.staleDays ?? (process.env.STALE_DAYS ? parseInt(process.env.STALE_DAYS, 10) : DEFAULT_CONFIG.staleDays);\n\n return {\n vaultPath,\n transport,\n agentId,\n writeMode,\n port,\n apiKey: input.apiKey ?? process.env.API_KEY,\n staleDays,\n };\n}\n","export interface Config {\n vaultPath: string;\n transport: \"stdio\" | \"sse\";\n agentId: string;\n writeMode: \"direct\" | \"inbox\";\n port: number;\n apiKey?: string;\n staleDays: number;\n}\n\nexport const DEFAULT_CONFIG: Omit<Config, \"vaultPath\" | \"agentId\"> = {\n transport: \"stdio\",\n writeMode: \"direct\",\n port: 3100,\n staleDays: 180,\n};\n"],"mappings":"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","names":["fs","path","fs","matter","matter","fs","yaml","existing","fs","path","pattern","files","results","fs","crypto","fs","path","glob","yaml","glob","fs","path","glob","yaml","glob","fs","path","glob","format","parseISO","glob","format","parseISO","fs","path","yaml","fs","z","z","format","z","z","fs","z","glob","path","z","glob"]}
package/dist/cli.js ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ Vault,
4
+ createServer,
5
+ resolveConfig
6
+ } from "./chunk-5U2LXK3W.js";
7
+
8
+ // bin/cli.ts
9
+ import { Command } from "commander";
10
+
11
+ // src/transport/stdio.ts
12
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
13
+ async function connectStdio(server) {
14
+ const transport = new StdioServerTransport();
15
+ await server.connect(transport);
16
+ }
17
+
18
+ // src/transport/sse.ts
19
+ import express from "express";
20
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
21
+ import { randomUUID } from "crypto";
22
+ async function startSSEServer(server, port, apiKey) {
23
+ const app = express();
24
+ app.use(express.json());
25
+ if (apiKey) {
26
+ app.use((req, res, next) => {
27
+ const auth = req.headers.authorization;
28
+ if (!auth || auth !== `Bearer ${apiKey}`) {
29
+ res.status(401).json({ error: "Unauthorized" });
30
+ return;
31
+ }
32
+ next();
33
+ });
34
+ }
35
+ const transports = /* @__PURE__ */ new Map();
36
+ app.post("/mcp", async (req, res) => {
37
+ const sessionId = req.headers["mcp-session-id"];
38
+ let transport;
39
+ if (sessionId && transports.has(sessionId)) {
40
+ transport = transports.get(sessionId);
41
+ } else {
42
+ transport = new StreamableHTTPServerTransport({
43
+ sessionIdGenerator: () => randomUUID(),
44
+ onsessioninitialized: (id) => {
45
+ transports.set(id, transport);
46
+ }
47
+ });
48
+ transport.onclose = () => {
49
+ const id = [...transports.entries()].find(([, t]) => t === transport)?.[0];
50
+ if (id) transports.delete(id);
51
+ };
52
+ await server.connect(transport);
53
+ }
54
+ await transport.handleRequest(req, res, req.body);
55
+ });
56
+ app.get("/mcp", async (req, res) => {
57
+ const sessionId = req.headers["mcp-session-id"];
58
+ if (!sessionId || !transports.has(sessionId)) {
59
+ res.status(400).json({ error: "No active session. Send an initialize request first." });
60
+ return;
61
+ }
62
+ const transport = transports.get(sessionId);
63
+ await transport.handleRequest(req, res);
64
+ });
65
+ app.get("/health", (_req, res) => {
66
+ res.json({ status: "ok", server: "obsidian-memory-mcp" });
67
+ });
68
+ app.listen(port, () => {
69
+ console.error(`[obsidian-memory-mcp] SSE server listening on http://localhost:${port}/mcp`);
70
+ });
71
+ }
72
+
73
+ // bin/cli.ts
74
+ var program = new Command();
75
+ program.name("obsidian-memory-mcp").description("MCP server for Obsidian v3 Atomic Markdown Memory vaults").version("0.1.0").requiredOption("--vault <path>", "Path to the Obsidian vault root").option("--transport <type>", "Transport type: stdio or sse", "stdio").option("--agent-id <id>", "Agent ID for this server instance").option("--mode <mode>", "Write mode: direct or inbox", "direct").option("--port <port>", "Port for SSE transport", "3100").option("--api-key <key>", "API key for SSE authentication").option("--stale-days <days>", "Days before a fact is considered stale", "180").action(async (opts) => {
76
+ try {
77
+ const config = resolveConfig({
78
+ vault: opts.vault,
79
+ transport: opts.transport,
80
+ agentId: opts.agentId,
81
+ mode: opts.mode,
82
+ port: parseInt(opts.port, 10),
83
+ apiKey: opts.apiKey,
84
+ staleDays: parseInt(opts.staleDays, 10)
85
+ });
86
+ const vault = new Vault(config);
87
+ try {
88
+ await vault.assertValid();
89
+ } catch (err) {
90
+ console.error(
91
+ `[obsidian-memory-mcp] Warning: ${err instanceof Error ? err.message : String(err)}`
92
+ );
93
+ console.error(
94
+ `[obsidian-memory-mcp] Server will start, but some tools may fail until vault is initialized.`
95
+ );
96
+ }
97
+ const server = createServer(config);
98
+ if (config.transport === "stdio") {
99
+ await connectStdio(server);
100
+ } else {
101
+ await startSSEServer(server, config.port, config.apiKey);
102
+ }
103
+ } catch (err) {
104
+ console.error(`[obsidian-memory-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}`);
105
+ process.exit(1);
106
+ }
107
+ });
108
+ program.parse();
109
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bin/cli.ts","../src/transport/stdio.ts","../src/transport/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { resolveConfig } from \"../src/config.js\";\nimport { createServer } from \"../src/server.js\";\nimport { connectStdio } from \"../src/transport/stdio.js\";\nimport { startSSEServer } from \"../src/transport/sse.js\";\nimport { Vault } from \"../src/core/vault.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"obsidian-memory-mcp\")\n .description(\"MCP server for Obsidian v3 Atomic Markdown Memory vaults\")\n .version(\"0.1.0\")\n .requiredOption(\"--vault <path>\", \"Path to the Obsidian vault root\")\n .option(\"--transport <type>\", \"Transport type: stdio or sse\", \"stdio\")\n .option(\"--agent-id <id>\", \"Agent ID for this server instance\")\n .option(\"--mode <mode>\", \"Write mode: direct or inbox\", \"direct\")\n .option(\"--port <port>\", \"Port for SSE transport\", \"3100\")\n .option(\"--api-key <key>\", \"API key for SSE authentication\")\n .option(\"--stale-days <days>\", \"Days before a fact is considered stale\", \"180\")\n .action(async (opts) => {\n try {\n const config = resolveConfig({\n vault: opts.vault,\n transport: opts.transport,\n agentId: opts.agentId,\n mode: opts.mode,\n port: parseInt(opts.port, 10),\n apiKey: opts.apiKey,\n staleDays: parseInt(opts.staleDays, 10),\n });\n\n // Validate vault exists (unless we're just serving and might init later)\n const vault = new Vault(config);\n try {\n await vault.assertValid();\n } catch (err) {\n // Allow server to start even with invalid vault - vault_init tool can fix it\n console.error(\n `[obsidian-memory-mcp] Warning: ${err instanceof Error ? err.message : String(err)}`,\n );\n console.error(\n `[obsidian-memory-mcp] Server will start, but some tools may fail until vault is initialized.`,\n );\n }\n\n const server = createServer(config);\n\n if (config.transport === \"stdio\") {\n await connectStdio(server);\n } else {\n await startSSEServer(server, config.port, config.apiKey);\n }\n } catch (err) {\n console.error(`[obsidian-memory-mcp] Fatal: ${err instanceof Error ? err.message : String(err)}`);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\n/**\n * Connect the MCP server to stdio transport (stdin/stdout).\n * Used by CLI tools like Claude Code, Qoder, Open Code.\n */\nexport async function connectStdio(server: McpServer): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import express from \"express\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { randomUUID } from \"node:crypto\";\n\n/**\n * Start the MCP server with SSE/HTTP transport.\n * Provides an HTTP endpoint for desktop apps and web clients.\n */\nexport async function startSSEServer(\n server: McpServer,\n port: number,\n apiKey?: string,\n): Promise<void> {\n const app = express();\n app.use(express.json());\n\n // Optional API key authentication\n if (apiKey) {\n app.use((req, res, next) => {\n const auth = req.headers.authorization;\n if (!auth || auth !== `Bearer ${apiKey}`) {\n res.status(401).json({ error: \"Unauthorized\" });\n return;\n }\n next();\n });\n }\n\n // Map to store transports by session ID\n const transports = new Map<string, StreamableHTTPServerTransport>();\n\n // Handle POST requests for client-to-server messages\n app.post(\"/mcp\", async (req, res) => {\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n let transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports.has(sessionId)) {\n transport = transports.get(sessionId)!;\n } else {\n // New session\n transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => randomUUID(),\n onsessioninitialized: (id) => {\n transports.set(id, transport);\n },\n });\n\n transport.onclose = () => {\n const id = [...transports.entries()].find(([, t]) => t === transport)?.[0];\n if (id) transports.delete(id);\n };\n\n await server.connect(transport);\n }\n\n await transport.handleRequest(req, res, req.body);\n });\n\n // Handle GET requests for SSE streams\n app.get(\"/mcp\", async (req, res) => {\n const sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n if (!sessionId || !transports.has(sessionId)) {\n res.status(400).json({ error: \"No active session. Send an initialize request first.\" });\n return;\n }\n const transport = transports.get(sessionId)!;\n await transport.handleRequest(req, res);\n });\n\n // Health check\n app.get(\"/health\", (_req, res) => {\n res.json({ status: \"ok\", server: \"obsidian-memory-mcp\" });\n });\n\n app.listen(port, () => {\n console.error(`[obsidian-memory-mcp] SSE server listening on http://localhost:${port}/mcp`);\n });\n}\n"],"mappings":"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","names":[]}