@datacore-one/mcp 1.0.2 → 1.1.1

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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts","../src/storage.ts","../package.json","../src/version.ts","../src/tools/index.ts","../src/tools/capture.ts","../src/limits.ts","../src/engrams.ts","../src/schemas/engram.ts","../src/logger.ts","../src/tools/learn.ts","../src/tools/inject-tool.ts","../src/decay.ts","../src/inject.ts","../src/tools/search.ts","../src/tools/ingest.ts","../src/tools/status.ts","../src/trust.ts","../registry/packs.json","../src/tools/discover.ts","../src/tools/install.ts","../src/tools/export.ts","../src/modules.ts","../src/tools/modules-list.ts","../src/tools/modules-info.ts","../src/tools/modules-health.ts","../src/tools/forget.ts","../src/tools/feedback.ts","../src/resources.ts","../src/datacortex.ts","../src/index.ts"],"sourcesContent":["// src/server.ts\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { detectStorage, initCore, type StorageConfig } from './storage.js'\nimport { currentVersion, checkForUpdate } from './version.js'\nimport { TOOLS } from './tools/index.js'\nimport { handleCapture } from './tools/capture.js'\nimport { handleLearn } from './tools/learn.js'\nimport { handleInject } from './tools/inject-tool.js'\nimport { handleSearch } from './tools/search.js'\nimport { handleIngest } from './tools/ingest.js'\nimport { handleStatus } from './tools/status.js'\nimport { handleDiscover } from './tools/discover.js'\nimport { handleInstall } from './tools/install.js'\nimport { handleExport } from './tools/export.js'\nimport {\n discoverModules,\n loadModuleTools,\n type DiscoveredModule,\n type RegisteredModuleTool,\n} from './modules.js'\nimport { handleModulesList } from './tools/modules-list.js'\nimport { handleModulesInfo } from './tools/modules-info.js'\nimport { handleModulesHealth } from './tools/modules-health.js'\nimport { handleForget } from './tools/forget.js'\nimport { handleFeedback } from './tools/feedback.js'\nimport { logger } from './logger.js'\nimport { registerResources, notifyEngramsChanged } from './resources.js'\nimport { DatacortexBridge } from './datacortex.js'\n\nlet storage: StorageConfig\nlet updateAvailable: string | null = null\nlet moduleTools: RegisteredModuleTool[] = []\nlet discoveredModules: DiscoveredModule[] = []\nlet isFirstRun = false\nlet serverRef: Server | null = null\nlet datacortexBridge: DatacortexBridge | null = null\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n { capabilities: { tools: {}, logging: {}, resources: { subscribe: true } } },\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n ...TOOLS.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: zodToJsonSchema(t.inputSchema),\n })),\n ...moduleTools.map(t => ({\n name: t.fullName,\n description: t.definition.description,\n inputSchema: zodToJsonSchema(t.definition.inputSchema),\n })),\n ],\n }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n try {\n const result = await routeTool(name, args ?? {})\n const response: { type: string; text: string }[] = []\n if (isFirstRun) {\n isFirstRun = false\n response.push({ type: 'text', text: JSON.stringify({\n _welcome: `Welcome to Datacore MCP! Your data is stored at ${storage.basePath}. Try: datacore.learn to create your first engram, datacore.capture to write a journal entry, or datacore.status to see system info.`,\n }) })\n }\n response.push({ type: 'text', text: JSON.stringify(result, null, 2) })\n return { content: response }\n } catch (error) {\n return { content: [{ type: 'text', text: `Error: ${error}` }], isError: true }\n }\n })\n\n logger.setServer(server)\n registerResources(server, storage)\n serverRef = server\n return server\n}\n\n// --- Tool routing ---\n\nconst ENGRAM_MUTATING_TOOLS = new Set(['datacore.learn', 'datacore.forget', 'datacore.feedback'])\n\nasync function routeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const coreTool = TOOLS.find(t => t.name === name)\n if (coreTool) {\n const validated = coreTool.inputSchema.parse(args)\n let result: unknown\n switch (name) {\n case 'datacore.capture': result = await handleCapture(validated, storage); break\n case 'datacore.learn': result = await handleLearn(validated, storage.engramsPath); break\n case 'datacore.inject': result = await handleInject(validated, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.search': result = await handleSearch(validated, { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath }, datacortexBridge); break\n case 'datacore.ingest': result = await handleIngest(validated, { knowledgePath: storage.knowledgePath, engramsPath: storage.engramsPath }); break\n case 'datacore.status': result = await handleStatus({ ...storage, engramsPath: storage.engramsPath, packsPath: storage.packsPath }, updateAvailable); break\n case 'datacore.forget': result = await handleForget(validated, storage.engramsPath); break\n case 'datacore.feedback': result = await handleFeedback(validated as { engram_id: string; signal: 'positive' | 'negative' | 'neutral'; comment?: string }, storage.engramsPath); break\n case 'datacore.packs.discover': result = handleDiscover(validated, storage.packsPath); break\n case 'datacore.packs.install': result = await handleInstall(validated, storage.packsPath); break\n case 'datacore.packs.export': result = await handleExport(validated as any, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.modules.list': result = await handleModulesList(validated, storage, discoveredModules); break\n case 'datacore.modules.info': result = await handleModulesInfo(validated as { module: string }, storage, discoveredModules); break\n case 'datacore.modules.health': result = await handleModulesHealth(validated as { module?: string }, storage, discoveredModules); break\n default: throw new Error(`Unknown core tool: ${name}`)\n }\n if (ENGRAM_MUTATING_TOOLS.has(name) && serverRef) {\n notifyEngramsChanged(serverRef)\n }\n return result\n }\n\n const modTool = moduleTools.find(t => t.fullName === name)\n if (modTool) {\n const validated = modTool.definition.inputSchema.parse(args)\n return modTool.definition.handler(validated, modTool.context)\n }\n\n const allNames = [...TOOLS.map(t => t.name), ...moduleTools.map(t => t.fullName)]\n const suggestions = findClosestTools(name, allNames)\n const hint = suggestions.length > 0\n ? ` Did you mean: ${suggestions.join(', ')}?`\n : ''\n throw new Error(`Unknown tool: ${name}.${hint}`)\n}\n\n// --- Tool name suggestion ---\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length\n const dp: number[] = Array.from({ length: n + 1 }, (_, i) => i)\n for (let i = 1; i <= m; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= n; j++) {\n const tmp = dp[j]\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1])\n prev = tmp\n }\n }\n return dp[n]\n}\n\nexport function findClosestTools(name: string, allNames: string[]): string[] {\n const threshold = Math.max(3, Math.floor(name.length * 0.35))\n const scored = allNames\n .map(t => ({ name: t, dist: levenshtein(name.toLowerCase(), t.toLowerCase()) }))\n .filter(s => s.dist <= threshold)\n .sort((a, b) => a.dist - b.dist)\n return scored.slice(0, 2).map(s => s.name)\n}\n\n// --- Shared initialization ---\n\nasync function initStorage(): Promise<void> {\n storage = detectStorage()\n if (storage.mode === 'core') {\n const result = initCore(storage.basePath)\n isFirstRun = result.isFirstRun\n }\n if (storage.mode === 'full') {\n discoveredModules = discoverModules(storage)\n moduleTools = await loadModuleTools(discoveredModules, storage)\n datacortexBridge = new DatacortexBridge(storage.basePath)\n }\n}\n\n// --- Transport entry points ---\n\nexport async function runStdio(): Promise<void> {\n await initStorage()\n\n checkForUpdate().then(v => { updateAvailable = v })\n // Check daily — MCP servers can run for months\n const updateInterval = setInterval(() => {\n checkForUpdate().then(v => { updateAvailable = v })\n }, 24 * 3600_000)\n updateInterval.unref()\n\n const server = createServer()\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n server.onclose = () => {\n clearInterval(updateInterval)\n }\n}\n\nexport async function runHttp(): Promise<void> {\n const { createServer: createHttpServer } = await import('http')\n const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js')\n\n await initStorage()\n checkForUpdate().then(v => { updateAvailable = v })\n\n const port = parseInt(process.env.DATACORE_HTTP_PORT ?? '3100', 10)\n const host = process.env.DATACORE_HTTP_HOST ?? '127.0.0.1'\n const server = createServer()\n\n const httpServer = createHttpServer(async (req, res) => {\n if (req.method === 'POST' && req.url === '/mcp') {\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined })\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } else if (req.method === 'GET' && req.url === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'ok', version: currentVersion }))\n } else {\n res.writeHead(404)\n res.end('Not Found')\n }\n })\n\n httpServer.listen(port, host, () => {\n console.log(`Datacore MCP server listening on http://${host}:${port}/mcp`)\n })\n}\n\n// Export for testing\nexport { moduleTools as _moduleTools }\n","// src/storage.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\nexport type StorageMode = 'full' | 'core'\n\nexport interface StorageConfig {\n mode: StorageMode\n basePath: string\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n}\n\nexport function detectStorage(): StorageConfig {\n // 1. Explicit DATACORE_PATH (full installation)\n const dcPath = process.env.DATACORE_PATH\n if (dcPath && fs.existsSync(path.join(dcPath, '.datacore'))) {\n return fullConfig(dcPath)\n }\n\n // 2. Explicit core path (env var overrides auto-detection)\n const corePath = process.env.DATACORE_CORE_PATH\n if (corePath && fs.existsSync(corePath)) {\n return coreConfig(corePath)\n }\n\n // 3. Default full installation at ~/Data\n const defaultFull = path.join(os.homedir(), 'Data')\n if (fs.existsSync(path.join(defaultFull, '.datacore'))) {\n return fullConfig(defaultFull)\n }\n\n // 4. Default core mode at ~/Datacore\n return coreConfig(path.join(os.homedir(), 'Datacore'))\n}\n\nfunction fullConfig(basePath: string): StorageConfig {\n return {\n mode: 'full',\n basePath,\n engramsPath: path.join(basePath, '.datacore', 'learning', 'engrams.yaml'),\n journalPath: path.join(basePath, '0-personal', 'journal'),\n knowledgePath: path.join(basePath, '0-personal', '3-knowledge'),\n packsPath: path.join(basePath, '.datacore', 'learning', 'packs'),\n }\n}\n\nfunction coreConfig(basePath: string): StorageConfig {\n return {\n mode: 'core',\n basePath,\n engramsPath: path.join(basePath, 'engrams.yaml'),\n journalPath: path.join(basePath, 'journal'),\n knowledgePath: path.join(basePath, 'knowledge'),\n packsPath: path.join(basePath, 'packs'),\n }\n}\n\nexport function initCore(basePath: string): { isFirstRun: boolean } {\n const isFirstRun = !fs.existsSync(path.join(basePath, 'engrams.yaml'))\n for (const dir of ['journal', 'knowledge', 'packs']) {\n const dirPath = path.join(basePath, dir)\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true })\n }\n }\n\n const engramsPath = path.join(basePath, 'engrams.yaml')\n if (!fs.existsSync(engramsPath)) {\n fs.writeFileSync(engramsPath, 'engrams: []\\n')\n }\n\n const configPath = path.join(basePath, 'config.yaml')\n if (!fs.existsSync(configPath)) {\n fs.writeFileSync(configPath, '# Datacore MCP configuration\\nversion: 1\\n')\n }\n\n copyStarterPacks(basePath)\n return { isFirstRun }\n}\n\nfunction copyStarterPacks(basePath: string): void {\n const packsDir = path.join(basePath, 'packs')\n const bundledPacksDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs'\n )\n\n if (!fs.existsSync(bundledPacksDir)) return\n\n for (const entry of fs.readdirSync(bundledPacksDir)) {\n const src = path.join(bundledPacksDir, entry)\n const dest = path.join(packsDir, entry)\n if (!fs.existsSync(dest) && fs.statSync(src).isDirectory()) {\n fs.cpSync(src, dest, { recursive: true })\n }\n }\n}\n","{\n \"name\": \"@datacore-one/mcp\",\n \"version\": \"1.0.2\",\n \"description\": \"Datacore MCP server — The Software of You\",\n \"type\": \"module\",\n \"bin\": {\n \"datacore-mcp\": \"dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"start\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"js-yaml\": \"^4.1.0\",\n \"zod\": \"^3.23.0\",\n \"zod-to-json-schema\": \"^3.25.1\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.0.0\"\n },\n \"files\": [\n \"dist\",\n \"packs\"\n ],\n \"keywords\": [\n \"mcp\",\n \"datacore\",\n \"knowledge\",\n \"learning\",\n \"engrams\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Fair Data Society\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/datacore-one/mcp.git\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","// src/version.ts\nimport pkg from '../package.json'\n\nexport const currentVersion: string = pkg.version\n\nexport async function checkForUpdate(): Promise<string | null> {\n try {\n const res = await fetch('https://registry.npmjs.org/@datacore-one/mcp/latest', {\n signal: AbortSignal.timeout(3000),\n })\n if (!res.ok) return null\n const data = await res.json() as { version: string }\n if (data.version !== currentVersion) return data.version\n return null\n } catch {\n return null\n }\n}\n","// src/tools/index.ts\nimport { z } from 'zod'\n\nexport const TOOLS = [\n {\n name: 'datacore.capture',\n description: 'Capture a journal entry or knowledge note',\n inputSchema: z.object({\n type: z.enum(['journal', 'knowledge']),\n content: z.string().describe('Content to capture'),\n title: z.string().optional().describe('Title for knowledge notes'),\n tags: z.array(z.string()).optional().describe('Tags to attach'),\n }),\n },\n {\n name: 'datacore.learn',\n description: 'Create an engram from a statement — record a reusable learning',\n inputSchema: z.object({\n statement: z.string().describe('The knowledge assertion'),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']).optional(),\n scope: z.string().optional().describe('Scope: global | agent:X | command:X'),\n tags: z.array(z.string()).optional(),\n domain: z.string().optional().describe('Dot-notation domain: software.architecture'),\n visibility: z.enum(['private', 'public', 'template']).optional(),\n }),\n },\n {\n name: 'datacore.inject',\n description: 'Get relevant engrams for a task — returns directives and considerations',\n inputSchema: z.object({\n prompt: z.string().describe('The task or question to match against'),\n scope: z.string().optional().describe('Filter by scope: global | agent:X | module:X | command:X'),\n max_tokens: z.number().optional().describe('Token budget (default: 8000)'),\n min_relevance: z.number().optional().describe('Minimum score threshold (default: 0.3)'),\n }),\n },\n {\n name: 'datacore.search',\n description: 'Search journal entries and knowledge notes by keyword',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n scope: z.enum(['journal', 'knowledge', 'all']).optional(),\n method: z.enum(['keyword', 'semantic']).optional().describe('Search method (default: keyword)'),\n limit: z.number().optional().describe('Max results (default: 20)'),\n }),\n },\n {\n name: 'datacore.ingest',\n description: 'Ingest text content as a knowledge note, optionally extract engram suggestions',\n inputSchema: z.object({\n content: z.string().describe('Content to ingest'),\n title: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n },\n {\n name: 'datacore.status',\n description: 'Show Datacore status: engram/pack/note counts, scaling hints, update info',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.packs.discover',\n description: 'Browse available engram packs from the registry',\n inputSchema: z.object({\n query: z.string().optional().describe('Filter by name/description'),\n tags: z.array(z.string()).optional().describe('Filter by tags'),\n }),\n },\n {\n name: 'datacore.packs.install',\n description: 'Install or upgrade an engram pack',\n inputSchema: z.object({\n source: z.string().describe('Pack source: local path or pack ID from registry'),\n }),\n },\n {\n name: 'datacore.forget',\n description: 'Retire an engram by ID or search term — marks it as retired so it is no longer injected',\n inputSchema: z.object({\n id: z.string().optional().describe('Exact engram ID to retire (e.g., ENG-2026-0219-001)'),\n search: z.string().optional().describe('Search term to find engram by statement, tag, or ID fragment'),\n }),\n },\n {\n name: 'datacore.feedback',\n description: 'Signal whether an injected engram was helpful (positive), unhelpful (negative), or seen but not acted on (neutral)',\n inputSchema: z.object({\n engram_id: z.string().describe('The engram ID to provide feedback on'),\n signal: z.enum(['positive', 'negative', 'neutral']).describe('Feedback signal'),\n comment: z.string().optional().describe('Optional comment about why'),\n }),\n },\n {\n name: 'datacore.packs.export',\n description: 'Export personal engrams as a shareable pack. Preview by default, set confirm=true to write.',\n inputSchema: z.object({\n name: z.string().describe('Pack name'),\n description: z.string().describe('Pack description'),\n engram_ids: z.array(z.string()).optional().describe('Specific engram IDs to export'),\n filter_tags: z.array(z.string()).optional().describe('Filter by tags'),\n filter_domain: z.string().optional().describe('Filter by domain prefix'),\n confirm: z.boolean().optional().describe('Set true to write pack (default: preview only)'),\n }),\n },\n {\n name: 'datacore.modules.list',\n description: 'List installed modules with scope, version, and capability counts',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.modules.info',\n description: 'Get detailed info about a specific module: manifest, tools, skills, agents, engrams',\n inputSchema: z.object({\n module: z.string().describe('Module name (e.g., \"gtd\", \"slides\", \"crm\")'),\n }),\n },\n {\n name: 'datacore.modules.health',\n description: 'Check module health: missing files, env vars, data separation issues',\n inputSchema: z.object({\n module: z.string().optional().describe('Module name (omit for all modules)'),\n }),\n },\n] as const\n","// src/tools/capture.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { StorageConfig } from '../storage.js'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface CaptureArgs {\n type: 'journal' | 'knowledge'\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface CaptureResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport async function handleCapture(args: CaptureArgs, storage: StorageConfig): Promise<CaptureResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n if (args.type === 'journal') {\n return captureJournal(args.content, storage.journalPath)\n }\n return captureKnowledge(args.content, args.title, args.tags, storage.knowledgePath)\n}\n\nexport function localDate(tz?: string): { date: string; time: string } {\n const timezone = tz || process.env.DATACORE_TIMEZONE || undefined\n const now = new Date()\n const dateStr = now.toLocaleDateString('en-CA', { timeZone: timezone }) // en-CA gives YYYY-MM-DD\n const timeStr = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: timezone })\n return { date: dateStr, time: timeStr }\n}\n\nfunction captureJournal(content: string, journalDir: string): CaptureResult {\n const { date: today, time } = localDate()\n const filePath = path.join(journalDir, `${today}.md`)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n if (fs.existsSync(filePath)) {\n const existing = fs.readFileSync(filePath, 'utf8')\n fs.writeFileSync(filePath, `${existing}\\n## ${time}\\n\\n${content}\\n`)\n } else {\n fs.writeFileSync(filePath, `# ${today}\\n\\n## ${time}\\n\\n${content}\\n`)\n }\n\n return { success: true, path: filePath }\n}\n\nfunction captureKnowledge(content: string, title: string | undefined, tags: string[] | undefined, knowledgeDir: string): CaptureResult {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (title ?? 'note').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(knowledgeDir, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${title ?? 'Untitled'}\"\\ncreated: \"${new Date().toISOString()}\"\\n---\\n\\n`\n const tagLine = tags?.length ? `\\n${tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${content}\\n${tagLine}`)\n\n return { success: true, path: filePath }\n}\n","// src/limits.ts\nexport const MAX_CONTENT_SIZE = 1_000_000 // 1MB\nexport const MAX_TITLE_LENGTH = 200\n\nexport function validateContent(content: string): string | null {\n if (content.length > MAX_CONTENT_SIZE) {\n return `Content too large: ${content.length} characters (max: ${MAX_CONTENT_SIZE})`\n }\n return null\n}\n\nexport function validateTitle(title: string): string | null {\n if (title.length > MAX_TITLE_LENGTH) {\n return `Title too long: ${title.length} characters (max: ${MAX_TITLE_LENGTH})`\n }\n return null\n}\n","// src/engrams.ts\nimport * as fs from 'fs'\nimport * as yaml from 'js-yaml'\nimport { EngramSchema, PackManifestSchema, type Engram, type PackManifest } from './schemas/engram.js'\nimport { logger } from './logger.js'\n\nexport function loadEngrams(filePath: string): Engram[] {\n if (!fs.existsSync(filePath)) return []\n\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n if (!raw?.engrams || !Array.isArray(raw.engrams)) return []\n\n const valid: Engram[] = []\n let skipped = 0\n for (const entry of raw.engrams) {\n const result = EngramSchema.safeParse(entry)\n if (result.success) {\n valid.push(result.data)\n } else {\n skipped++\n }\n }\n if (skipped > 0) {\n logger.warning(`Skipped ${skipped} invalid engram(s) in ${filePath}`)\n }\n return valid\n } catch (err) {\n logger.error(`Failed to parse engrams file ${filePath}: ${err}`)\n return []\n }\n}\n\nexport function saveEngrams(filePath: string, engrams: Engram[]): void {\n const content = yaml.dump({ engrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n fs.writeFileSync(filePath, content)\n}\n\nexport interface LoadedPack {\n manifest: PackManifest\n engrams: Engram[]\n}\n\nfunction parseSkillMdFrontmatter(filePath: string): Record<string, any> {\n const content = fs.readFileSync(filePath, 'utf8')\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!match) throw new Error(`No frontmatter found in ${filePath}`)\n try {\n return yaml.load(match[1]) as Record<string, any>\n } catch (err) {\n throw new Error(`Failed to parse YAML frontmatter in ${filePath}: ${err}`)\n }\n}\n\nexport function loadPack(packDir: string): LoadedPack {\n const skillMdPath = `${packDir}/SKILL.md`\n const engramsPath = `${packDir}/engrams.yaml`\n\n const rawManifest = parseSkillMdFrontmatter(skillMdPath)\n const manifest = PackManifestSchema.parse(rawManifest)\n const engrams = loadEngrams(engramsPath)\n\n return { manifest, engrams }\n}\n\nexport function loadAllPacks(packsDir: string): LoadedPack[] {\n if (!fs.existsSync(packsDir)) return []\n\n const packs: LoadedPack[] = []\n for (const entry of fs.readdirSync(packsDir)) {\n const packDir = `${packsDir}/${entry}`\n if (!fs.statSync(packDir).isDirectory()) continue\n if (!fs.existsSync(`${packDir}/SKILL.md`)) continue\n\n try {\n packs.push(loadPack(packDir))\n } catch (err) {\n logger.warning(`Failed to load pack ${entry}: ${err}`)\n }\n }\n return packs\n}\n","// src/schemas/engram.ts\nimport { z } from 'zod'\n\nexport const ActivationSchema = z.object({\n retrieval_strength: z.number().min(0).max(1),\n storage_strength: z.number().min(0).max(1),\n frequency: z.number().int().min(0),\n last_accessed: z.string(),\n})\n\nexport const KnowledgeTypeSchema = z.object({\n memory_class: z.enum(['semantic', 'episodic', 'procedural', 'metacognitive']),\n cognitive_level: z.enum(['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']),\n})\n\nexport const RelationsSchema = z.object({\n broader: z.array(z.string()).default([]),\n narrower: z.array(z.string()).default([]),\n related: z.array(z.string()).default([]),\n conflicts: z.array(z.string()).default([]),\n})\n\nexport const ProvenanceSchema = z.object({\n origin: z.string(),\n chain: z.array(z.string()).default([]),\n signature: z.string().nullable().default(null),\n license: z.string().default('cc-by-sa-4.0'),\n})\n\nexport const FeedbackSignalsSchema = z.object({\n positive: z.number().int().default(0),\n negative: z.number().int().default(0),\n neutral: z.number().int().default(0),\n})\n\nexport const EngramSchema = z.object({\n id: z.string().regex(/^ENG-[A-Za-z0-9-]+$/),\n version: z.number().int().min(1),\n status: z.enum(['active', 'dormant', 'retired', 'candidate']),\n consolidated: z.boolean().default(false),\n\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n scope: z.string(),\n visibility: z.enum(['private', 'public', 'template']).default('private'),\n statement: z.string().min(1),\n rationale: z.string().optional(),\n contraindications: z.array(z.string()).optional(),\n source_patterns: z.array(z.string()).optional(),\n derivation_count: z.number().int().min(0).default(1),\n\n knowledge_type: KnowledgeTypeSchema.optional(),\n domain: z.string().optional(),\n relations: RelationsSchema.optional(),\n activation: ActivationSchema,\n provenance: ProvenanceSchema.optional(),\n feedback_signals: FeedbackSignalsSchema.optional(),\n tags: z.array(z.string()).default([]),\n pack: z.string().nullable().default(null),\n abstract: z.string().nullable().default(null),\n derived_from: z.string().nullable().default(null),\n})\n\nexport type Engram = z.infer<typeof EngramSchema>\n\n// Pack manifest matches SKILL.md frontmatter structure\nexport const DatacoreExtensionSchema = z.object({\n id: z.string(),\n injection_policy: z.enum(['on_match', 'on_request']),\n match_terms: z.array(z.string()).default([]),\n domain: z.string().optional(),\n engram_count: z.number().int().min(0),\n})\n\nexport const PackManifestSchema = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n creator: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).default([]),\n 'x-datacore': DatacoreExtensionSchema,\n})\n\nexport type PackManifest = z.infer<typeof PackManifestSchema>\n","// src/logger.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error'\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warning: 2,\n error: 3,\n}\n\nconst MAX_MESSAGE_LENGTH = 4096\n\nclass Logger {\n private server: Server | null = null\n private minLevel: LogLevel\n\n constructor() {\n const envLevel = process.env.DATACORE_LOG_LEVEL?.toLowerCase()\n this.minLevel = envLevel && envLevel in LEVEL_ORDER\n ? envLevel as LogLevel\n : 'warning'\n }\n\n setServer(server: Server): void {\n this.server = server\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevel]\n }\n\n private truncate(msg: string): string {\n if (msg.length <= MAX_MESSAGE_LENGTH) return msg\n return msg.slice(0, MAX_MESSAGE_LENGTH - 3) + '...'\n }\n\n private emit(level: LogLevel, message: string): void {\n if (!this.shouldLog(level)) return\n const truncated = this.truncate(message)\n\n // Always write to stderr for debug traces\n process.stderr.write(`[datacore:${level}] ${truncated}\\n`)\n\n // Send MCP notification for warning+ if server connected\n if (this.server && LEVEL_ORDER[level] >= LEVEL_ORDER['warning']) {\n try {\n this.server.sendLoggingMessage({ level, data: truncated })\n } catch {\n // Server not connected or notification failed — ignore\n }\n }\n }\n\n debug(message: string): void { this.emit('debug', message) }\n info(message: string): void { this.emit('info', message) }\n warning(message: string): void { this.emit('warning', message) }\n error(message: string): void { this.emit('error', message) }\n}\n\nexport const logger = new Logger()\n","// src/tools/learn.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface LearnArgs {\n statement: string\n type?: 'behavioral' | 'terminological' | 'procedural' | 'architectural'\n scope?: string\n tags?: string[]\n domain?: string\n rationale?: string\n visibility?: 'private' | 'public' | 'template'\n}\n\ninterface LearnResult {\n success: boolean\n engram: Engram\n}\n\nexport function generateEngramId(existingEngrams: Engram[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `ENG-${date.slice(0, 4)}-${date.slice(4)}-`\n\n // Find highest seq for today\n let maxSeq = 0\n for (const e of existingEngrams) {\n if (e.id.startsWith(prefix)) {\n const seq = parseInt(e.id.slice(prefix.length), 10)\n if (seq > maxSeq) maxSeq = seq\n }\n }\n\n const nextSeq = maxSeq + 1\n const padWidth = nextSeq > 999 ? String(nextSeq).length : 3\n return `${prefix}${String(nextSeq).padStart(padWidth, '0')}`\n}\n\nexport async function handleLearn(args: LearnArgs, engramsPath: string): Promise<LearnResult> {\n const engrams = loadEngrams(engramsPath)\n const today = new Date().toISOString().split('T')[0]\n\n const engram: Engram = {\n id: generateEngramId(engrams),\n version: 2,\n status: 'candidate',\n consolidated: false,\n type: args.type ?? 'behavioral',\n scope: args.scope ?? 'global',\n visibility: args.visibility ?? 'private',\n statement: args.statement,\n rationale: args.rationale,\n derivation_count: 1,\n domain: args.domain,\n tags: args.tags ?? [],\n activation: {\n retrieval_strength: 0.5,\n storage_strength: 0.3,\n frequency: 0,\n last_accessed: today,\n },\n pack: null,\n abstract: null,\n derived_from: null,\n }\n\n engrams.push(engram)\n saveEngrams(engramsPath, engrams)\n return { success: true, engram }\n}\n","// src/tools/inject-tool.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams, loadAllPacks } from '../engrams.js'\nimport { selectEngrams, type InjectionContext } from '../inject.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface InjectArgs {\n prompt: string\n scope?: string\n max_tokens?: number\n min_relevance?: number\n}\n\ninterface InjectResult {\n text: string\n count: number\n tokens_used: number\n}\n\nexport async function handleInject(\n args: InjectArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<InjectResult> {\n const personalEngrams = loadEngrams(paths.engramsPath)\n const packs = loadAllPacks(paths.packsPath)\n\n const ctx: InjectionContext = {\n prompt: args.prompt,\n scope: args.scope,\n maxTokens: args.max_tokens,\n minRelevance: args.min_relevance,\n }\n\n const result = selectEngrams(ctx, personalEngrams, packs)\n const totalCount = result.directives.length + result.consider.length\n\n if (totalCount === 0) {\n return { text: '', count: 0, tokens_used: 0 }\n }\n\n const lines: string[] = []\n if (result.directives.length > 0) {\n lines.push('## DIRECTIVES\\n')\n for (const e of result.directives) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n if (result.consider.length > 0) {\n lines.push('\\n## ALSO CONSIDER\\n')\n for (const e of result.consider) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n\n // Update usage tracking for selected personal engrams\n updateUsageTracking(\n paths.engramsPath,\n personalEngrams,\n [...result.directives, ...result.consider],\n )\n\n return { text: lines.join('\\n'), count: totalCount, tokens_used: result.tokens_used }\n}\n\nfunction updateUsageTracking(\n engramsPath: string,\n allPersonal: Engram[],\n selected: Engram[],\n): void {\n const selectedPersonalIds = new Set(\n selected.filter(e => !e.pack).map(e => e.id),\n )\n if (selectedPersonalIds.size === 0) return\n\n const today = new Date().toISOString().split('T')[0]\n let changed = false\n\n for (const engram of allPersonal) {\n if (selectedPersonalIds.has(engram.id)) {\n engram.activation.last_accessed = today\n engram.activation.frequency += 1\n changed = true\n }\n }\n\n if (changed) {\n atomicWriteYaml(engramsPath, { engrams: allPersonal })\n }\n}\n\nexport function atomicWriteYaml(filePath: string, data: unknown): void {\n const content = yaml.dump(data, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nfunction formatEngram(engram: Engram, totalCount: number): string {\n if (totalCount < 10) {\n let text = `- **${engram.statement}**`\n if (engram.rationale) text += `\\n _${engram.rationale}_`\n if (engram.contraindications?.length) {\n text += `\\n Except: ${engram.contraindications.join(', ')}`\n }\n return text\n }\n if (totalCount < 30) {\n const source = engram.pack ? ` [${engram.pack}]` : ''\n return `- ${engram.statement}${source}`\n }\n return `- ${engram.statement}`\n}\n","// src/decay.ts\n\nconst DECAY_RATE = 0.05\nconst FLOOR = 0.05\nconst MS_PER_DAY = 86_400_000\n\nexport type EngramState = 'active' | 'fading' | 'dormant' | 'retirement_candidate'\n\n/**\n * Compute decayed retrieval strength using exponential decay.\n * Floor of 0.05 prevents permanent extinction.\n */\nexport function decayedStrength(\n retrievalStrength: number,\n lastAccessed: string,\n now?: Date,\n): number {\n const last = new Date(lastAccessed)\n const current = now ?? new Date()\n const days = Math.max(0, (current.getTime() - last.getTime()) / MS_PER_DAY)\n return Math.max(retrievalStrength * Math.exp(-DECAY_RATE * days), FLOOR)\n}\n\n/**\n * Classify engram state based on current retrieval strength.\n */\nexport function engramState(retrievalStrength: number): EngramState {\n if (retrievalStrength >= 0.5) return 'active'\n if (retrievalStrength >= 0.3) return 'fading'\n if (retrievalStrength >= 0.1) return 'dormant'\n return 'retirement_candidate'\n}\n","// src/inject.ts\nimport type { Engram } from './schemas/engram.js'\nimport type { LoadedPack } from './engrams.js'\nimport { decayedStrength } from './decay.js'\n\nexport interface InjectionContext {\n prompt: string\n scope?: string\n maxTokens?: number // Default: 8000 (~10% of 80K context)\n minRelevance?: number // Default: 0.3\n}\n\nexport interface InjectionResult {\n directives: Engram[]\n consider: Engram[]\n tokens_used: number\n}\n\ninterface ScoredEngram {\n engram: Engram\n score: number\n}\n\nconst DEFAULT_MAX_TOKENS = 8000\nconst DEFAULT_MIN_RELEVANCE = 0.3\nconst TOKENS_PER_ENGRAM = 40 // Compact format estimate\nconst MAX_PER_PACK = 5\nconst MAX_PER_DOMAIN = 10\n\nexport function selectEngrams(\n ctx: InjectionContext,\n personalEngrams: Engram[],\n packs: LoadedPack[],\n): InjectionResult {\n const promptLower = ctx.prompt.toLowerCase()\n const promptWords = new Set(promptLower.split(/\\W+/).filter(w => w.length > 2))\n const scored: ScoredEngram[] = []\n\n for (const engram of personalEngrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, [], ctx.scope, false)\n if (score > 0) scored.push({ engram, score })\n }\n\n for (const pack of packs) {\n if (pack.manifest['x-datacore'].injection_policy === 'on_request') continue\n const matchTerms = pack.manifest['x-datacore'].match_terms\n for (const engram of pack.engrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, matchTerms, ctx.scope, true)\n if (score > 0) scored.push({ engram, score })\n }\n }\n\n const maxTokens = ctx.maxTokens ?? DEFAULT_MAX_TOKENS\n const minRelevance = ctx.minRelevance ?? DEFAULT_MIN_RELEVANCE\n\n // Filter by minimum relevance\n const passing = scored.filter(s => s.score >= minRelevance)\n passing.sort((a, b) => b.score - a.score)\n\n // Fill token budget with diversity constraints\n const selected = fillTokenBudget(passing, maxTokens)\n\n // Split: top 2/3 = directives, bottom 1/3 = consider\n const splitPoint = Math.ceil(selected.length * 2 / 3)\n return {\n directives: selected.slice(0, splitPoint),\n consider: selected.slice(splitPoint),\n tokens_used: selected.length * TOKENS_PER_ENGRAM,\n }\n}\n\nfunction scoreEngram(engram: Engram, promptLower: string, promptWords: Set<string>, packMatchTerms: string[], scopeFilter: string | undefined, isPack: boolean): number {\n // Scope filtering: if scope is specified, only include matching engrams\n if (scopeFilter) {\n if (scopeFilter === 'global') {\n if (engram.scope !== 'global') return 0\n } else if (!engram.scope.startsWith(scopeFilter) && engram.scope !== 'global') {\n return 0\n }\n }\n\n let termHits = 0\n\n // Pack match terms (highest weight — curated relevance signals)\n for (const term of packMatchTerms) {\n if (promptLower.includes(term.toLowerCase())) termHits++\n }\n // Tag matches\n for (const tag of engram.tags) {\n if (promptWords.has(tag.toLowerCase())) termHits++\n }\n // Domain hierarchy matches (each level counts)\n if (engram.domain) {\n for (const part of engram.domain.split(/[./]/)) {\n if (promptWords.has(part.toLowerCase())) termHits++\n }\n }\n // Statement keyword overlap — word-boundary matching (lower weight)\n const statementWords = new Set(engram.statement.toLowerCase().split(/\\W+/).filter(w => w.length > 2))\n for (const word of promptWords) {\n if (statementWords.has(word)) termHits += 0.5\n }\n\n if (termHits === 0) return 0\n\n // Base score from term hits * (decayed) retrieval strength\n // Pack engrams use raw RS (read-only, can't track usage)\n const rs = isPack\n ? engram.activation.retrieval_strength\n : decayedStrength(engram.activation.retrieval_strength, engram.activation.last_accessed)\n let score = termHits * rs\n\n // Feedback signal boost: positive feedback increases score, negative decreases\n const feedback = engram.feedback_signals\n if (feedback) {\n const netFeedback = feedback.positive - feedback.negative\n if (netFeedback > 0) score *= 1 + Math.min(netFeedback * 0.05, 0.3)\n else if (netFeedback < 0) score *= Math.max(1 + netFeedback * 0.1, 0.5)\n }\n\n // Consolidated engrams get a slight boost (survived reconsolidation)\n if (engram.consolidated) score *= 1.1\n\n return score\n}\n\nfunction fillTokenBudget(scored: ScoredEngram[], maxTokens: number): Engram[] {\n const result: Engram[] = []\n const packCounts = new Map<string, number>()\n const domainCounts = new Map<string, number>()\n let tokensUsed = 0\n\n for (const { engram } of scored) {\n if (tokensUsed + TOKENS_PER_ENGRAM > maxTokens) break\n\n const pack = engram.pack ?? '__personal__'\n const packCount = packCounts.get(pack) ?? 0\n if (packCount >= MAX_PER_PACK && pack !== '__personal__') continue\n\n const domain = engram.domain ?? '__none__'\n const topDomain = domain.split('.')[0]\n const domainCount = domainCounts.get(topDomain) ?? 0\n if (domainCount >= MAX_PER_DOMAIN) continue\n\n result.push(engram)\n tokensUsed += TOKENS_PER_ENGRAM\n packCounts.set(pack, packCount + 1)\n domainCounts.set(topDomain, domainCount + 1)\n }\n return result\n}\n","// src/tools/search.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { DatacortexBridge } from '../datacortex.js'\n\nconst CONTENT_CACHE_MAX = 500\nconst contentCache = new Map<string, { mtime: number; content: string }>()\n\nfunction getCachedContent(filePath: string): string | null {\n const entry = contentCache.get(filePath)\n if (!entry) return null\n try {\n const stat = fs.statSync(filePath)\n if (stat.mtimeMs === entry.mtime) return entry.content\n } catch { /* file gone */ }\n contentCache.delete(filePath)\n return null\n}\n\nfunction setCachedContent(filePath: string, content: string): void {\n try {\n const mtime = fs.statSync(filePath).mtimeMs\n if (contentCache.size >= CONTENT_CACHE_MAX) {\n // Evict oldest entry\n const firstKey = contentCache.keys().next().value\n if (firstKey) contentCache.delete(firstKey)\n }\n contentCache.set(filePath, { mtime, content })\n } catch { /* ignore */ }\n}\n\ninterface SearchArgs {\n query: string\n scope?: 'journal' | 'knowledge' | 'all'\n method?: 'keyword' | 'semantic'\n limit?: number\n}\n\ninterface SearchResultItem {\n path: string\n snippet: string\n score: number\n}\n\ninterface SearchResponse {\n results: SearchResultItem[]\n method?: string\n fallback_warning?: string\n}\n\nexport async function handleSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n bridge?: DatacortexBridge | null,\n): Promise<SearchResponse> {\n // Semantic search via Datacortex bridge\n if (args.method === 'semantic' && bridge) {\n const availability = bridge.isAvailable()\n if (availability.available) {\n const result = await bridge.search(args.query, args.limit ?? 20)\n if (!result.fallback) {\n return { results: result.results, method: 'semantic' }\n }\n // Fall through to keyword search with warning\n }\n // Semantic unavailable — fall back with warning\n const keywordResults = await keywordSearch(args, paths)\n return { ...keywordResults, method: 'keyword', fallback_warning: 'Semantic search unavailable, using keyword fallback' }\n }\n\n return keywordSearch(args, paths)\n}\n\nasync function keywordSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n): Promise<SearchResponse> {\n const scope = args.scope ?? 'all'\n const limit = args.limit ?? 20\n const results: SearchResultItem[] = []\n\n if (scope === 'journal' || scope === 'all') {\n results.push(...searchDir(paths.journalPath, args.query))\n }\n if (scope === 'knowledge' || scope === 'all') {\n results.push(...searchDir(paths.knowledgePath, args.query))\n }\n\n results.sort((a, b) => b.score - a.score)\n return { results: results.slice(0, limit), method: 'keyword' }\n}\n\nfunction searchDir(dirPath: string, query: string): SearchResultItem[] {\n if (!fs.existsSync(dirPath)) return []\n const results: SearchResultItem[] = []\n const queryLower = query.toLowerCase()\n\n for (const file of walkDir(dirPath)) {\n if (!file.endsWith('.md')) continue\n const content = getCachedContent(file) ?? (() => {\n const c = fs.readFileSync(file, 'utf8')\n setCachedContent(file, c)\n return c\n })()\n const contentLower = content.toLowerCase()\n const occurrences = countOccurrences(contentLower, queryLower)\n if (occurrences === 0) continue\n\n const snippet = extractSnippet(content, query)\n results.push({ path: file, snippet, score: occurrences })\n }\n return results\n}\n\nfunction walkDir(dir: string): string[] {\n const files: string[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) files.push(...walkDir(fullPath))\n else files.push(fullPath)\n }\n return files\n}\n\nfunction countOccurrences(text: string, query: string): number {\n let count = 0\n let pos = 0\n while ((pos = text.indexOf(query, pos)) !== -1) {\n count++\n pos += query.length\n }\n return count\n}\n\nfunction extractSnippet(content: string, query: string): string {\n const idx = content.toLowerCase().indexOf(query.toLowerCase())\n if (idx === -1) return content.slice(0, 100)\n const start = Math.max(0, idx - 50)\n const end = Math.min(content.length, idx + query.length + 50)\n return (start > 0 ? '...' : '') + content.slice(start, end) + (end < content.length ? '...' : '')\n}\n","// src/tools/ingest.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface IngestArgs {\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface IngestResult {\n success: boolean\n note_path?: string\n engram_suggestions?: string[]\n error?: string\n}\n\nexport async function handleIngest(\n args: IngestArgs,\n paths: { knowledgePath: string; engramsPath: string },\n): Promise<IngestResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (args.title ?? 'ingested').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(paths.knowledgePath, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${args.title ?? 'Ingested Note'}\"\\ncreated: \"${new Date().toISOString()}\"\\ntype: ingested\\n---\\n\\n`\n const tagLine = args.tags?.length ? `\\n${args.tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${args.content}\\n${tagLine}`)\n\n const suggestions = extractEngramSuggestions(args.content)\n\n return {\n success: true,\n note_path: filePath,\n engram_suggestions: suggestions.length > 0 ? suggestions : undefined,\n }\n}\n\nexport function extractEngramSuggestions(content: string): string[] {\n // Require sentence-start context to reduce mid-sentence false positives\n const patterns = [\n /(?:^|[.!?]\\s+)(always\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(never\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(prefer\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(avoid\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(ensure\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n ]\n\n const suggestions: string[] = []\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const suggestion = match[1].trim()\n if (suggestion.length >= 8 && suggestion.length <= 180) {\n suggestions.push(suggestion)\n }\n }\n }\n return suggestions\n}\n","// src/tools/status.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { loadEngrams } from '../engrams.js'\nimport { currentVersion } from '../version.js'\nimport { decayedStrength, engramState } from '../decay.js'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface StatusPaths {\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n mode: string\n basePath: string\n}\n\ninterface StatusResult {\n version: string\n mode: string\n engrams: number\n engram_health?: Record<string, number>\n packs: number\n pack_integrity?: { name: string; valid: boolean }[]\n journal_entries: number\n knowledge_notes: number\n scaling_hint?: string\n update_available?: string\n}\n\nexport async function handleStatus(\n paths: StatusPaths,\n updateAvailable?: string | null,\n): Promise<StatusResult> {\n const engrams = loadEngrams(paths.engramsPath)\n const journalCount = countFiles(paths.journalPath, '.md')\n const knowledgeCount = countFiles(paths.knowledgePath, '.md')\n const packsCount = countDirs(paths.packsPath)\n\n // Engram health summary by state\n const healthCounts: Record<string, number> = { active: 0, fading: 0, dormant: 0, retirement_candidate: 0 }\n for (const e of engrams) {\n if (e.status !== 'active') continue\n const rs = decayedStrength(e.activation.retrieval_strength, e.activation.last_accessed)\n const state = engramState(rs)\n healthCounts[state]++\n }\n\n // Pack integrity check\n const packIntegrity: { name: string; valid: boolean }[] = []\n for (const regPack of (registry.packs as Array<{ id: string; checksum?: string }>)) {\n if (!regPack.checksum) continue\n const packDir = path.join(paths.packsPath, regPack.id)\n if (!fs.existsSync(packDir)) continue\n const result = verifyPackChecksum(packDir, regPack.checksum)\n packIntegrity.push({ name: regPack.id, valid: result.valid })\n }\n\n const result: StatusResult = {\n version: currentVersion,\n mode: paths.mode,\n engrams: engrams.length,\n engram_health: healthCounts,\n packs: packsCount,\n pack_integrity: packIntegrity.length > 0 ? packIntegrity : undefined,\n journal_entries: journalCount,\n knowledge_notes: knowledgeCount,\n }\n\n if (engrams.length >= 500) {\n result.scaling_hint = `You have ${engrams.length} engrams. Consider migrating to full Datacore for SQLite-backed search.`\n }\n\n if (updateAvailable) {\n result.update_available = updateAvailable\n }\n\n return result\n}\n\nfunction countFiles(dir: string, ext: string): number {\n if (!fs.existsSync(dir)) return 0\n let count = 0\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) count += countFiles(fullPath, ext)\n else if (entry.name.endsWith(ext)) count++\n }\n return count\n}\n\nfunction countDirs(dir: string): number {\n if (!fs.existsSync(dir)) return 0\n return fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory()).length\n}\n","// src/trust.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as crypto from 'crypto'\n\nexport function computePackChecksum(packDir: string): string | null {\n const files = ['SKILL.md', 'engrams.yaml']\n const hash = crypto.createHash('sha256')\n let hasContent = false\n\n for (const file of files) {\n const filePath = path.join(packDir, file)\n if (fs.existsSync(filePath)) {\n hash.update(fs.readFileSync(filePath))\n hasContent = true\n }\n }\n\n return hasContent ? hash.digest('hex') : null\n}\n\nexport function verifyPackChecksum(packDir: string, expected: string): { valid: boolean; actual: string | null } {\n const actual = computePackChecksum(packDir)\n return { valid: actual === expected, actual }\n}\n","{\n \"version\": 1,\n \"packs\": [\n {\n \"id\": \"datacore-starter-v1\",\n \"name\": \"Datacore Methodology\",\n \"description\": \"Core knowledge management principles — capture, journal, learn, compound\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"methodology\", \"gtd\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 5,\n \"free\": true,\n \"checksum\": \"4fb30b260c6ba5fd36e7cf9240f0a651ca484c777ab4a7be0b3438627138f1a3\"\n },\n {\n \"id\": \"fds-principles-v1\",\n \"name\": \"FDS Principles\",\n \"description\": \"Fair Data Society's 10 principles for ethical data handling\",\n \"version\": \"1.0.0\",\n \"author\": \"Fair Data Society\",\n \"tags\": [\"ethics\", \"data-sovereignty\", \"privacy\", \"consent\"],\n \"download_url\": \"\",\n \"engram_count\": 10,\n \"free\": true,\n \"checksum\": \"8cc7bbb7e259486b16370511fefe937532ee7dcba60ce87c2cd6b8647b5b9847\"\n },\n {\n \"id\": \"dips-v1\",\n \"name\": \"Datacore DIPs\",\n \"description\": \"Comprehensive knowledge from all 20 Datacore Improvement Proposals\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"architecture\", \"patterns\", \"gtd\", \"modules\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 747,\n \"free\": true,\n \"checksum\": \"08185777c38e3a91fbb0f92e7ef388c5940e97e69be6dcce8ce119bd2b33968c\"\n }\n ]\n}\n","// src/tools/discover.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport registry from '../../registry/packs.json'\n\ninterface RegistryPack {\n id: string; name: string; description: string; version: string\n author: string; tags: string[]; download_url: string\n engram_count: number; free: boolean\n}\n\ninterface DiscoverPack extends RegistryPack {\n installed: boolean\n installed_version?: string\n upgradeable: boolean\n can_install: boolean\n}\n\ninterface DiscoverResult {\n packs: DiscoverPack[]\n}\n\nexport function handleDiscover(\n args: { query?: string; tags?: string[] },\n packsDir: string,\n): DiscoverResult {\n let packs: DiscoverPack[] = registry.packs.map((p: RegistryPack) => {\n const localDir = path.join(packsDir, p.id)\n const installed = fs.existsSync(path.join(localDir, 'SKILL.md'))\n let installedVersion: string | undefined\n if (installed) {\n try {\n const content = fs.readFileSync(path.join(localDir, 'SKILL.md'), 'utf8')\n const match = content.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n installedVersion = match?.[1]\n } catch {}\n }\n return {\n ...p,\n installed,\n installed_version: installedVersion,\n upgradeable: installed && installedVersion !== p.version,\n can_install: !!p.download_url,\n }\n })\n\n if (args.query) {\n const q = args.query.toLowerCase()\n packs = packs.filter(p =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.tags.some(t => t.toLowerCase().includes(q))\n )\n }\n\n if (args.tags?.length) {\n const filterTags = new Set(args.tags.map(t => t.toLowerCase()))\n packs = packs.filter(p => p.tags.some(t => filterTags.has(t.toLowerCase())))\n }\n\n return { packs }\n}\n","// src/tools/install.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface InstallArgs {\n source: string\n}\n\ninterface InstallResult {\n success: boolean\n pack_id?: string\n upgraded?: boolean\n already_current?: boolean\n checksum_verified?: boolean\n error?: string\n}\n\nexport async function handleInstall(args: InstallArgs, packsDir: string): Promise<InstallResult> {\n let srcDir = args.source\n\n // Detect URL source — download to temp, extract, use as srcDir\n if (srcDir.startsWith('http://') || srcDir.startsWith('https://')) {\n const downloaded = await downloadPack(srcDir)\n if (downloaded.error) return { success: false, error: downloaded.error }\n srcDir = downloaded.path!\n }\n\n // Validate source has SKILL.md\n const skillPath = path.join(srcDir, 'SKILL.md')\n if (!fs.existsSync(skillPath)) {\n return { success: false, error: 'No SKILL.md found in source directory' }\n }\n\n // Parse SKILL.md frontmatter to get pack ID and version\n const skillContent = fs.readFileSync(skillPath, 'utf8')\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!frontmatterMatch) {\n return { success: false, error: 'No YAML frontmatter in SKILL.md' }\n }\n\n const manifest = yaml.load(frontmatterMatch[1]) as Record<string, any>\n const packId = manifest?.['x-datacore']?.id\n const newVersion = manifest?.version\n\n if (!packId) {\n return { success: false, error: 'Missing x-datacore.id in SKILL.md frontmatter' }\n }\n\n const destDir = path.join(packsDir, packId)\n\n // Check if already installed\n if (fs.existsSync(path.join(destDir, 'SKILL.md'))) {\n const existingContent = fs.readFileSync(path.join(destDir, 'SKILL.md'), 'utf8')\n const existingMatch = existingContent.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n const existingVersion = existingMatch?.[1]\n\n if (existingVersion === newVersion) {\n return { success: true, pack_id: packId, already_current: true }\n }\n\n // Upgrade: remove old, copy new\n fs.rmSync(destDir, { recursive: true, force: true })\n fs.cpSync(srcDir, destDir, { recursive: true })\n return { success: true, pack_id: packId, upgraded: true }\n }\n\n // Fresh install\n fs.cpSync(srcDir, destDir, { recursive: true })\n\n // Verify checksum if registry has one\n const checksumVerified = verifyInstalledChecksum(packId, destDir)\n return { success: true, pack_id: packId, checksum_verified: checksumVerified ?? undefined }\n}\n\nfunction verifyInstalledChecksum(packId: string, destDir: string): boolean | null {\n const registryPack = (registry.packs as Array<{ id: string; checksum?: string }>).find(p => p.id === packId)\n if (!registryPack?.checksum) return null\n const result = verifyPackChecksum(destDir, registryPack.checksum)\n return result.valid\n}\n\nasync function downloadPack(url: string): Promise<{ path?: string; error?: string }> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'datacore-pack-'))\n\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!res.ok) return { error: `Download failed: HTTP ${res.status}` }\n\n const buffer = Buffer.from(await res.arrayBuffer())\n const archivePath = path.join(tmpDir, 'pack.tar.gz')\n fs.writeFileSync(archivePath, buffer)\n\n // Extract .tar.gz\n const extractDir = path.join(tmpDir, 'extracted')\n fs.mkdirSync(extractDir)\n execSync(`tar xzf ${JSON.stringify(archivePath)} -C ${JSON.stringify(extractDir)}`, { timeout: 10000 })\n\n // Find the pack root (directory containing SKILL.md)\n const packRoot = findPackRoot(extractDir)\n if (!packRoot) return { error: 'Downloaded archive does not contain SKILL.md' }\n\n return { path: packRoot }\n } catch (err) {\n return { error: `Download failed: ${err instanceof Error ? err.message : err}` }\n }\n}\n\nfunction findPackRoot(dir: string): string | null {\n if (fs.existsSync(path.join(dir, 'SKILL.md'))) return dir\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const found = findPackRoot(path.join(dir, entry.name))\n if (found) return found\n }\n }\n return null\n}\n","// src/tools/export.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface ExportArgs {\n name: string\n description: string\n engram_ids?: string[]\n filter_tags?: string[]\n filter_domain?: string\n confirm?: boolean\n}\n\ninterface ExportResult {\n success: boolean\n preview?: {\n count: number\n statements: string[]\n pack_path: string\n }\n pack_path?: string\n error?: string\n}\n\nexport async function handleExport(\n args: ExportArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<ExportResult> {\n const allEngrams = loadEngrams(paths.engramsPath)\n let selected = allEngrams.filter(e => e.status === 'active')\n\n // Only include public or template engrams\n selected = selected.filter(e => e.visibility === 'public' || e.visibility === 'template')\n\n if (selected.length === 0 && !args.engram_ids?.length) {\n return { success: false, error: 'No exportable engrams found (only public/template engrams can be exported)' }\n }\n\n // Apply filters\n if (args.engram_ids?.length) {\n const idSet = new Set(args.engram_ids)\n // For explicit IDs, still filter for public/template from allEngrams\n selected = allEngrams.filter(e =>\n idSet.has(e.id) &&\n e.status === 'active' &&\n (e.visibility === 'public' || e.visibility === 'template')\n )\n const privateSkipped = args.engram_ids.filter(id => {\n const e = allEngrams.find(eng => eng.id === id)\n return e && e.visibility === 'private'\n })\n if (privateSkipped.length > 0) {\n return { success: false, error: `Cannot export private engrams: ${privateSkipped.join(', ')}. Set visibility to public or template first.` }\n }\n }\n\n if (args.filter_tags?.length) {\n const tagSet = new Set(args.filter_tags.map(t => t.toLowerCase()))\n selected = selected.filter(e => e.tags.some(t => tagSet.has(t.toLowerCase())))\n }\n\n if (args.filter_domain) {\n selected = selected.filter(e => e.domain?.startsWith(args.filter_domain!))\n }\n\n if (selected.length === 0) {\n return { success: false, error: 'No engrams match the filter criteria' }\n }\n\n const packId = args.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const packDir = path.join(paths.packsPath, packId)\n\n // Preview mode (default)\n if (!args.confirm) {\n return {\n success: true,\n preview: {\n count: selected.length,\n statements: selected.map(e => e.statement).slice(0, 10),\n pack_path: packDir,\n },\n }\n }\n\n // Write pack\n fs.mkdirSync(packDir, { recursive: true })\n\n // SKILL.md with frontmatter\n const skillContent = `---\nname: \"${args.name}\"\ndescription: \"${args.description}\"\nversion: \"1.0.0\"\nschema_version: 2\nx-datacore:\n id: \"${packId}\"\n injection_policy: on_match\n match_terms: []\n engram_count: ${selected.length}\n---\n\n# ${args.name}\n\n${args.description}\n\nExported ${selected.length} engrams.\n`\n fs.writeFileSync(path.join(packDir, 'SKILL.md'), skillContent)\n\n // engrams.yaml — strip personal fields\n const exportEngrams = selected.map(e => ({\n id: e.id,\n version: e.version,\n type: e.type,\n scope: e.scope,\n visibility: e.visibility,\n statement: e.statement,\n rationale: e.rationale,\n tags: e.tags,\n domain: e.domain,\n status: 'active',\n activation: {\n retrieval_strength: 0.7,\n storage_strength: 1.0,\n frequency: 0,\n last_accessed: new Date().toISOString().split('T')[0],\n },\n feedback_signals: { positive: 0, negative: 0 },\n }))\n\n fs.writeFileSync(\n path.join(packDir, 'engrams.yaml'),\n yaml.dump({ engrams: exportEngrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' }),\n )\n\n return { success: true, pack_path: packDir }\n}\n","// src/modules.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\nimport type { StorageConfig } from './storage.js'\n\nexport interface ModuleToolDefinition {\n name: string // Without namespace prefix (e.g., 'inbox_count')\n description: string\n inputSchema: z.ZodType\n handler: (args: unknown, context: ModuleToolContext) => Promise<unknown>\n}\n\nexport interface ModuleToolContext {\n storage: StorageConfig\n modulePath: string // Path to module code directory\n dataPath: string // Path to module's private data directory\n spaceName?: string // Active space (if space-scoped)\n}\n\nexport interface ModuleManifest {\n manifest_version?: number\n name: string\n version?: string\n description?: string\n builtin?: boolean\n provides?: {\n tools?: Array<{\n name: string\n description: string\n handler: string // Relative path to handler file\n }>\n skills?: unknown[]\n agents?: unknown[]\n commands?: unknown[]\n workflows?: unknown[]\n }\n context?: {\n priority?: 'always' | 'minimal' | 'on_demand'\n summary?: string\n }\n engrams?: {\n namespace?: string\n starter_pack?: string\n injection_policy?: string\n match_terms?: string[]\n }\n requires?: {\n env_vars?: {\n required?: string[]\n optional?: string[]\n }\n }\n settings?: Record<string, unknown>\n}\n\nexport interface DiscoveredModule {\n name: string\n manifest: ModuleManifest\n modulePath: string // Absolute path to module code\n scope: 'global' | 'space'\n spaceName?: string\n}\n\nexport interface RegisteredModuleTool {\n fullName: string // datacore.[module].[tool]\n moduleName: string\n definition: ModuleToolDefinition\n context: ModuleToolContext\n}\n\n/**\n * Discover all installed modules by scanning module directories.\n * Checks global (.datacore/modules/) and space-scoped ([space]/.datacore/modules/).\n */\nexport function discoverModules(storage: StorageConfig): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (storage.mode !== 'full') return modules\n\n // 1. Global modules: basePath/.datacore/modules/*/\n const globalModulesDir = path.join(storage.basePath, '.datacore', 'modules')\n modules.push(...scanModulesDir(globalModulesDir, 'global'))\n\n // 2. Space modules: basePath/[0-9]-*//.datacore/modules/*/\n try {\n const entries = fs.readdirSync(storage.basePath)\n for (const entry of entries) {\n if (/^\\d+-/.test(entry)) {\n const spaceModulesDir = path.join(storage.basePath, entry, '.datacore', 'modules')\n modules.push(...scanModulesDir(spaceModulesDir, 'space', entry))\n }\n }\n } catch {\n // basePath not readable — skip space scan\n }\n\n return modules\n}\n\nfunction scanModulesDir(\n modulesDir: string,\n scope: 'global' | 'space',\n spaceName?: string,\n): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (!fs.existsSync(modulesDir)) return modules\n\n try {\n const entries = fs.readdirSync(modulesDir)\n for (const entry of entries) {\n const modulePath = path.join(modulesDir, entry)\n const manifestPath = path.join(modulePath, 'module.yaml')\n\n if (!fs.existsSync(manifestPath)) continue\n\n try {\n const raw = fs.readFileSync(manifestPath, 'utf-8')\n const manifest = yaml.load(raw) as ModuleManifest\n if (!manifest || !manifest.name) continue\n\n modules.push({\n name: manifest.name,\n manifest,\n modulePath,\n scope,\n spaceName,\n })\n } catch {\n // Invalid YAML or missing name — skip\n }\n }\n } catch {\n // Directory not readable — skip\n }\n\n return modules\n}\n\n/**\n * Load module tools from discovered modules.\n * Only loads tools from modules that declare provides.tools in module.yaml\n * and have a valid tools/index.ts (compiled to .js) handler.\n *\n * Returns registered tools ready for MCP server integration.\n */\nexport async function loadModuleTools(\n modules: DiscoveredModule[],\n storage: StorageConfig,\n): Promise<RegisteredModuleTool[]> {\n const tools: RegisteredModuleTool[] = []\n\n for (const mod of modules) {\n const declaredTools = mod.manifest.provides?.tools\n if (!declaredTools || declaredTools.length === 0) continue\n\n // Try to load the tools/index.ts (compiled to .js)\n const toolsIndexPath = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndexPath)) continue\n\n try {\n const toolsModule = await import(toolsIndexPath)\n const moduleTools: ModuleToolDefinition[] = toolsModule.tools || toolsModule.default?.tools || []\n\n // Build data path for this module's private data\n const dataPath = mod.scope === 'space' && mod.spaceName\n ? path.join(storage.basePath, mod.spaceName, '.datacore', 'modules', mod.name, 'data')\n : path.join(storage.basePath, '0-personal', '.datacore', 'modules', mod.name, 'data')\n\n const context: ModuleToolContext = {\n storage,\n modulePath: mod.modulePath,\n dataPath,\n spaceName: mod.spaceName,\n }\n\n for (const toolDef of moduleTools) {\n // Only register tools declared in module.yaml\n const declared = declaredTools.find(d => d.name === toolDef.name)\n if (!declared) continue\n\n tools.push({\n fullName: `datacore.${mod.name}.${toolDef.name}`,\n moduleName: mod.name,\n definition: toolDef,\n context,\n })\n }\n } catch {\n // Failed to load module tools — skip this module\n }\n }\n\n return tools\n}\n\n/**\n * Get module info for the modules.list and modules.info tools.\n */\nexport function getModuleInfo(mod: DiscoveredModule): Record<string, unknown> {\n const m = mod.manifest\n return {\n name: m.name,\n version: m.version || '0.0.0',\n description: m.description || '',\n scope: mod.scope,\n space: mod.spaceName,\n builtin: m.builtin || false,\n manifest_version: m.manifest_version || 1,\n provides: {\n tools: m.provides?.tools?.length || 0,\n skills: m.provides?.skills?.length || 0,\n agents: m.provides?.agents?.length || 0,\n commands: m.provides?.commands?.length || 0,\n workflows: m.provides?.workflows?.length || 0,\n },\n context_priority: m.context?.priority || 'minimal',\n engrams: m.engrams ? {\n namespace: m.engrams.namespace,\n injection_policy: m.engrams.injection_policy,\n has_starter_pack: !!m.engrams.starter_pack,\n } : null,\n requires: m.requires?.env_vars ? {\n env_required: m.requires.env_vars.required || [],\n env_optional: m.requires.env_vars.optional || [],\n } : null,\n path: mod.modulePath,\n }\n}\n","// src/tools/modules-list.ts\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesList(\n _args: unknown,\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (modules.length === 0) {\n return {\n count: 0,\n modules: [],\n message: storage.mode === 'core'\n ? 'Module discovery requires a full Datacore installation'\n : 'No modules found',\n }\n }\n\n return {\n count: modules.length,\n modules: modules.map(m => ({\n name: m.manifest.name,\n version: m.manifest.version || '0.0.0',\n description: m.manifest.description || '',\n scope: m.scope,\n space: m.spaceName || null,\n builtin: m.manifest.builtin || false,\n manifest_version: m.manifest.manifest_version || 1,\n provides: {\n tools: m.manifest.provides?.tools?.length || 0,\n skills: m.manifest.provides?.skills?.length || 0,\n agents: m.manifest.provides?.agents?.length || 0,\n commands: m.manifest.provides?.commands?.length || 0,\n workflows: m.manifest.provides?.workflows?.length || 0,\n },\n context_priority: m.manifest.context?.priority || 'minimal',\n })),\n }\n}\n","// src/tools/modules-info.ts\nimport { discoverModules, getModuleInfo, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesInfo(\n args: { module: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n const found = modules.find(m => m.manifest.name === args.module)\n\n if (!found) {\n return { error: `Module '${args.module}' not found`, installed_modules: modules.map(m => m.name) }\n }\n\n return getModuleInfo(found)\n}\n","// src/tools/modules-health.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\ninterface HealthCheck {\n name: string\n status: 'ok' | 'warning' | 'error'\n issues: string[]\n}\n\nexport async function handleModulesHealth(\n args: { module?: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (args.module) {\n const found = modules.find(m => m.manifest.name === args.module)\n if (!found) {\n return { error: `Module '${args.module}' not found` }\n }\n return await checkModule(found, storage)\n }\n\n // Check all modules\n const checks = await Promise.all(modules.map(m => checkModule(m, storage)))\n const ok = checks.filter(c => c.status === 'ok').length\n const warnings = checks.filter(c => c.status === 'warning').length\n const errors = checks.filter(c => c.status === 'error').length\n\n return {\n summary: { total: checks.length, ok, warnings, errors },\n modules: checks,\n }\n}\n\nasync function checkModule(\n mod: { name: string; manifest: Record<string, unknown>; modulePath: string },\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as Record<string, unknown>\n\n // Check required files\n if (!fs.existsSync(path.join(mod.modulePath, 'SKILL.md'))) {\n issues.push('Missing SKILL.md (ecosystem entry point)')\n }\n if (!fs.existsSync(path.join(mod.modulePath, 'CLAUDE.base.md'))) {\n issues.push('Missing CLAUDE.base.md (AI context)')\n }\n\n // Check manifest version\n if (!manifest.manifest_version || (manifest.manifest_version as number) < 2) {\n issues.push('module.yaml uses v1 format (missing manifest_version: 2)')\n }\n\n // Check env vars\n const requires = manifest.requires as { env_vars?: { required?: string[] } } | undefined\n const requiredEnv = requires?.env_vars?.required || []\n for (const envVar of requiredEnv) {\n if (!process.env[envVar]) {\n issues.push(`Missing required env var: ${envVar}`)\n }\n }\n\n // Check declared tools have handlers\n const provides = manifest.provides as { tools?: Array<{ name: string; handler: string }> } | undefined\n const declaredTools = provides?.tools || []\n if (declaredTools.length > 0) {\n const toolsIndex = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndex)) {\n issues.push(`Declares ${declaredTools.length} tools but tools/index.js not found`)\n } else {\n // Attempt to verify exports match declarations\n try {\n const toolModule = await import(toolsIndex)\n for (const tool of declaredTools) {\n const handlerName = tool.handler || tool.name\n if (typeof toolModule[handlerName] !== 'function') {\n issues.push(`Tool '${tool.name}' declares handler '${handlerName}' but export not found`)\n }\n }\n } catch (err) {\n issues.push(`tools/index.js failed to load: ${err instanceof Error ? err.message : err}`)\n }\n }\n }\n\n // Check data separation (no data files in module code dir)\n const suspectExts = ['.db', '.sqlite', '.json']\n const suspectDirs = ['output', 'data', 'state']\n for (const dir of suspectDirs) {\n const fullPath = path.join(mod.modulePath, dir)\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory()) {\n issues.push(`Data dir '${dir}/' found in module code (should be in space data path)`)\n }\n }\n try {\n const entries = fs.readdirSync(mod.modulePath)\n for (const entry of entries) {\n if (suspectExts.some(ext => entry.endsWith(ext))) {\n issues.push(`Data file '${entry}' found in module code dir`)\n }\n }\n } catch { /* ignore */ }\n\n return {\n name: mod.name as string,\n status: issues.length === 0 ? 'ok' : issues.some(i => i.startsWith('Missing required')) ? 'error' : 'warning',\n issues,\n }\n}\n","// src/tools/forget.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\n\ninterface ForgetArgs {\n id?: string\n search?: string\n}\n\ninterface ForgetResult {\n success: boolean\n retired?: { id: string; statement: string }\n matches?: Array<{ id: string; statement: string }>\n error?: string\n}\n\nexport async function handleForget(args: ForgetArgs, engramsPath: string): Promise<ForgetResult> {\n const engrams = loadEngrams(engramsPath)\n\n if (args.id) {\n const idx = engrams.findIndex(e => e.id === args.id)\n if (idx === -1) {\n return { success: false, error: `Engram ${args.id} not found` }\n }\n const engram = engrams[idx]\n if (engram.status === 'retired') {\n return { success: false, error: `Engram ${args.id} is already retired` }\n }\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n\n if (args.search) {\n const searchLower = args.search.toLowerCase()\n const matches = engrams\n .filter(e => e.status !== 'retired')\n .filter(e =>\n e.statement.toLowerCase().includes(searchLower) ||\n e.id.toLowerCase().includes(searchLower) ||\n e.tags.some(t => t.toLowerCase().includes(searchLower))\n )\n .slice(0, 10)\n\n if (matches.length === 0) {\n return { success: false, error: `No active engrams matching \"${args.search}\"` }\n }\n if (matches.length === 1) {\n const engram = matches[0]\n const idx = engrams.findIndex(e => e.id === engram.id)\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n return {\n success: false,\n matches: matches.map(e => ({ id: e.id, statement: e.statement })),\n error: `Multiple matches found. Specify an exact ID to retire.`,\n }\n }\n\n return { success: false, error: 'Provide either id or search parameter' }\n}\n","// src/tools/feedback.ts\nimport { loadEngrams } from '../engrams.js'\nimport { atomicWriteYaml } from './inject-tool.js'\n\ninterface FeedbackArgs {\n engram_id: string\n signal: 'positive' | 'negative' | 'neutral'\n comment?: string\n}\n\ninterface FeedbackResult {\n success: boolean\n engram_id: string\n signal: string\n feedback_signals?: { positive: number; negative: number; neutral: number }\n error?: string\n}\n\nexport async function handleFeedback(\n args: FeedbackArgs,\n engramsPath: string,\n): Promise<FeedbackResult> {\n const engrams = loadEngrams(engramsPath)\n const engram = engrams.find(e => e.id === args.engram_id)\n\n if (!engram) {\n return { success: false, engram_id: args.engram_id, signal: args.signal, error: `Engram ${args.engram_id} not found` }\n }\n\n // Per-day dedup: check if same signal already given today\n const today = new Date().toISOString().split('T')[0]\n if (engram.activation.last_accessed === today) {\n // Allow max 1 positive + 1 negative per day (neutral always allowed)\n // We track this simply: if last_accessed is today and we already incremented, skip\n // This is approximate — true dedup would need a signal log\n }\n\n // Initialize feedback_signals if missing\n if (!engram.feedback_signals) {\n engram.feedback_signals = { positive: 0, negative: 0, neutral: 0 }\n }\n\n engram.feedback_signals[args.signal] += 1\n engram.activation.last_accessed = today\n\n atomicWriteYaml(engramsPath, { engrams })\n\n return {\n success: true,\n engram_id: args.engram_id,\n signal: args.signal,\n feedback_signals: { ...engram.feedback_signals },\n }\n}\n","// src/resources.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListResourceTemplatesRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { loadEngrams } from './engrams.js'\nimport { localDate } from './tools/capture.js'\nimport type { StorageConfig } from './storage.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { currentVersion } from './version.js'\n\nexport function registerResources(server: Server, storage: StorageConfig): void {\n // List static resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: 'datacore://status',\n name: 'Datacore Status',\n description: 'Current system status summary',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://engrams/active',\n name: 'Active Engrams',\n description: 'All active engrams with their metadata',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://journal/today',\n name: \"Today's Journal\",\n description: \"Today's journal entry\",\n mimeType: 'text/markdown',\n },\n ],\n }))\n\n // List resource templates\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [\n {\n uriTemplate: 'datacore://journal/{date}',\n name: 'Journal Entry',\n description: 'Journal entry for a specific date (YYYY-MM-DD)',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'datacore://engrams/{id}',\n name: 'Engram',\n description: 'A specific engram by ID',\n mimeType: 'application/json',\n },\n ],\n }))\n\n // Read resource\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri\n\n // Static: datacore://status\n if (uri === 'datacore://status') {\n const engrams = loadEngrams(storage.engramsPath)\n const active = engrams.filter(e => e.status === 'active').length\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ version: currentVersion, mode: storage.mode, engrams: engrams.length, active }),\n }],\n }\n }\n\n // Static: datacore://engrams/active\n if (uri === 'datacore://engrams/active') {\n const engrams = loadEngrams(storage.engramsPath).filter(e => e.status === 'active')\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engrams, null, 2),\n }],\n }\n }\n\n // Static or template: datacore://journal/today or datacore://journal/{date}\n const journalMatch = uri.match(/^datacore:\\/\\/journal\\/(.+)$/)\n if (journalMatch) {\n const dateStr = journalMatch[1] === 'today' ? localDate().date : journalMatch[1]\n const filePath = path.join(storage.journalPath, `${dateStr}.md`)\n if (!fs.existsSync(filePath)) {\n return { contents: [{ uri, mimeType: 'text/markdown', text: `No journal entry for ${dateStr}` }] }\n }\n return { contents: [{ uri, mimeType: 'text/markdown', text: fs.readFileSync(filePath, 'utf8') }] }\n }\n\n // Template: datacore://engrams/{id}\n const engramMatch = uri.match(/^datacore:\\/\\/engrams\\/(.+)$/)\n if (engramMatch) {\n const engrams = loadEngrams(storage.engramsPath)\n const engram = engrams.find(e => e.id === engramMatch[1])\n if (!engram) {\n throw new Error(`Engram not found: ${engramMatch[1]}`)\n }\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engram, null, 2),\n }],\n }\n }\n\n throw new Error(`Unknown resource: ${uri}`)\n })\n}\n\nexport function notifyEngramsChanged(server: Server): void {\n try {\n server.sendResourceUpdated?.({ uri: 'datacore://engrams/active' })\n } catch { /* ignore if not supported */ }\n}\n","// src/datacortex.ts\nimport { execFile } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { logger } from './logger.js'\n\ninterface SemanticResult {\n path: string\n score: number\n snippet: string\n}\n\ninterface BridgeResponse {\n results?: SemanticResult[]\n error?: string\n}\n\nexport class DatacortexBridge {\n private pythonPath: string\n private scriptPath: string | null\n\n constructor(datacorePath: string) {\n this.pythonPath = process.env.DATACORE_PYTHON ?? 'python3'\n this.scriptPath = this.findBridgeScript(datacorePath)\n }\n\n private findBridgeScript(datacorePath: string): string | null {\n const candidates = [\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'lib', 'bridge.py'),\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'bridge.py'),\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n }\n\n isAvailable(): { available: boolean; reason?: string } {\n if (!this.scriptPath) {\n return { available: false, reason: 'Datacortex bridge script not found' }\n }\n try {\n const { execSync } = require('child_process')\n execSync(`${this.pythonPath} --version`, { timeout: 5000, stdio: 'pipe' })\n return { available: true }\n } catch {\n return { available: false, reason: `Python not found at ${this.pythonPath}` }\n }\n }\n\n async search(query: string, limit: number = 20): Promise<{ results: SemanticResult[]; fallback?: boolean }> {\n if (!this.scriptPath) {\n return { results: [], fallback: true }\n }\n\n const request = JSON.stringify({ action: 'search', query, limit })\n\n return new Promise((resolve) => {\n const proc = execFile(\n this.pythonPath,\n [this.scriptPath!],\n { timeout: 30000 },\n (error, stdout, stderr) => {\n if (error) {\n logger.warning(`Datacortex bridge error: ${error.message}`)\n resolve({ results: [], fallback: true })\n return\n }\n try {\n const response: BridgeResponse = JSON.parse(stdout.trim())\n if (response.error) {\n logger.warning(`Datacortex bridge: ${response.error}`)\n resolve({ results: [], fallback: true })\n return\n }\n resolve({ results: response.results ?? [] })\n } catch {\n logger.warning(`Datacortex bridge: invalid response`)\n resolve({ results: [], fallback: true })\n }\n },\n )\n proc.stdin?.write(request + '\\n')\n proc.stdin?.end()\n })\n }\n}\n","import { runStdio, runHttp } from './server.js'\nimport { currentVersion } from './version.js'\n\nconst args = process.argv.slice(2)\n\nif (args.includes('--version') || args.includes('-v')) {\n console.log(currentVersion)\n process.exit(0)\n}\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Datacore MCP Server v${currentVersion}\nAn MCP server that gives AI assistants persistent memory through engrams.\n\nUsage:\n npx @datacore-one/mcp Start MCP server (stdio transport)\n npx @datacore-one/mcp --http Start MCP server (HTTP transport)\n npx @datacore-one/mcp --help Show this help\n npx @datacore-one/mcp --version Show version\n\nTools:\n Core\n datacore.capture Capture a journal entry or knowledge note\n datacore.learn Create an engram from a statement\n datacore.inject Get relevant engrams for a task\n datacore.search Search journal and knowledge by keyword\n datacore.ingest Ingest text as knowledge note with engram extraction\n datacore.status System status, counts, update info\n\n Lifecycle\n datacore.feedback Signal whether an injected engram was helpful\n datacore.forget Retire an engram by ID or search\n\n Packs\n datacore.packs.discover Browse available engram packs\n datacore.packs.install Install or upgrade an engram pack\n datacore.packs.export Export personal engrams as a shareable pack\n\n Modules (full mode)\n datacore.modules.list List installed modules\n datacore.modules.info Detailed info about a module\n datacore.modules.health Health check for modules\n\nConfiguration:\n DATACORE_PATH Full installation path (default: ~/Data)\n DATACORE_CORE_PATH Core mode storage path (default: ~/Datacore)\n DATACORE_TIMEZONE IANA timezone (e.g., Europe/Ljubljana)\n DATACORE_LOG_LEVEL Log level: debug|info|warning|error (default: warning)\n DATACORE_CACHE_TTL File cache TTL in seconds (default: 60)\n DATACORE_TRANSPORT Transport: stdio or http (default: stdio)\n DATACORE_HTTP_PORT HTTP transport port (default: 3100)\n DATACORE_HTTP_HOST HTTP transport bind address (default: 127.0.0.1)\n\nExamples:\n # Add to Claude Desktop config\n { \"mcpServers\": { \"datacore\": { \"command\": \"npx\", \"args\": [\"@datacore-one/mcp\"] } } }\n\n # Run with HTTP transport on custom port\n DATACORE_HTTP_PORT=8080 npx @datacore-one/mcp --http\n`)\n process.exit(0)\n}\n\nconst useHttp = args.includes('--http') || process.env.DATACORE_TRANSPORT === 'http'\n\nconst start = useHttp ? runHttp : runStdio\nstart().catch((error) => {\n console.error('Failed to start Datacore MCP server:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["isFirstRun","fs","path","args","storage","fs","z","args","fs","yaml","args","fs","path","args","start","fs","path","args","fs","path","fs","path","updateAvailable","result","fs","path","args","fs","path","yaml","os","args","fs","path","yaml","args","fs","path","yaml","storage","moduleTools","storage","args","storage","fs","path","args","storage","args","args","fs","path","storage","fs","path","execSync","args"]}
1
+ {"version":3,"sources":["../src/server.ts","../src/storage.ts","../src/config.ts","../package.json","../src/version.ts","../src/tools/index.ts","../src/tools/capture.ts","../src/limits.ts","../src/engrams.ts","../src/schemas/engram.ts","../src/logger.ts","../src/hints.ts","../src/tools/learn.ts","../src/tools/inject-tool.ts","../src/decay.ts","../src/inject.ts","../src/tools/search.ts","../src/tools/ingest.ts","../src/tools/status.ts","../src/trust.ts","../registry/packs.json","../src/tools/discover.ts","../src/tools/install.ts","../src/tools/export.ts","../src/modules.ts","../src/tools/modules-list.ts","../src/tools/modules-info.ts","../src/tools/modules-health.ts","../src/tools/forget.ts","../src/tools/feedback.ts","../src/tools/session-start.ts","../src/tools/session-end.ts","../src/tools/recall.ts","../src/tools/promote.ts","../src/resources.ts","../src/prompts.ts","../src/datacortex.ts","../src/index.ts"],"sourcesContent":["// src/server.ts\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { detectStorage, initCore, type StorageConfig } from './storage.js'\nimport { loadConfig } from './config.js'\nimport { currentVersion, checkForUpdate } from './version.js'\nimport { TOOLS } from './tools/index.js'\nimport { handleCapture } from './tools/capture.js'\nimport { handleLearn } from './tools/learn.js'\nimport { handleInject } from './tools/inject-tool.js'\nimport { handleSearch } from './tools/search.js'\nimport { handleIngest } from './tools/ingest.js'\nimport { handleStatus } from './tools/status.js'\nimport { handleDiscover } from './tools/discover.js'\nimport { handleInstall } from './tools/install.js'\nimport { handleExport } from './tools/export.js'\nimport {\n discoverModules,\n loadModuleTools,\n type DiscoveredModule,\n type RegisteredModuleTool,\n} from './modules.js'\nimport { handleModulesList } from './tools/modules-list.js'\nimport { handleModulesInfo } from './tools/modules-info.js'\nimport { handleModulesHealth } from './tools/modules-health.js'\nimport { handleForget } from './tools/forget.js'\nimport { handleFeedback } from './tools/feedback.js'\nimport { handleSessionStart } from './tools/session-start.js'\nimport { handleSessionEnd } from './tools/session-end.js'\nimport { handleRecall } from './tools/recall.js'\nimport { handlePromote } from './tools/promote.js'\nimport { logger } from './logger.js'\nimport { registerResources, notifyEngramsChanged } from './resources.js'\nimport { registerPrompts } from './prompts.js'\nimport { DatacortexBridge } from './datacortex.js'\n\nlet storage: StorageConfig\nlet updateAvailable: string | null = null\nlet moduleTools: RegisteredModuleTool[] = []\nlet discoveredModules: DiscoveredModule[] = []\nlet isFirstRun = false\nlet serverRef: Server | null = null\nlet datacortexBridge: DatacortexBridge | null = null\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n { capabilities: { tools: {}, logging: {}, resources: { subscribe: true }, prompts: {} } },\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n // Hide modules.* tools in core mode — they require a full installation\n const coreTools = storage.mode === 'core'\n ? TOOLS.filter(t => !t.name.startsWith('datacore.modules.'))\n : TOOLS\n return {\n tools: [\n ...coreTools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: zodToJsonSchema(t.inputSchema),\n })),\n ...moduleTools.map(t => ({\n name: t.fullName,\n description: t.definition.description,\n inputSchema: zodToJsonSchema(t.definition.inputSchema),\n })),\n ],\n }\n })\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n try {\n const result = await routeTool(name, args ?? {})\n const response: { type: string; text: string }[] = []\n if (isFirstRun) {\n isFirstRun = false\n response.push({ type: 'text', text: JSON.stringify({\n _welcome: `Welcome to Datacore MCP! Your data is stored at ${storage.basePath}. Try: datacore.learn to create your first engram, datacore.capture to write a journal entry, or datacore.status to see system info.`,\n }) })\n }\n response.push({ type: 'text', text: JSON.stringify(result, null, 2) })\n return { content: response }\n } catch (error) {\n return { content: [{ type: 'text', text: `Error: ${error}` }], isError: true }\n }\n })\n\n logger.setServer(server)\n registerResources(server, storage)\n registerPrompts(server)\n serverRef = server\n return server\n}\n\n// --- Tool routing ---\n\nconst ENGRAM_MUTATING_TOOLS = new Set(['datacore.learn', 'datacore.forget', 'datacore.feedback', 'datacore.session.end', 'datacore.promote'])\n\nasync function routeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const coreTool = TOOLS.find(t => t.name === name)\n if (coreTool) {\n const validated = coreTool.inputSchema.parse(args)\n let result: unknown\n switch (name) {\n case 'datacore.capture': result = await handleCapture(validated, storage); break\n case 'datacore.learn': result = await handleLearn(validated, storage.engramsPath); break\n case 'datacore.inject': result = await handleInject(validated, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.search': result = await handleSearch(validated, { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath }, datacortexBridge); break\n case 'datacore.ingest': result = await handleIngest(validated, { knowledgePath: storage.knowledgePath, engramsPath: storage.engramsPath }); break\n case 'datacore.status': result = await handleStatus({ ...storage, engramsPath: storage.engramsPath, packsPath: storage.packsPath }, updateAvailable); break\n case 'datacore.forget': result = await handleForget(validated, storage.engramsPath); break\n case 'datacore.feedback': result = await handleFeedback(validated, storage.engramsPath, storage.packsPath); break\n case 'datacore.session.start': result = await handleSessionStart(validated, storage, datacortexBridge); break\n case 'datacore.session.end': result = await handleSessionEnd(validated, storage); break\n case 'datacore.recall': result = await handleRecall(validated, { engramsPath: storage.engramsPath, journalPath: storage.journalPath, knowledgePath: storage.knowledgePath }, datacortexBridge); break\n case 'datacore.promote': result = await handlePromote(validated, storage.engramsPath); break\n case 'datacore.packs.discover': result = handleDiscover(validated, storage.packsPath); break\n case 'datacore.packs.install': result = await handleInstall(validated, storage.packsPath); break\n case 'datacore.packs.export': result = await handleExport(validated as any, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.modules.list': result = await handleModulesList(validated, storage, discoveredModules); break\n case 'datacore.modules.info': result = await handleModulesInfo(validated as { module: string }, storage, discoveredModules); break\n case 'datacore.modules.health': result = await handleModulesHealth(validated as { module?: string }, storage, discoveredModules); break\n default: throw new Error(`Unknown core tool: ${name}`)\n }\n if (ENGRAM_MUTATING_TOOLS.has(name) && serverRef) {\n notifyEngramsChanged(serverRef)\n }\n return result\n }\n\n const modTool = moduleTools.find(t => t.fullName === name)\n if (modTool) {\n const validated = modTool.definition.inputSchema.parse(args)\n return modTool.definition.handler(validated, modTool.context)\n }\n\n const allNames = [...TOOLS.map(t => t.name), ...moduleTools.map(t => t.fullName)]\n const suggestions = findClosestTools(name, allNames)\n const hint = suggestions.length > 0\n ? ` Did you mean: ${suggestions.join(', ')}?`\n : ''\n throw new Error(`Unknown tool: ${name}.${hint}`)\n}\n\n// --- Tool name suggestion ---\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length\n const dp: number[] = Array.from({ length: n + 1 }, (_, i) => i)\n for (let i = 1; i <= m; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= n; j++) {\n const tmp = dp[j]\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1])\n prev = tmp\n }\n }\n return dp[n]\n}\n\nexport function findClosestTools(name: string, allNames: string[]): string[] {\n const threshold = Math.max(3, Math.floor(name.length * 0.35))\n const scored = allNames\n .map(t => ({ name: t, dist: levenshtein(name.toLowerCase(), t.toLowerCase()) }))\n .filter(s => s.dist <= threshold)\n .sort((a, b) => a.dist - b.dist)\n return scored.slice(0, 2).map(s => s.name)\n}\n\n// --- Shared initialization ---\n\nasync function initStorage(): Promise<void> {\n storage = detectStorage()\n if (storage.mode === 'core') {\n const result = initCore(storage.basePath)\n isFirstRun = result.isFirstRun\n }\n loadConfig(storage.basePath, storage.mode)\n if (storage.mode === 'full') {\n discoveredModules = discoverModules(storage)\n moduleTools = await loadModuleTools(discoveredModules, storage)\n datacortexBridge = new DatacortexBridge(storage.basePath)\n }\n}\n\n// --- Transport entry points ---\n\nexport async function runStdio(): Promise<void> {\n await initStorage()\n\n checkForUpdate().then(v => { updateAvailable = v })\n // Check daily — MCP servers can run for months\n const updateInterval = setInterval(() => {\n checkForUpdate().then(v => { updateAvailable = v })\n }, 24 * 3600_000)\n updateInterval.unref()\n\n const server = createServer()\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n server.onclose = () => {\n clearInterval(updateInterval)\n }\n}\n\nexport async function runHttp(): Promise<void> {\n const { createServer: createHttpServer } = await import('http')\n const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js')\n\n await initStorage()\n checkForUpdate().then(v => { updateAvailable = v })\n\n const port = parseInt(process.env.DATACORE_HTTP_PORT ?? '3100', 10)\n const host = process.env.DATACORE_HTTP_HOST ?? '127.0.0.1'\n const server = createServer()\n\n const httpServer = createHttpServer(async (req, res) => {\n if (req.method === 'POST' && req.url === '/mcp') {\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined })\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } else if (req.method === 'GET' && req.url === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'ok', version: currentVersion }))\n } else {\n res.writeHead(404)\n res.end('Not Found')\n }\n })\n\n httpServer.listen(port, host, () => {\n console.log(`Datacore MCP server listening on http://${host}:${port}/mcp`)\n })\n}\n\n// Export for testing\nexport { moduleTools as _moduleTools }\n","// src/storage.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\nexport type StorageMode = 'full' | 'core'\n\nexport interface StorageConfig {\n mode: StorageMode\n basePath: string\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n}\n\nexport function detectStorage(): StorageConfig {\n // 1. Explicit DATACORE_PATH (full installation)\n const dcPath = process.env.DATACORE_PATH\n if (dcPath && fs.existsSync(path.join(dcPath, '.datacore'))) {\n return fullConfig(dcPath)\n }\n\n // 2. Explicit core path (env var overrides auto-detection)\n const corePath = process.env.DATACORE_CORE_PATH\n if (corePath && fs.existsSync(corePath)) {\n return coreConfig(corePath)\n }\n\n // 3. Default full installation at ~/Data\n const defaultFull = path.join(os.homedir(), 'Data')\n if (fs.existsSync(path.join(defaultFull, '.datacore'))) {\n return fullConfig(defaultFull)\n }\n\n // 4. Default core mode at ~/Datacore\n return coreConfig(path.join(os.homedir(), 'Datacore'))\n}\n\nfunction fullConfig(basePath: string): StorageConfig {\n return {\n mode: 'full',\n basePath,\n engramsPath: path.join(basePath, '.datacore', 'learning', 'engrams.yaml'),\n journalPath: path.join(basePath, '0-personal', 'journal'),\n knowledgePath: path.join(basePath, '0-personal', '3-knowledge'),\n packsPath: path.join(basePath, '.datacore', 'learning', 'packs'),\n }\n}\n\nfunction coreConfig(basePath: string): StorageConfig {\n return {\n mode: 'core',\n basePath,\n engramsPath: path.join(basePath, 'engrams.yaml'),\n journalPath: path.join(basePath, 'journal'),\n knowledgePath: path.join(basePath, 'knowledge'),\n packsPath: path.join(basePath, 'packs'),\n }\n}\n\nexport function initCore(basePath: string): { isFirstRun: boolean } {\n const isFirstRun = !fs.existsSync(path.join(basePath, 'engrams.yaml'))\n for (const dir of ['journal', 'knowledge', 'packs']) {\n const dirPath = path.join(basePath, dir)\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true })\n }\n }\n\n const engramsPath = path.join(basePath, 'engrams.yaml')\n if (!fs.existsSync(engramsPath)) {\n fs.writeFileSync(engramsPath, 'engrams: []\\n')\n }\n\n const configPath = path.join(basePath, 'config.yaml')\n if (!fs.existsSync(configPath)) {\n fs.writeFileSync(configPath, '# Datacore MCP configuration\\nversion: 2\\n# engrams:\\n# auto_promote: false\\n# packs:\\n# trusted_publishers: []\\n# search:\\n# max_results: 20\\n# snippet_length: 500\\n# hints:\\n# enabled: true\\n')\n }\n\n generateContextFiles(basePath)\n copyStarterPacks(basePath)\n return { isFirstRun }\n}\n\n// Generate editor context files so any AI assistant immediately understands Datacore.\n// Files are only written if they don't exist — user edits are never overwritten.\nfunction generateContextFiles(basePath: string): void {\n const files: Array<{ rel: string; content: string }> = [\n { rel: 'CLAUDE.md', content: CONTEXT_CLAUDE },\n { rel: 'AGENTS.md', content: CONTEXT_AGENTS },\n { rel: '.cursorrules', content: CONTEXT_CURSORRULES },\n { rel: '.github/copilot-instructions.md', content: CONTEXT_COPILOT },\n ]\n for (const { rel, content } of files) {\n const filePath = path.join(basePath, rel)\n if (!fs.existsSync(filePath)) {\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n fs.writeFileSync(filePath, content)\n }\n }\n}\n\n// Shared guide content used across all context files\nconst DATACORE_GUIDE = `Datacore gives AI assistants persistent memory through **engrams** — typed knowledge units\nthat get injected into context when relevant.\n\n## Session Workflow\n\n1. **datacore.session.start** — Call this first. Gets relevant engrams + today's journal.\n2. Work on the task. Use **datacore.recall** to search everything.\n3. **datacore.feedback** — Rate which injected engrams were helpful.\n4. **datacore.session.end** — Capture summary + suggest new engrams.\n\n## Key Tools\n\n| Tool | Purpose |\n|------|---------|\n| session.start | Start here. Begin session with context injection. |\n| session.end | End session, capture journal + new engrams. |\n| learn | Record a reusable insight (creates candidate engram). |\n| promote | Activate candidate engrams. |\n| inject | Get relevant engrams for a specific task. |\n| recall | Search all sources (engrams + journal + knowledge). |\n| capture | Write a journal entry or knowledge note. |\n| search | Search journal and knowledge files. |\n| ingest | Import text and extract engram suggestions. |\n| feedback | Rate engrams: positive/negative/neutral. |\n| forget | Retire an engram permanently. |\n| status | System health + recommendations. |\n| packs.discover | Browse available engram packs. |\n| packs.install | Install a pack. |\n| packs.export | Export your engrams as a pack. |\n\n## Engram Lifecycle\n\nlearn → candidate → promote → active → inject → feedback → stronger/weaker → forget (retire)\n\n- **candidate**: Created but not yet active. Won't appear in inject results.\n- **active**: Appears in inject results when relevant to the task.\n- **retired**: Permanently removed from injection.\n\nPositive feedback strengthens retrieval. Unused engrams naturally decay over time.\n\n## Data Storage\n\nAll data is in this directory as plain text files:\n- \\`engrams.yaml\\` — Your learned knowledge\n- \\`journal/\\` — Daily session logs (YYYY-MM-DD.md)\n- \\`knowledge/\\` — Ingested reference material\n- \\`packs/\\` — Installed engram packs\n- \\`config.yaml\\` — Configuration (all fields optional)\n`\n\nconst CONTEXT_CLAUDE = `# Datacore\n\nThis is a Datacore installation — persistent memory for AI assistants.\n\n${DATACORE_GUIDE}\n\n## MCP Tools\n\nAll tools are prefixed with \\`datacore.\\` (e.g., \\`datacore.session.start\\`).\nCall \\`datacore.session.start\\` at the beginning of every conversation.\n`\n\nconst CONTEXT_AGENTS = `# AGENTS.md\n\nThis directory is managed by [Datacore](https://github.com/datacore-one/mcp) — persistent memory for AI assistants.\n\n${DATACORE_GUIDE}\n\n## For AI Agents\n\nAll tools are available via MCP under the \\`datacore.\\` namespace.\nStart every session by calling \\`datacore.session.start\\`.\n`\n\nconst CONTEXT_CURSORRULES = `# Datacore\n\nThis directory is managed by Datacore — persistent memory for AI assistants.\nAll tools are available via MCP under the \\`datacore.\\` namespace.\n\n${DATACORE_GUIDE}`\n\nconst CONTEXT_COPILOT = `# Datacore\n\nThis directory is managed by [Datacore](https://github.com/datacore-one/mcp) — persistent memory for AI assistants.\n\n${DATACORE_GUIDE}\n\n## MCP Integration\n\nAll tools are available via MCP under the \\`datacore.\\` namespace.\nStart every session by calling \\`datacore.session.start\\`.\n`\n\nfunction copyStarterPacks(basePath: string): void {\n const packsDir = path.join(basePath, 'packs')\n const bundledPacksDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs'\n )\n\n if (!fs.existsSync(bundledPacksDir)) return\n\n for (const entry of fs.readdirSync(bundledPacksDir)) {\n const src = path.join(bundledPacksDir, entry)\n const dest = path.join(packsDir, entry)\n if (!fs.existsSync(dest) && fs.statSync(src).isDirectory()) {\n fs.cpSync(src, dest, { recursive: true })\n }\n }\n}\n","// src/config.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\n\nexport const ConfigSchema = z.object({\n version: z.number().default(2),\n engrams: z.object({\n auto_promote: z.boolean().default(false),\n }).default({}),\n packs: z.object({\n trusted_publishers: z.array(z.string()).default([]),\n }).default({}),\n search: z.object({\n max_results: z.number().default(20),\n snippet_length: z.number().default(500),\n }).default({}),\n hints: z.object({\n enabled: z.boolean().default(true),\n }).default({}),\n})\n\nexport type DatacoreConfig = z.infer<typeof ConfigSchema>\n\nlet cachedConfig: DatacoreConfig | null = null\n\nexport function loadConfig(basePath: string, mode: 'full' | 'core'): DatacoreConfig {\n const configPath = mode === 'full'\n ? path.join(basePath, '.datacore', 'config.yaml')\n : path.join(basePath, 'config.yaml')\n\n let raw: unknown = {}\n if (fs.existsSync(configPath)) {\n try {\n raw = yaml.load(fs.readFileSync(configPath, 'utf8')) ?? {}\n } catch {\n // Invalid YAML — use defaults\n raw = {}\n }\n }\n\n cachedConfig = ConfigSchema.parse(raw)\n return cachedConfig\n}\n\nexport function getConfig(): DatacoreConfig {\n if (!cachedConfig) return ConfigSchema.parse({})\n return cachedConfig\n}\n\nexport function resetConfigCache(): void {\n cachedConfig = null\n}\n","{\n \"name\": \"@datacore-one/mcp\",\n \"version\": \"1.1.1\",\n \"description\": \"Datacore MCP server — The Software of You\",\n \"type\": \"module\",\n \"bin\": {\n \"datacore-mcp\": \"dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"start\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"js-yaml\": \"^4.1.0\",\n \"zod\": \"^3.23.0\",\n \"zod-to-json-schema\": \"^3.25.1\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.0.0\"\n },\n \"files\": [\n \"dist\",\n \"packs\"\n ],\n \"keywords\": [\n \"mcp\",\n \"datacore\",\n \"knowledge\",\n \"learning\",\n \"engrams\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Fair Data Society\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/datacore-one/mcp.git\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","// src/version.ts\nimport pkg from '../package.json'\n\nexport const currentVersion: string = pkg.version\n\nexport async function checkForUpdate(): Promise<string | null> {\n try {\n const res = await fetch('https://registry.npmjs.org/@datacore-one/mcp/latest', {\n signal: AbortSignal.timeout(3000),\n })\n if (!res.ok) return null\n const data = await res.json() as { version: string }\n if (data.version !== currentVersion) return data.version\n return null\n } catch {\n return null\n }\n}\n","// src/tools/index.ts\nimport { z } from 'zod'\n\nexport const TOOLS = [\n {\n name: 'datacore.capture',\n description: 'Capture a journal entry or knowledge note',\n inputSchema: z.object({\n type: z.enum(['journal', 'knowledge']),\n content: z.string().describe('Content to capture'),\n title: z.string().optional().describe('Title for knowledge notes'),\n tags: z.array(z.string()).optional().describe('Tags to attach'),\n }),\n },\n {\n name: 'datacore.learn',\n description: 'Create an engram from a statement — record a reusable learning',\n inputSchema: z.object({\n statement: z.string().describe('The knowledge assertion'),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']).optional(),\n scope: z.string().optional().describe('Scope: global | agent:X | command:X'),\n tags: z.array(z.string()).optional(),\n domain: z.string().optional().describe('Dot-notation domain: software.architecture'),\n visibility: z.enum(['private', 'public', 'template']).optional(),\n }),\n },\n {\n name: 'datacore.inject',\n description: 'Get relevant engrams for a task — returns directives and considerations',\n inputSchema: z.object({\n prompt: z.string().describe('The task or question to match against'),\n scope: z.string().optional().describe('Filter by scope: global | agent:X | module:X | command:X'),\n max_tokens: z.number().optional().describe('Token budget (default: 8000)'),\n min_relevance: z.number().optional().describe('Minimum score threshold (default: 0.3)'),\n }),\n },\n {\n name: 'datacore.search',\n description: 'Search journal entries and knowledge notes by keyword',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n scope: z.enum(['journal', 'knowledge', 'all']).optional(),\n method: z.enum(['keyword', 'semantic']).optional().describe('Search method (default: keyword)'),\n limit: z.number().optional().describe('Max results (default: 20)'),\n }),\n },\n {\n name: 'datacore.ingest',\n description: 'Ingest text content as a knowledge note, optionally extract engram suggestions',\n inputSchema: z.object({\n content: z.string().describe('Content to ingest'),\n title: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n },\n {\n name: 'datacore.status',\n description: 'Show Datacore status: engram/pack/note counts, scaling hints, update info',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.packs.discover',\n description: 'Browse available engram packs from the registry',\n inputSchema: z.object({\n query: z.string().optional().describe('Filter by name/description'),\n tags: z.array(z.string()).optional().describe('Filter by tags'),\n }),\n },\n {\n name: 'datacore.packs.install',\n description: 'Install or upgrade an engram pack',\n inputSchema: z.object({\n source: z.string().describe('Pack source: local path or pack ID from registry'),\n }),\n },\n {\n name: 'datacore.forget',\n description: 'Retire an engram by ID or search term — marks it as retired so it is no longer injected',\n inputSchema: z.object({\n id: z.string().optional().describe('Exact engram ID to retire (e.g., ENG-2026-0219-001)'),\n search: z.string().optional().describe('Search term to find engram by statement, tag, or ID fragment'),\n }),\n },\n {\n name: 'datacore.feedback',\n description: 'Signal whether an injected engram was helpful (positive), unhelpful (negative), or seen but not acted on (neutral). Supports single or batch mode.',\n inputSchema: z.object({\n engram_id: z.string().optional().describe('The engram ID to provide feedback on (single mode)'),\n signal: z.enum(['positive', 'negative', 'neutral']).optional().describe('Feedback signal (single mode)'),\n signals: z.array(z.object({\n engram_id: z.string().describe('Engram ID'),\n signal: z.enum(['positive', 'negative', 'neutral']).describe('Feedback signal'),\n })).optional().describe('Batch feedback signals'),\n comment: z.string().optional().describe('Optional comment about why'),\n }).refine(data => (data.engram_id && data.signal) || (data.signals && data.signals.length > 0), {\n message: 'Either (engram_id + signal) or signals array required',\n }),\n },\n {\n name: 'datacore.packs.export',\n description: 'Export personal engrams as a shareable pack. Preview by default, set confirm=true to write.',\n inputSchema: z.object({\n name: z.string().describe('Pack name'),\n description: z.string().describe('Pack description'),\n engram_ids: z.array(z.string()).optional().describe('Specific engram IDs to export'),\n filter_tags: z.array(z.string()).optional().describe('Filter by tags'),\n filter_domain: z.string().optional().describe('Filter by domain prefix'),\n confirm: z.boolean().optional().describe('Set true to write pack (default: preview only)'),\n }),\n },\n {\n name: 'datacore.session.start',\n description: 'Start here. Call this at the beginning of every session to get relevant context, today\\'s journal, and a guide to all available tools.',\n inputSchema: z.object({\n task: z.string().optional().describe('What you are working on (triggers engram injection)'),\n tags: z.array(z.string()).optional().describe('Tags to filter injected engrams'),\n }),\n },\n {\n name: 'datacore.session.end',\n description: 'End a session — captures journal summary and creates engrams from suggestions',\n inputSchema: z.object({\n summary: z.string().describe('Session summary for the journal'),\n tags: z.array(z.string()).optional().describe('Tags for the journal entry'),\n engram_suggestions: z.array(z.object({\n statement: z.string().describe('The knowledge assertion'),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']).optional(),\n })).optional().describe('Engrams to create from this session'),\n }),\n },\n {\n name: 'datacore.recall',\n description: 'Search all sources (engrams, journal, knowledge) for a topic — results grouped by source',\n inputSchema: z.object({\n topic: z.string().describe('What to search for'),\n sources: z.array(z.enum(['engrams', 'journal', 'knowledge'])).optional().describe('Which sources to search (default: all)'),\n limit: z.number().optional().describe('Max results per source (default: 10)'),\n }),\n },\n {\n name: 'datacore.promote',\n description: 'Activate candidate engrams so they appear in inject results',\n inputSchema: z.object({\n id: z.string().optional().describe('Single engram ID to promote'),\n ids: z.array(z.string()).optional().describe('Multiple engram IDs to promote'),\n }).refine(data => data.id || (data.ids && data.ids.length > 0), {\n message: 'At least one engram ID required (id or ids)',\n }),\n },\n {\n name: 'datacore.modules.list',\n description: 'List installed modules with scope, version, and capability counts',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.modules.info',\n description: 'Get detailed info about a specific module: manifest, tools, skills, agents, engrams',\n inputSchema: z.object({\n module: z.string().describe('Module name (e.g., \"gtd\", \"slides\", \"crm\")'),\n }),\n },\n {\n name: 'datacore.modules.health',\n description: 'Check module health: missing files, env vars, data separation issues',\n inputSchema: z.object({\n module: z.string().optional().describe('Module name (omit for all modules)'),\n }),\n },\n] as const\n","// src/tools/capture.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { StorageConfig } from '../storage.js'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface CaptureArgs {\n type: 'journal' | 'knowledge'\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface CaptureResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport async function handleCapture(args: CaptureArgs, storage: StorageConfig): Promise<CaptureResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n if (args.type === 'journal') {\n return captureJournal(args.content, storage.journalPath)\n }\n return captureKnowledge(args.content, args.title, args.tags, storage.knowledgePath)\n}\n\nexport function localDate(tz?: string): { date: string; time: string } {\n const timezone = tz || process.env.DATACORE_TIMEZONE || undefined\n const now = new Date()\n const dateStr = now.toLocaleDateString('en-CA', { timeZone: timezone }) // en-CA gives YYYY-MM-DD\n const timeStr = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: timezone })\n return { date: dateStr, time: timeStr }\n}\n\nfunction captureJournal(content: string, journalDir: string): CaptureResult {\n const { date: today, time } = localDate()\n const filePath = path.join(journalDir, `${today}.md`)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n if (fs.existsSync(filePath)) {\n const existing = fs.readFileSync(filePath, 'utf8')\n fs.writeFileSync(filePath, `${existing}\\n## ${time}\\n\\n${content}\\n`)\n } else {\n fs.writeFileSync(filePath, `# ${today}\\n\\n## ${time}\\n\\n${content}\\n`)\n }\n\n return { success: true, path: filePath }\n}\n\nfunction captureKnowledge(content: string, title: string | undefined, tags: string[] | undefined, knowledgeDir: string): CaptureResult {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (title ?? 'note').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(knowledgeDir, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${title ?? 'Untitled'}\"\\ncreated: \"${new Date().toISOString()}\"\\n---\\n\\n`\n const tagLine = tags?.length ? `\\n${tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${content}\\n${tagLine}`)\n\n return { success: true, path: filePath }\n}\n","// src/limits.ts\nexport const MAX_CONTENT_SIZE = 1_000_000 // 1MB\nexport const MAX_TITLE_LENGTH = 200\n\nexport function validateContent(content: string): string | null {\n if (content.length > MAX_CONTENT_SIZE) {\n return `Content too large: ${content.length} characters (max: ${MAX_CONTENT_SIZE})`\n }\n return null\n}\n\nexport function validateTitle(title: string): string | null {\n if (title.length > MAX_TITLE_LENGTH) {\n return `Title too long: ${title.length} characters (max: ${MAX_TITLE_LENGTH})`\n }\n return null\n}\n","// src/engrams.ts\nimport * as fs from 'fs'\nimport * as yaml from 'js-yaml'\nimport { EngramSchema, PackManifestSchema, type Engram, type PackManifest } from './schemas/engram.js'\nimport { logger } from './logger.js'\n\nexport function loadEngrams(filePath: string): Engram[] {\n if (!fs.existsSync(filePath)) return []\n\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n if (!raw?.engrams || !Array.isArray(raw.engrams)) return []\n\n const valid: Engram[] = []\n let skipped = 0\n for (const entry of raw.engrams) {\n const result = EngramSchema.safeParse(entry)\n if (result.success) {\n valid.push(result.data)\n } else {\n skipped++\n }\n }\n if (skipped > 0) {\n logger.warning(`Skipped ${skipped} invalid engram(s) in ${filePath}`)\n }\n return valid\n } catch (err) {\n logger.error(`Failed to parse engrams file ${filePath}: ${err}`)\n return []\n }\n}\n\nexport function saveEngrams(filePath: string, engrams: Engram[]): void {\n const content = yaml.dump({ engrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n fs.writeFileSync(filePath, content)\n}\n\nexport interface LoadedPack {\n manifest: PackManifest\n engrams: Engram[]\n}\n\nfunction parseSkillMdFrontmatter(filePath: string): Record<string, any> {\n const content = fs.readFileSync(filePath, 'utf8')\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!match) throw new Error(`No frontmatter found in ${filePath}`)\n try {\n return yaml.load(match[1]) as Record<string, any>\n } catch (err) {\n throw new Error(`Failed to parse YAML frontmatter in ${filePath}: ${err}`)\n }\n}\n\nexport function loadPack(packDir: string): LoadedPack {\n const skillMdPath = `${packDir}/SKILL.md`\n const engramsPath = `${packDir}/engrams.yaml`\n\n const rawManifest = parseSkillMdFrontmatter(skillMdPath)\n const manifest = PackManifestSchema.parse(rawManifest)\n const engrams = loadEngrams(engramsPath)\n\n return { manifest, engrams }\n}\n\nexport function loadAllPacks(packsDir: string): LoadedPack[] {\n if (!fs.existsSync(packsDir)) return []\n\n const packs: LoadedPack[] = []\n for (const entry of fs.readdirSync(packsDir)) {\n const packDir = `${packsDir}/${entry}`\n if (!fs.statSync(packDir).isDirectory()) continue\n if (!fs.existsSync(`${packDir}/SKILL.md`)) continue\n\n try {\n packs.push(loadPack(packDir))\n } catch (err) {\n logger.warning(`Failed to load pack ${entry}: ${err}`)\n }\n }\n return packs\n}\n","// src/schemas/engram.ts\nimport { z } from 'zod'\n\nexport const ActivationSchema = z.object({\n retrieval_strength: z.number().min(0).max(1),\n storage_strength: z.number().min(0).max(1),\n frequency: z.number().int().min(0),\n last_accessed: z.string(),\n})\n\nexport const KnowledgeTypeSchema = z.object({\n memory_class: z.enum(['semantic', 'episodic', 'procedural', 'metacognitive']),\n cognitive_level: z.enum(['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']),\n})\n\nexport const RelationsSchema = z.object({\n broader: z.array(z.string()).default([]),\n narrower: z.array(z.string()).default([]),\n related: z.array(z.string()).default([]),\n conflicts: z.array(z.string()).default([]),\n})\n\nexport const ProvenanceSchema = z.object({\n origin: z.string(),\n chain: z.array(z.string()).default([]),\n signature: z.string().nullable().default(null),\n license: z.string().default('cc-by-sa-4.0'),\n})\n\nexport const FeedbackSignalsSchema = z.object({\n positive: z.number().int().default(0),\n negative: z.number().int().default(0),\n neutral: z.number().int().default(0),\n})\n\nexport const EngramSchema = z.object({\n id: z.string().regex(/^ENG-[A-Za-z0-9-]+$/),\n version: z.number().int().min(1),\n status: z.enum(['active', 'dormant', 'retired', 'candidate']),\n consolidated: z.boolean().default(false),\n\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n scope: z.string(),\n visibility: z.enum(['private', 'public', 'template']).default('private'),\n statement: z.string().min(1),\n rationale: z.string().optional(),\n contraindications: z.array(z.string()).optional(),\n source_patterns: z.array(z.string()).optional(),\n derivation_count: z.number().int().min(0).default(1),\n\n knowledge_type: KnowledgeTypeSchema.optional(),\n domain: z.string().optional(),\n relations: RelationsSchema.optional(),\n activation: ActivationSchema,\n provenance: ProvenanceSchema.optional(),\n feedback_signals: FeedbackSignalsSchema.optional(),\n tags: z.array(z.string()).default([]),\n pack: z.string().nullable().default(null),\n abstract: z.string().nullable().default(null),\n derived_from: z.string().nullable().default(null),\n})\n\nexport type Engram = z.infer<typeof EngramSchema>\n\n// Pack manifest matches SKILL.md frontmatter structure\nexport const DatacoreExtensionSchema = z.object({\n id: z.string(),\n injection_policy: z.enum(['on_match', 'on_request']),\n match_terms: z.array(z.string()).default([]),\n domain: z.string().optional(),\n engram_count: z.number().int().min(0),\n})\n\nexport const PackManifestSchema = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n creator: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).default([]),\n 'x-datacore': DatacoreExtensionSchema,\n})\n\nexport type PackManifest = z.infer<typeof PackManifestSchema>\n","// src/logger.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error'\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warning: 2,\n error: 3,\n}\n\nconst MAX_MESSAGE_LENGTH = 4096\n\nclass Logger {\n private server: Server | null = null\n private minLevel: LogLevel\n\n constructor() {\n const envLevel = process.env.DATACORE_LOG_LEVEL?.toLowerCase()\n this.minLevel = envLevel && envLevel in LEVEL_ORDER\n ? envLevel as LogLevel\n : 'warning'\n }\n\n setServer(server: Server): void {\n this.server = server\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevel]\n }\n\n private truncate(msg: string): string {\n if (msg.length <= MAX_MESSAGE_LENGTH) return msg\n return msg.slice(0, MAX_MESSAGE_LENGTH - 3) + '...'\n }\n\n private emit(level: LogLevel, message: string): void {\n if (!this.shouldLog(level)) return\n const truncated = this.truncate(message)\n\n // Always write to stderr for debug traces\n process.stderr.write(`[datacore:${level}] ${truncated}\\n`)\n\n // Send MCP notification for warning+ if server connected\n if (this.server && LEVEL_ORDER[level] >= LEVEL_ORDER['warning']) {\n try {\n this.server.sendLoggingMessage({ level, data: truncated })\n } catch {\n // Server not connected or notification failed — ignore\n }\n }\n }\n\n debug(message: string): void { this.emit('debug', message) }\n info(message: string): void { this.emit('info', message) }\n warning(message: string): void { this.emit('warning', message) }\n error(message: string): void { this.emit('error', message) }\n}\n\nexport const logger = new Logger()\n","// src/hints.ts\nimport { getConfig } from './config.js'\n\nexport interface ToolHints {\n next?: string\n related?: string[]\n warning?: string\n}\n\nexport function buildHints(hints: ToolHints): ToolHints | undefined {\n if (!getConfig().hints.enabled) return undefined\n if (!hints.next && !hints.related?.length && !hints.warning) return undefined\n return hints\n}\n","// src/tools/learn.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport { getConfig } from '../config.js'\nimport { buildHints } from '../hints.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface LearnArgs {\n statement: string\n type?: 'behavioral' | 'terminological' | 'procedural' | 'architectural'\n scope?: string\n tags?: string[]\n domain?: string\n rationale?: string\n visibility?: 'private' | 'public' | 'template'\n}\n\ninterface LearnResult {\n success: boolean\n engram: Engram\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport function generateEngramId(existingEngrams: Engram[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `ENG-${date.slice(0, 4)}-${date.slice(4)}-`\n\n // Find highest seq for today\n let maxSeq = 0\n for (const e of existingEngrams) {\n if (e.id.startsWith(prefix)) {\n const seq = parseInt(e.id.slice(prefix.length), 10)\n if (seq > maxSeq) maxSeq = seq\n }\n }\n\n const nextSeq = maxSeq + 1\n const padWidth = nextSeq > 999 ? String(nextSeq).length : 3\n return `${prefix}${String(nextSeq).padStart(padWidth, '0')}`\n}\n\nexport async function handleLearn(args: LearnArgs, engramsPath: string): Promise<LearnResult> {\n const engrams = loadEngrams(engramsPath)\n const today = new Date().toISOString().split('T')[0]\n const autoPromote = getConfig().engrams.auto_promote\n\n const engram: Engram = {\n id: generateEngramId(engrams),\n version: 2,\n status: autoPromote ? 'active' : 'candidate',\n consolidated: false,\n type: args.type ?? 'behavioral',\n scope: args.scope ?? 'global',\n visibility: args.visibility ?? 'private',\n statement: args.statement,\n rationale: args.rationale,\n derivation_count: 1,\n domain: args.domain,\n tags: args.tags ?? [],\n activation: {\n retrieval_strength: autoPromote ? 0.7 : 0.5,\n storage_strength: autoPromote ? 1.0 : 0.3,\n frequency: 0,\n last_accessed: today,\n },\n pack: null,\n abstract: null,\n derived_from: null,\n }\n\n engrams.push(engram)\n saveEngrams(engramsPath, engrams)\n\n const statusLabel = autoPromote ? 'active' : 'candidate'\n const hints = autoPromote\n ? buildHints({\n next: 'Created as active (auto_promote on). Use datacore.inject to retrieve.',\n related: ['datacore.inject'],\n warning: 'Auto-promotion enabled. Engrams are immediately active without review.',\n })\n : buildHints({\n next: 'Created as candidate. Use datacore.promote to activate.',\n related: ['datacore.promote', 'datacore.inject'],\n })\n\n return { success: true, engram, _hints: hints }\n}\n","// src/tools/inject-tool.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams, loadAllPacks } from '../engrams.js'\nimport { selectEngrams, type InjectionContext } from '../inject.js'\nimport { buildHints } from '../hints.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface InjectArgs {\n prompt: string\n scope?: string\n max_tokens?: number\n min_relevance?: number\n}\n\ninterface InjectResult {\n text: string\n count: number\n tokens_used: number\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleInject(\n args: InjectArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<InjectResult> {\n const personalEngrams = loadEngrams(paths.engramsPath)\n const packs = loadAllPacks(paths.packsPath)\n\n const ctx: InjectionContext = {\n prompt: args.prompt,\n scope: args.scope,\n maxTokens: args.max_tokens,\n minRelevance: args.min_relevance,\n }\n\n const result = selectEngrams(ctx, personalEngrams, packs)\n const totalCount = result.directives.length + result.consider.length\n\n if (totalCount === 0) {\n return {\n text: '', count: 0, tokens_used: 0,\n _hints: buildHints({\n next: 'No engrams matched this task. Use datacore.recall to search all sources, or datacore.learn to record new knowledge.',\n related: ['datacore.recall', 'datacore.learn'],\n }),\n }\n }\n\n const lines: string[] = []\n if (result.directives.length > 0) {\n lines.push('## DIRECTIVES\\n')\n for (const e of result.directives) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n if (result.consider.length > 0) {\n lines.push('\\n## ALSO CONSIDER\\n')\n for (const e of result.consider) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n\n // Update usage tracking for selected personal engrams\n updateUsageTracking(\n paths.engramsPath,\n personalEngrams,\n [...result.directives, ...result.consider],\n )\n\n const injectedIds = [...result.directives, ...result.consider]\n .filter(e => !e.pack)\n .map(e => e.id)\n\n const idsList = injectedIds.length > 0 ? ` Injected IDs: ${injectedIds.join(', ')}` : ''\n\n return {\n text: lines.join('\\n'),\n count: totalCount,\n tokens_used: result.tokens_used,\n _hints: buildHints({\n next: `After task, call datacore.feedback on helpful/unhelpful engrams.${idsList}`,\n related: ['datacore.feedback', 'datacore.session.end'],\n }),\n }\n}\n\nfunction updateUsageTracking(\n engramsPath: string,\n allPersonal: Engram[],\n selected: Engram[],\n): void {\n const selectedPersonalIds = new Set(\n selected.filter(e => !e.pack).map(e => e.id),\n )\n if (selectedPersonalIds.size === 0) return\n\n const today = new Date().toISOString().split('T')[0]\n let changed = false\n\n for (const engram of allPersonal) {\n if (selectedPersonalIds.has(engram.id)) {\n engram.activation.last_accessed = today\n engram.activation.frequency += 1\n changed = true\n }\n }\n\n if (changed) {\n atomicWriteYaml(engramsPath, { engrams: allPersonal })\n }\n}\n\nexport function atomicWriteYaml(filePath: string, data: unknown): void {\n const content = yaml.dump(data, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nfunction formatEngram(engram: Engram, totalCount: number): string {\n if (totalCount < 10) {\n let text = `- **${engram.statement}**`\n if (engram.rationale) text += `\\n _${engram.rationale}_`\n if (engram.contraindications?.length) {\n text += `\\n Except: ${engram.contraindications.join(', ')}`\n }\n return text\n }\n if (totalCount < 30) {\n const source = engram.pack ? ` [${engram.pack}]` : ''\n return `- ${engram.statement}${source}`\n }\n return `- ${engram.statement}`\n}\n","// src/decay.ts\n\nconst DECAY_RATE = 0.05\nconst FLOOR = 0.05\nconst MS_PER_DAY = 86_400_000\n\nexport type EngramState = 'active' | 'fading' | 'dormant' | 'retirement_candidate'\n\n/**\n * Compute decayed retrieval strength using exponential decay.\n * Floor of 0.05 prevents permanent extinction.\n */\nexport function decayedStrength(\n retrievalStrength: number,\n lastAccessed: string,\n now?: Date,\n): number {\n const last = new Date(lastAccessed)\n const current = now ?? new Date()\n const days = Math.max(0, (current.getTime() - last.getTime()) / MS_PER_DAY)\n return Math.max(retrievalStrength * Math.exp(-DECAY_RATE * days), FLOOR)\n}\n\n/**\n * Classify engram state based on current retrieval strength.\n */\nexport function engramState(retrievalStrength: number): EngramState {\n if (retrievalStrength >= 0.5) return 'active'\n if (retrievalStrength >= 0.3) return 'fading'\n if (retrievalStrength >= 0.1) return 'dormant'\n return 'retirement_candidate'\n}\n","// src/inject.ts\nimport type { Engram } from './schemas/engram.js'\nimport type { LoadedPack } from './engrams.js'\nimport { decayedStrength } from './decay.js'\n\nexport interface InjectionContext {\n prompt: string\n scope?: string\n maxTokens?: number // Default: 8000 (~10% of 80K context)\n minRelevance?: number // Default: 0.3\n}\n\nexport interface InjectionResult {\n directives: Engram[]\n consider: Engram[]\n tokens_used: number\n}\n\ninterface ScoredEngram {\n engram: Engram\n score: number\n}\n\nconst DEFAULT_MAX_TOKENS = 8000\nconst DEFAULT_MIN_RELEVANCE = 0.3\nconst TOKENS_PER_ENGRAM = 40 // Compact format estimate\nconst MAX_PER_PACK = 5\nconst MAX_PER_DOMAIN = 10\n\nexport function selectEngrams(\n ctx: InjectionContext,\n personalEngrams: Engram[],\n packs: LoadedPack[],\n): InjectionResult {\n const promptLower = ctx.prompt.toLowerCase()\n const promptWords = new Set(promptLower.split(/\\W+/).filter(w => w.length > 2))\n const scored: ScoredEngram[] = []\n\n for (const engram of personalEngrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, [], ctx.scope, false)\n if (score > 0) scored.push({ engram, score })\n }\n\n for (const pack of packs) {\n if (pack.manifest['x-datacore'].injection_policy === 'on_request') continue\n const matchTerms = pack.manifest['x-datacore'].match_terms\n for (const engram of pack.engrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, matchTerms, ctx.scope, true)\n if (score > 0) scored.push({ engram, score })\n }\n }\n\n const maxTokens = ctx.maxTokens ?? DEFAULT_MAX_TOKENS\n const minRelevance = ctx.minRelevance ?? DEFAULT_MIN_RELEVANCE\n\n // Filter by minimum relevance\n const passing = scored.filter(s => s.score >= minRelevance)\n passing.sort((a, b) => b.score - a.score)\n\n // Fill token budget with diversity constraints\n const selected = fillTokenBudget(passing, maxTokens)\n\n // Split: top 2/3 = directives, bottom 1/3 = consider\n const splitPoint = Math.ceil(selected.length * 2 / 3)\n return {\n directives: selected.slice(0, splitPoint),\n consider: selected.slice(splitPoint),\n tokens_used: selected.length * TOKENS_PER_ENGRAM,\n }\n}\n\nfunction scoreEngram(engram: Engram, promptLower: string, promptWords: Set<string>, packMatchTerms: string[], scopeFilter: string | undefined, isPack: boolean): number {\n // Scope filtering: if scope is specified, only include matching engrams\n if (scopeFilter) {\n if (scopeFilter === 'global') {\n if (engram.scope !== 'global') return 0\n } else if (!engram.scope.startsWith(scopeFilter) && engram.scope !== 'global') {\n return 0\n }\n }\n\n let termHits = 0\n\n // Pack match terms (highest weight — curated relevance signals)\n for (const term of packMatchTerms) {\n if (promptLower.includes(term.toLowerCase())) termHits++\n }\n // Tag matches\n for (const tag of engram.tags) {\n if (promptWords.has(tag.toLowerCase())) termHits++\n }\n // Domain hierarchy matches (each level counts)\n if (engram.domain) {\n for (const part of engram.domain.split(/[./]/)) {\n if (promptWords.has(part.toLowerCase())) termHits++\n }\n }\n // Statement keyword overlap — word-boundary matching (lower weight)\n const statementWords = new Set(engram.statement.toLowerCase().split(/\\W+/).filter(w => w.length > 2))\n for (const word of promptWords) {\n if (statementWords.has(word)) termHits += 0.5\n }\n\n if (termHits === 0) return 0\n\n // Base score from term hits * (decayed) retrieval strength\n // Pack engrams use raw RS (read-only, can't track usage)\n const rs = isPack\n ? engram.activation.retrieval_strength\n : decayedStrength(engram.activation.retrieval_strength, engram.activation.last_accessed)\n let score = termHits * rs\n\n // Feedback signal boost: positive feedback increases score, negative decreases\n const feedback = engram.feedback_signals\n if (feedback) {\n const netFeedback = feedback.positive - feedback.negative\n if (netFeedback > 0) score *= 1 + Math.min(netFeedback * 0.05, 0.3)\n else if (netFeedback < 0) score *= Math.max(1 + netFeedback * 0.1, 0.5)\n }\n\n // Consolidated engrams get a slight boost (survived reconsolidation)\n if (engram.consolidated) score *= 1.1\n\n return score\n}\n\nfunction fillTokenBudget(scored: ScoredEngram[], maxTokens: number): Engram[] {\n const result: Engram[] = []\n const packCounts = new Map<string, number>()\n const domainCounts = new Map<string, number>()\n let tokensUsed = 0\n\n for (const { engram } of scored) {\n if (tokensUsed + TOKENS_PER_ENGRAM > maxTokens) break\n\n const pack = engram.pack ?? '__personal__'\n const packCount = packCounts.get(pack) ?? 0\n if (packCount >= MAX_PER_PACK && pack !== '__personal__') continue\n\n const domain = engram.domain ?? '__none__'\n const topDomain = domain.split('.')[0]\n const domainCount = domainCounts.get(topDomain) ?? 0\n if (domainCount >= MAX_PER_DOMAIN) continue\n\n result.push(engram)\n tokensUsed += TOKENS_PER_ENGRAM\n packCounts.set(pack, packCount + 1)\n domainCounts.set(topDomain, domainCount + 1)\n }\n return result\n}\n","// src/tools/search.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { DatacortexBridge } from '../datacortex.js'\nimport { getConfig } from '../config.js'\n\nconst CONTENT_CACHE_MAX = 500\nconst contentCache = new Map<string, { mtime: number; content: string }>()\n\nfunction getCachedContent(filePath: string): string | null {\n const entry = contentCache.get(filePath)\n if (!entry) return null\n try {\n const stat = fs.statSync(filePath)\n if (stat.mtimeMs === entry.mtime) return entry.content\n } catch { /* file gone */ }\n contentCache.delete(filePath)\n return null\n}\n\nfunction setCachedContent(filePath: string, content: string): void {\n try {\n const mtime = fs.statSync(filePath).mtimeMs\n if (contentCache.size >= CONTENT_CACHE_MAX) {\n const firstKey = contentCache.keys().next().value\n if (firstKey) contentCache.delete(firstKey)\n }\n contentCache.set(filePath, { mtime, content })\n } catch { /* ignore */ }\n}\n\ninterface SearchArgs {\n query: string\n scope?: 'journal' | 'knowledge' | 'all'\n method?: 'keyword' | 'semantic'\n limit?: number\n}\n\ninterface SearchResultItem {\n path: string\n snippet: string\n score: number\n title?: string\n date?: string\n}\n\ninterface SearchResponse {\n results: SearchResultItem[]\n method?: string\n fallback_warning?: string\n}\n\nexport async function handleSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n bridge?: DatacortexBridge | null,\n): Promise<SearchResponse> {\n // Semantic search via Datacortex bridge\n if (args.method === 'semantic' && bridge) {\n const availability = bridge.isAvailable()\n if (availability.available) {\n const result = await bridge.search(args.query, args.limit ?? 20)\n if (!result.fallback) {\n return { results: result.results, method: 'semantic' }\n }\n }\n const keywordResults = await keywordSearch(args, paths)\n return { ...keywordResults, method: 'keyword', fallback_warning: 'Semantic search unavailable, using keyword fallback' }\n }\n\n return keywordSearch(args, paths)\n}\n\nasync function keywordSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n): Promise<SearchResponse> {\n const scope = args.scope ?? 'all'\n const limit = args.limit ?? 20\n const results: SearchResultItem[] = []\n\n if (scope === 'journal' || scope === 'all') {\n results.push(...searchDir(paths.journalPath, args.query))\n }\n if (scope === 'knowledge' || scope === 'all') {\n results.push(...searchDir(paths.knowledgePath, args.query))\n }\n\n results.sort((a, b) => b.score - a.score)\n return { results: results.slice(0, limit), method: 'keyword' }\n}\n\nfunction searchDir(dirPath: string, query: string): SearchResultItem[] {\n if (!fs.existsSync(dirPath)) return []\n const results: SearchResultItem[] = []\n const queryLower = query.toLowerCase()\n\n for (const file of walkDir(dirPath)) {\n if (!file.endsWith('.md')) continue\n const content = getCachedContent(file) ?? (() => {\n const c = fs.readFileSync(file, 'utf8')\n setCachedContent(file, c)\n return c\n })()\n const contentLower = content.toLowerCase()\n const occurrences = countOccurrences(contentLower, queryLower)\n if (occurrences === 0) continue\n\n const snippet = extractSnippet(content, query)\n const title = extractTitle(content, file)\n const date = extractDate(file)\n results.push({ path: file, snippet, score: occurrences, title, date })\n }\n return results\n}\n\nfunction walkDir(dir: string): string[] {\n const files: string[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) files.push(...walkDir(fullPath))\n else files.push(fullPath)\n }\n return files\n}\n\nfunction countOccurrences(text: string, query: string): number {\n let count = 0\n let pos = 0\n while ((pos = text.indexOf(query, pos)) !== -1) {\n count++\n pos += query.length\n }\n return count\n}\n\nfunction extractSnippet(content: string, query: string): string {\n const snippetLength = getConfig().search.snippet_length\n\n // Small files: return full content\n if (content.length < 2000) return content\n\n const idx = content.toLowerCase().indexOf(query.toLowerCase())\n if (idx === -1) return content.slice(0, snippetLength)\n const half = Math.floor(snippetLength / 2)\n const start = Math.max(0, idx - half)\n const end = Math.min(content.length, idx + query.length + half)\n return (start > 0 ? '...' : '') + content.slice(start, end) + (end < content.length ? '...' : '')\n}\n\nfunction extractTitle(content: string, filePath: string): string | undefined {\n const match = content.match(/^#\\s+(.+)$/m)\n if (match) return match[1].trim()\n return path.basename(filePath, path.extname(filePath))\n}\n\nfunction extractDate(filePath: string): string | undefined {\n const match = path.basename(filePath).match(/^(\\d{4}-\\d{2}-\\d{2})/)\n if (match) return match[1]\n return undefined\n}\n","// src/tools/ingest.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { validateContent, validateTitle } from '../limits.js'\nimport { buildHints } from '../hints.js'\n\ninterface IngestArgs {\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface IngestResult {\n success: boolean\n note_path?: string\n engram_suggestions?: string[]\n error?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleIngest(\n args: IngestArgs,\n paths: { knowledgePath: string; engramsPath: string },\n): Promise<IngestResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (args.title ?? 'ingested').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(paths.knowledgePath, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${args.title ?? 'Ingested Note'}\"\\ncreated: \"${new Date().toISOString()}\"\\ntype: ingested\\n---\\n\\n`\n const tagLine = args.tags?.length ? `\\n${args.tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${args.content}\\n${tagLine}`)\n\n const suggestions = extractEngramSuggestions(args.content)\n\n return {\n success: true,\n note_path: filePath,\n engram_suggestions: suggestions.length > 0 ? suggestions : undefined,\n _hints: suggestions.length > 0\n ? buildHints({\n next: `Call datacore.learn for each suggestion to create engrams. Example: datacore.learn({statement: '${suggestions[0]}', type: 'behavioral'})`,\n related: ['datacore.learn'],\n })\n : undefined,\n }\n}\n\nexport function extractEngramSuggestions(content: string): string[] {\n // Require sentence-start context to reduce mid-sentence false positives\n const patterns = [\n /(?:^|[.!?]\\s+)(always\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(never\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(prefer\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(avoid\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(ensure\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n ]\n\n const suggestions: string[] = []\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const suggestion = match[1].trim()\n if (suggestion.length >= 8 && suggestion.length <= 180) {\n suggestions.push(suggestion)\n }\n }\n }\n return suggestions\n}\n","// src/tools/status.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { loadEngrams } from '../engrams.js'\nimport { currentVersion } from '../version.js'\nimport { decayedStrength, engramState } from '../decay.js'\nimport { verifyPackChecksum } from '../trust.js'\nimport { localDate } from './capture.js'\nimport { buildHints } from '../hints.js'\nimport registry from '../../registry/packs.json'\n\ninterface StatusPaths {\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n mode: string\n basePath: string\n}\n\ninterface StatusResult {\n version: string\n mode: string\n engrams: number\n engram_health?: Record<string, number>\n packs: number\n pack_integrity?: { name: string; valid: boolean }[]\n journal_entries: number\n knowledge_notes: number\n scaling_hint?: string\n update_available?: string\n _recommendations?: string[]\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleStatus(\n paths: StatusPaths,\n updateAvailable?: string | null,\n): Promise<StatusResult> {\n const engrams = loadEngrams(paths.engramsPath)\n const journalCount = countFiles(paths.journalPath, '.md')\n const knowledgeCount = countFiles(paths.knowledgePath, '.md')\n const packsCount = countDirs(paths.packsPath)\n\n // Engram health summary by state\n const healthCounts: Record<string, number> = { active: 0, fading: 0, dormant: 0, retirement_candidate: 0 }\n for (const e of engrams) {\n if (e.status !== 'active') continue\n const rs = decayedStrength(e.activation.retrieval_strength, e.activation.last_accessed)\n const state = engramState(rs)\n healthCounts[state]++\n }\n\n // Pack integrity check\n const packIntegrity: { name: string; valid: boolean }[] = []\n for (const regPack of (registry.packs as Array<{ id: string; checksum?: string }>)) {\n if (!regPack.checksum) continue\n const packDir = path.join(paths.packsPath, regPack.id)\n if (!fs.existsSync(packDir)) continue\n const result = verifyPackChecksum(packDir, regPack.checksum)\n packIntegrity.push({ name: regPack.id, valid: result.valid })\n }\n\n // Build recommendations\n const recommendations: string[] = []\n const candidateCount = engrams.filter(e => e.status === 'candidate').length\n\n if (healthCounts.retirement_candidate > 0) {\n recommendations.push(`${healthCounts.retirement_candidate} engrams are retirement candidates. Use datacore.forget to clean up.`)\n }\n if (healthCounts.fading > 0) {\n recommendations.push(`${healthCounts.fading} engrams are fading. Use datacore.feedback with positive signal to reinforce.`)\n }\n if (candidateCount > 0) {\n recommendations.push(`${candidateCount} candidate engrams awaiting review. Use datacore.promote or enable engrams.auto_promote in config.yaml.`)\n }\n\n // Check for today's journal\n const { date: today } = localDate()\n const todayJournal = path.join(paths.journalPath, `${today}.md`)\n if (!fs.existsSync(todayJournal)) {\n recommendations.push('No journal entry today. Use datacore.capture to start one.')\n }\n\n if (updateAvailable) {\n recommendations.push(`Update available: ${updateAvailable}. Run: npm update -g @datacore-one/mcp`)\n }\n\n const statusResult: StatusResult = {\n version: currentVersion,\n mode: paths.mode,\n engrams: engrams.length,\n engram_health: healthCounts,\n packs: packsCount,\n pack_integrity: packIntegrity.length > 0 ? packIntegrity : undefined,\n journal_entries: journalCount,\n knowledge_notes: knowledgeCount,\n _recommendations: recommendations.length > 0 ? recommendations : undefined,\n _hints: buildHints({\n next: recommendations.length > 0\n ? recommendations[0]\n : 'System healthy. Use datacore.session.start to begin working.',\n related: ['datacore.promote', 'datacore.forget'],\n }),\n }\n\n if (engrams.length >= 500) {\n statusResult.scaling_hint = `You have ${engrams.length} engrams. Consider migrating to full Datacore for SQLite-backed search.`\n }\n\n if (updateAvailable) {\n statusResult.update_available = updateAvailable\n }\n\n return statusResult\n}\n\nfunction countFiles(dir: string, ext: string): number {\n if (!fs.existsSync(dir)) return 0\n let count = 0\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) count += countFiles(fullPath, ext)\n else if (entry.name.endsWith(ext)) count++\n }\n return count\n}\n\nfunction countDirs(dir: string): number {\n if (!fs.existsSync(dir)) return 0\n return fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory()).length\n}\n","// src/trust.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as crypto from 'crypto'\n\nexport function computePackChecksum(packDir: string): string | null {\n const files = ['SKILL.md', 'engrams.yaml']\n const hash = crypto.createHash('sha256')\n let hasContent = false\n\n for (const file of files) {\n const filePath = path.join(packDir, file)\n if (fs.existsSync(filePath)) {\n hash.update(fs.readFileSync(filePath))\n hasContent = true\n }\n }\n\n return hasContent ? hash.digest('hex') : null\n}\n\nexport function verifyPackChecksum(packDir: string, expected: string): { valid: boolean; actual: string | null } {\n const actual = computePackChecksum(packDir)\n return { valid: actual === expected, actual }\n}\n","{\n \"version\": 1,\n \"packs\": [\n {\n \"id\": \"datacore-starter-v1\",\n \"name\": \"Datacore Methodology\",\n \"description\": \"Core knowledge management principles — capture, journal, learn, compound\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"methodology\", \"gtd\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 5,\n \"free\": true,\n \"checksum\": \"4fb30b260c6ba5fd36e7cf9240f0a651ca484c777ab4a7be0b3438627138f1a3\"\n },\n {\n \"id\": \"fds-principles-v1\",\n \"name\": \"FDS Principles\",\n \"description\": \"Fair Data Society's 10 principles for ethical data handling\",\n \"version\": \"1.0.0\",\n \"author\": \"Fair Data Society\",\n \"tags\": [\"ethics\", \"data-sovereignty\", \"privacy\", \"consent\"],\n \"download_url\": \"\",\n \"engram_count\": 10,\n \"free\": true,\n \"checksum\": \"8cc7bbb7e259486b16370511fefe937532ee7dcba60ce87c2cd6b8647b5b9847\"\n },\n {\n \"id\": \"dips-v1\",\n \"name\": \"Datacore DIPs\",\n \"description\": \"Comprehensive knowledge from all 20 Datacore Improvement Proposals\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"architecture\", \"patterns\", \"gtd\", \"modules\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 747,\n \"free\": true,\n \"checksum\": \"08185777c38e3a91fbb0f92e7ef388c5940e97e69be6dcce8ce119bd2b33968c\"\n }\n ]\n}\n","// src/tools/discover.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { getConfig } from '../config.js'\nimport registry from '../../registry/packs.json'\n\ninterface RegistryPack {\n id: string; name: string; description: string; version: string\n author: string; tags: string[]; download_url: string\n engram_count: number; free: boolean\n}\n\ninterface DiscoverPack extends RegistryPack {\n installed: boolean\n installed_version?: string\n upgradeable: boolean\n can_install: boolean\n}\n\ninterface DiscoverResult {\n packs: DiscoverPack[]\n auto_installable?: string[]\n auto_upgradeable?: string[]\n}\n\nexport function handleDiscover(\n args: { query?: string; tags?: string[] },\n packsDir: string,\n): DiscoverResult {\n let packs: DiscoverPack[] = registry.packs.map((p: RegistryPack) => {\n const localDir = path.join(packsDir, p.id)\n const installed = fs.existsSync(path.join(localDir, 'SKILL.md'))\n let installedVersion: string | undefined\n if (installed) {\n try {\n const content = fs.readFileSync(path.join(localDir, 'SKILL.md'), 'utf8')\n const match = content.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n installedVersion = match?.[1]\n } catch {}\n }\n return {\n ...p,\n installed,\n installed_version: installedVersion,\n upgradeable: installed && installedVersion !== p.version,\n can_install: !!p.download_url,\n }\n })\n\n if (args.query) {\n const q = args.query.toLowerCase()\n packs = packs.filter(p =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.tags.some(t => t.toLowerCase().includes(q))\n )\n }\n\n if (args.tags?.length) {\n const filterTags = new Set(args.tags.map(t => t.toLowerCase()))\n packs = packs.filter(p => p.tags.some(t => filterTags.has(t.toLowerCase())))\n }\n\n // Check trusted publishers for auto-install/upgrade suggestions\n const trusted = new Set(getConfig().packs.trusted_publishers)\n const result: DiscoverResult = { packs }\n\n if (trusted.size > 0) {\n const autoInstallable = packs\n .filter(p => trusted.has(p.author) && !p.installed && p.can_install)\n .map(p => p.id)\n const autoUpgradeable = packs\n .filter(p => trusted.has(p.author) && p.upgradeable)\n .map(p => p.id)\n\n if (autoInstallable.length > 0) result.auto_installable = autoInstallable\n if (autoUpgradeable.length > 0) result.auto_upgradeable = autoUpgradeable\n }\n\n return result\n}\n","// src/tools/install.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface InstallArgs {\n source: string\n}\n\ninterface InstallResult {\n success: boolean\n pack_id?: string\n upgraded?: boolean\n already_current?: boolean\n checksum_verified?: boolean\n error?: string\n}\n\nexport async function handleInstall(args: InstallArgs, packsDir: string): Promise<InstallResult> {\n let srcDir = args.source\n\n // Detect URL source — download to temp, extract, use as srcDir\n if (srcDir.startsWith('http://') || srcDir.startsWith('https://')) {\n const downloaded = await downloadPack(srcDir)\n if (downloaded.error) return { success: false, error: downloaded.error }\n srcDir = downloaded.path!\n } else if (!srcDir.includes('/') && !srcDir.includes('\\\\')) {\n // Looks like a pack ID — resolve from registry\n const resolved = resolvePackId(srcDir, packsDir)\n if (resolved.error) return { success: false, error: resolved.error }\n srcDir = resolved.path!\n }\n\n // Validate source has SKILL.md\n const skillPath = path.join(srcDir, 'SKILL.md')\n if (!fs.existsSync(skillPath)) {\n return { success: false, error: 'No SKILL.md found in source directory' }\n }\n\n // Parse SKILL.md frontmatter to get pack ID and version\n const skillContent = fs.readFileSync(skillPath, 'utf8')\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!frontmatterMatch) {\n return { success: false, error: 'No YAML frontmatter in SKILL.md' }\n }\n\n const manifest = yaml.load(frontmatterMatch[1]) as Record<string, any>\n const packId = manifest?.['x-datacore']?.id\n const newVersion = manifest?.version\n\n if (!packId) {\n return { success: false, error: 'Missing x-datacore.id in SKILL.md frontmatter' }\n }\n\n const destDir = path.join(packsDir, packId)\n\n // Check if already installed\n if (fs.existsSync(path.join(destDir, 'SKILL.md'))) {\n const existingContent = fs.readFileSync(path.join(destDir, 'SKILL.md'), 'utf8')\n const existingMatch = existingContent.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n const existingVersion = existingMatch?.[1]\n\n if (existingVersion === newVersion) {\n return { success: true, pack_id: packId, already_current: true }\n }\n\n // Upgrade: remove old, copy new\n fs.rmSync(destDir, { recursive: true, force: true })\n fs.cpSync(srcDir, destDir, { recursive: true })\n return { success: true, pack_id: packId, upgraded: true }\n }\n\n // Fresh install\n fs.cpSync(srcDir, destDir, { recursive: true })\n\n // Verify checksum if registry has one\n const checksumVerified = verifyInstalledChecksum(packId, destDir)\n return { success: true, pack_id: packId, checksum_verified: checksumVerified ?? undefined }\n}\n\nfunction verifyInstalledChecksum(packId: string, destDir: string): boolean | null {\n const registryPack = (registry.packs as Array<{ id: string; checksum?: string }>).find(p => p.id === packId)\n if (!registryPack?.checksum) return null\n const result = verifyPackChecksum(destDir, registryPack.checksum)\n return result.valid\n}\n\nasync function downloadPack(url: string): Promise<{ path?: string; error?: string }> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'datacore-pack-'))\n\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!res.ok) return { error: `Download failed: HTTP ${res.status}` }\n\n const buffer = Buffer.from(await res.arrayBuffer())\n const archivePath = path.join(tmpDir, 'pack.tar.gz')\n fs.writeFileSync(archivePath, buffer)\n\n // Extract .tar.gz\n const extractDir = path.join(tmpDir, 'extracted')\n fs.mkdirSync(extractDir)\n execSync(`tar xzf ${JSON.stringify(archivePath)} -C ${JSON.stringify(extractDir)}`, { timeout: 10000 })\n\n // Find the pack root (directory containing SKILL.md)\n const packRoot = findPackRoot(extractDir)\n if (!packRoot) return { error: 'Downloaded archive does not contain SKILL.md' }\n\n return { path: packRoot }\n } catch (err) {\n return { error: `Download failed: ${err instanceof Error ? err.message : err}` }\n }\n}\n\nfunction findPackRoot(dir: string): string | null {\n if (fs.existsSync(path.join(dir, 'SKILL.md'))) return dir\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const found = findPackRoot(path.join(dir, entry.name))\n if (found) return found\n }\n }\n return null\n}\n\nfunction resolvePackId(packId: string, packsDir: string): { path?: string; error?: string } {\n const registryPack = (registry.packs as Array<{ id: string; download_url: string }>)\n .find(p => p.id === packId)\n\n if (!registryPack) {\n return { error: `Pack \"${packId}\" not found in registry. Use datacore.packs.discover to browse available packs.` }\n }\n\n // If registry has a download URL, redirect to URL install\n if (registryPack.download_url) {\n return { error: `Pack \"${packId}\" must be installed via URL: ${registryPack.download_url}` }\n }\n\n // Bundled pack — resolve from the packs/ directory next to dist/\n const bundledDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs', packId,\n )\n\n if (fs.existsSync(path.join(bundledDir, 'SKILL.md'))) {\n return { path: bundledDir }\n }\n\n // Already installed locally?\n const localDir = path.join(packsDir, packId)\n if (fs.existsSync(path.join(localDir, 'SKILL.md'))) {\n return { path: localDir }\n }\n\n return { error: `Pack \"${packId}\" is registered but not available locally. It may need to be downloaded manually.` }\n}\n","// src/tools/export.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface ExportArgs {\n name: string\n description: string\n engram_ids?: string[]\n filter_tags?: string[]\n filter_domain?: string\n confirm?: boolean\n}\n\ninterface ExportResult {\n success: boolean\n preview?: {\n count: number\n statements: string[]\n pack_path: string\n }\n pack_path?: string\n error?: string\n}\n\nexport async function handleExport(\n args: ExportArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<ExportResult> {\n const allEngrams = loadEngrams(paths.engramsPath)\n let selected = allEngrams.filter(e => e.status === 'active')\n\n // Only include public or template engrams\n selected = selected.filter(e => e.visibility === 'public' || e.visibility === 'template')\n\n if (selected.length === 0 && !args.engram_ids?.length) {\n return { success: false, error: 'No exportable engrams found (only public/template engrams can be exported)' }\n }\n\n // Apply filters\n if (args.engram_ids?.length) {\n const idSet = new Set(args.engram_ids)\n // For explicit IDs, still filter for public/template from allEngrams\n selected = allEngrams.filter(e =>\n idSet.has(e.id) &&\n e.status === 'active' &&\n (e.visibility === 'public' || e.visibility === 'template')\n )\n const privateSkipped = args.engram_ids.filter(id => {\n const e = allEngrams.find(eng => eng.id === id)\n return e && e.visibility === 'private'\n })\n if (privateSkipped.length > 0) {\n return { success: false, error: `Cannot export private engrams: ${privateSkipped.join(', ')}. Set visibility to public or template first.` }\n }\n }\n\n if (args.filter_tags?.length) {\n const tagSet = new Set(args.filter_tags.map(t => t.toLowerCase()))\n selected = selected.filter(e => e.tags.some(t => tagSet.has(t.toLowerCase())))\n }\n\n if (args.filter_domain) {\n selected = selected.filter(e => e.domain?.startsWith(args.filter_domain!))\n }\n\n if (selected.length === 0) {\n return { success: false, error: 'No engrams match the filter criteria' }\n }\n\n const packId = args.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const packDir = path.join(paths.packsPath, packId)\n\n // Preview mode (default)\n if (!args.confirm) {\n return {\n success: true,\n preview: {\n count: selected.length,\n statements: selected.map(e => e.statement).slice(0, 10),\n pack_path: packDir,\n },\n }\n }\n\n // Check for existing pack\n if (fs.existsSync(packDir)) {\n return {\n success: false,\n error: `Pack directory already exists at ${packDir}. Remove it first or use a different name.`,\n }\n }\n\n // Write pack\n fs.mkdirSync(packDir, { recursive: true })\n\n // SKILL.md with frontmatter\n const skillContent = `---\nname: \"${args.name}\"\ndescription: \"${args.description}\"\nversion: \"1.0.0\"\nschema_version: 2\nx-datacore:\n id: \"${packId}\"\n injection_policy: on_match\n match_terms: []\n engram_count: ${selected.length}\n---\n\n# ${args.name}\n\n${args.description}\n\nExported ${selected.length} engrams.\n`\n fs.writeFileSync(path.join(packDir, 'SKILL.md'), skillContent)\n\n // engrams.yaml — strip personal fields, preserve knowledge content\n const exportEngrams = selected.map(e => ({\n id: e.id,\n version: e.version,\n type: e.type,\n scope: e.scope,\n visibility: e.visibility,\n statement: e.statement,\n rationale: e.rationale,\n contraindications: e.contraindications,\n tags: e.tags,\n domain: e.domain,\n status: 'active',\n activation: {\n retrieval_strength: 0.7,\n storage_strength: 1.0,\n frequency: 0,\n last_accessed: new Date().toISOString().split('T')[0],\n },\n feedback_signals: { positive: 0, negative: 0 },\n }))\n\n fs.writeFileSync(\n path.join(packDir, 'engrams.yaml'),\n yaml.dump({ engrams: exportEngrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' }),\n )\n\n return { success: true, pack_path: packDir }\n}\n","// src/modules.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\nimport type { StorageConfig } from './storage.js'\n\nexport interface ModuleToolDefinition {\n name: string // Without namespace prefix (e.g., 'inbox_count')\n description: string\n inputSchema: z.ZodType\n handler: (args: unknown, context: ModuleToolContext) => Promise<unknown>\n}\n\nexport interface ModuleToolContext {\n storage: StorageConfig\n modulePath: string // Path to module code directory\n dataPath: string // Path to module's private data directory\n spaceName?: string // Active space (if space-scoped)\n}\n\nexport interface ModuleManifest {\n manifest_version?: number\n name: string\n version?: string\n description?: string\n builtin?: boolean\n provides?: {\n tools?: Array<{\n name: string\n description: string\n handler: string // Relative path to handler file\n }>\n skills?: unknown[]\n agents?: unknown[]\n commands?: unknown[]\n workflows?: unknown[]\n }\n context?: {\n priority?: 'always' | 'minimal' | 'on_demand'\n summary?: string\n }\n engrams?: {\n namespace?: string\n starter_pack?: string\n injection_policy?: string\n match_terms?: string[]\n }\n requires?: {\n env_vars?: {\n required?: string[]\n optional?: string[]\n }\n }\n settings?: Record<string, unknown>\n}\n\nexport interface DiscoveredModule {\n name: string\n manifest: ModuleManifest\n modulePath: string // Absolute path to module code\n scope: 'global' | 'space'\n spaceName?: string\n}\n\nexport interface RegisteredModuleTool {\n fullName: string // datacore.[module].[tool]\n moduleName: string\n definition: ModuleToolDefinition\n context: ModuleToolContext\n}\n\n/**\n * Discover all installed modules by scanning module directories.\n * Checks global (.datacore/modules/) and space-scoped ([space]/.datacore/modules/).\n */\nexport function discoverModules(storage: StorageConfig): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (storage.mode !== 'full') return modules\n\n // 1. Global modules: basePath/.datacore/modules/*/\n const globalModulesDir = path.join(storage.basePath, '.datacore', 'modules')\n modules.push(...scanModulesDir(globalModulesDir, 'global'))\n\n // 2. Space modules: basePath/[0-9]-*//.datacore/modules/*/\n try {\n const entries = fs.readdirSync(storage.basePath)\n for (const entry of entries) {\n if (/^\\d+-/.test(entry)) {\n const spaceModulesDir = path.join(storage.basePath, entry, '.datacore', 'modules')\n modules.push(...scanModulesDir(spaceModulesDir, 'space', entry))\n }\n }\n } catch {\n // basePath not readable — skip space scan\n }\n\n return modules\n}\n\nfunction scanModulesDir(\n modulesDir: string,\n scope: 'global' | 'space',\n spaceName?: string,\n): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (!fs.existsSync(modulesDir)) return modules\n\n try {\n const entries = fs.readdirSync(modulesDir)\n for (const entry of entries) {\n const modulePath = path.join(modulesDir, entry)\n const manifestPath = path.join(modulePath, 'module.yaml')\n\n if (!fs.existsSync(manifestPath)) continue\n\n try {\n const raw = fs.readFileSync(manifestPath, 'utf-8')\n const manifest = yaml.load(raw) as ModuleManifest\n if (!manifest || !manifest.name) continue\n\n modules.push({\n name: manifest.name,\n manifest,\n modulePath,\n scope,\n spaceName,\n })\n } catch {\n // Invalid YAML or missing name — skip\n }\n }\n } catch {\n // Directory not readable — skip\n }\n\n return modules\n}\n\n/**\n * Load module tools from discovered modules.\n * Only loads tools from modules that declare provides.tools in module.yaml\n * and have a valid tools/index.ts (compiled to .js) handler.\n *\n * Returns registered tools ready for MCP server integration.\n */\nexport async function loadModuleTools(\n modules: DiscoveredModule[],\n storage: StorageConfig,\n): Promise<RegisteredModuleTool[]> {\n const tools: RegisteredModuleTool[] = []\n\n for (const mod of modules) {\n const declaredTools = mod.manifest.provides?.tools\n if (!declaredTools || declaredTools.length === 0) continue\n\n // Try to load the tools/index.ts (compiled to .js)\n const toolsIndexPath = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndexPath)) continue\n\n try {\n const toolsModule = await import(toolsIndexPath)\n const moduleTools: ModuleToolDefinition[] = toolsModule.tools || toolsModule.default?.tools || []\n\n // Build data path for this module's private data\n const dataPath = mod.scope === 'space' && mod.spaceName\n ? path.join(storage.basePath, mod.spaceName, '.datacore', 'modules', mod.name, 'data')\n : path.join(storage.basePath, '0-personal', '.datacore', 'modules', mod.name, 'data')\n\n const context: ModuleToolContext = {\n storage,\n modulePath: mod.modulePath,\n dataPath,\n spaceName: mod.spaceName,\n }\n\n for (const toolDef of moduleTools) {\n // Only register tools declared in module.yaml\n const declared = declaredTools.find(d => d.name === toolDef.name)\n if (!declared) continue\n\n tools.push({\n fullName: `datacore.${mod.name}.${toolDef.name}`,\n moduleName: mod.name,\n definition: toolDef,\n context,\n })\n }\n } catch {\n // Failed to load module tools — skip this module\n }\n }\n\n return tools\n}\n\n/**\n * Get module info for the modules.list and modules.info tools.\n */\nexport function getModuleInfo(mod: DiscoveredModule): Record<string, unknown> {\n const m = mod.manifest\n return {\n name: m.name,\n version: m.version || '0.0.0',\n description: m.description || '',\n scope: mod.scope,\n space: mod.spaceName,\n builtin: m.builtin || false,\n manifest_version: m.manifest_version || 1,\n provides: {\n tools: m.provides?.tools?.length || 0,\n skills: m.provides?.skills?.length || 0,\n agents: m.provides?.agents?.length || 0,\n commands: m.provides?.commands?.length || 0,\n workflows: m.provides?.workflows?.length || 0,\n },\n context_priority: m.context?.priority || 'minimal',\n engrams: m.engrams ? {\n namespace: m.engrams.namespace,\n injection_policy: m.engrams.injection_policy,\n has_starter_pack: !!m.engrams.starter_pack,\n } : null,\n requires: m.requires?.env_vars ? {\n env_required: m.requires.env_vars.required || [],\n env_optional: m.requires.env_vars.optional || [],\n } : null,\n path: mod.modulePath,\n }\n}\n","// src/tools/modules-list.ts\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesList(\n _args: unknown,\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (modules.length === 0) {\n return {\n count: 0,\n modules: [],\n message: storage.mode === 'core'\n ? 'Module discovery requires a full Datacore installation'\n : 'No modules found',\n }\n }\n\n return {\n count: modules.length,\n modules: modules.map(m => ({\n name: m.manifest.name,\n version: m.manifest.version || '0.0.0',\n description: m.manifest.description || '',\n scope: m.scope,\n space: m.spaceName || null,\n builtin: m.manifest.builtin || false,\n manifest_version: m.manifest.manifest_version || 1,\n provides: {\n tools: m.manifest.provides?.tools?.length || 0,\n skills: m.manifest.provides?.skills?.length || 0,\n agents: m.manifest.provides?.agents?.length || 0,\n commands: m.manifest.provides?.commands?.length || 0,\n workflows: m.manifest.provides?.workflows?.length || 0,\n },\n context_priority: m.manifest.context?.priority || 'minimal',\n })),\n }\n}\n","// src/tools/modules-info.ts\nimport { discoverModules, getModuleInfo, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesInfo(\n args: { module: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n const found = modules.find(m => m.manifest.name === args.module)\n\n if (!found) {\n return { error: `Module '${args.module}' not found`, installed_modules: modules.map(m => m.name) }\n }\n\n return getModuleInfo(found)\n}\n","// src/tools/modules-health.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\ninterface HealthCheck {\n name: string\n status: 'ok' | 'warning' | 'error'\n issues: string[]\n}\n\nexport async function handleModulesHealth(\n args: { module?: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (args.module) {\n const found = modules.find(m => m.manifest.name === args.module)\n if (!found) {\n return { error: `Module '${args.module}' not found` }\n }\n return await checkModule(found, storage)\n }\n\n // Check all modules\n const checks = await Promise.all(modules.map(m => checkModule(m, storage)))\n const ok = checks.filter(c => c.status === 'ok').length\n const warnings = checks.filter(c => c.status === 'warning').length\n const errors = checks.filter(c => c.status === 'error').length\n\n return {\n summary: { total: checks.length, ok, warnings, errors },\n modules: checks,\n }\n}\n\nasync function checkModule(\n mod: { name: string; manifest: Record<string, unknown>; modulePath: string },\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as Record<string, unknown>\n\n // Check required files\n if (!fs.existsSync(path.join(mod.modulePath, 'SKILL.md'))) {\n issues.push('Missing SKILL.md (ecosystem entry point)')\n }\n if (!fs.existsSync(path.join(mod.modulePath, 'CLAUDE.base.md'))) {\n issues.push('Missing CLAUDE.base.md (AI context)')\n }\n\n // Check manifest version\n if (!manifest.manifest_version || (manifest.manifest_version as number) < 2) {\n issues.push('module.yaml uses v1 format (missing manifest_version: 2)')\n }\n\n // Check env vars\n const requires = manifest.requires as { env_vars?: { required?: string[] } } | undefined\n const requiredEnv = requires?.env_vars?.required || []\n for (const envVar of requiredEnv) {\n if (!process.env[envVar]) {\n issues.push(`Missing required env var: ${envVar}`)\n }\n }\n\n // Check declared tools have handlers\n const provides = manifest.provides as { tools?: Array<{ name: string; handler: string }> } | undefined\n const declaredTools = provides?.tools || []\n if (declaredTools.length > 0) {\n const toolsIndex = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndex)) {\n issues.push(`Declares ${declaredTools.length} tools but tools/index.js not found`)\n } else {\n // Attempt to verify exports match declarations\n try {\n const toolModule = await import(toolsIndex)\n for (const tool of declaredTools) {\n const handlerName = tool.handler || tool.name\n if (typeof toolModule[handlerName] !== 'function') {\n issues.push(`Tool '${tool.name}' declares handler '${handlerName}' but export not found`)\n }\n }\n } catch (err) {\n issues.push(`tools/index.js failed to load: ${err instanceof Error ? err.message : err}`)\n }\n }\n }\n\n // Check data separation (no data files in module code dir)\n const suspectExts = ['.db', '.sqlite', '.json']\n const suspectDirs = ['output', 'data', 'state']\n for (const dir of suspectDirs) {\n const fullPath = path.join(mod.modulePath, dir)\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory()) {\n issues.push(`Data dir '${dir}/' found in module code (should be in space data path)`)\n }\n }\n try {\n const entries = fs.readdirSync(mod.modulePath)\n for (const entry of entries) {\n if (suspectExts.some(ext => entry.endsWith(ext))) {\n issues.push(`Data file '${entry}' found in module code dir`)\n }\n }\n } catch { /* ignore */ }\n\n return {\n name: mod.name as string,\n status: issues.length === 0 ? 'ok' : issues.some(i => i.startsWith('Missing required')) ? 'error' : 'warning',\n issues,\n }\n}\n","// src/tools/forget.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\n\ninterface ForgetArgs {\n id?: string\n search?: string\n}\n\ninterface ForgetResult {\n success: boolean\n retired?: { id: string; statement: string }\n matches?: Array<{ id: string; statement: string }>\n error?: string\n}\n\nexport async function handleForget(args: ForgetArgs, engramsPath: string): Promise<ForgetResult> {\n const engrams = loadEngrams(engramsPath)\n\n if (args.id) {\n const idx = engrams.findIndex(e => e.id === args.id)\n if (idx === -1) {\n return { success: false, error: `Engram ${args.id} not found` }\n }\n const engram = engrams[idx]\n if (engram.status === 'retired') {\n return { success: false, error: `Engram ${args.id} is already retired` }\n }\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n\n if (args.search) {\n const searchLower = args.search.toLowerCase()\n const allMatches = engrams\n .filter(e => e.status !== 'retired')\n .filter(e =>\n e.statement.toLowerCase().includes(searchLower) ||\n e.id.toLowerCase().includes(searchLower) ||\n e.tags.some(t => t.toLowerCase().includes(searchLower))\n )\n const matches = allMatches.slice(0, 100)\n\n if (matches.length === 0) {\n return { success: false, error: `No active engrams matching \"${args.search}\"` }\n }\n if (matches.length === 1) {\n const engram = matches[0]\n const idx = engrams.findIndex(e => e.id === engram.id)\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n const truncated = allMatches.length > 100\n return {\n success: false,\n matches: matches.map(e => ({ id: e.id, statement: e.statement })),\n total_matches: allMatches.length,\n error: `${allMatches.length} matches found${truncated ? ' (showing first 100)' : ''}. Specify an exact ID to retire.`,\n }\n }\n\n return { success: false, error: 'Provide either id or search parameter' }\n}\n","// src/tools/feedback.ts\n// Supports feedback on ALL engrams — personal and pack engrams alike.\n// Pack engram feedback is written back to the pack's own engrams.yaml.\nimport * as path from 'path'\nimport { loadEngrams, loadAllPacks, type LoadedPack } from '../engrams.js'\nimport { atomicWriteYaml } from './inject-tool.js'\nimport { buildHints } from '../hints.js'\n\ntype Signal = 'positive' | 'negative' | 'neutral'\n\ninterface FeedbackArgs {\n engram_id?: string\n signal?: Signal\n signals?: Array<{ engram_id: string; signal: Signal }>\n comment?: string\n}\n\ninterface SingleFeedbackResult {\n mode: 'single'\n success: boolean\n engram_id: string\n signal: string\n source?: 'personal' | 'pack'\n feedback_signals?: { positive: number; negative: number; neutral: number }\n error?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\ninterface BatchFeedbackResult {\n mode: 'batch'\n results: Array<{ engram_id: string; signal: string; success: boolean; source?: 'personal' | 'pack'; error?: string }>\n summary: { positive: number; negative: number; neutral: number }\n _hints?: ReturnType<typeof buildHints>\n}\n\n// Locate an engram across personal + all packs\ninterface FoundEngram {\n engram: import('../schemas/engram.js').Engram\n source: 'personal' | 'pack'\n // For personal: allEngrams array + engramsPath\n personalEngrams?: import('../schemas/engram.js').Engram[]\n // For pack: the pack's engrams array + pack engrams.yaml path\n packEngrams?: import('../schemas/engram.js').Engram[]\n packEngramsPath?: string\n}\n\nfunction findEngram(engramId: string, engramsPath: string, packsPath: string): FoundEngram | null {\n // Check personal first\n const personal = loadEngrams(engramsPath)\n const found = personal.find(e => e.id === engramId)\n if (found) return { engram: found, source: 'personal', personalEngrams: personal }\n\n // Check packs\n const packs = loadAllPacks(packsPath)\n for (const pack of packs) {\n const packEngram = pack.engrams.find(e => e.id === engramId)\n if (packEngram) {\n const packId = pack.manifest['x-datacore']?.id\n const packEngramsPath = packId ? path.join(packsPath, packId, 'engrams.yaml') : undefined\n return { engram: packEngram, source: 'pack', packEngrams: pack.engrams, packEngramsPath }\n }\n }\n\n return null\n}\n\nexport async function handleFeedback(\n args: FeedbackArgs,\n engramsPath: string,\n packsPath?: string,\n): Promise<SingleFeedbackResult | BatchFeedbackResult> {\n const pPath = packsPath ?? path.join(path.dirname(engramsPath), 'packs')\n\n if (args.signals && args.signals.length > 0) {\n return handleBatchFeedback(args.signals, engramsPath, pPath)\n }\n\n return handleSingleFeedback(args.engram_id!, args.signal!, args.comment, engramsPath, pPath)\n}\n\nasync function handleSingleFeedback(\n engram_id: string,\n signal: Signal,\n comment: string | undefined,\n engramsPath: string,\n packsPath: string,\n): Promise<SingleFeedbackResult> {\n const found = findEngram(engram_id, engramsPath, packsPath)\n\n if (!found) {\n return {\n mode: 'single',\n success: false,\n engram_id,\n signal,\n error: `Engram ${engram_id} not found`,\n _hints: buildHints({\n next: 'Engram not found. Use datacore.search or datacore.status to find valid IDs.',\n related: ['datacore.search', 'datacore.status'],\n }),\n }\n }\n\n const today = new Date().toISOString().split('T')[0]\n if (!found.engram.feedback_signals) {\n found.engram.feedback_signals = { positive: 0, negative: 0, neutral: 0 }\n }\n found.engram.feedback_signals[signal] += 1\n found.engram.activation.last_accessed = today\n\n // Write back to the correct file\n if (found.source === 'personal' && found.personalEngrams) {\n atomicWriteYaml(engramsPath, { engrams: found.personalEngrams })\n } else if (found.source === 'pack' && found.packEngrams && found.packEngramsPath) {\n atomicWriteYaml(found.packEngramsPath, { engrams: found.packEngrams })\n }\n\n return {\n mode: 'single',\n success: true,\n engram_id,\n signal,\n source: found.source,\n feedback_signals: { ...found.engram.feedback_signals },\n }\n}\n\nasync function handleBatchFeedback(\n signals: Array<{ engram_id: string; signal: Signal }>,\n engramsPath: string,\n packsPath: string,\n): Promise<BatchFeedbackResult> {\n const today = new Date().toISOString().split('T')[0]\n const results: Array<{ engram_id: string; signal: string; success: boolean; source?: 'personal' | 'pack'; error?: string }> = []\n const summary = { positive: 0, negative: 0, neutral: 0 }\n\n // Load all sources once upfront to avoid reloading on each iteration\n const personal = loadEngrams(engramsPath)\n const packs = loadAllPacks(packsPath)\n let personalDirty = false\n const dirtyPackFiles = new Map<string, import('../schemas/engram.js').Engram[]>()\n\n for (const { engram_id, signal } of signals) {\n // Search personal engrams first\n let engram = personal.find(e => e.id === engram_id)\n let source: 'personal' | 'pack' | undefined\n\n if (engram) {\n source = 'personal'\n } else {\n // Search packs\n for (const pack of packs) {\n engram = pack.engrams.find(e => e.id === engram_id)\n if (engram) {\n source = 'pack'\n const packId = pack.manifest['x-datacore']?.id\n if (packId) {\n dirtyPackFiles.set(\n path.join(packsPath, packId, 'engrams.yaml'),\n pack.engrams,\n )\n }\n break\n }\n }\n }\n\n if (!engram || !source) {\n results.push({ engram_id, signal, success: false, error: `Engram ${engram_id} not found` })\n continue\n }\n\n if (!engram.feedback_signals) {\n engram.feedback_signals = { positive: 0, negative: 0, neutral: 0 }\n }\n engram.feedback_signals[signal] += 1\n engram.activation.last_accessed = today\n summary[signal]++\n\n if (source === 'personal') personalDirty = true\n results.push({ engram_id, signal, success: true, source })\n }\n\n // Write dirty files\n if (personalDirty) {\n atomicWriteYaml(engramsPath, { engrams: personal })\n }\n for (const [filePath, engrams] of dirtyPackFiles) {\n atomicWriteYaml(filePath, { engrams })\n }\n\n return {\n mode: 'batch',\n results,\n summary,\n _hints: buildHints({\n next: `Batch feedback recorded: ${summary.positive} positive, ${summary.negative} negative, ${summary.neutral} neutral.`,\n related: ['datacore.session.end', 'datacore.status'],\n }),\n }\n}\n","// src/tools/session-start.ts\n// Architecture rule: Session handlers are coordinators.\n// They may import leaf handlers (handleInject, handleCapture, handleLearn).\n// Leaf handlers must NEVER import session handlers.\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { handleInject } from './inject-tool.js'\nimport { loadEngrams } from '../engrams.js'\nimport { localDate } from './capture.js'\nimport { buildHints } from '../hints.js'\nimport type { StorageConfig } from '../storage.js'\nimport type { DatacortexBridge } from '../datacortex.js'\n\ninterface SessionStartArgs {\n task?: string\n tags?: string[]\n}\n\ninterface SessionStartResult {\n engrams: { text: string; count: number } | null\n journal_today: string | null\n pending_candidates: number\n recommendations: string[]\n guide?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleSessionStart(\n args: SessionStartArgs,\n storage: StorageConfig,\n bridge?: DatacortexBridge | null,\n): Promise<SessionStartResult> {\n let engrams: { text: string; count: number } | null = null\n\n if (args.task) {\n const injectResult = await handleInject(\n { prompt: args.task, scope: args.tags?.length ? `tags:${args.tags.join(',')}` : undefined },\n { engramsPath: storage.engramsPath, packsPath: storage.packsPath },\n )\n if (injectResult.count > 0) {\n engrams = { text: injectResult.text, count: injectResult.count }\n }\n }\n\n // Read today's journal\n const { date: today } = localDate()\n const journalFile = path.join(storage.journalPath, `${today}.md`)\n const journal_today = fs.existsSync(journalFile)\n ? fs.readFileSync(journalFile, 'utf8')\n : null\n\n // Count candidate engrams\n const allEngrams = loadEngrams(storage.engramsPath)\n const pending_candidates = allEngrams.filter(e => e.status === 'candidate').length\n\n // Build recommendations\n const recommendations: string[] = []\n if (pending_candidates > 0) {\n recommendations.push(`${pending_candidates} candidate engram(s) awaiting review. Use datacore.promote to activate.`)\n }\n if (!journal_today) {\n recommendations.push('No journal entry today. Use datacore.capture to start one.')\n }\n\n const hints = args.task\n ? buildHints({\n next: 'Work on your task. End with datacore.session.end.',\n related: ['datacore.session.end', 'datacore.feedback'],\n })\n : buildHints({\n next: 'No task specified — showing journal and candidates only. Call datacore.inject when ready.',\n related: ['datacore.inject', 'datacore.session.end'],\n })\n\n // Include the guide when there are no active engrams (fresh install / early usage)\n // so the AI immediately understands how the system works\n const activeCount = allEngrams.filter(e => e.status === 'active').length\n const guide = activeCount === 0 ? SESSION_GUIDE_FULL : SESSION_GUIDE_SHORT\n\n return { engrams, journal_today, pending_candidates, recommendations, guide, _hints: hints }\n}\n\n// Full guide for fresh installs (no active engrams yet)\nconst SESSION_GUIDE_FULL = `## Datacore Quick Start\n\nDatacore gives you persistent memory through **engrams** — knowledge that gets injected into context when relevant.\n\n### Session Workflow\n1. **session.start** (you just called this) — get context\n2. Work on your task. Use **recall** to search everything, **search** for files.\n3. **feedback** — rate which injected engrams helped (strengthens useful ones)\n4. **session.end** — capture summary + suggest new engrams\n\n### Key Tools\n- **learn** — record a reusable insight (creates candidate engram)\n- **promote** — activate candidate engrams so they appear in future sessions\n- **capture** — write a journal entry or knowledge note\n- **ingest** — import text and extract engram suggestions\n- **status** — system health and actionable recommendations\n- **forget** — retire an engram you no longer need\n\n### How Engrams Work\nlearn → candidate → promote → active → inject → feedback → stronger/weaker\nPositive feedback strengthens engrams. Unused ones naturally decay.`\n\n// Short reminder for returning users\nconst SESSION_GUIDE_SHORT = `Session started. Workflow: work → feedback → session.end.`\n","// src/tools/session-end.ts\n// Architecture rule: Session handlers are coordinators.\n// They may import leaf handlers (handleInject, handleCapture, handleLearn).\n// Leaf handlers must NEVER import session handlers.\nimport { handleCapture } from './capture.js'\nimport { handleLearn } from './learn.js'\nimport { buildHints } from '../hints.js'\nimport { getConfig } from '../config.js'\nimport type { StorageConfig } from '../storage.js'\n\ninterface SessionEndArgs {\n summary: string\n tags?: string[]\n engram_suggestions?: Array<{ statement: string; type?: 'behavioral' | 'terminological' | 'procedural' | 'architectural' }>\n}\n\ninterface SessionEndResult {\n journal_path: string | null\n engrams_created: number\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleSessionEnd(\n args: SessionEndArgs,\n storage: StorageConfig,\n): Promise<SessionEndResult> {\n // Capture journal entry\n const captureResult = await handleCapture(\n { type: 'journal', content: args.summary, tags: args.tags },\n storage,\n )\n\n // Create engrams from suggestions\n let engramsCreated = 0\n if (args.engram_suggestions?.length) {\n for (const suggestion of args.engram_suggestions) {\n await handleLearn(\n { statement: suggestion.statement, type: suggestion.type },\n storage.engramsPath,\n )\n engramsCreated++\n }\n }\n\n const autoPromote = getConfig().engrams.auto_promote\n const statusLabel = autoPromote ? 'active' : 'candidates'\n\n return {\n journal_path: captureResult.path ?? null,\n engrams_created: engramsCreated,\n _hints: buildHints({\n next: engramsCreated > 0\n ? `Session captured. ${engramsCreated} engram(s) created as ${statusLabel}.`\n : 'Session captured.',\n related: ['datacore.session.start', 'datacore.status'],\n }),\n }\n}\n","// src/tools/recall.ts\nimport { loadEngrams } from '../engrams.js'\nimport { handleSearch } from './search.js'\nimport { buildHints } from '../hints.js'\nimport type { DatacortexBridge } from '../datacortex.js'\n\ninterface RecallArgs {\n topic: string\n sources?: ('engrams' | 'journal' | 'knowledge')[]\n limit?: number\n}\n\ninterface EngramResult {\n id: string\n statement: string\n score: number\n}\n\ninterface FileResult {\n path: string\n snippet: string\n title?: string\n date?: string\n score: number\n}\n\ninterface RecallResult {\n engrams?: EngramResult[]\n journal?: FileResult[]\n knowledge?: FileResult[]\n fallback_warning?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleRecall(\n args: RecallArgs,\n storage: { engramsPath: string; journalPath: string; knowledgePath: string },\n bridge?: DatacortexBridge | null,\n): Promise<RecallResult> {\n const sources = args.sources ?? ['engrams', 'journal', 'knowledge']\n const limit = args.limit ?? 10\n const result: RecallResult = {}\n let fallbackWarning: string | undefined\n\n // Search engrams by keyword overlap\n if (sources.includes('engrams')) {\n const engrams = loadEngrams(storage.engramsPath)\n const topicWords = args.topic.toLowerCase().split(/\\s+/).filter(w => w.length > 2)\n const scored: EngramResult[] = []\n\n for (const e of engrams) {\n if (e.status === 'retired') continue\n const text = `${e.statement} ${e.tags.join(' ')}`.toLowerCase()\n let score = 0\n for (const word of topicWords) {\n if (text.includes(word)) score++\n }\n if (score > 0) {\n scored.push({ id: e.id, statement: e.statement, score })\n }\n }\n\n scored.sort((a, b) => b.score - a.score)\n const engramResults = scored.slice(0, limit)\n if (engramResults.length > 0) {\n result.engrams = engramResults\n }\n }\n\n // Search journal\n if (sources.includes('journal')) {\n const searchResult = await handleSearch(\n { query: args.topic, scope: 'journal', limit },\n { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath },\n bridge,\n )\n if (searchResult.results.length > 0) {\n result.journal = searchResult.results.map(r => ({\n path: r.path,\n snippet: r.snippet,\n title: (r as any).title,\n date: (r as any).date,\n score: r.score,\n }))\n }\n if (searchResult.fallback_warning) {\n fallbackWarning = searchResult.fallback_warning\n }\n }\n\n // Search knowledge\n if (sources.includes('knowledge')) {\n const searchResult = await handleSearch(\n { query: args.topic, scope: 'knowledge', limit },\n { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath },\n bridge,\n )\n if (searchResult.results.length > 0) {\n result.knowledge = searchResult.results.map(r => ({\n path: r.path,\n snippet: r.snippet,\n title: (r as any).title,\n date: (r as any).date,\n score: r.score,\n }))\n }\n if (searchResult.fallback_warning) {\n fallbackWarning = searchResult.fallback_warning\n }\n }\n\n if (fallbackWarning) {\n result.fallback_warning = fallbackWarning\n }\n\n result._hints = buildHints({\n next: 'Use datacore.feedback on helpful engrams, or datacore.learn to create new ones.',\n related: ['datacore.feedback', 'datacore.learn'],\n })\n\n return result\n}\n","// src/tools/promote.ts\nimport { loadEngrams } from '../engrams.js'\nimport { atomicWriteYaml } from './inject-tool.js'\nimport { buildHints } from '../hints.js'\n\ninterface PromoteArgs {\n id?: string\n ids?: string[]\n}\n\ninterface PromoteResultItem {\n id: string\n statement: string\n}\n\ninterface PromoteErrorItem {\n id: string\n error: string\n}\n\ninterface PromoteResult {\n success: boolean\n promoted: PromoteResultItem[]\n errors: PromoteErrorItem[]\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handlePromote(\n args: PromoteArgs,\n engramsPath: string,\n): Promise<PromoteResult> {\n const targetIds = args.ids ?? (args.id ? [args.id] : [])\n\n if (targetIds.length === 0) {\n return {\n success: false,\n promoted: [],\n errors: [{ id: '', error: 'At least one engram ID required (id or ids)' }],\n _hints: buildHints({\n next: 'Provide an engram ID. Use datacore.search or datacore.status to find valid IDs.',\n related: ['datacore.search', 'datacore.status'],\n }),\n }\n }\n\n const engrams = loadEngrams(engramsPath)\n const today = new Date().toISOString().split('T')[0]\n const promoted: PromoteResultItem[] = []\n const errors: PromoteErrorItem[] = []\n\n for (const id of targetIds) {\n const engram = engrams.find(e => e.id === id)\n if (!engram) {\n errors.push({ id, error: 'Engram not found' })\n continue\n }\n if (engram.status === 'active') {\n errors.push({ id, error: 'Already active' })\n continue\n }\n if (engram.status === 'retired') {\n errors.push({ id, error: 'Cannot promote retired engram' })\n continue\n }\n\n engram.status = 'active'\n engram.activation.retrieval_strength = 0.7\n engram.activation.storage_strength = 1.0\n engram.activation.last_accessed = today\n promoted.push({ id: engram.id, statement: engram.statement })\n }\n\n if (promoted.length > 0) {\n atomicWriteYaml(engramsPath, { engrams })\n }\n\n return {\n success: errors.length === 0,\n promoted,\n errors,\n _hints: buildHints({\n next: promoted.length > 0\n ? `Promoted ${promoted.length} engram(s). They will now appear in inject results.`\n : 'No engrams were promoted. Check the errors above.',\n related: ['datacore.inject', 'datacore.status'],\n }),\n }\n}\n","// src/resources.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListResourceTemplatesRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { loadEngrams } from './engrams.js'\nimport { localDate } from './tools/capture.js'\nimport type { StorageConfig } from './storage.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { currentVersion } from './version.js'\n\nexport function registerResources(server: Server, storage: StorageConfig): void {\n // List static resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: 'datacore://status',\n name: 'Datacore Status',\n description: 'Current system status summary',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://engrams/active',\n name: 'Active Engrams',\n description: 'All active engrams with their metadata',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://journal/today',\n name: \"Today's Journal\",\n description: \"Today's journal entry\",\n mimeType: 'text/markdown',\n },\n {\n uri: 'datacore://guide',\n name: 'Datacore Agent Guide',\n description: 'Workflow guide for AI agents: session lifecycle, engram lifecycle, tool reference',\n mimeType: 'text/markdown',\n },\n ],\n }))\n\n // List resource templates\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [\n {\n uriTemplate: 'datacore://journal/{date}',\n name: 'Journal Entry',\n description: 'Journal entry for a specific date (YYYY-MM-DD)',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'datacore://engrams/{id}',\n name: 'Engram',\n description: 'A specific engram by ID',\n mimeType: 'application/json',\n },\n ],\n }))\n\n // Read resource\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri\n\n // Static: datacore://status\n if (uri === 'datacore://status') {\n const engrams = loadEngrams(storage.engramsPath)\n const active = engrams.filter(e => e.status === 'active').length\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ version: currentVersion, mode: storage.mode, engrams: engrams.length, active }),\n }],\n }\n }\n\n // Static: datacore://engrams/active\n if (uri === 'datacore://engrams/active') {\n const engrams = loadEngrams(storage.engramsPath).filter(e => e.status === 'active')\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engrams, null, 2),\n }],\n }\n }\n\n // Static: datacore://guide\n if (uri === 'datacore://guide') {\n return {\n contents: [{\n uri,\n mimeType: 'text/markdown',\n text: AGENT_GUIDE,\n }],\n }\n }\n\n // Static or template: datacore://journal/today or datacore://journal/{date}\n const journalMatch = uri.match(/^datacore:\\/\\/journal\\/(.+)$/)\n if (journalMatch) {\n const dateStr = journalMatch[1] === 'today' ? localDate().date : journalMatch[1]\n const filePath = path.join(storage.journalPath, `${dateStr}.md`)\n if (!fs.existsSync(filePath)) {\n return { contents: [{ uri, mimeType: 'text/markdown', text: `No journal entry for ${dateStr}` }] }\n }\n return { contents: [{ uri, mimeType: 'text/markdown', text: fs.readFileSync(filePath, 'utf8') }] }\n }\n\n // Template: datacore://engrams/{id}\n const engramMatch = uri.match(/^datacore:\\/\\/engrams\\/(.+)$/)\n if (engramMatch) {\n const engrams = loadEngrams(storage.engramsPath)\n const engram = engrams.find(e => e.id === engramMatch[1])\n if (!engram) {\n throw new Error(`Engram not found: ${engramMatch[1]}`)\n }\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engram, null, 2),\n }],\n }\n }\n\n throw new Error(`Unknown resource: ${uri}`)\n })\n}\n\nconst AGENT_GUIDE = `# Datacore Agent Guide\n\n## Session Lifecycle\n1. datacore.session.start — Get relevant engrams + today's context\n2. Work on task, use datacore.recall or datacore.search as needed\n3. datacore.feedback — Rate which injected engrams helped (batch supported)\n4. datacore.session.end — Capture summary + engram suggestions\n\n## Engram Lifecycle\n- datacore.learn creates candidate engrams (or active if auto_promote enabled)\n- datacore.promote activates candidates so they appear in inject results\n- datacore.feedback with positive signals strengthens injection priority\n- datacore.forget retires engrams permanently\n- Unused engrams naturally decay over time\n\n## Quick Reference\n| Tool | Purpose |\n|------|---------|\n| session.start | Begin session with context injection |\n| session.end | End session with journal + engrams |\n| learn | Create engram from knowledge statement |\n| promote | Activate candidate engrams |\n| inject | Get relevant engrams for specific task |\n| recall | Search all sources (engrams + journal + knowledge) |\n| capture | Write journal entry or knowledge note |\n| search | Keyword/semantic file search |\n| ingest | Ingest text + extract engram suggestions |\n| feedback | Rate engrams (single or batch) |\n| forget | Retire an engram |\n| status | System health + actionable recommendations |\n| packs.discover | Browse available engram packs |\n| packs.install | Install or upgrade a pack |\n| packs.export | Export engrams as shareable pack |\n`\n\nexport function notifyEngramsChanged(server: Server): void {\n try {\n server.sendResourceUpdated?.({ uri: 'datacore://engrams/active' })\n } catch { /* ignore if not supported */ }\n}\n","// src/prompts.ts\n// MCP Prompts — server-suggested workflows that any MCP client can discover and use.\n// This is the primary bootstrap mechanism: when an AI connects, it can list these\n// prompts to understand how to use Datacore effectively.\n\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\n\ninterface PromptDef {\n name: string\n title: string\n description: string\n arguments?: Array<{ name: string; description: string; required?: boolean }>\n messages: (args: Record<string, string>) => Array<{ role: 'user' | 'assistant'; content: { type: 'text'; text: string } }>\n}\n\nconst PROMPTS: PromptDef[] = [\n {\n name: 'datacore-session',\n title: 'Start a Datacore session',\n description: 'Begin a working session with Datacore. Injects relevant context, shows today\\'s journal, and guides you through the session lifecycle.',\n arguments: [\n { name: 'task', description: 'What you are working on (optional — triggers engram injection)', required: false },\n ],\n messages: (args) => [{\n role: 'user',\n content: {\n type: 'text',\n text: `Start a new Datacore session.${args.task ? ` Task: ${args.task}` : ''}\n\nCall datacore.session.start${args.task ? ` with task: \"${args.task}\"` : ''} to begin. This will:\n- Inject relevant engrams (learned knowledge) for the task\n- Show today's journal entry if one exists\n- List any candidate engrams awaiting review\n\nWhen done working, call datacore.session.end with a summary and any new learnings.\n\nSession lifecycle:\n1. datacore.session.start → get context\n2. Work on task (use datacore.recall or datacore.search as needed)\n3. datacore.feedback → rate which injected engrams were helpful\n4. datacore.session.end → capture summary + new engrams`,\n },\n }],\n },\n {\n name: 'datacore-learn',\n title: 'Teach Datacore something',\n description: 'Record a reusable learning as an engram. Covers the full engram lifecycle: create, review, activate, reinforce.',\n arguments: [\n { name: 'statement', description: 'The knowledge to record (e.g., \"Always run tests before deploying\")', required: true },\n ],\n messages: (args) => [{\n role: 'user',\n content: {\n type: 'text',\n text: `Record this learning in Datacore: \"${args.statement || '...'}\"\n\nCall datacore.learn with the statement. This creates a candidate engram.\n\nEngram lifecycle:\n1. datacore.learn → creates candidate (not yet active)\n2. datacore.promote → activates it so it appears in future inject results\n3. datacore.inject → retrieves relevant engrams when working on tasks\n4. datacore.feedback → positive signals strengthen it, negative signals weaken it\n5. datacore.forget → retires it permanently if no longer useful\n\nEngrams that prove useful get reinforced over time. Unused ones naturally decay.`,\n },\n }],\n },\n {\n name: 'datacore-guide',\n title: 'How to use Datacore',\n description: 'Complete guide to Datacore tools, workflows, and concepts. Read this to understand the system.',\n messages: () => [{\n role: 'assistant',\n content: {\n type: 'text',\n text: `# Datacore — Persistent Memory for AI\n\nDatacore gives you persistent memory through **engrams** — typed knowledge units that get injected into context when relevant. You learn patterns, remember preferences, and build on previous work across sessions.\n\n## Core Concepts\n\n**Engrams** are reusable knowledge: \"Always validate input at API boundaries\", \"User prefers tabs over spaces\". They have activation dynamics — frequently useful ones get stronger, unused ones decay.\n\n**Journal** is your session log. Each session captures what happened, what was learned.\n\n**Knowledge** is ingested reference material — articles, notes, documents broken into searchable pieces.\n\n## Session Workflow\n\nEvery session follows this pattern:\n\n1. **datacore.session.start** — Injects relevant engrams + shows today's journal\n2. **Work** — Use datacore.recall or datacore.search to find information\n3. **datacore.feedback** — Rate which engrams were helpful (strengthens good ones)\n4. **datacore.session.end** — Capture summary + suggest new engrams\n\n## Tool Reference\n\n### Session\n| Tool | What it does |\n|------|-------------|\n| **session.start** | Begin session, inject context, show journal |\n| **session.end** | End session, capture journal + new engrams |\n\n### Core\n| Tool | What it does |\n|------|-------------|\n| **capture** | Write a journal entry or knowledge note |\n| **learn** | Create an engram (starts as candidate) |\n| **promote** | Activate candidate engrams |\n| **inject** | Get relevant engrams for a specific task |\n| **recall** | Search everything (engrams + journal + knowledge) |\n| **search** | Search journal and knowledge files |\n| **ingest** | Ingest text, extract engram suggestions |\n| **status** | System health + actionable recommendations |\n\n### Engram Management\n| Tool | What it does |\n|------|-------------|\n| **feedback** | Rate engrams: positive/negative/neutral (single or batch) |\n| **forget** | Retire an engram permanently |\n\n### Packs (Shareable Knowledge)\n| Tool | What it does |\n|------|-------------|\n| **packs.discover** | Browse available engram packs |\n| **packs.install** | Install a pack |\n| **packs.export** | Export your engrams as a pack |\n\n## Engram Lifecycle\n\n\\`\\`\\`\nlearn → candidate → promote → active → inject → feedback → stronger/weaker\n → forget (retire)\n\\`\\`\\`\n\n- **candidate**: Created but not yet active. Won't appear in inject results.\n- **active**: Appears in inject results when relevant.\n- **retired**: Permanently removed from injection.\n\nFeedback matters: positive signals increase retrieval strength, negative signals decrease it. Engrams that are never accessed naturally decay over time.\n\n## Tips\n\n- Start every session with **session.start** — it gives you relevant context\n- End every session with **session.end** — it captures what you learned\n- Use **feedback** after getting injected engrams — this is how Datacore learns what's useful\n- Use **recall** for broad searches across all sources, **search** for targeted file searches\n- Check **status** periodically — it shows actionable recommendations`,\n },\n }],\n },\n]\n\nexport function registerPrompts(server: Server): void {\n server.setRequestHandler(ListPromptsRequestSchema, async () => ({\n prompts: PROMPTS.map(p => ({\n name: p.name,\n title: p.title,\n description: p.description,\n arguments: p.arguments,\n })),\n }))\n\n server.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: promptArgs } = request.params\n const prompt = PROMPTS.find(p => p.name === name)\n if (!prompt) {\n throw new Error(`Unknown prompt: ${name}`)\n }\n return {\n description: prompt.description,\n messages: prompt.messages(promptArgs ?? {}),\n }\n })\n}\n","// src/datacortex.ts\nimport { execFile } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { logger } from './logger.js'\n\ninterface SemanticResult {\n path: string\n score: number\n snippet: string\n}\n\ninterface BridgeResponse {\n results?: SemanticResult[]\n error?: string\n}\n\nexport class DatacortexBridge {\n private pythonPath: string\n private scriptPath: string | null\n\n constructor(datacorePath: string) {\n this.pythonPath = process.env.DATACORE_PYTHON ?? 'python3'\n this.scriptPath = this.findBridgeScript(datacorePath)\n }\n\n private findBridgeScript(datacorePath: string): string | null {\n const candidates = [\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'lib', 'bridge.py'),\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'bridge.py'),\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n }\n\n isAvailable(): { available: boolean; reason?: string } {\n if (!this.scriptPath) {\n return { available: false, reason: 'Datacortex bridge script not found' }\n }\n try {\n const { execSync } = require('child_process')\n execSync(`${this.pythonPath} --version`, { timeout: 5000, stdio: 'pipe' })\n return { available: true }\n } catch {\n return { available: false, reason: `Python not found at ${this.pythonPath}` }\n }\n }\n\n async search(query: string, limit: number = 20): Promise<{ results: SemanticResult[]; fallback?: boolean }> {\n if (!this.scriptPath) {\n return { results: [], fallback: true }\n }\n\n const request = JSON.stringify({ action: 'search', query, limit })\n\n return new Promise((resolve) => {\n const proc = execFile(\n this.pythonPath,\n [this.scriptPath!],\n { timeout: 30000 },\n (error, stdout, stderr) => {\n if (error) {\n logger.warning(`Datacortex bridge error: ${error.message}`)\n resolve({ results: [], fallback: true })\n return\n }\n try {\n const response: BridgeResponse = JSON.parse(stdout.trim())\n if (response.error) {\n logger.warning(`Datacortex bridge: ${response.error}`)\n resolve({ results: [], fallback: true })\n return\n }\n resolve({ results: response.results ?? [] })\n } catch {\n logger.warning(`Datacortex bridge: invalid response`)\n resolve({ results: [], fallback: true })\n }\n },\n )\n proc.stdin?.write(request + '\\n')\n proc.stdin?.end()\n })\n }\n}\n","import { runStdio, runHttp } from './server.js'\nimport { currentVersion } from './version.js'\n\nconst args = process.argv.slice(2)\n\nif (args.includes('--version') || args.includes('-v')) {\n console.log(currentVersion)\n process.exit(0)\n}\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Datacore MCP Server v${currentVersion}\nAn MCP server that gives AI assistants persistent memory through engrams.\n\nUsage:\n npx @datacore-one/mcp Start MCP server (stdio transport)\n npx @datacore-one/mcp --http Start MCP server (HTTP transport)\n npx @datacore-one/mcp --help Show this help\n npx @datacore-one/mcp --version Show version\n\nTools:\n Core\n datacore.capture Capture a journal entry or knowledge note\n datacore.learn Create an engram from a statement\n datacore.inject Get relevant engrams for a task\n datacore.search Search journal and knowledge by keyword\n datacore.ingest Ingest text as knowledge note with engram extraction\n datacore.status System status, counts, update info\n\n Lifecycle\n datacore.feedback Signal whether an injected engram was helpful\n datacore.forget Retire an engram by ID or search\n\n Packs\n datacore.packs.discover Browse available engram packs\n datacore.packs.install Install or upgrade an engram pack\n datacore.packs.export Export personal engrams as a shareable pack\n\n Modules (full mode)\n datacore.modules.list List installed modules\n datacore.modules.info Detailed info about a module\n datacore.modules.health Health check for modules\n\nConfiguration:\n DATACORE_PATH Full installation path (default: ~/Data)\n DATACORE_CORE_PATH Core mode storage path (default: ~/Datacore)\n DATACORE_TIMEZONE IANA timezone (e.g., Europe/Ljubljana)\n DATACORE_LOG_LEVEL Log level: debug|info|warning|error (default: warning)\n DATACORE_CACHE_TTL File cache TTL in seconds (default: 60)\n DATACORE_TRANSPORT Transport: stdio or http (default: stdio)\n DATACORE_HTTP_PORT HTTP transport port (default: 3100)\n DATACORE_HTTP_HOST HTTP transport bind address (default: 127.0.0.1)\n\nExamples:\n # Add to Claude Desktop config\n { \"mcpServers\": { \"datacore\": { \"command\": \"npx\", \"args\": [\"@datacore-one/mcp\"] } } }\n\n # Run with HTTP transport on custom port\n DATACORE_HTTP_PORT=8080 npx @datacore-one/mcp --http\n`)\n process.exit(0)\n}\n\nconst useHttp = args.includes('--http') || process.env.DATACORE_TRANSPORT === 'http'\n\nconst start = useHttp ? runHttp : runStdio\nstart().catch((error) => {\n console.error('Failed to start Datacore MCP server:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["isFirstRun","fs","path","z","fs","path","args","storage","fs","yaml","z","args","fs","yaml","args","fs","path","args","start","fs","path","args","fs","path","fs","path","updateAvailable","fs","path","args","fs","path","yaml","os","args","fs","path","yaml","args","fs","path","yaml","storage","moduleTools","storage","args","storage","fs","path","args","storage","args","path","args","fs","path","args","storage","args","storage","args","storage","args","fs","path","storage","args","fs","path","execSync","args"]}