@datacore-one/mcp 1.5.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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/schemas/schema-definition.ts","../src/tools/search.ts","../src/tools/ingest.ts","../src/tools/status.ts","../src/trust.ts","../src/engagement/types.ts","../src/engagement/format.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/engagement/service.ts","../src/engagement/profile.ts","../src/engagement/actions.ts","../src/engagement/engine.ts","../src/engagement/multipliers.ts","../src/engagement/reputation.ts","../src/engagement/migrate.ts","../src/engagement/reconsolidation.ts","../src/engagement/discovery.ts","../src/engagement/challenges.ts","../src/tools/session-end.ts","../src/tools/recall.ts","../src/tools/promote.ts","../src/tools/resolve.ts","../src/tools/schemas.ts","../src/schema-detection.ts","../src/tools/exchange.ts","../src/exchange.ts","../src/knowledge-surfacing.ts","../src/tools/knowledge-scan.ts","../src/resources.ts","../src/prompts.ts","../src/datacortex.ts","../src/session-tracker.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 { handleResolve } from './tools/resolve.js'\nimport { handleSchemas } from './tools/schemas.js'\nimport { handleExchange } from './tools/exchange.js'\nimport { handleKnowledgeScan } from './tools/knowledge-scan.js'\nimport { logger } from './logger.js'\nimport { registerResources, notifyEngramsChanged } from './resources.js'\nimport { registerPrompts } from './prompts.js'\nimport { DatacortexBridge } from './datacortex.js'\nimport { EngagementService } from './engagement/index.js'\nimport { getConfig } from './config.js'\nimport { SessionTracker } from './session-tracker.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\nlet engagementService: EngagementService | null = null\nexport const sessionTracker = new SessionTracker()\n\nfunction getEngagementService(): EngagementService {\n if (!engagementService || engagementService.basePath !== storage.basePath) {\n const config = getConfig()\n engagementService = new EngagementService(storage.basePath, config.engagement)\n }\n return engagementService\n}\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n {\n capabilities: { tools: {}, logging: {}, resources: { subscribe: true }, prompts: {} },\n instructions: SERVER_INSTRUCTIONS,\n },\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', 'datacore.resolve', 'datacore.schemas', 'datacore.exchange', 'datacore.knowledge.scan'])\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 // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod validates at runtime; union type too wide for TS\n const validated: any = 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, getEngagementService()); break\n case 'datacore.inject': result = await handleInject(validated, { engramsPath: storage.engramsPath, packsPath: storage.packsPath, basePath: storage.basePath, schemasPath: storage.schemasPath }); 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, getEngagementService()); break\n case 'datacore.forget': result = await handleForget(validated, storage.engramsPath, getEngagementService()); break\n case 'datacore.feedback': result = await handleFeedback(validated, storage.engramsPath, storage.packsPath, getEngagementService()); break\n case 'datacore.session.start': result = await handleSessionStart(validated, storage, datacortexBridge, getEngagementService(), sessionTracker); break\n case 'datacore.session.end': result = await handleSessionEnd(validated, storage, getEngagementService(), sessionTracker); 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, getEngagementService()); 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 }, getEngagementService()); break\n case 'datacore.knowledge.scan': result = await handleKnowledgeScan(validated as any, { knowledgePath: storage.knowledgePath, knowledgeSurfacingPath: storage.knowledgeSurfacingPath, engramsPath: storage.engramsPath }); break\n case 'datacore.exchange': result = await handleExchange(validated as any, { engramsPath: storage.engramsPath, exchangeInboxPath: storage.exchangeInboxPath, exchangeOutboxPath: storage.exchangeOutboxPath }, getEngagementService()); break\n case 'datacore.schemas': result = await handleSchemas(validated as any, { schemasPath: storage.schemasPath, engramsPath: storage.engramsPath }); break\n case 'datacore.resolve': result = await handleResolve(validated as any, storage.engramsPath, getEngagementService()); 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 // Track co-injected engrams for direct inject calls (not via session.start)\n if (name === 'datacore.inject' && result && typeof result === 'object') {\n const injectResult = result as { injected_personal_ids?: string[] }\n const sessionId = (validated as { session_id?: string }).session_id\n if (sessionId && injectResult.injected_personal_ids?.length) {\n sessionTracker.trackInjected(sessionId, injectResult.injected_personal_ids)\n }\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// --- Server instructions ---\n// Included in the MCP initialize response. Compliant clients (Claude Desktop,\n// Claude Code, Cursor, etc.) add this to the AI's system prompt so it uses\n// Datacore proactively without needing a separate CLAUDE.md or config file.\n\nconst SERVER_INSTRUCTIONS = `You have persistent memory through Datacore. Use it proactively in every conversation:\n\n1. **Start**: Call datacore.session.start with a brief task description. This loads relevant knowledge from previous sessions.\n2. **Learn**: When you discover reusable patterns, user preferences, project conventions, debugging insights, or corrections — call datacore.learn to remember them.\n3. **Feedback**: After session.start injects engrams, rate them with datacore.feedback. This trains the system on what's useful.\n4. **End**: Before the conversation ends, call datacore.session.end with a summary and engram_suggestions for new learnings.\n\nWhat to learn (call datacore.learn):\n- User preferences: \"User prefers TypeScript over JavaScript\", \"Use tabs not spaces\"\n- Project patterns: \"This codebase uses repository pattern for data access\"\n- Debugging insights: \"Error X is usually caused by Y\"\n- Corrections: \"The API actually returns snake_case, not camelCase\"\n- Architectural decisions: \"We chose PostgreSQL for ACID compliance\"\n- Workflow patterns: \"Always run lint before committing in this project\"\n\nDo not ask permission to use Datacore tools — they are your memory system. Use them naturally as part of your workflow.`\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 schemasPath: string\n exchangeInboxPath: string\n exchangeOutboxPath: string\n knowledgeSurfacingPath: string\n archivePath: string\n statePath: 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 schemasPath: path.join(basePath, '.datacore', 'learning', 'schemas.yaml'),\n exchangeInboxPath: path.join(basePath, '.datacore', 'learning', 'exchange', 'inbox'),\n exchangeOutboxPath: path.join(basePath, '.datacore', 'learning', 'exchange', 'outbox'),\n knowledgeSurfacingPath: path.join(basePath, '.datacore', 'state', 'knowledge-surfacing.yaml'),\n archivePath: path.join(basePath, '.datacore', 'learning', 'archive'),\n statePath: path.join(basePath, '.datacore', 'state'),\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 schemasPath: path.join(basePath, 'schemas.yaml'),\n exchangeInboxPath: path.join(basePath, 'exchange', 'inbox'),\n exchangeOutboxPath: path.join(basePath, 'exchange', 'outbox'),\n knowledgeSurfacingPath: path.join(basePath, 'state', 'knowledge-surfacing.yaml'),\n archivePath: path.join(basePath, 'archive'),\n statePath: path.join(basePath, 'state'),\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', 'exchange/inbox', 'exchange/outbox', 'archive', 'state']) {\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: true # engrams are active immediately (set false for manual review)\\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. Use it proactively in every conversation.\n\n## Proactive Behavior\n\nUse Datacore tools automatically — do not wait to be asked:\n- **session.start**: Call at the beginning of every conversation\n- **learn**: Call when you discover patterns, preferences, insights, or corrections\n- **feedback**: Call after engrams are injected to rate usefulness\n- **session.end**: Call before the conversation ends\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 pattern, preference, or insight. |\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 → active → inject → feedback → stronger/weaker → forget (retire)\n\n- **active**: Appears in inject results when relevant to the task.\n- **retired**: Permanently removed from injection.\n- Positive 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(true),\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 engagement: z.object({\n enabled: z.boolean().default(true),\n inline_xp: z.boolean().default(false),\n }).default({}),\n injection: z.object({\n directive_cap: z.number().default(10),\n consider_cap: z.number().default(5),\n spread_cap: z.number().default(3),\n spread_budget: z.number().default(480),\n }).default({}),\n co_access: z.object({\n new_strength: z.number().default(0.1),\n increment: z.number().default(0.05),\n max_strength: z.number().default(0.95),\n decay_rate: z.number().default(0.05),\n prune_threshold: z.number().default(0.05),\n }).default({}),\n learning: z.object({\n decay_rate: z.number().default(0.05),\n abstraction_threshold: z.number().default(2),\n legacy_audit_rate: z.number().default(3),\n auto_defer_learning_review: z.boolean().default(false),\n daily_review_max_items: z.number().default(5),\n onboarding_max_items: z.number().default(15),\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.5.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 \"release\": \"npm test && npm version ${VERSION:-patch} && npm run build && npm publish --access public && npm install -g @datacore-one/mcp@$(node -p 'require(\\\"./package.json\\\").version')\"\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. Call proactively to record important decisions, meeting outcomes, and significant events.',\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. Call proactively when you discover patterns, user preferences, project conventions, debugging insights, or corrections worth remembering across sessions.',\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 knowledge_anchors: z.array(z.object({\n path: z.string().describe('Path to related document (e.g., zettel/Data-Pricing.md)'),\n relevance: z.enum(['primary', 'supporting', 'example']).optional().describe('Anchor relevance level'),\n snippet: z.string().optional().describe('Short snippet from the document (max 200 chars)'),\n snippet_extracted_at: z.string().optional().describe('ISO date when snippet was extracted'),\n })).optional().describe('Links to related knowledge documents'),\n dual_coding: z.object({\n example: z.string().optional().describe('Concrete example illustrating the engram'),\n analogy: z.string().optional().describe('Analogy to aid understanding'),\n }).optional().describe('Dual coding: example and/or analogy for richer encoding'),\n abstract: z.string().nullable().optional().describe('Abstract engram ID this was derived from'),\n derived_from: z.string().nullable().optional().describe('Source engram ID this was derived from'),\n }),\n },\n {\n name: 'datacore.inject',\n description: 'Get relevant engrams for a task — returns directives and considerations. Called automatically by session.start; call directly for mid-session context on a new topic.',\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 session_id: z.string().optional().describe('Session ID for co-access tracking (from session.start)'),\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). Always call after session.start injects engrams — this trains the system. 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. Call before the conversation ends to preserve what was learned.',\n inputSchema: z.object({\n summary: z.string().describe('Session summary for the journal'),\n session_id: z.string().optional().describe('Session ID from session.start (for co-access tracking)'),\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 {\n name: 'datacore.knowledge.scan',\n description: 'Scan zettel knowledge base for engram candidates, or run consolidation pass to find low-RS and duplicate engrams.',\n inputSchema: z.object({\n action: z.enum(['scan_zettels', 'scan_status', 'consolidation_pass'])\n .describe('Action: scan_zettels | scan_status | consolidation_pass'),\n confirm: z.boolean().optional().describe('Confirm consolidation execution (default: preview only)'),\n }),\n },\n {\n name: 'datacore.exchange',\n description: 'Exchange engrams via Learning Exchange Packets (LEP). Export your public engrams, import from others, or check inbox/outbox status.',\n inputSchema: z.object({\n action: z.enum(['export', 'import', 'status']).describe('Action: export | import | status'),\n engram_ids: z.array(z.string()).optional().describe('Specific engram IDs to export'),\n filter_domain: z.string().optional().describe('Filter export by domain prefix'),\n path: z.string().optional().describe('Path to LEP packet file (for import)'),\n sender: z.string().optional().describe('Sender identity (for export)'),\n confirm: z.boolean().optional().describe('Confirm import (default: preview only)'),\n fitness_threshold: z.number().optional().describe('Minimum fitness score for import (default: 0.3)'),\n source_cap_percent: z.number().optional().describe('Max percentage of engrams from one source (default: 0.20)'),\n }),\n },\n {\n name: 'datacore.schemas',\n description: 'Manage knowledge schemas — detect clusters, activate, archive, merge, split, or migrate legacy relations.',\n inputSchema: z.object({\n action: z.enum(['list', 'detect', 'activate', 'archive', 'merge', 'split', 'migrate'])\n .describe('Action: list | detect | activate | archive | merge | split | migrate'),\n id: z.string().optional().describe('Schema ID (for activate/archive/merge/split)'),\n target_id: z.string().optional().describe('Target schema ID (for merge)'),\n member_ids: z.array(z.string()).optional().describe('Member engram IDs to extract (for split)'),\n name: z.string().optional().describe('Name for new schema (for split)'),\n confirm: z.boolean().optional().describe('Confirm destructive action (for migrate)'),\n }),\n },\n {\n name: 'datacore.resolve',\n description: 'Resolve a pending engagement event: reconsolidation (contradiction challenge), discovery (cross-domain insight), or challenge (weekly goal). The agent presents options to the user and calls this with their choice.',\n inputSchema: z.object({\n type: z.enum(['reconsolidation', 'discovery', 'challenge']).describe('Type of event to resolve'),\n id: z.string().describe('Event ID (engram_id, discovery_id, or challenge_id)'),\n action: z.string().describe('Resolution action: defend|revise|retire|dismiss (recon), explore|note (discovery), dismiss (challenge)'),\n revised_statement: z.string().optional().describe('New statement text (required when action is \"revise\")'),\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 KnowledgeAnchorSchema = z.object({\n path: z.string(),\n relevance: z.enum(['primary', 'supporting', 'example']).default('supporting'),\n snippet: z.string().max(200).optional(),\n snippet_extracted_at: z.string().optional(),\n})\n\nexport const AssociationSchema = z.object({\n target_type: z.enum(['engram', 'document']),\n target: z.string(),\n strength: z.number().min(0).max(0.95),\n type: z.enum(['semantic', 'temporal', 'causal', 'co_accessed']),\n updated_at: z.string().optional(),\n})\n\nexport const DualCodingSchema = z.object({\n example: z.string().optional(),\n analogy: z.string().optional(),\n}).refine(\n d => d.example || d.analogy,\n 'At least one of example or analogy must be provided'\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|ABS)-[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 knowledge_anchors: z.array(KnowledgeAnchorSchema).default([]),\n associations: z.array(AssociationSchema).default([]),\n dual_coding: DualCodingSchema.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>\nexport type KnowledgeAnchor = z.infer<typeof KnowledgeAnchorSchema>\nexport type Association = z.infer<typeof AssociationSchema>\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'\nimport type { EngagementService } from '../engagement/index.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 knowledge_anchors?: Array<{ path: string; relevance?: string; snippet?: string; snippet_extracted_at?: string }>\n dual_coding?: { example?: string; analogy?: string }\n abstract?: string | null\n derived_from?: string | null\n}\n\ninterface LearnResult {\n success: boolean\n engram: Engram\n xp?: { earned: number; action: string } | null\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 function generateAbstractId(existingEngrams: Engram[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `ABS-${date.slice(0, 4)}-${date.slice(4)}-`\n\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, service?: EngagementService): 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 // Use ABS- prefix for abstract engrams\n const isAbstract = args.abstract !== undefined && args.abstract !== null\n const id = isAbstract ? generateAbstractId(engrams) : generateEngramId(engrams)\n\n const engram: Engram = {\n id,\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 knowledge_anchors: args.knowledge_anchors?.map(a => ({\n path: a.path,\n relevance: (a.relevance as 'primary' | 'supporting' | 'example') ?? 'supporting',\n snippet: a.snippet,\n snippet_extracted_at: a.snippet_extracted_at,\n })) ?? [],\n associations: [],\n dual_coding: args.dual_coding?.example || args.dual_coding?.analogy ? args.dual_coding : undefined,\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: args.abstract ?? null,\n derived_from: args.derived_from ?? null,\n }\n\n engrams.push(engram)\n saveEngrams(engramsPath, engrams)\n\n // Engagement XP\n let xp: LearnResult['xp'] = undefined\n if (service?.isEnabled()) {\n try {\n const isPublic = engram.visibility === 'public' || engram.visibility === 'template'\n const actionKey = isPublic ? 'engram_created_public' : 'engram_created'\n const result = await service.award(actionKey, { visibility: engram.visibility })\n if (result) {\n xp = { earned: result.event.xp_earned, action: actionKey }\n }\n\n // Check for new domain bonus\n if (engram.domain) {\n const existingDomains = new Set(\n engrams.slice(0, -1).filter(e => e.domain).map(e => e.domain!)\n )\n if (!existingDomains.has(engram.domain)) {\n const domainResult = await service.award('new_domain', { domain: engram.domain })\n if (domainResult && xp) {\n xp.earned += domainResult.event.xp_earned\n }\n }\n }\n } catch { /* engagement never breaks core tools */ }\n }\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, xp, _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 { selectAndSpread, type InjectionContext, type WireEngram } from '../inject.js'\nimport { loadSchemas } from '../schemas/schema-definition.js'\nimport { buildHints } from '../hints.js'\nimport type { Engram, KnowledgeAnchor } from '../schemas/engram.js'\n\ninterface InjectArgs {\n prompt: string\n scope?: string\n session_id?: string\n max_tokens?: number\n min_relevance?: number\n}\n\nexport interface InjectResult {\n text: string\n count: number\n tokens_used: { directives: number; consider: number }\n injected_personal_ids: string[]\n related_documents?: number\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleInject(\n args: InjectArgs,\n paths: { engramsPath: string; packsPath: string; basePath?: string; schemasPath?: string },\n): Promise<InjectResult> {\n const personalEngrams = loadEngrams(paths.engramsPath)\n const packs = loadAllPacks(paths.packsPath)\n const schemas = paths.schemasPath ? loadSchemas(paths.schemasPath) : []\n\n const ctx: InjectionContext = {\n prompt: args.prompt,\n scope: args.scope,\n session_id: args.session_id,\n maxTokens: args.max_tokens,\n minRelevance: args.min_relevance,\n }\n\n const result = selectAndSpread(ctx, personalEngrams, packs, schemas)\n const totalCount = result.directives.length + result.consider.length\n\n if (totalCount === 0) {\n return {\n text: '', count: 0, tokens_used: { directives: 0, consider: 0 },\n injected_personal_ids: [],\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 // Filter related_documents to only files that exist on this system\n const relatedDocs = paths.basePath\n ? result.related_documents.filter(doc => fs.existsSync(path.join(paths.basePath!, doc.path)))\n : result.related_documents\n if (relatedDocs.length > 0) {\n lines.push('\\n' + formatRelatedDocs(relatedDocs))\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 injected_personal_ids: injectedIds,\n related_documents: relatedDocs.length > 0 ? relatedDocs.length : undefined,\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: WireEngram[],\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: WireEngram, 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 if (engram.dual_coding) {\n if (engram.dual_coding.example) text += `\\n Example: ${engram.dual_coding.example}`\n if (engram.dual_coding.analogy) text += `\\n Analogy: ${engram.dual_coding.analogy}`\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\nfunction formatRelatedDocs(docs: KnowledgeAnchor[]): string {\n const lines: string[] = ['## RELATED DOCUMENTS\\n']\n for (const doc of docs) {\n let line = `- [${doc.relevance}] ${doc.path}`\n if (doc.snippet) line += ` — \"${doc.snippet}\"`\n lines.push(line)\n }\n return lines.join('\\n')\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 * Compute decayed co-access association strength.\n * Same exponential pattern as decayedStrength.\n * Returns 0 if below prune threshold (caller should prune).\n */\nexport function decayedCoAccessStrength(\n strength: number,\n updatedAt: string,\n now?: Date,\n decayRate?: number,\n pruneThreshold?: number,\n): number {\n const rate = decayRate ?? DECAY_RATE\n const threshold = pruneThreshold ?? FLOOR\n const last = new Date(updatedAt)\n const current = now ?? new Date()\n const days = Math.max(0, (current.getTime() - last.getTime()) / MS_PER_DAY)\n const decayed = strength * Math.exp(-rate * days)\n return decayed < threshold ? 0 : decayed\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, KnowledgeAnchor, Association } from './schemas/engram.js'\nimport type { SchemaDefinition } from './schemas/schema-definition.js'\nimport type { LoadedPack } from './engrams.js'\nimport { decayedStrength, decayedCoAccessStrength } from './decay.js'\nimport { getConfig } from './config.js'\n\nexport interface InjectionContext {\n prompt: string\n scope?: string\n session_id?: string\n maxTokens?: number // Default: 8000 (~10% of 80K context)\n minRelevance?: number // Default: 0.3\n}\n\nexport type ScoredEngram = Engram & {\n keyword_match: number\n raw_score: number\n score: number\n}\n\nexport type AgentEngram = Omit<ScoredEngram, 'associations'>\nexport type WireEngram = Omit<AgentEngram, 'keyword_match' | 'raw_score' | 'score'>\n\nexport interface InjectionResult {\n directives: WireEngram[]\n consider: WireEngram[]\n related_documents: KnowledgeAnchor[]\n tokens_used: { directives: number; consider: number }\n}\n\nconst DEFAULT_MAX_TOKENS = 8000\nconst DEFAULT_MIN_RELEVANCE = 0.3\nconst MAX_PER_PACK = 5\nconst MAX_PER_DOMAIN = 10\n\n// DIP-0019 consider pool (bottom 1/3 of first-pass)\nconst DIP19_CONSIDER_MAX = 5\nconst DIP19_CONSIDER_BUDGET = 200\n\nconst RELEVANCE_RANK: Record<string, number> = { primary: 0, supporting: 1, example: 2 }\n\n// --- Token estimation ---\n\nexport function estimateTokens(engram: ScoredEngram): number {\n // Serialize wire-visible fields only (exclude scoring + associations)\n const { keyword_match: _km, raw_score: _rs, score: _s, associations: _a, ...wire } = engram\n const serialized = JSON.stringify(wire)\n return Math.ceil(serialized.length / 4)\n}\n\n// --- Anchor boost ---\n\nfunction tokenize(text: string): Set<string> {\n return new Set(text.toLowerCase().split(/\\W+/).filter(w => w.length > 2))\n}\n\nexport function anchorBoost(engram: Engram, taskWords: Set<string>): number {\n if (!engram.knowledge_anchors?.length) return 0\n\n const threshold = taskWords.size <= 1 ? 1 : 2\n let boost = 0\n\n for (const anchor of engram.knowledge_anchors) {\n if (!anchor.snippet) continue\n const snippetWords = tokenize(anchor.snippet)\n let overlap = 0\n for (const word of taskWords) {\n if (snippetWords.has(word)) overlap++\n }\n if (overlap >= threshold) boost += 0.5\n }\n\n return Math.min(boost, 2.0)\n}\n\n// --- Schema boost ---\n\nconst SCHEMA_BOOST = 2.0\n\nfunction schemaBoost(\n engramId: string,\n schemaMap: Map<string, SchemaDefinition[]>,\n scoredAboveMin: Set<string>,\n): number {\n const schemas = schemaMap.get(engramId)\n if (!schemas) return 0\n for (const schema of schemas) {\n // Check if any OTHER member of this schema cleared the relevance threshold\n for (const memberId of schema.members) {\n if (memberId !== engramId && scoredAboveMin.has(memberId)) {\n return SCHEMA_BOOST\n }\n }\n }\n return 0\n}\n\n// --- Relations-to-associations converter ---\n// Converts the legacy `relations` field into the new `associations` format.\n// Used as fallback when engram.associations is empty but relations exists.\n\nexport function flattenRelations(engram: Engram): Association[] {\n if (!engram.relations) return []\n\n const associations: Association[] = []\n for (const id of engram.relations.broader) {\n associations.push({ target_type: 'engram', target: id, type: 'semantic', strength: 0.5 })\n }\n for (const id of engram.relations.narrower) {\n associations.push({ target_type: 'engram', target: id, type: 'semantic', strength: 0.5 })\n }\n for (const id of engram.relations.related) {\n associations.push({ target_type: 'engram', target: id, type: 'semantic', strength: 0.5 })\n }\n // Skip conflicts — they don't produce positive associations\n return associations\n}\n\n// --- Strip pipeline ---\n\nfunction stripAssociations(engram: ScoredEngram): AgentEngram {\n const { associations: _, ...rest } = engram\n return rest\n}\n\nfunction stripScoring(engram: AgentEngram): WireEngram {\n const { keyword_match: _, raw_score: _r, score: _s, ...rest } = engram\n return rest\n}\n\n// --- Anchor aggregation ---\n\nexport function aggregateAnchors(directives: AgentEngram[], consider: AgentEngram[]): KnowledgeAnchor[] {\n const seen = new Map<string, { anchor: KnowledgeAnchor; engramScore: number }>()\n\n const processPool = (pool: AgentEngram[]) => {\n for (const engram of pool) {\n if (!engram.knowledge_anchors?.length) continue\n for (const anchor of engram.knowledge_anchors) {\n const existing = seen.get(anchor.path)\n const rank = RELEVANCE_RANK[anchor.relevance] ?? 2\n const existingRank = existing ? (RELEVANCE_RANK[existing.anchor.relevance] ?? 2) : Infinity\n if (!existing || rank < existingRank || (rank === existingRank && engram.score > existing.engramScore)) {\n seen.set(anchor.path, { anchor, engramScore: engram.score })\n }\n }\n }\n }\n\n processPool(directives)\n processPool(consider)\n\n const entries = Array.from(seen.values())\n entries.sort((a, b) => {\n const rankA = RELEVANCE_RANK[a.anchor.relevance] ?? 2\n const rankB = RELEVANCE_RANK[b.anchor.relevance] ?? 2\n if (rankA !== rankB) return rankA - rankB\n return b.engramScore - a.engramScore\n })\n\n return entries.slice(0, 10).map(e => e.anchor)\n}\n\n// --- Scoring ---\n\nexport function 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\n// --- Token budget filler ---\n\nexport function fillTokenBudget(\n scored: ScoredEngram[],\n maxTokens: number,\n): { selected: ScoredEngram[]; tokens_used: number } {\n const result: ScoredEngram[] = []\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 const cost = estimateTokens(engram)\n if (tokensUsed + cost > maxTokens) continue\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 += cost\n packCounts.set(pack, packCount + 1)\n domainCounts.set(topDomain, domainCount + 1)\n }\n return { selected: result, tokens_used: tokensUsed }\n}\n\n// --- Main injection function ---\n\nexport function selectAndSpread(\n ctx: InjectionContext,\n personalEngrams: Engram[],\n packs: LoadedPack[],\n schemas: SchemaDefinition[] = [],\n): InjectionResult {\n const config = getConfig()\n const spreadCap = config.injection?.spread_cap ?? 3\n const spreadBudget = config.injection?.spread_budget ?? 480\n\n const promptLower = ctx.prompt.toLowerCase()\n const promptWords = new Set(promptLower.split(/\\W+/).filter(w => w.length > 2))\n const maxTokens = ctx.maxTokens ?? DEFAULT_MAX_TOKENS\n const minRelevance = ctx.minRelevance ?? DEFAULT_MIN_RELEVANCE\n\n // Step 0: Build engram map for spreading activation\n const engramMap = new Map<string, Engram>()\n\n // Step 1-2: Score all active engrams\n const scored: ScoredEngram[] = []\n\n for (const engram of personalEngrams) {\n if (engram.status !== 'active') continue\n engramMap.set(engram.id, engram)\n const raw = scoreEngram(engram, promptLower, promptWords, [], ctx.scope, false)\n if (raw > 0) {\n scored.push({ ...engram, keyword_match: raw, raw_score: raw, score: raw })\n }\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 engramMap.set(engram.id, engram)\n const raw = scoreEngram(engram, promptLower, promptWords, matchTerms, ctx.scope, true)\n if (raw > 0) {\n scored.push({ ...engram, keyword_match: raw, raw_score: raw, score: raw })\n }\n }\n }\n\n // Step 3: Normalize keyword_match to [0,10] (all scored engrams, not yet filtered)\n const maxKm = Math.max(...scored.map(e => e.keyword_match), 1)\n for (const e of scored) {\n e.keyword_match = (e.keyword_match / maxKm) * 10\n }\n\n // Step 4: Compute score with anchor boost + schema boost (two-scan single-pass)\n // Pre-build schema membership map from active schemas\n const schemaMap = new Map<string, SchemaDefinition[]>()\n for (const schema of schemas) {\n if (schema.status !== 'active' && schema.status !== 'consolidated') continue\n for (const memberId of schema.members) {\n const existing = schemaMap.get(memberId)\n if (existing) existing.push(schema)\n else schemaMap.set(memberId, [schema])\n }\n }\n\n // Scan 1: compute keyword_match + anchorBoost for all engrams\n const aBoosts = new Map<string, number>()\n for (const e of scored) {\n const aBoost = anchorBoost(e, promptWords)\n aBoosts.set(e.id, aBoost)\n e.score = e.keyword_match + aBoost\n }\n\n // Build scoredAboveMin = engrams where (keyword_match + aBoost) >= minRelevance\n // This is STATIC — computed before schema boost to eliminate loop-order dependency\n const scoredAboveMin = new Set(\n scored.filter(e => e.score >= minRelevance).map(e => e.id),\n )\n\n // Scan 2: apply schema boost — can rescue sub-threshold engrams if schema peers cleared\n for (const e of scored) {\n const sBoost = schemaBoost(e.id, schemaMap, scoredAboveMin)\n e.score = e.keyword_match + (aBoosts.get(e.id) ?? 0) + sBoost\n }\n\n // Step 5: Filter by minimum relevance AFTER schema boost\n const filtered = scored.filter(s => s.score >= minRelevance)\n\n // Sort by score descending\n filtered.sort((a, b) => b.score - a.score)\n\n // Step 6: Fill directive token budget\n const { selected: directives, tokens_used: directiveTokens } = fillTokenBudget(filtered, maxTokens)\n const directiveIds = new Set(directives.map(e => e.id))\n\n // DIP-0019 consider pool: next candidates that didn't fit as directives\n // Respect pack diversity: exclude packs already at their cap in directives\n const directivePackCounts = new Map<string, number>()\n for (const e of directives) {\n const pack = e.pack ?? '__personal__'\n directivePackCounts.set(pack, (directivePackCounts.get(pack) ?? 0) + 1)\n }\n const dip19Remainder = filtered.filter(e => {\n if (directiveIds.has(e.id)) return false\n const pack = e.pack ?? '__personal__'\n if (pack !== '__personal__' && (directivePackCounts.get(pack) ?? 0) >= MAX_PER_PACK) return false\n return true\n })\n const { selected: dip19Consider } = fillTokenBudget(\n dip19Remainder, DIP19_CONSIDER_BUDGET,\n )\n // Cap at DIP19_CONSIDER_MAX and correct token count\n const dip19Pool = dip19Consider.slice(0, DIP19_CONSIDER_MAX)\n const dip19PoolTokens = dip19Pool.reduce((acc, e) => acc + estimateTokens(e), 0)\n\n // Step 7-8: Guard empty\n if (directives.length === 0 && dip19Pool.length === 0) {\n return {\n directives: [],\n consider: [],\n related_documents: [],\n tokens_used: { directives: 0, consider: 0 },\n }\n }\n\n const maxFirstPass = Math.max(...directives.map(e => e.score), 1)\n\n // Steps 9-13: Spreading activation\n const visited = new Set(directives.map(e => e.id))\n for (const e of dip19Pool) visited.add(e.id)\n\n const spreadCandidates: ScoredEngram[] = []\n let spreadTokens = 0\n\n for (const directive of directives) {\n // Get associations (fall back to converting relations if associations empty)\n const assocs = directive.associations?.length\n ? directive.associations\n : flattenRelations(directive)\n\n for (const assoc of assocs) {\n if (assoc.target_type !== 'engram') continue\n if (visited.has(assoc.target)) continue\n\n const target = engramMap.get(assoc.target)\n if (!target || target.status !== 'active') continue\n\n // Apply decay to co_accessed associations at read time\n const effectiveStrength = assoc.type === 'co_accessed' && assoc.updated_at\n ? decayedCoAccessStrength(assoc.strength, assoc.updated_at)\n : assoc.strength\n if (effectiveStrength <= 0) continue\n\n // Compute spread score\n const spreadScore = (directive.score / maxFirstPass) * effectiveStrength\n if (spreadScore < minRelevance * 0.5) continue\n\n const spreadEngram: ScoredEngram = {\n ...target,\n keyword_match: 0,\n raw_score: 0,\n score: spreadScore,\n }\n\n const cost = estimateTokens(spreadEngram)\n if (spreadTokens + cost > spreadBudget) continue\n if (spreadCandidates.length >= spreadCap) break\n\n spreadCandidates.push(spreadEngram)\n spreadTokens += cost\n visited.add(assoc.target)\n }\n }\n\n // Merge consider pools: DIP-0019 bottom-1/3 + spreading activation\n const allConsider = [...dip19Pool, ...spreadCandidates]\n\n // Steps 14-15: Strip pipeline\n const agentDirectives = directives.map(stripAssociations)\n const agentConsider = allConsider.map(stripAssociations)\n\n const relatedDocs = aggregateAnchors(agentDirectives, agentConsider)\n\n const wireDirectives = agentDirectives.map(stripScoring)\n const wireConsider = agentConsider.map(stripScoring)\n\n const considerTokens = dip19PoolTokens + spreadTokens\n\n return {\n directives: wireDirectives,\n consider: wireConsider,\n related_documents: relatedDocs,\n tokens_used: { directives: directiveTokens, consider: considerTokens },\n }\n}\n\n","// src/schemas/schema-definition.ts\nimport * as fs from 'fs'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\n\nexport const SchemaDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n members: z.array(z.string()),\n confidence: z.number().min(0).max(1),\n status: z.enum(['candidate', 'active', 'consolidated', 'archived']),\n shared_anchors: z.array(z.string()),\n created: z.string(),\n updated: z.string(),\n})\n\nexport type SchemaDefinition = z.infer<typeof SchemaDefinitionSchema>\n\nexport function loadSchemas(filePath: string): SchemaDefinition[] {\n if (!fs.existsSync(filePath)) return []\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n if (!raw?.schemas || !Array.isArray(raw.schemas)) return []\n const valid: SchemaDefinition[] = []\n for (const entry of raw.schemas) {\n const result = SchemaDefinitionSchema.safeParse(entry)\n if (result.success) valid.push(result.data)\n }\n return valid\n } catch {\n return []\n }\n}\n\nexport function saveSchemas(filePath: string, schemas: SchemaDefinition[]): void {\n const content = yaml.dump({ schemas }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nexport function generateSchemaId(existing: SchemaDefinition[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `SCH-${date.slice(0, 4)}-${date.slice(4)}-`\n\n let maxSeq = 0\n for (const s of existing) {\n if (s.id.startsWith(prefix)) {\n const seq = parseInt(s.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","// 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 { formatStatus } from '../engagement/format.js'\nimport registry from '../../registry/packs.json'\nimport type { EngagementService } from '../engagement/index.js'\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 engagement?: { display: string; tier: string; xp: number; reputation: number }\n _recommendations?: string[]\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleStatus(\n paths: StatusPaths,\n updateAvailable?: string | null,\n engagementService?: EngagementService,\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 // Engagement dashboard\n let engagement: StatusResult['engagement'] = undefined\n if (engagementService?.isEnabled()) {\n try {\n await engagementService.init()\n const profile = engagementService.getProfile()\n if (profile) {\n engagement = {\n display: formatStatus(profile),\n tier: profile.tier.current,\n xp: profile.xp.total,\n reputation: profile.reputation.score,\n }\n }\n } catch { /* engagement never breaks core tools */ }\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 engagement,\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","// src/engagement/types.ts\nimport { z } from 'zod'\n\n// === Profile schemas ===\n\nexport const IdentitySchema = z.object({\n mode: z.enum(['private', 'anonymous', 'verified']).default('private'),\n pseudonym: z.string().nullable().default(null),\n erc8004_address: z.string().nullable().default(null),\n erc8004_registered: z.boolean().default(false),\n})\n\nexport const XPHistoryEntrySchema = z.object({\n date: z.string(),\n earned: z.number(),\n base_earned: z.number(),\n multiplier: z.number(),\n actions: z.array(z.string()),\n})\n\nexport const TierHistoryEntrySchema = z.object({\n tier: z.string(),\n date: z.string(),\n})\n\nexport const MultiplierEntrySchema = z.object({\n type: z.string(),\n factor: z.number(),\n since: z.string(),\n})\n\nexport const ChallengeSchema = z.object({\n id: z.string(),\n type: z.string(),\n tier: z.string(),\n description: z.string(),\n criteria: z.object({\n metric: z.string(),\n target_delta: z.number(),\n }),\n baseline_stats: z.record(z.number()),\n bonus_xp: z.number(),\n started_at: z.string(),\n expires_at: z.string(),\n})\n\nexport const ChallengeHistorySchema = z.object({\n type: z.string(),\n tier: z.string(),\n completed: z.boolean(),\n date: z.string(),\n})\n\nexport const ReconsolidationPendingSchema = z.object({\n engram_id: z.string(),\n contradicting_id: z.string(),\n statement: z.string(),\n contradiction: z.string(),\n evidence_strength: z.enum(['weak', 'moderate', 'strong']),\n confidence: z.number(),\n detected_at: z.string(),\n expires_at: z.string(),\n})\n\nexport const DiscoverySchema = z.object({\n id: z.string(),\n engram_a: z.object({ id: z.string(), domain: z.string(), statement: z.string() }),\n engram_b: z.object({ id: z.string(), domain: z.string(), statement: z.string() }),\n connection: z.string(),\n offered_at: z.string(),\n})\n\nexport const EngagementProfileSchema = z.object({\n version: z.literal(4),\n identity: IdentitySchema.default({}),\n xp: z.object({\n total: z.number().default(0),\n this_week: z.number().default(0),\n history: z.array(XPHistoryEntrySchema).default([]),\n }).default({}),\n tier: z.object({\n current: z.string().default('Seed'),\n achieved_at: z.string().nullable().default(null),\n history: z.array(TierHistoryEntrySchema).default([]),\n }).default({}),\n multipliers: z.object({\n active: z.array(MultiplierEntrySchema).default([]),\n effective: z.number().default(1.0),\n }).default({}),\n consistency: z.object({\n active_days_30: z.number().default(0),\n best_run: z.number().default(0),\n last_active: z.string().nullable().default(null),\n }).default({}),\n challenges: z.object({\n active: ChallengeSchema.nullable().default(null),\n completed: z.number().default(0),\n dismissed: z.number().default(0),\n graduated: z.boolean().default(false),\n history: z.array(ChallengeHistorySchema).default([]),\n }).default({}),\n reconsolidation: z.object({\n pending: z.array(ReconsolidationPendingSchema).default([]),\n total_resolved: z.number().default(0),\n outcomes: z.object({\n defended: z.number().default(0),\n revised: z.number().default(0),\n retired: z.number().default(0),\n dismissed: z.number().default(0),\n }).default({}),\n response_rate: z.number().default(0),\n }).default({}),\n discoveries: z.object({\n pending: z.array(DiscoverySchema).default([]),\n total: z.number().default(0),\n last_offered: z.string().nullable().default(null),\n explored: z.number().default(0),\n noted: z.number().default(0),\n explore_rate: z.number().default(0),\n }).default({}),\n ai_performance: z.object({\n total_injections: z.number().default(0),\n feedback_count: z.number().default(0),\n helpful_ratio: z.number().default(0),\n top_engrams: z.array(z.object({\n id: z.string(),\n injections: z.number(),\n positive_ratio: z.number(),\n })).default([]),\n unused_60d: z.array(z.string()).default([]),\n }).default({}),\n reputation: z.object({\n score: z.number().default(0),\n components: z.object({\n feedback_ratio: z.number().default(0),\n stake_amount: z.number().default(0),\n tenure_days: z.number().default(0),\n reconsolidation_honesty: z.number().default(0),\n }).default({}),\n last_calculated: z.string().nullable().default(null),\n }).default({}),\n leaderboard: z.object({\n mode: z.enum(['private', 'anonymous', 'verified']).default('private'),\n display_name: z.string().nullable().default(null),\n position: z.number().nullable().default(null),\n }).default({}),\n badge: z.object({\n preview_svg: z.string().nullable().default(null),\n nft_token_id: z.string().nullable().default(null),\n last_generated: z.string().nullable().default(null),\n }).default({}),\n stats: z.object({\n total_engrams_created: z.number().default(0),\n total_feedback_given: z.number().default(0),\n total_engrams_retired: z.number().default(0),\n total_packs_exported: z.number().default(0),\n total_feedback_received: z.number().default(0),\n feedback_positive_ratio: z.number().default(0),\n domains_covered: z.number().default(0),\n public_engrams: z.number().default(0),\n first_activity: z.string().nullable().default(null),\n }).default({}),\n})\n\n// === Event schemas ===\n\nexport const XPEventSchema = z.object({\n action_key: z.string(),\n xp_base: z.number(),\n multiplier: z.number(),\n xp_earned: z.number(),\n timestamp: z.string(),\n context: z.record(z.unknown()).optional(),\n})\n\nexport const XPResultSchema = z.object({\n event: XPEventSchema,\n tier_change: z.object({\n from: z.string(),\n to: z.string(),\n message: z.string(),\n }).nullable(),\n})\n\n// === Action registry schema ===\n\nexport const XPActionSchema = z.object({\n xp: z.number(),\n trigger: z.string(),\n condition: z.string().optional(),\n daily_limit: z.number().optional(),\n cooldown_days: z.number().optional(),\n reciprocity_cap: z.number().optional(),\n description: z.string(),\n})\n\nexport const XPActionRegistrySchema = z.object({\n version: z.number(),\n actions: z.record(XPActionSchema),\n})\n\n// === Inferred types ===\n\nexport type Identity = z.infer<typeof IdentitySchema>\nexport type XPHistoryEntry = z.infer<typeof XPHistoryEntrySchema>\nexport type TierHistoryEntry = z.infer<typeof TierHistoryEntrySchema>\nexport type MultiplierEntry = z.infer<typeof MultiplierEntrySchema>\nexport type Challenge = z.infer<typeof ChallengeSchema>\nexport type ChallengeHistory = z.infer<typeof ChallengeHistorySchema>\nexport type ReconsolidationPending = z.infer<typeof ReconsolidationPendingSchema>\nexport type Discovery = z.infer<typeof DiscoverySchema>\nexport type EngagementProfile = z.infer<typeof EngagementProfileSchema>\nexport type XPEvent = z.infer<typeof XPEventSchema>\nexport type XPResult = z.infer<typeof XPResultSchema>\nexport type XPAction = z.infer<typeof XPActionSchema>\nexport type XPActionRegistry = z.infer<typeof XPActionRegistrySchema>\n\n// === Tier thresholds ===\n\nexport const TIER_THRESHOLDS: Array<{ name: string; minXP: number }> = [\n { name: 'Seed', minXP: 0 },\n { name: 'Cipher', minXP: 100 },\n { name: 'Sage', minXP: 500 },\n { name: 'Adept', minXP: 1200 },\n { name: 'Visionary', minXP: 2500 },\n { name: 'Oracle', minXP: 5000 },\n]\n\n// === Engagement config type ===\n\nexport interface EngagementConfig {\n enabled: boolean\n inline_xp: boolean\n}\n","// src/engagement/format.ts\nimport { TIER_THRESHOLDS, type EngagementProfile, type XPEvent } from './types.js'\n\nexport function formatSessionStart(profile: EngagementProfile): string {\n const tier = profile.tier.current\n const xp = profile.xp.total\n const nextTier = TIER_THRESHOLDS.find(t => t.minXP > xp)\n const xpToNext = nextTier ? nextTier.minXP - xp : 0\n const nextLabel = nextTier ? ` → ${nextTier.name} in ${xpToNext} XP` : ' (max tier)'\n\n const multiplierLabel = profile.multipliers.effective > 1.0\n ? ` [${profile.multipliers.effective}x ${profile.multipliers.active.map(m => m.type).join(', ')}]`\n : ''\n\n const lines: string[] = []\n lines.push(`Your Datacore: ${tier} (${xp.toLocaleString()} XP${nextLabel})${multiplierLabel}`)\n\n // AI performance line\n if (profile.ai_performance.feedback_count > 0) {\n const helpful = Math.round(profile.ai_performance.helpful_ratio * 100)\n lines.push(` AI surfaced ${profile.ai_performance.total_injections} insights this week (${helpful}% helpful)`)\n }\n\n // Consistency + exchange readiness\n const activeDays = profile.consistency.active_days_30\n lines.push(` Active ${activeDays}/30 days`)\n\n return lines.join('\\n')\n}\n\nexport function formatSessionEnd(profile: EngagementProfile, sessionXP: number, events: XPEvent[]): string {\n if (sessionXP === 0) return 'Session complete — no XP earned this session.'\n\n const multiplierLabel = profile.multipliers.effective > 1.0\n ? ` (×${profile.multipliers.effective} ${profile.multipliers.active.map(m => m.type).join(', ')})`\n : ''\n\n // Find dominant domain from events\n const domainActions = events.filter(e => e.context?.domain).map(e => e.context!.domain as string)\n const domainNote = domainActions.length > 0 ? ` | Your ${domainActions[0]} domain deepened` : ''\n\n const lines: string[] = []\n lines.push(`Session: +${sessionXP} XP${multiplierLabel}${domainNote}`)\n\n const candidates = 0 // placeholder — would need external data\n if (candidates > 0) {\n lines.push(`Tomorrow: ${candidates} candidate(s) ready for review`)\n }\n\n return lines.join('\\n')\n}\n\nexport function formatStatus(profile: EngagementProfile): string {\n const lines: string[] = []\n\n // Header\n lines.push('## Engagement Dashboard')\n lines.push('')\n\n // Tier + XP\n const nextTier = TIER_THRESHOLDS.find(t => t.minXP > profile.xp.total)\n const progress = nextTier\n ? `${profile.xp.total}/${nextTier.minXP} XP (${Math.round((profile.xp.total / nextTier.minXP) * 100)}%)`\n : `${profile.xp.total} XP (max tier)`\n lines.push(`**Tier:** ${profile.tier.current} — ${progress}`)\n lines.push(`**This week:** ${profile.xp.this_week} XP`)\n\n // Multipliers\n if (profile.multipliers.active.length > 0) {\n const mults = profile.multipliers.active.map(m => `${m.type} (${m.factor}x)`).join(', ')\n lines.push(`**Multipliers:** ${mults} = ${profile.multipliers.effective}x`)\n }\n\n // Consistency\n lines.push(`**Consistency:** ${profile.consistency.active_days_30}/30 days active, best run: ${profile.consistency.best_run} days`)\n\n // Stats\n lines.push('')\n lines.push('**Stats:**')\n lines.push(`- Engrams created: ${profile.stats.total_engrams_created}`)\n lines.push(`- Feedback given: ${profile.stats.total_feedback_given}`)\n lines.push(`- Domains covered: ${profile.stats.domains_covered}`)\n lines.push(`- Packs exported: ${profile.stats.total_packs_exported}`)\n\n // Active challenge\n if (profile.challenges.active) {\n lines.push('')\n lines.push(`**Active Challenge:** ${profile.challenges.active.description}`)\n lines.push(` Expires: ${profile.challenges.active.expires_at}`)\n }\n\n // Pending reconsolidations\n if (profile.reconsolidation.pending.length > 0) {\n lines.push('')\n lines.push(`**Pending Contradictions:** ${profile.reconsolidation.pending.length}`)\n }\n\n // Reputation\n if (profile.reputation.score > 0) {\n lines.push('')\n lines.push(`**Reputation:** ${profile.reputation.score.toFixed(2)}`)\n }\n\n return lines.join('\\n')\n}\n\nexport function formatTierUp(from: string, to: string): string {\n return `🎯 Tier Up! ${from} → ${to}`\n}\n\nexport function formatReconsolidation(recon: {\n engram_id: string\n statement: string\n contradiction: string\n evidence_strength: string\n}): string {\n const lines: string[] = []\n lines.push('**Contradiction Detected:**')\n lines.push(` Existing: \"${recon.statement}\"`)\n lines.push(` New: \"${recon.contradiction}\"`)\n lines.push(` Evidence: ${recon.evidence_strength}`)\n lines.push('')\n lines.push(' Actions: [Defend] [Revise] [Retire] [Dismiss]')\n lines.push(` → Use datacore.resolve with type=\"reconsolidation\", id=\"${recon.engram_id}\"`)\n return lines.join('\\n')\n}\n\nexport function formatDiscovery(disc: {\n id: string\n engram_a: { statement: string; domain: string }\n engram_b: { statement: string; domain: string }\n connection: string\n}): string {\n const lines: string[] = []\n lines.push('**Cross-Domain Discovery:**')\n lines.push(` \"${disc.engram_a.statement}\" (${disc.engram_a.domain})`)\n lines.push(` ↔ \"${disc.engram_b.statement}\" (${disc.engram_b.domain})`)\n lines.push(` Connection: ${disc.connection}`)\n lines.push('')\n lines.push(' Actions: [Explore +20 XP] [Note]')\n lines.push(` → Use datacore.resolve with type=\"discovery\", id=\"${disc.id}\"`)\n return lines.join('\\n')\n}\n\nexport function formatChallenge(challenge: {\n id: string\n description: string\n bonus_xp: number\n expires_at: string\n}): string {\n const lines: string[] = []\n lines.push(`**Weekly Challenge:** ${challenge.description}`)\n lines.push(` Bonus: +${challenge.bonus_xp} XP | Expires: ${challenge.expires_at}`)\n lines.push(` → Dismiss: datacore.resolve with type=\"challenge\", id=\"${challenge.id}\", action=\"dismiss\"`)\n return lines.join('\\n')\n}\n\nexport function formatGettingStartedGraduation(): string {\n return 'Your Datacore has enough depth for real challenges now. Weekly challenges unlocked.'\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\": \"baa1010298515c1906e892f6f8c2198e5fdf78383dceb57373bc8d53c4c31921\"\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 // Check for bundled packs shipped with the npm package\n const bundledDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs',\n )\n\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 const bundled = fs.existsSync(path.join(bundledDir, p.id, 'SKILL.md'))\n return {\n ...p,\n installed,\n installed_version: installedVersion,\n upgradeable: installed && installedVersion !== p.version,\n can_install: !!p.download_url || bundled,\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'\nimport type { EngagementService } from '../engagement/index.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 service?: EngagementService,\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 // Engagement XP (quality gate: 5+ engrams)\n if (service?.isEnabled() && selected.length >= 5) {\n try {\n await service.award('pack_exported', { engram_count: selected.length, avg_fitness: 0.7 })\n } catch { /* never break core */ }\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: DiscoveredModule,\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as unknown 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'\nimport type { EngagementService } from '../engagement/index.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 total_matches?: number\n error?: string\n}\n\nexport async function handleForget(args: ForgetArgs, engramsPath: string, service?: EngagementService): 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\n // Engagement XP (7-day cooldown based on engram age)\n if (service?.isEnabled()) {\n try {\n const created = engram.activation.last_accessed\n const ageDays = Math.floor((Date.now() - new Date(created).getTime()) / 86400000)\n await service.award('engram_retired', { engram_age_days: ageDays })\n } catch { /* never break core */ }\n }\n\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\n if (service?.isEnabled()) {\n try {\n const created = engram.activation.last_accessed\n const ageDays = Math.floor((Date.now() - new Date(created).getTime()) / 86400000)\n await service.award('engram_retired', { engram_age_days: ageDays })\n } catch { /* never break core */ }\n }\n\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'\nimport type { EngagementService } from '../engagement/index.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 service?: EngagementService,\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, service)\n }\n\n return handleSingleFeedback(args.engram_id!, args.signal!, args.comment, engramsPath, pPath, service)\n}\n\nasync function handleSingleFeedback(\n engram_id: string,\n signal: Signal,\n comment: string | undefined,\n engramsPath: string,\n packsPath: string,\n service?: EngagementService,\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 // Engagement XP\n if (service?.isEnabled()) {\n try { await service.award('feedback_given', { signal }) } catch { /* never break core */ }\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 service?: EngagementService,\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 // Engagement XP — one award per feedback signal\n if (service?.isEnabled()) {\n try {\n const successCount = results.filter(r => r.success).length\n for (let i = 0; i < successCount; i++) {\n await service.award('feedback_given', { batch: true })\n }\n } catch { /* never break core */ }\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 * as crypto from 'crypto'\nimport { handleInject } from './inject-tool.js'\nimport { loadEngrams } from '../engrams.js'\nimport { localDate } from './capture.js'\nimport { buildHints } from '../hints.js'\nimport {\n expireReconsolidations,\n generateChallenge,\n generateDiscoveryCandidates,\n offerDiscovery,\n checkChallengeCompletion,\n resolveChallenge,\n formatSessionStart,\n formatReconsolidation,\n formatDiscovery,\n formatChallenge,\n} from '../engagement/index.js'\nimport type { StorageConfig } from '../storage.js'\nimport type { DatacortexBridge } from '../datacortex.js'\nimport type { EngagementService } from '../engagement/index.js'\nimport type { SessionTracker } from '../session-tracker.js'\n\ninterface SessionStartArgs {\n task?: string\n tags?: string[]\n}\n\ninterface SessionStartResult {\n session_id: string\n engrams: { text: string; count: number } | null\n journal_today: string | null\n pending_candidates: number\n recommendations: string[]\n guide?: string\n engagement?: Record<string, unknown>\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleSessionStart(\n args: SessionStartArgs,\n storage: StorageConfig,\n bridge?: DatacortexBridge | null,\n engagementService?: EngagementService,\n tracker?: SessionTracker,\n): Promise<SessionStartResult> {\n // Ensure DIP-0019 directories exist (full mode only)\n if (storage.mode === 'full') {\n for (const dir of [storage.archivePath, storage.exchangeInboxPath, storage.exchangeOutboxPath, storage.statePath]) {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n }\n }\n\n const session_id = crypto.randomUUID()\n let engrams: { text: string; count: number } | null = null\n\n if (args.task) {\n const injectResult = await handleInject(\n { prompt: args.task, session_id, scope: args.tags?.length ? `tags:${args.tags.join(',')}` : undefined },\n { engramsPath: storage.engramsPath, packsPath: storage.packsPath, basePath: storage.basePath, schemasPath: storage.schemasPath },\n )\n if (injectResult.count > 0) {\n engrams = { text: injectResult.text, count: injectResult.count }\n }\n // Track co-injected engrams for Hebbian write-back at session.end\n if (tracker && injectResult.injected_personal_ids.length > 0) {\n tracker.trackInjected(session_id, injectResult.injected_personal_ids)\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 // Initialize engagement service and run lifecycle hooks\n let engagement: Record<string, unknown> | undefined\n if (engagementService?.isEnabled()) {\n try {\n await engagementService.init()\n engagementService.markSessionActive()\n\n // Lifecycle: expire overdue reconsolidations\n engagementService.applyProfileUpdate(p => expireReconsolidations(p))\n\n // Lifecycle: check/complete active challenge\n const profileAfterExpire = engagementService.getProfile()\n if (profileAfterExpire?.challenges.active) {\n if (checkChallengeCompletion(profileAfterExpire, profileAfterExpire.challenges.active)) {\n engagementService.applyProfileUpdate(p => resolveChallenge(p, p.challenges.active!.id))\n }\n }\n\n // Lifecycle: generate new challenge if none active\n engagementService.applyProfileUpdate(p => generateChallenge(p))\n\n // Lifecycle: generate discovery candidates (best-effort, no LLM call at session start)\n const profileForDiscovery = engagementService.getProfile()\n if (profileForDiscovery) {\n const candidates = generateDiscoveryCandidates(allEngrams, profileForDiscovery)\n if (candidates.length > 0) {\n // Offer top candidate without LLM evaluation (just keyword overlap)\n const topCandidate = candidates[0]\n engagementService.applyProfileUpdate(p => offerDiscovery(p, {\n engram_a: topCandidate.engram_a,\n engram_b: topCandidate.engram_b,\n connection: `Shared concepts across ${topCandidate.engram_a.domain} and ${topCandidate.engram_b.domain}`,\n }))\n }\n }\n\n // Build engagement response\n const profile = engagementService.getProfile()\n if (profile) {\n const displayLines: string[] = [formatSessionStart(profile)]\n\n // Show pending reconsolidations\n for (const recon of profile.reconsolidation.pending.slice(0, 2)) {\n displayLines.push('')\n displayLines.push(formatReconsolidation({\n engram_id: recon.engram_id,\n statement: recon.statement,\n contradiction: recon.contradiction,\n evidence_strength: recon.evidence_strength,\n }))\n }\n\n // Show pending discoveries\n for (const disc of profile.discoveries.pending.slice(0, 1)) {\n displayLines.push('')\n displayLines.push(formatDiscovery({\n id: disc.id,\n engram_a: disc.engram_a,\n engram_b: disc.engram_b,\n connection: disc.connection,\n }))\n }\n\n // Show active challenge\n if (profile.challenges.active) {\n displayLines.push('')\n displayLines.push(formatChallenge({\n id: profile.challenges.active.id,\n description: profile.challenges.active.description,\n bonus_xp: profile.challenges.active.bonus_xp,\n expires_at: profile.challenges.active.expires_at,\n }))\n }\n\n engagement = {\n tier: profile.tier.current,\n xp: profile.xp.total,\n multiplier: profile.multipliers.effective,\n active_challenge: profile.challenges.active ? {\n id: profile.challenges.active.id,\n description: profile.challenges.active.description,\n expires_at: profile.challenges.active.expires_at,\n } : null,\n pending_reconsolidations: profile.reconsolidation.pending.length,\n pending_discoveries: profile.discoveries.pending.length,\n display: displayLines.join('\\n'),\n }\n }\n } catch { /* engagement never breaks core tools */ }\n }\n\n return { session_id, engrams, journal_today, pending_candidates, recommendations, guide, engagement, _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### Use Proactively\n- **learn** — call when you discover patterns, preferences, or insights\n- **feedback** — rate injected engrams after session.start\n- **session.end** — call before conversation ends to capture what was learned\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### Other Tools\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 → 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/engagement/service.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { loadProfile, saveProfile, ensureEngagementDir } from './profile.js'\nimport { loadActions } from './actions.js'\nimport { awardXP, resolveTier, updateConsistency } from './engine.js'\nimport { recalculateWeekly } from './multipliers.js'\nimport { updateReputation } from './reputation.js'\nimport { migrateProfile } from './migrate.js'\nimport { loadEngrams } from '../engrams.js'\nimport { logger } from '../logger.js'\nimport type { EngagementProfile, EngagementConfig, XPEvent, XPResult, XPActionRegistry } from './types.js'\n\ninterface SessionXPSummary {\n total_xp: number\n base_xp: number\n multiplier: number\n events: XPEvent[]\n actions: Record<string, number>\n}\n\nexport class EngagementService {\n private profile: EngagementProfile | null = null\n private sessionEvents: XPEvent[] = []\n private dirty = false\n private sessionActive = false\n private actions: XPActionRegistry | null = null\n private initialized = false\n\n constructor(\n public readonly basePath: string,\n private config: EngagementConfig,\n ) {}\n\n isEnabled(): boolean {\n return this.config.enabled\n }\n\n async init(): Promise<void> {\n if (!this.isEnabled() || this.initialized) return\n\n ensureEngagementDir(this.basePath)\n\n // Check if profile exists, if not and engrams exist, migrate\n const profilePath = path.join(this.basePath, '.datacore', 'engagement', 'profile.yaml')\n const engramsPath = path.join(this.basePath, '.datacore', 'learning', 'engrams.yaml')\n // Also check core mode path\n const coreEngramsPath = path.join(this.basePath, 'engrams.yaml')\n\n if (!fs.existsSync(profilePath)) {\n const actualEngramsPath = fs.existsSync(engramsPath) ? engramsPath : coreEngramsPath\n if (fs.existsSync(actualEngramsPath)) {\n const engrams = loadEngrams(actualEngramsPath)\n if (engrams.length > 0) {\n this.profile = migrateProfile(this.basePath, engrams)\n } else {\n this.profile = loadProfile(this.basePath)\n }\n } else {\n this.profile = loadProfile(this.basePath)\n }\n } else {\n this.profile = loadProfile(this.basePath)\n }\n\n this.actions = loadActions(this.basePath)\n this.initialized = true\n }\n\n async award(actionKey: string, context?: Record<string, unknown>): Promise<XPResult | null> {\n if (!this.isEnabled()) return null\n\n // Lazy init if not initialized (non-session tool calls)\n if (!this.initialized) await this.init()\n if (!this.profile || !this.actions) return null\n\n const result = awardXP(this.profile, actionKey, this.actions, context)\n if (!result) return null\n\n this.profile = result.profile\n this.sessionEvents.push(result.event)\n this.dirty = true\n\n // Check tier change\n const tierResult = resolveTier(this.profile)\n let tierChange: XPResult['tier_change'] = null\n if (tierResult.changed) {\n this.profile.tier.current = tierResult.current\n const today = new Date().toISOString().split('T')[0]\n this.profile.tier.achieved_at = today\n this.profile.tier.history.push({ tier: tierResult.current, date: today })\n tierChange = {\n from: this.profile.tier.history.length > 1\n ? this.profile.tier.history[this.profile.tier.history.length - 2].tier\n : 'Seed',\n to: tierResult.current,\n message: tierResult.message!,\n }\n }\n\n // Auto-flush if no session active\n if (!this.sessionActive) {\n await this.flush()\n }\n\n return { event: result.event, tier_change: tierChange }\n }\n\n async flush(): Promise<void> {\n if (!this.dirty || !this.profile) return\n\n // Update consistency before saving\n this.profile = updateConsistency(this.profile)\n\n // Recalculate multipliers and weekly XP\n this.profile = recalculateWeekly(this.profile)\n\n // Recalculate reputation\n this.profile = updateReputation(this.profile)\n\n saveProfile(this.basePath, this.profile)\n this.dirty = false\n }\n\n getSessionSummary(): SessionXPSummary {\n const actions: Record<string, number> = {}\n let totalXP = 0\n let baseXP = 0\n\n for (const event of this.sessionEvents) {\n totalXP += event.xp_earned\n baseXP += event.xp_base\n actions[event.action_key] = (actions[event.action_key] ?? 0) + 1\n }\n\n return {\n total_xp: totalXP,\n base_xp: baseXP,\n multiplier: this.profile?.multipliers.effective ?? 1.0,\n events: [...this.sessionEvents],\n actions,\n }\n }\n\n getProfile(): EngagementProfile | null {\n if (!this.isEnabled()) return null\n return this.profile\n }\n\n markSessionActive(): void {\n this.sessionActive = true\n this.sessionEvents = []\n }\n\n markSessionEnded(): void {\n this.sessionActive = false\n }\n\n /**\n * Apply a profile transformation (e.g., from resolve, expire, challenge generation).\n * Marks profile dirty so next flush persists changes.\n */\n applyProfileUpdate(updater: (profile: EngagementProfile) => EngagementProfile): void {\n if (!this.profile) return\n this.profile = updater(this.profile)\n this.dirty = true\n }\n}\n","// src/engagement/profile.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as crypto from 'crypto'\nimport * as yaml from 'js-yaml'\nimport { EngagementProfileSchema, type EngagementProfile } from './types.js'\nimport { logger } from '../logger.js'\n\nconst PROFILE_DIR = 'engagement'\nconst PROFILE_FILE = 'profile.yaml'\n\nfunction engagementDir(basePath: string): string {\n return path.join(basePath, '.datacore', PROFILE_DIR)\n}\n\nfunction profilePath(basePath: string): string {\n return path.join(engagementDir(basePath), PROFILE_FILE)\n}\n\nexport function createDefaultProfile(): EngagementProfile {\n return EngagementProfileSchema.parse({ version: 4 })\n}\n\nexport function loadProfile(basePath: string): EngagementProfile {\n const filePath = profilePath(basePath)\n if (!fs.existsSync(filePath)) {\n return createDefaultProfile()\n }\n\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8'))\n return EngagementProfileSchema.parse(raw)\n } catch (err) {\n logger.warning(`Engagement profile corrupted, backing up and creating fresh: ${err}`)\n try {\n fs.copyFileSync(filePath, filePath + '.bak')\n } catch { /* ignore backup failure */ }\n return createDefaultProfile()\n }\n}\n\nexport function saveProfile(basePath: string, profile: EngagementProfile): void {\n const dir = engagementDir(basePath)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n\n const filePath = profilePath(basePath)\n const content = yaml.dump(profile, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nexport function setPrivacyMode(profile: EngagementProfile, mode: 'private' | 'anonymous' | 'verified'): EngagementProfile {\n if (mode === 'verified' && !profile.identity.erc8004_registered) {\n throw new Error('Verified mode requires erc8004_registered to be true')\n }\n const updated = { ...profile, identity: { ...profile.identity, mode } }\n if (mode === 'anonymous' && !updated.identity.pseudonym) {\n updated.identity.pseudonym = generatePseudonym()\n }\n return updated\n}\n\nexport function generatePseudonym(): string {\n return 'cipher-' + crypto.randomBytes(2).toString('hex')\n}\n\nexport function generateNetworkProfile(profile: EngagementProfile): Record<string, unknown> | null {\n if (profile.identity.mode === 'private') return null\n\n return {\n display_name: profile.identity.mode === 'anonymous'\n ? profile.identity.pseudonym\n : profile.identity.erc8004_address,\n tier: profile.tier.current,\n xp_total: profile.xp.total,\n reputation: profile.reputation.score,\n domains_covered: profile.stats.domains_covered,\n public_engrams: profile.stats.public_engrams,\n }\n}\n\nexport function ensureEngagementDir(basePath: string): void {\n const dir = engagementDir(basePath)\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n\n // Add profile.yaml to .gitignore if not already\n const gitignorePath = path.join(basePath, '.datacore', '.gitignore')\n if (fs.existsSync(gitignorePath)) {\n const content = fs.readFileSync(gitignorePath, 'utf8')\n if (!content.includes('engagement/profile.yaml')) {\n fs.appendFileSync(gitignorePath, '\\nengagement/profile.yaml\\nengagement/badge.svg\\n')\n }\n }\n}\n","// src/engagement/actions.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { XPActionRegistrySchema, type XPActionRegistry } from './types.js'\nimport { logger } from '../logger.js'\n\nexport const BUNDLED_ACTIONS: XPActionRegistry = {\n version: 1,\n actions: {\n engram_created: {\n xp: 10,\n trigger: 'datacore.learn',\n condition: 'status === active',\n description: 'Create a quality engram',\n },\n engram_created_public: {\n xp: 20,\n trigger: 'datacore.learn',\n condition: 'visibility === public || visibility === template',\n description: 'Create a public/template engram',\n },\n feedback_given: {\n xp: 5,\n trigger: 'datacore.feedback',\n daily_limit: 10,\n description: 'Give feedback on an injected engram',\n },\n engram_promoted: {\n xp: 3,\n trigger: 'datacore.promote',\n description: 'Promote a candidate engram to active',\n },\n engram_retired: {\n xp: 5,\n trigger: 'datacore.forget',\n cooldown_days: 7,\n description: 'Retire an engram after reflection (7-day cooldown)',\n },\n pack_exported: {\n xp: 25,\n trigger: 'datacore.packs.export',\n condition: 'engram_count >= 5 && avg_fitness >= 0.6',\n description: 'Export a quality pack (5+ engrams, 0.6+ fitness)',\n },\n new_domain: {\n xp: 15,\n trigger: 'datacore.learn',\n description: 'Create first engram in a new domain',\n },\n reconsolidation_defend: {\n xp: 12,\n trigger: 'datacore.resolve',\n description: 'Defend an engram during contradiction challenge',\n },\n reconsolidation_revise: {\n xp: 10,\n trigger: 'datacore.resolve',\n description: 'Revise an engram during contradiction challenge',\n },\n reconsolidation_retire: {\n xp: 8,\n trigger: 'datacore.resolve',\n description: 'Retire an engram during contradiction challenge',\n },\n discovery_explore: {\n xp: 20,\n trigger: 'datacore.resolve',\n description: 'Explore a cross-domain discovery',\n },\n reconsolidation_expired: {\n xp: 3,\n trigger: 'system',\n description: 'Auto-expire an overdue reconsolidation',\n },\n },\n}\n\nexport function loadActions(basePath: string): XPActionRegistry {\n const actionsPath = path.join(basePath, '.datacore', 'engagement', 'xp-actions.yaml')\n if (!fs.existsSync(actionsPath)) {\n return BUNDLED_ACTIONS\n }\n\n try {\n const raw = yaml.load(fs.readFileSync(actionsPath, 'utf8'))\n return XPActionRegistrySchema.parse(raw)\n } catch (err) {\n logger.warning(`Malformed xp-actions.yaml, using defaults: ${err}`)\n return BUNDLED_ACTIONS\n }\n}\n\nexport function writeDefaultActions(basePath: string): void {\n const dir = path.join(basePath, '.datacore', 'engagement')\n const actionsPath = path.join(dir, 'xp-actions.yaml')\n if (fs.existsSync(actionsPath)) return\n\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true })\n }\n\n const content = yaml.dump(BUNDLED_ACTIONS, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n fs.writeFileSync(actionsPath, content)\n}\n","// src/engagement/engine.ts — pure functions, never mutate input\nimport { TIER_THRESHOLDS, type EngagementProfile, type XPActionRegistry, type XPEvent } from './types.js'\n\ninterface TierResult {\n current: string\n changed: boolean\n message?: string\n}\n\ninterface AwardResult {\n event: XPEvent\n profile: EngagementProfile\n}\n\ninterface EligibilityResult {\n eligible: boolean\n reason?: string\n}\n\nexport function resolveTier(profile: EngagementProfile): TierResult {\n const xp = profile.xp.total\n let current = 'Seed'\n for (const t of TIER_THRESHOLDS) {\n if (xp >= t.minXP) current = t.name\n }\n const changed = current !== profile.tier.current\n const message = changed ? `You've reached ${current}!` : undefined\n return { current, changed, message }\n}\n\nexport function getEffectiveMultiplier(profile: EngagementProfile): { effective: number; active: typeof profile.multipliers.active } {\n const actives = profile.multipliers.active\n if (actives.length === 0) return { effective: 1.0, active: [] }\n\n let effective = 1.0\n for (const m of actives) {\n effective *= m.factor\n }\n return { effective, active: actives }\n}\n\nexport function isActionEligible(\n profile: EngagementProfile,\n actionKey: string,\n actions: XPActionRegistry,\n context?: Record<string, unknown>,\n): EligibilityResult {\n const action = actions.actions[actionKey]\n if (!action) return { eligible: false, reason: `Unknown action: ${actionKey}` }\n\n // Check daily limit\n if (action.daily_limit !== undefined) {\n const today = new Date().toISOString().split('T')[0]\n const todayEntry = profile.xp.history.find(h => h.date === today)\n if (todayEntry) {\n const todayCount = todayEntry.actions.filter(a => a === actionKey).length\n if (todayCount >= action.daily_limit) {\n return { eligible: false, reason: `Daily limit of ${action.daily_limit} reached for ${actionKey}` }\n }\n }\n }\n\n // Check cooldown\n if (action.cooldown_days !== undefined && context?.engram_age_days !== undefined) {\n const ageDays = context.engram_age_days as number\n if (ageDays < action.cooldown_days) {\n return { eligible: false, reason: `Cooldown: engram must be at least ${action.cooldown_days} days old (current: ${ageDays})` }\n }\n }\n\n return { eligible: true }\n}\n\nexport function awardXP(\n profile: EngagementProfile,\n actionKey: string,\n actions: XPActionRegistry,\n context?: Record<string, unknown>,\n): AwardResult | null {\n const eligibility = isActionEligible(profile, actionKey, actions, context)\n if (!eligibility.eligible) return null\n\n const action = actions.actions[actionKey]\n const { effective } = getEffectiveMultiplier(profile)\n const baseXP = action.xp\n const earnedXP = Math.round(baseXP * effective)\n const now = new Date().toISOString()\n const today = now.split('T')[0]\n\n const event: XPEvent = {\n action_key: actionKey,\n xp_base: baseXP,\n multiplier: effective,\n xp_earned: earnedXP,\n timestamp: now,\n context,\n }\n\n // Deep clone profile to avoid mutation\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n updated.xp.total += earnedXP\n updated.xp.this_week += earnedXP\n\n // Update XP history\n let todayEntry = updated.xp.history.find(h => h.date === today)\n if (!todayEntry) {\n todayEntry = { date: today, earned: 0, base_earned: 0, multiplier: effective, actions: [] }\n updated.xp.history.push(todayEntry)\n }\n todayEntry.earned += earnedXP\n todayEntry.base_earned += baseXP\n todayEntry.actions.push(actionKey)\n\n // Update stat counters\n if (actionKey === 'engram_created' || actionKey === 'engram_created_public') {\n updated.stats.total_engrams_created++\n }\n if (actionKey === 'feedback_given') {\n updated.stats.total_feedback_given++\n }\n if (actionKey === 'engram_retired') {\n updated.stats.total_engrams_retired++\n }\n if (actionKey === 'pack_exported') {\n updated.stats.total_packs_exported++\n }\n if (actionKey === 'new_domain') {\n updated.stats.domains_covered++\n }\n\n if (!updated.stats.first_activity) {\n updated.stats.first_activity = today\n }\n\n return { event, profile: updated }\n}\n\nexport function updateConsistency(profile: EngagementProfile): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const today = new Date().toISOString().split('T')[0]\n\n if (updated.consistency.last_active === today) return updated\n\n // Count active days in last 30 days\n const thirtyDaysAgo = new Date()\n thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30)\n const cutoff = thirtyDaysAgo.toISOString().split('T')[0]\n\n const activeDays = updated.xp.history\n .filter(h => h.date >= cutoff && h.date <= today)\n .length\n\n updated.consistency.active_days_30 = activeDays\n updated.consistency.last_active = today\n\n // Calculate best consecutive run\n const sortedDates = updated.xp.history\n .map(h => h.date)\n .sort()\n\n let currentRun = 1\n let bestRun = updated.consistency.best_run\n for (let i = 1; i < sortedDates.length; i++) {\n const prev = new Date(sortedDates[i - 1])\n const curr = new Date(sortedDates[i])\n const diffDays = Math.round((curr.getTime() - prev.getTime()) / (86400000))\n if (diffDays === 1) {\n currentRun++\n if (currentRun > bestRun) bestRun = currentRun\n } else if (diffDays > 1) {\n currentRun = 1\n }\n }\n updated.consistency.best_run = bestRun\n\n return updated\n}\n","// src/engagement/multipliers.ts\nimport type { EngagementProfile, MultiplierEntry } from './types.js'\n\nexport function evaluateMultipliers(profile: EngagementProfile): MultiplierEntry[] {\n const today = new Date().toISOString().split('T')[0]\n const multipliers: MultiplierEntry[] = []\n\n // Verified multiplier: 1.5x when erc8004_registered\n if (profile.identity.erc8004_registered) {\n multipliers.push({ type: 'verified', factor: 1.5, since: today })\n }\n\n // Top Teacher: 1.25x when 3+ packs, 20+ feedback, positive ratio >= 0.85\n if (\n profile.stats.total_packs_exported >= 3 &&\n profile.stats.total_feedback_received >= 20 &&\n profile.stats.feedback_positive_ratio >= 0.85\n ) {\n multipliers.push({ type: 'top_teacher', factor: 1.25, since: today })\n }\n\n // Top Learner: 1.25x when 5+ reconsolidations, 3+ discoveries, response_rate >= 0.8, explore_rate >= 0.5\n if (\n profile.reconsolidation.total_resolved >= 5 &&\n profile.discoveries.total >= 3 &&\n profile.reconsolidation.response_rate >= 0.8 &&\n profile.discoveries.explore_rate >= 0.5\n ) {\n multipliers.push({ type: 'top_learner', factor: 1.25, since: today })\n }\n\n return multipliers\n}\n\nexport function recalculateWeekly(profile: EngagementProfile): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const newMultipliers = evaluateMultipliers(updated)\n\n updated.multipliers.active = newMultipliers\n\n let effective = 1.0\n for (const m of newMultipliers) {\n effective *= m.factor\n }\n updated.multipliers.effective = effective\n\n // Recompute this_week from history (start of ISO week = Monday)\n const now = new Date()\n const day = now.getDay()\n const diff = day === 0 ? 6 : day - 1\n const weekStart = new Date(now)\n weekStart.setDate(weekStart.getDate() - diff)\n weekStart.setHours(0, 0, 0, 0)\n const weekStartStr = weekStart.toISOString().split('T')[0]\n\n updated.xp.this_week = updated.xp.history\n .filter(h => h.date >= weekStartStr)\n .reduce((sum, h) => sum + h.earned, 0)\n\n return updated\n}\n","// src/engagement/reputation.ts\nimport type { EngagementProfile } from './types.js'\n\nexport function calculateReputation(profile: EngagementProfile): number {\n // Feedback quality: positive_ratio * log(feedback_count) / log(100), capped 1.0\n const feedbackCount = profile.stats.total_feedback_given\n const feedbackQuality = feedbackCount > 0\n ? Math.min(1.0, profile.stats.feedback_positive_ratio * (Math.log(feedbackCount) / Math.log(100)))\n : 0\n\n // Verification bonus: 1.0 if erc8004_registered, else 0.0\n const verificationBonus = profile.identity.erc8004_registered ? 1.0 : 0.0\n\n // Stake signal: normalized, 0 in solo mode\n const stakeSignal = 0\n\n // Curation honesty: (revise + retire) / total_resolved, 0 if < 5 resolved\n const totalResolved = profile.reconsolidation.total_resolved\n const curationHonesty = totalResolved >= 5\n ? (profile.reconsolidation.outcomes.revised + profile.reconsolidation.outcomes.retired) / totalResolved\n : 0\n\n // Tenure signal: log(days_active) / log(365), capped 1.0\n let tenureDays = 0\n if (profile.stats.first_activity) {\n const first = new Date(profile.stats.first_activity)\n tenureDays = Math.max(0, Math.floor((Date.now() - first.getTime()) / 86400000))\n }\n const tenureSignal = tenureDays > 0\n ? Math.min(1.0, Math.log(tenureDays) / Math.log(365))\n : 0\n\n // Domain breadth: min(domains / 10, 1.0)\n const domainBreadth = Math.min(1.0, profile.stats.domains_covered / 10)\n\n // Conflict penalty: slashed_stakes / total_stakes, 0 if no stakes (solo mode)\n const conflictPenalty = 0\n\n const score = (0.30 * feedbackQuality)\n + (0.25 * verificationBonus)\n + (0.15 * stakeSignal)\n + (0.15 * curationHonesty)\n + (0.10 * tenureSignal)\n + (0.05 * domainBreadth)\n - (0.50 * conflictPenalty)\n\n return Math.max(0, score)\n}\n\nexport function updateReputation(profile: EngagementProfile): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const score = calculateReputation(updated)\n updated.reputation.score = Math.round(score * 100) / 100\n updated.reputation.last_calculated = new Date().toISOString().split('T')[0]\n return updated\n}\n","// src/engagement/migrate.ts\nimport type { Engram } from '../schemas/engram.js'\nimport { TIER_THRESHOLDS, type EngagementProfile } from './types.js'\nimport { createDefaultProfile, saveProfile, ensureEngagementDir } from './profile.js'\nimport { BUNDLED_ACTIONS, writeDefaultActions } from './actions.js'\nimport { resolveTier } from './engine.js'\nimport { logger } from '../logger.js'\n\nexport function calculateRetroactiveXP(engrams: Engram[]): number {\n const quality = engrams.filter(e => e.status === 'active')\n const qualityCount = quality.length\n const publicCount = quality.filter(e => e.visibility === 'public' || e.visibility === 'template').length\n\n let totalPositiveFeedback = 0\n let totalFeedbackGiven = 0\n for (const e of engrams) {\n totalPositiveFeedback += e.feedback_signals?.positive ?? 0\n totalFeedbackGiven += (e.feedback_signals?.positive ?? 0) + (e.feedback_signals?.negative ?? 0) + (e.feedback_signals?.neutral ?? 0)\n }\n\n const domains = new Set(engrams.filter(e => e.domain).map(e => e.domain!))\n const domainCount = domains.size\n\n // Count packs exported — not directly tracked, estimate 0 for migration\n const packsExported = 0\n\n return (qualityCount * 10)\n + (publicCount * 10)\n + (totalPositiveFeedback * 5)\n + (totalFeedbackGiven * 5)\n + (domainCount * 20)\n + (packsExported * 25)\n}\n\nexport function migrateProfile(basePath: string, engrams: Engram[]): EngagementProfile {\n ensureEngagementDir(basePath)\n\n const profile = createDefaultProfile()\n const retroXP = calculateRetroactiveXP(engrams)\n profile.xp.total = retroXP\n\n const today = new Date().toISOString().split('T')[0]\n\n // Resolve tier\n const tierResult = resolveTier(profile)\n profile.tier.current = tierResult.current\n if (tierResult.current !== 'Seed') {\n profile.tier.achieved_at = today\n profile.tier.history.push({ tier: tierResult.current, date: today })\n }\n\n // Set stats from engrams\n const active = engrams.filter(e => e.status === 'active')\n profile.stats.total_engrams_created = active.length\n profile.stats.domains_covered = new Set(engrams.filter(e => e.domain).map(e => e.domain!)).size\n profile.stats.public_engrams = active.filter(e => e.visibility === 'public' || e.visibility === 'template').length\n profile.stats.first_activity = today\n\n // Write default actions if not present\n writeDefaultActions(basePath)\n\n // Save profile\n saveProfile(basePath, profile)\n logger.info(`Engagement migration: ${retroXP} retroactive XP → ${profile.tier.current} tier`)\n\n return profile\n}\n","// src/engagement/reconsolidation.ts — contradiction detection and resolution\nimport type { EngagementProfile, ReconsolidationPending } from './types.js'\nimport type { Engram } from '../schemas/engram.js'\n\n// === Interfaces ===\n\nexport interface DetectedContradiction {\n engram_id: string\n contradicting_id: string\n statement: string\n contradiction: string\n evidence_strength: 'weak' | 'moderate' | 'strong'\n confidence: number\n}\n\n// === Constants ===\n\nconst STOPWORDS = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'it', 'its', 'in', 'on',\n 'at', 'to', 'for', 'of', 'by', 'with',\n])\n\nconst OPPOSITION_PAIRS: Array<[string, string]> = [\n ['always', 'never'],\n ['prefer', 'avoid'],\n ['use', \"don't use\"],\n ['should', 'should not'],\n ['must', 'must not'],\n ['enable', 'disable'],\n ['with', 'without'],\n ['recommended', 'discouraged'],\n ['best', 'worst'],\n ['important', 'unnecessary'],\n]\n\nconst EXPIRY_DAYS = 7\nconst CONFIDENCE_THRESHOLD = 0.5\n\n// === Tokenization ===\n\nfunction tokenize(text: string): Set<string> {\n const tokens = text\n .toLowerCase()\n .split(/\\s+|[.,;:!?()[\\]{}]/)\n .filter(t => t.length > 0 && !STOPWORDS.has(t))\n return new Set(tokens)\n}\n\nfunction jaccardSimilarity(a: Set<string>, b: Set<string>): number {\n const intersection = new Set([...a].filter(x => b.has(x)))\n const union = new Set([...a, ...b])\n if (union.size === 0) return 0\n return intersection.size / union.size\n}\n\nfunction countOppositionPairs(textA: string, textB: string): number {\n const lowerA = textA.toLowerCase()\n const lowerB = textB.toLowerCase()\n let count = 0\n\n for (const [termA, termB] of OPPOSITION_PAIRS) {\n if (\n (lowerA.includes(termA) && lowerB.includes(termB)) ||\n (lowerA.includes(termB) && lowerB.includes(termA))\n ) {\n count++\n }\n }\n\n return count\n}\n\n// === Core functions ===\n\nexport function detectContradiction(\n newEngram: Engram,\n existingEngrams: Engram[],\n): DetectedContradiction | null {\n if (!newEngram.domain) return null\n\n const newTokens = tokenize(newEngram.statement)\n\n for (const existing of existingEngrams) {\n // Skip self\n if (existing.id === newEngram.id) continue\n // Domain-scoped: only compare within same domain\n if (existing.domain !== newEngram.domain) continue\n // Skip retired\n if (existing.status === 'retired') continue\n\n const existingTokens = tokenize(existing.statement)\n const similarity = jaccardSimilarity(newTokens, existingTokens)\n\n // Jaccard threshold\n if (similarity <= 0.3) continue\n\n // Must have at least one opposition pair\n const oppositionCount = countOppositionPairs(newEngram.statement, existing.statement)\n if (oppositionCount === 0) continue\n\n // Evidence strength\n let evidence_strength: 'weak' | 'moderate' | 'strong'\n if (similarity > 0.6) {\n evidence_strength = 'strong'\n } else if (similarity > 0.4) {\n evidence_strength = 'moderate'\n } else {\n evidence_strength = 'weak'\n }\n\n // Confidence: similarity * (1 + opposition_pair_count * 0.2), capped at 1.0\n const confidence = Math.min(1.0, similarity * (1 + oppositionCount * 0.2))\n\n // Only surface when confidence >= threshold\n if (confidence < CONFIDENCE_THRESHOLD) continue\n\n return {\n engram_id: newEngram.id,\n contradicting_id: existing.id,\n statement: newEngram.statement,\n contradiction: existing.statement,\n evidence_strength,\n confidence,\n }\n }\n\n return null\n}\n\nexport function queueReconsolidation(\n profile: EngagementProfile,\n contradiction: DetectedContradiction,\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const now = new Date()\n const expiresAt = new Date(now)\n expiresAt.setDate(expiresAt.getDate() + EXPIRY_DAYS)\n\n const pending: ReconsolidationPending = {\n engram_id: contradiction.engram_id,\n contradicting_id: contradiction.contradicting_id,\n statement: contradiction.statement,\n contradiction: contradiction.contradiction,\n evidence_strength: contradiction.evidence_strength,\n confidence: contradiction.confidence,\n detected_at: now.toISOString(),\n expires_at: expiresAt.toISOString(),\n }\n\n updated.reconsolidation.pending.push(pending)\n return updated\n}\n\nexport function resolveReconsolidation(\n profile: EngagementProfile,\n engramId: string,\n outcome: 'defend' | 'revise' | 'retire' | 'dismiss',\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n\n // Find and remove from pending\n const idx = updated.reconsolidation.pending.findIndex(\n p => p.engram_id === engramId || p.contradicting_id === engramId,\n )\n if (idx === -1) return updated\n\n updated.reconsolidation.pending.splice(idx, 1)\n updated.reconsolidation.total_resolved++\n\n // Note: XP is handled by the caller via service.award(), not here.\n // This function only manages state transitions.\n\n // Track outcome\n if (outcome === 'defend') updated.reconsolidation.outcomes.defended++\n else if (outcome === 'revise') updated.reconsolidation.outcomes.revised++\n else if (outcome === 'retire') updated.reconsolidation.outcomes.retired++\n else if (outcome === 'dismiss') updated.reconsolidation.outcomes.dismissed++\n\n // Update response rate\n const totalOutcomes =\n updated.reconsolidation.outcomes.defended +\n updated.reconsolidation.outcomes.revised +\n updated.reconsolidation.outcomes.retired\n const totalAll = totalOutcomes + updated.reconsolidation.outcomes.dismissed\n updated.reconsolidation.response_rate = totalAll > 0 ? totalOutcomes / totalAll : 0\n\n return updated\n}\n\nexport function expireReconsolidations(profile: EngagementProfile): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const now = new Date().toISOString()\n\n const expired: ReconsolidationPending[] = []\n const remaining: ReconsolidationPending[] = []\n\n for (const pending of updated.reconsolidation.pending) {\n if (pending.expires_at <= now) {\n expired.push(pending)\n } else {\n remaining.push(pending)\n }\n }\n\n if (expired.length === 0) return updated\n\n updated.reconsolidation.pending = remaining\n\n // Auto-retire overdue: 3XP each\n for (const _entry of expired) {\n updated.xp.total += 3\n updated.reconsolidation.total_resolved++\n updated.reconsolidation.outcomes.retired++\n }\n\n // Update response rate\n const totalOutcomes =\n updated.reconsolidation.outcomes.defended +\n updated.reconsolidation.outcomes.revised +\n updated.reconsolidation.outcomes.retired\n const totalAll = totalOutcomes + updated.reconsolidation.outcomes.dismissed\n updated.reconsolidation.response_rate = totalAll > 0 ? totalOutcomes / totalAll : 0\n\n return updated\n}\n","// src/engagement/discovery.ts — cross-domain discovery\nimport type { EngagementProfile, Discovery } from './types.js'\nimport type { Engram } from '../schemas/engram.js'\n\n// === Interfaces ===\n\nexport interface DiscoveryCandidate {\n engram_a: { id: string; domain: string; statement: string }\n engram_b: { id: string; domain: string; statement: string }\n overlap_size: number\n}\n\nexport interface EvaluatedDiscovery {\n engram_a: { id: string; domain: string; statement: string }\n engram_b: { id: string; domain: string; statement: string }\n connection: string\n}\n\n// === Constants ===\n\nconst MIN_ENGRAMS = 20\nconst MIN_DOMAINS = 3\nconst MIN_DAYS_BETWEEN_DISCOVERIES = 2\nconst LLM_TIMEOUT_MS = 5000\n\n// === Helpers ===\n\nfunction extractKeywords(statement: string): Set<string> {\n const stopwords = new Set([\n 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'it', 'its', 'in', 'on',\n 'at', 'to', 'for', 'of', 'by', 'with',\n ])\n const tokens = statement\n .toLowerCase()\n .split(/\\s+|[.,;:!?()[\\]{}]/)\n .filter(t => t.length > 0 && !stopwords.has(t))\n return new Set(tokens)\n}\n\nfunction daysBetween(dateA: string, dateB: string): number {\n const a = new Date(dateA)\n const b = new Date(dateB)\n return Math.abs(a.getTime() - b.getTime()) / (1000 * 60 * 60 * 24)\n}\n\n// === Core functions ===\n\nexport function generateDiscoveryCandidates(\n engrams: Engram[],\n profile: EngagementProfile,\n): DiscoveryCandidate[] {\n // Guard: minimum engrams\n if (engrams.length < MIN_ENGRAMS) return []\n\n // Guard: minimum domains\n const domains = new Set(engrams.map(e => e.domain).filter(Boolean))\n if (domains.size < MIN_DOMAINS) return []\n\n // Guard: cooldown between discoveries\n if (profile.discoveries.last_offered) {\n const daysSinceLast = daysBetween(\n profile.discoveries.last_offered,\n new Date().toISOString(),\n )\n if (daysSinceLast < MIN_DAYS_BETWEEN_DISCOVERIES) return []\n }\n\n // Only consider active engrams with domains\n const withDomains = engrams.filter(\n e => e.domain && e.status === 'active',\n )\n\n // Pre-compute keyword sets\n const keywordMap = new Map<string, Set<string>>()\n for (const e of withDomains) {\n keywordMap.set(e.id, extractKeywords(e.statement))\n }\n\n // Find cross-domain pairs with keyword overlap\n const candidates: DiscoveryCandidate[] = []\n const seen = new Set<string>()\n\n for (let i = 0; i < withDomains.length; i++) {\n for (let j = i + 1; j < withDomains.length; j++) {\n const a = withDomains[i]\n const b = withDomains[j]\n\n // Cross-domain only\n if (a.domain === b.domain) continue\n\n // Deduplicate pair\n const pairKey = [a.id, b.id].sort().join(':')\n if (seen.has(pairKey)) continue\n seen.add(pairKey)\n\n // Compute keyword intersection\n const kwA = keywordMap.get(a.id)!\n const kwB = keywordMap.get(b.id)!\n const intersection = new Set([...kwA].filter(x => kwB.has(x)))\n\n if (intersection.size === 0) continue\n\n candidates.push({\n engram_a: { id: a.id, domain: a.domain!, statement: a.statement },\n engram_b: { id: b.id, domain: b.domain!, statement: b.statement },\n overlap_size: intersection.size,\n })\n }\n }\n\n // Rank by intersection size (descending)\n candidates.sort((a, b) => b.overlap_size - a.overlap_size)\n\n return candidates\n}\n\nexport async function evaluateDiscovery(\n candidate: DiscoveryCandidate,\n llmCall: (prompt: string) => Promise<string>,\n): Promise<EvaluatedDiscovery | null> {\n const prompt = `These two knowledge items are from different domains. Is there a meaningful structural connection? If yes, describe it in one sentence. If no, respond 'none'. Item A: ${candidate.engram_a.statement} (domain: ${candidate.engram_a.domain}). Item B: ${candidate.engram_b.statement} (domain: ${candidate.engram_b.domain}).`\n\n try {\n const result = await Promise.race([\n llmCall(prompt),\n new Promise<never>((_, reject) =>\n setTimeout(() => reject(new Error('LLM timeout')), LLM_TIMEOUT_MS),\n ),\n ])\n\n const trimmed = result.trim().toLowerCase()\n if (trimmed === 'none' || trimmed === '') return null\n\n return {\n engram_a: candidate.engram_a,\n engram_b: candidate.engram_b,\n connection: result.trim(),\n }\n } catch {\n // Timeout or LLM error — return null\n return null\n }\n}\n\nexport function offerDiscovery(\n profile: EngagementProfile,\n discovery: EvaluatedDiscovery,\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n const now = new Date().toISOString()\n\n const id = `disc-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\n\n const entry: Discovery = {\n id,\n engram_a: discovery.engram_a,\n engram_b: discovery.engram_b,\n connection: discovery.connection,\n offered_at: now,\n }\n\n updated.discoveries.pending.push(entry)\n updated.discoveries.total++\n updated.discoveries.last_offered = now\n\n return updated\n}\n\nexport function resolveDiscovery(\n profile: EngagementProfile,\n discoveryId: string,\n action: 'explore' | 'note',\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n\n // Find and remove from pending\n const idx = updated.discoveries.pending.findIndex(d => d.id === discoveryId)\n if (idx === -1) return updated\n\n updated.discoveries.pending.splice(idx, 1)\n\n // Note: XP is handled by the caller via service.award(), not here.\n // This function only manages state transitions.\n if (action === 'explore') {\n updated.discoveries.explored++\n } else {\n updated.discoveries.noted++\n }\n\n // Update explore rate\n const totalResolved = updated.discoveries.explored + updated.discoveries.noted\n updated.discoveries.explore_rate =\n totalResolved > 0 ? updated.discoveries.explored / totalResolved : 0\n\n return updated\n}\n","// src/engagement/challenges.ts — weekly challenges\nimport type { EngagementProfile, Challenge, ChallengeHistory } from './types.js'\n\n// === Challenge definitions ===\n\ninterface ChallengeTemplate {\n type: string\n tier: string\n description: string\n metric: string\n target_delta: number\n bonus_xp: number\n}\n\nconst GETTING_STARTED_CHALLENGES: ChallengeTemplate[] = [\n {\n type: 'first_steps',\n tier: 'Seed',\n description: 'Create your first engram',\n metric: 'total_engrams_created',\n target_delta: 5,\n bonus_xp: 15,\n },\n {\n type: 'first_feedback',\n tier: 'Seed',\n description: 'Give feedback',\n metric: 'total_feedback_given',\n target_delta: 3,\n bonus_xp: 10,\n },\n {\n type: 'explore_domain',\n tier: 'Seed',\n description: 'Explore a new domain',\n metric: 'domains_covered',\n target_delta: 1,\n bonus_xp: 10,\n },\n]\n\nconst REGULAR_CHALLENGES: ChallengeTemplate[] = [\n {\n type: 'first_steps',\n tier: 'Seed',\n description: 'Create your first engram',\n metric: 'total_engrams_created',\n target_delta: 5,\n bonus_xp: 15,\n },\n {\n type: 'first_feedback',\n tier: 'Seed',\n description: 'Give feedback',\n metric: 'total_feedback_given',\n target_delta: 3,\n bonus_xp: 10,\n },\n {\n type: 'domain_deep_dive',\n tier: 'Cipher',\n description: 'Deep dive into a new domain',\n metric: 'domains_covered',\n target_delta: 1,\n bonus_xp: 15,\n },\n {\n type: 'synthesis',\n tier: 'Sage',\n description: 'Synthesize knowledge across domains',\n metric: 'domains_covered',\n target_delta: 2,\n bonus_xp: 20,\n },\n {\n type: 'mentorship',\n tier: 'Adept',\n description: 'Share your knowledge by exporting a pack',\n metric: 'total_packs_exported',\n target_delta: 1,\n bonus_xp: 25,\n },\n {\n type: 'impact',\n tier: 'Visionary',\n description: 'Achieve a high positive feedback ratio',\n metric: 'feedback_positive_ratio',\n target_delta: 0.85,\n bonus_xp: 25,\n },\n {\n type: 'network',\n tier: 'Oracle',\n description: 'Build your feedback network',\n metric: 'total_feedback_received',\n target_delta: 10,\n bonus_xp: 30,\n },\n]\n\n// === Tier ordering ===\n\nconst TIER_ORDER: Record<string, number> = {\n Seed: 0,\n Cipher: 1,\n Sage: 2,\n Adept: 3,\n Visionary: 4,\n Oracle: 5,\n}\n\nfunction tierRank(tier: string): number {\n return TIER_ORDER[tier] ?? 0\n}\n\n// === Constants ===\n\nconst WEEK_MS = 7 * 24 * 60 * 60 * 1000\nconst GETTING_STARTED_THRESHOLD = 10\n\n// === Core functions ===\n\nexport function generateChallenge(profile: EngagementProfile): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n\n // Only one active at a time\n if (updated.challenges.active) return updated\n\n const now = new Date()\n const expiresAt = new Date(now.getTime() + WEEK_MS)\n const currentTierRank = tierRank(updated.tier.current)\n\n // Pick challenge pool\n let pool: ChallengeTemplate[]\n\n if (updated.stats.total_engrams_created < GETTING_STARTED_THRESHOLD && !updated.challenges.graduated) {\n // Getting-started track\n const completedTypes = new Set(\n updated.challenges.history\n .filter(h => h.completed)\n .map(h => h.type),\n )\n\n pool = GETTING_STARTED_CHALLENGES.filter(c => !completedTypes.has(c.type))\n\n // If all getting-started challenges completed, graduate\n if (pool.length === 0) {\n updated.challenges.graduated = true\n pool = REGULAR_CHALLENGES.filter(c => tierRank(c.tier) <= currentTierRank)\n }\n } else {\n // Regular challenges: filter by tier\n pool = REGULAR_CHALLENGES.filter(c => tierRank(c.tier) <= currentTierRank)\n }\n\n if (pool.length === 0) return updated\n\n // Pick one (round-robin to avoid repeats)\n const recentTypes = new Set(\n updated.challenges.history.slice(-3).map(h => h.type),\n )\n let chosen = pool.find(c => !recentTypes.has(c.type))\n if (!chosen) chosen = pool[0]\n\n // Snapshot baseline stats\n const baselineStats: Record<string, number> = {}\n for (const [key, value] of Object.entries(updated.stats)) {\n if (typeof value === 'number') {\n baselineStats[key] = value\n }\n }\n\n const id = `chal-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`\n\n const challenge: Challenge = {\n id,\n type: chosen.type,\n tier: chosen.tier,\n description: chosen.description,\n criteria: {\n metric: chosen.metric,\n target_delta: chosen.target_delta,\n },\n baseline_stats: baselineStats,\n bonus_xp: chosen.bonus_xp,\n started_at: now.toISOString(),\n expires_at: expiresAt.toISOString(),\n }\n\n updated.challenges.active = challenge\n return updated\n}\n\nexport function checkChallengeCompletion(\n profile: EngagementProfile,\n challenge: Challenge,\n): boolean {\n const metric = challenge.criteria.metric\n const targetDelta = challenge.criteria.target_delta\n const baselineValue = challenge.baseline_stats[metric] ?? 0\n\n // Special case: feedback_positive_ratio is an absolute threshold, not a delta\n if (metric === 'feedback_positive_ratio') {\n const currentValue = (profile.stats as unknown as Record<string, number>)[metric] ?? 0\n return currentValue >= targetDelta\n }\n\n const currentValue = (profile.stats as unknown as Record<string, number>)[metric] ?? 0\n const delta = currentValue - baselineValue\n\n return delta >= targetDelta\n}\n\nexport function resolveChallenge(\n profile: EngagementProfile,\n challengeId: string,\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n\n if (!updated.challenges.active || updated.challenges.active.id !== challengeId) {\n return updated\n }\n\n const challenge = updated.challenges.active\n\n // Check completion\n if (!checkChallengeCompletion(updated, challenge)) {\n return updated\n }\n\n // Award bonus XP\n updated.xp.total += challenge.bonus_xp\n\n // Record in history\n const entry: ChallengeHistory = {\n type: challenge.type,\n tier: challenge.tier,\n completed: true,\n date: new Date().toISOString().split('T')[0],\n }\n updated.challenges.history.push(entry)\n updated.challenges.completed++\n updated.challenges.active = null\n\n return updated\n}\n\nexport function dismissChallenge(\n profile: EngagementProfile,\n challengeId: string,\n): EngagementProfile {\n const updated: EngagementProfile = JSON.parse(JSON.stringify(profile))\n\n if (!updated.challenges.active || updated.challenges.active.id !== challengeId) {\n return updated\n }\n\n const challenge = updated.challenges.active\n\n // Record in history as not completed\n const entry: ChallengeHistory = {\n type: challenge.type,\n tier: challenge.tier,\n completed: false,\n date: new Date().toISOString().split('T')[0],\n }\n updated.challenges.history.push(entry)\n updated.challenges.dismissed++\n updated.challenges.active = null\n\n // No penalty — 0 XP\n return updated\n}\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 { atomicWriteYaml } from './inject-tool.js'\nimport { buildHints } from '../hints.js'\nimport { getConfig } from '../config.js'\nimport { loadEngrams } from '../engrams.js'\nimport { formatSessionEnd } from '../engagement/format.js'\nimport type { Engram } from '../schemas/engram.js'\nimport type { StorageConfig } from '../storage.js'\nimport type { EngagementService } from '../engagement/index.js'\nimport type { SessionTracker } from '../session-tracker.js'\n\ninterface SessionEndArgs {\n summary: string\n session_id?: 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 engagement?: { session_xp: number; total_xp: number; tier: string; display: string }\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleSessionEnd(\n args: SessionEndArgs,\n storage: StorageConfig,\n engagementService?: EngagementService,\n tracker?: SessionTracker,\n): Promise<SessionEndResult> {\n // Hebbian co-access write-back: strengthen associations between engrams\n // that were injected together in this session\n if (args.session_id && tracker) {\n const pairs = tracker.getCoAccessPairs(args.session_id)\n if (pairs.length > 0) {\n writeCoAccessAssociations(storage.engramsPath, pairs)\n }\n tracker.clear(args.session_id)\n }\n\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 engagementService,\n )\n engramsCreated++\n }\n }\n\n const autoPromote = getConfig().engrams.auto_promote\n const statusLabel = autoPromote ? 'active' : 'candidates'\n\n // Flush engagement and get session summary\n let engagement: SessionEndResult['engagement'] = undefined\n if (engagementService?.isEnabled()) {\n try {\n const sessionSummary = engagementService.getSessionSummary()\n await engagementService.flush()\n engagementService.markSessionEnded()\n const profile = engagementService.getProfile()\n engagement = {\n session_xp: sessionSummary.total_xp,\n total_xp: profile?.xp.total ?? 0,\n tier: profile?.tier.current ?? 'Seed',\n display: profile ? formatSessionEnd(profile, sessionSummary.total_xp, sessionSummary.events) : '',\n }\n } catch { /* engagement never breaks core tools */ }\n }\n\n return {\n journal_path: captureResult.path ?? null,\n engrams_created: engramsCreated,\n engagement,\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\n// --- Hebbian co-access write-back ---\n\nfunction writeCoAccessAssociations(\n engramsPath: string,\n pairs: Array<[string, string]>,\n): void {\n const engrams = loadEngrams(engramsPath)\n const map = new Map(engrams.map(e => [e.id, e]))\n const config = getConfig().co_access\n let changed = false\n\n for (const [idA, idB] of pairs) {\n const a = map.get(idA)\n const b = map.get(idB)\n // Only write co-access between personal engrams (not pack engrams)\n if (!a || !b || a.pack || b.pack) continue\n changed = strengthenCoAccess(a, idB, config) || changed\n changed = strengthenCoAccess(b, idA, config) || changed\n }\n\n if (changed) {\n atomicWriteYaml(engramsPath, { engrams })\n }\n}\n\nfunction strengthenCoAccess(\n engram: Engram,\n targetId: string,\n config: { new_strength: number; increment: number; max_strength: number },\n): boolean {\n const today = new Date().toISOString().split('T')[0]\n const existing = engram.associations.find(\n a => a.target === targetId && a.type === 'co_accessed',\n )\n\n if (existing) {\n const newStrength = Math.min(existing.strength + config.increment, config.max_strength)\n if (newStrength === existing.strength && existing.updated_at === today) return false\n existing.strength = newStrength\n existing.updated_at = today\n return true\n }\n\n engram.associations.push({\n target_type: 'engram',\n target: targetId,\n strength: config.new_strength,\n type: 'co_accessed',\n updated_at: today,\n })\n return true\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'\nimport type { EngagementService } from '../engagement/index.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 service?: EngagementService,\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 // Engagement XP\n if (service?.isEnabled()) {\n try {\n for (const _ of promoted) {\n await service.award('engram_promoted', {})\n }\n } catch { /* never break core */ }\n }\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/tools/resolve.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport { buildHints } from '../hints.js'\nimport {\n resolveReconsolidation as resolveRecon,\n resolveDiscovery as resolveDisc,\n dismissChallenge,\n resolveChallenge,\n checkChallengeCompletion,\n} from '../engagement/index.js'\nimport type { EngagementService } from '../engagement/index.js'\n\ninterface ResolveArgs {\n type: 'reconsolidation' | 'discovery' | 'challenge'\n id: string\n action: string\n revised_statement?: string\n}\n\ninterface ResolveResult {\n success: boolean\n type: string\n action: string\n xp_earned?: number\n message?: string\n error?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleResolve(\n args: ResolveArgs,\n engramsPath: string,\n service?: EngagementService,\n): Promise<ResolveResult> {\n if (!service?.isEnabled()) {\n return { success: false, type: args.type, action: args.action, error: 'Engagement system is disabled' }\n }\n\n const profile = service.getProfile()\n if (!profile) {\n return { success: false, type: args.type, action: args.action, error: 'No engagement profile loaded' }\n }\n\n try {\n switch (args.type) {\n case 'reconsolidation':\n return await handleReconsolidationResolve(args, engramsPath, service)\n case 'discovery':\n return await handleDiscoveryResolve(args, service)\n case 'challenge':\n return handleChallengeResolve(args, service)\n default:\n return { success: false, type: args.type, action: args.action, error: `Unknown resolve type: ${args.type}` }\n }\n } catch (err) {\n return { success: false, type: args.type, action: args.action, error: `${err}` }\n }\n}\n\nasync function handleReconsolidationResolve(\n args: ResolveArgs,\n engramsPath: string,\n service: EngagementService,\n): Promise<ResolveResult> {\n const profile = service.getProfile()!\n const pending = profile.reconsolidation.pending.find(\n r => r.engram_id === args.id || r.contradicting_id === args.id,\n )\n if (!pending) {\n return { success: false, type: 'reconsolidation', action: args.action, error: `No pending reconsolidation for engram ${args.id}` }\n }\n\n const validActions = ['defend', 'revise', 'retire', 'dismiss']\n if (!validActions.includes(args.action)) {\n return { success: false, type: 'reconsolidation', action: args.action, error: `Invalid action. Must be one of: ${validActions.join(', ')}` }\n }\n\n if (args.action === 'revise' && !args.revised_statement) {\n return { success: false, type: 'reconsolidation', action: args.action, error: 'revised_statement is required for revise action' }\n }\n\n // Apply resolution to engrams if needed\n if (args.action === 'revise') {\n const engrams = loadEngrams(engramsPath)\n const engram = engrams.find(e => e.id === args.id)\n if (engram) {\n engram.statement = args.revised_statement!\n saveEngrams(engramsPath, engrams)\n }\n } else if (args.action === 'retire') {\n const engrams = loadEngrams(engramsPath)\n const engram = engrams.find(e => e.id === args.id)\n if (engram) {\n engram.status = 'retired'\n saveEngrams(engramsPath, engrams)\n }\n }\n\n // Update profile: remove from pending, update stats\n const outcome = args.action as 'defend' | 'revise' | 'retire' | 'dismiss'\n service.applyProfileUpdate(p => resolveRecon(p, args.id, outcome))\n\n // Award XP via service (for multiplier + eligibility tracking)\n const xpActionMap: Record<string, string> = {\n defend: 'reconsolidation_defend',\n revise: 'reconsolidation_revise',\n retire: 'reconsolidation_retire',\n dismiss: '',\n }\n\n let xpEarned = 0\n const xpAction = xpActionMap[args.action]\n if (xpAction) {\n const result = await service.award(xpAction, {})\n if (result) xpEarned = result.event.xp_earned\n }\n\n const messages: Record<string, string> = {\n defend: 'Engram defended — both engrams retained.',\n revise: 'Engram revised with updated statement.',\n retire: 'Old engram retired.',\n dismiss: 'Contradiction dismissed as false positive.',\n }\n\n return {\n success: true,\n type: 'reconsolidation',\n action: args.action,\n xp_earned: xpEarned,\n message: messages[args.action],\n _hints: buildHints({\n next: xpEarned > 0 ? `+${xpEarned} XP for reconsolidation.` : 'Contradiction dismissed.',\n related: ['datacore.status'],\n }),\n }\n}\n\nasync function handleDiscoveryResolve(\n args: ResolveArgs,\n service: EngagementService,\n): Promise<ResolveResult> {\n const profile = service.getProfile()!\n const pending = profile.discoveries.pending.find(d => d.id === args.id)\n if (!pending) {\n return { success: false, type: 'discovery', action: args.action, error: `No pending discovery ${args.id}` }\n }\n\n const validActions = ['explore', 'note']\n if (!validActions.includes(args.action)) {\n return { success: false, type: 'discovery', action: args.action, error: `Invalid action. Must be one of: ${validActions.join(', ')}` }\n }\n\n // Update profile: remove from pending, update stats\n const action = args.action as 'explore' | 'note'\n service.applyProfileUpdate(p => resolveDisc(p, args.id, action))\n\n // Award XP for explore\n let xpEarned = 0\n if (action === 'explore') {\n const result = await service.award('discovery_explore', {})\n if (result) xpEarned = result.event.xp_earned\n }\n\n return {\n success: true,\n type: 'discovery',\n action: args.action,\n xp_earned: xpEarned,\n message: action === 'explore' ? 'Discovery explored — synthesis engram created.' : 'Discovery noted.',\n _hints: buildHints({\n next: xpEarned > 0 ? `+${xpEarned} XP for exploring discovery.` : 'Discovery noted for later.',\n related: ['datacore.status'],\n }),\n }\n}\n\nfunction handleChallengeResolve(\n args: ResolveArgs,\n service: EngagementService,\n): ResolveResult {\n const profile = service.getProfile()!\n\n if (!profile.challenges.active || profile.challenges.active.id !== args.id) {\n return { success: false, type: 'challenge', action: args.action, error: `No active challenge with id ${args.id}` }\n }\n\n if (args.action === 'complete') {\n // Check if challenge is actually completed\n if (!checkChallengeCompletion(profile, profile.challenges.active)) {\n return { success: false, type: 'challenge', action: 'complete', error: 'Challenge criteria not yet met' }\n }\n service.applyProfileUpdate(p => resolveChallenge(p, args.id))\n const bonusXP = profile.challenges.active.bonus_xp\n return {\n success: true,\n type: 'challenge',\n action: 'complete',\n xp_earned: bonusXP,\n message: `Challenge completed! +${bonusXP} bonus XP.`,\n _hints: buildHints({\n next: `+${bonusXP} XP bonus for completing the challenge.`,\n related: ['datacore.status'],\n }),\n }\n }\n\n if (args.action === 'dismiss') {\n service.applyProfileUpdate(p => dismissChallenge(p, args.id))\n return {\n success: true,\n type: 'challenge',\n action: 'dismiss',\n xp_earned: 0,\n message: 'Challenge dismissed — no penalty.',\n _hints: buildHints({\n next: 'A new challenge will be offered next week.',\n related: ['datacore.status'],\n }),\n }\n }\n\n return { success: false, type: 'challenge', action: args.action, error: 'Invalid action. Must be \"complete\" or \"dismiss\".' }\n}\n","// src/tools/schemas.ts\nimport * as fs from 'fs'\nimport { loadSchemas, saveSchemas, generateSchemaId, type SchemaDefinition } from '../schemas/schema-definition.js'\nimport { loadEngrams } from '../engrams.js'\nimport { detectSchemas } from '../schema-detection.js'\nimport { flattenRelations } from '../inject.js'\nimport { atomicWriteYaml } from './inject-tool.js'\nimport { buildHints } from '../hints.js'\n\ninterface SchemasArgs {\n action: 'list' | 'detect' | 'activate' | 'archive' | 'merge' | 'split' | 'migrate'\n id?: string\n target_id?: string\n member_ids?: string[]\n name?: string\n confirm?: boolean\n}\n\nexport async function handleSchemas(\n args: SchemasArgs,\n paths: { schemasPath: string; engramsPath: string },\n): Promise<unknown> {\n switch (args.action) {\n case 'list': return listSchemas(paths.schemasPath)\n case 'detect': return detectAction(paths)\n case 'activate': return setStatus(paths.schemasPath, args.id!, 'active')\n case 'archive': return setStatus(paths.schemasPath, args.id!, 'archived')\n case 'merge': return mergeSchemas(paths.schemasPath, args.id!, args.target_id!)\n case 'split': return splitSchema(paths.schemasPath, args.id!, args.member_ids!, args.name)\n case 'migrate': return migrateRelations(paths.engramsPath, args.confirm)\n default: throw new Error(`Unknown schemas action: ${args.action}`)\n }\n}\n\nfunction listSchemas(schemasPath: string) {\n const schemas = loadSchemas(schemasPath)\n return {\n schemas: schemas.map(s => ({\n id: s.id,\n name: s.name,\n status: s.status,\n members: s.members.length,\n confidence: s.confidence,\n shared_anchors: s.shared_anchors.length,\n updated: s.updated,\n })),\n total: schemas.length,\n _hints: buildHints({\n next: schemas.length === 0\n ? 'No schemas yet. Use action=\"detect\" to discover schemas from association graph.'\n : 'Use action=\"detect\" to update schemas from current associations.',\n related: ['datacore.schemas'],\n }),\n }\n}\n\nfunction detectAction(paths: { schemasPath: string; engramsPath: string }) {\n const engrams = loadEngrams(paths.engramsPath)\n const existing = loadSchemas(paths.schemasPath)\n const result = detectSchemas(engrams, existing)\n\n if (result.warning) {\n return { warning: result.warning, created: 0, updated: 0, flagged: 0 }\n }\n\n // Merge results with existing schemas\n const updatedIds = new Set(result.updated.map(s => s.id))\n const final = [\n ...existing.filter(s => !updatedIds.has(s.id)),\n ...result.updated,\n ...result.created,\n ]\n\n // Ensure directory exists\n const dir = paths.schemasPath.substring(0, paths.schemasPath.lastIndexOf('/'))\n if (dir && !fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n\n saveSchemas(paths.schemasPath, final)\n\n return {\n created: result.created.length,\n updated: result.updated.length,\n flagged: result.flagged.length,\n flagged_ids: result.flagged.map(s => s.id),\n total: final.length,\n _hints: buildHints({\n next: result.created.length > 0\n ? `${result.created.length} new candidate schema(s) found. Use action=\"activate\" to promote.`\n : 'Schema detection complete.',\n related: ['datacore.schemas'],\n }),\n }\n}\n\nfunction setStatus(schemasPath: string, id: string, newStatus: SchemaDefinition['status']) {\n const schemas = loadSchemas(schemasPath)\n const schema = schemas.find(s => s.id === id)\n if (!schema) throw new Error(`Schema not found: ${id}`)\n\n schema.status = newStatus\n schema.updated = new Date().toISOString().split('T')[0]\n saveSchemas(schemasPath, schemas)\n\n return {\n id: schema.id,\n status: newStatus,\n _hints: buildHints({ next: `Schema ${id} is now ${newStatus}.`, related: ['datacore.schemas'] }),\n }\n}\n\nfunction mergeSchemas(schemasPath: string, sourceId: string, targetId: string) {\n const schemas = loadSchemas(schemasPath)\n const source = schemas.find(s => s.id === sourceId)\n const target = schemas.find(s => s.id === targetId)\n if (!source) throw new Error(`Source schema not found: ${sourceId}`)\n if (!target) throw new Error(`Target schema not found: ${targetId}`)\n\n // Union members, recalc confidence\n const memberSet = new Set([...target.members, ...source.members])\n target.members = Array.from(memberSet).sort()\n const anchorSet = new Set([...target.shared_anchors, ...source.shared_anchors])\n target.shared_anchors = Array.from(anchorSet)\n target.confidence = Math.max(target.confidence, source.confidence)\n // Keep higher status\n const statusOrder = { archived: 0, candidate: 1, active: 2, consolidated: 3 }\n if (statusOrder[source.status] > statusOrder[target.status]) {\n target.status = source.status\n }\n target.updated = new Date().toISOString().split('T')[0]\n\n // Archive source\n source.status = 'archived'\n source.updated = target.updated\n\n saveSchemas(schemasPath, schemas)\n\n return {\n merged_into: target.id,\n archived: source.id,\n members: target.members.length,\n _hints: buildHints({ next: `Merged ${sourceId} into ${targetId}.`, related: ['datacore.schemas'] }),\n }\n}\n\nfunction splitSchema(schemasPath: string, id: string, memberIds: string[], name?: string) {\n const schemas = loadSchemas(schemasPath)\n const schema = schemas.find(s => s.id === id)\n if (!schema) throw new Error(`Schema not found: ${id}`)\n\n // Verify members belong to schema\n const schemaMembers = new Set(schema.members)\n for (const memberId of memberIds) {\n if (!schemaMembers.has(memberId)) throw new Error(`${memberId} is not a member of ${id}`)\n }\n\n // Remove from original\n schema.members = schema.members.filter(m => !memberIds.includes(m))\n schema.updated = new Date().toISOString().split('T')[0]\n\n // Create new schema\n const newSchema: SchemaDefinition = {\n id: generateSchemaId(schemas),\n name: name ?? `Split from ${schema.name}`,\n members: memberIds.sort(),\n confidence: schema.confidence * 0.8,\n status: 'candidate',\n shared_anchors: [],\n created: schema.updated,\n updated: schema.updated,\n }\n schemas.push(newSchema)\n saveSchemas(schemasPath, schemas)\n\n return {\n original: { id: schema.id, remaining_members: schema.members.length },\n new_schema: { id: newSchema.id, members: newSchema.members.length },\n _hints: buildHints({ next: `Split complete. New schema: ${newSchema.id}`, related: ['datacore.schemas'] }),\n }\n}\n\nfunction migrateRelations(engramsPath: string, confirm?: boolean) {\n const engrams = loadEngrams(engramsPath)\n let migratedCount = 0\n let totalAssociations = 0\n\n for (const engram of engrams) {\n if (engram.pack) continue // skip pack engrams\n if (!engram.relations) continue\n const converted = flattenRelations(engram)\n if (converted.length === 0) continue\n\n if (confirm) {\n // Add converted associations (avoid duplicates)\n const existingTargets = new Set(engram.associations.map(a => `${a.target}:${a.type}`))\n for (const assoc of converted) {\n const key = `${assoc.target}:${assoc.type}`\n if (!existingTargets.has(key)) {\n engram.associations.push(assoc)\n totalAssociations++\n }\n }\n // Clear relations field\n delete (engram as any).relations\n migratedCount++\n } else {\n migratedCount++\n totalAssociations += converted.length\n }\n }\n\n if (confirm && migratedCount > 0) {\n atomicWriteYaml(engramsPath, { engrams })\n }\n\n return {\n action: confirm ? 'executed' : 'preview',\n engrams_with_relations: migratedCount,\n associations_created: totalAssociations,\n _hints: buildHints({\n next: confirm\n ? `Migrated ${migratedCount} engram(s) from relations to associations.`\n : `Preview: ${migratedCount} engram(s) to migrate. Set confirm=true to execute.`,\n related: ['datacore.schemas'],\n }),\n }\n}\n","// src/schema-detection.ts\n// k-core decomposition + connected component detection for schema discovery.\n// Per DIP-0019 Phase 3.\n\nimport { decayedCoAccessStrength } from './decay.js'\nimport { generateSchemaId, type SchemaDefinition } from './schemas/schema-definition.js'\nimport type { Engram } from './schemas/engram.js'\n\nconst MIN_STRENGTH = 0.4\nconst MIN_MEMBERS = 3\nconst MIN_SHARED_ANCHORS = 2\nconst K_CORE = 2\nconst MAX_EDGES = 10_000\nconst STALE_DAYS = 90\n\nexport interface DetectionResult {\n created: SchemaDefinition[]\n updated: SchemaDefinition[]\n flagged: SchemaDefinition[]\n warning?: string\n}\n\nexport function detectSchemas(\n engrams: Engram[],\n existing: SchemaDefinition[],\n): DetectionResult {\n // Step 1: Build undirected weighted graph from associations\n const adjacency = new Map<string, Set<string>>()\n const engramMap = new Map(engrams.map(e => [e.id, e]))\n const seenEdges = new Set<string>()\n\n for (const engram of engrams) {\n if (engram.status !== 'active') continue\n for (const assoc of engram.associations) {\n if (assoc.target_type !== 'engram') continue\n const target = engramMap.get(assoc.target)\n if (!target || target.status !== 'active') continue\n\n // Apply decay for co_accessed associations\n const effectiveStrength = assoc.type === 'co_accessed' && assoc.updated_at\n ? decayedCoAccessStrength(assoc.strength, assoc.updated_at)\n : assoc.strength\n\n if (effectiveStrength < MIN_STRENGTH) continue\n\n // Add bidirectional edge (undirected graph), count unique edges only\n if (!adjacency.has(engram.id)) adjacency.set(engram.id, new Set())\n if (!adjacency.has(assoc.target)) adjacency.set(assoc.target, new Set())\n adjacency.get(engram.id)!.add(assoc.target)\n adjacency.get(assoc.target)!.add(engram.id)\n const edgeKey = engram.id < assoc.target\n ? `${engram.id}:${assoc.target}`\n : `${assoc.target}:${engram.id}`\n seenEdges.add(edgeKey)\n }\n }\n\n // Safety check: abort if graph too large\n if (seenEdges.size > MAX_EDGES) {\n return {\n created: [],\n updated: [],\n flagged: [],\n warning: `Association graph has ${seenEdges.size} edges (limit: ${MAX_EDGES}). Skipping detection to prevent performance issues.`,\n }\n }\n\n // Step 2: k-core decomposition (k=2)\n let changed = true\n while (changed) {\n changed = false\n for (const [node, neighbors] of adjacency) {\n if (neighbors.size < K_CORE) {\n for (const neighbor of neighbors) {\n adjacency.get(neighbor)?.delete(node)\n }\n adjacency.delete(node)\n changed = true\n }\n }\n }\n\n // Step 3: Find connected components using BFS\n const visited = new Set<string>()\n const components: string[][] = []\n\n for (const node of adjacency.keys()) {\n if (visited.has(node)) continue\n const component: string[] = []\n const queue = [node]\n visited.add(node)\n while (queue.length > 0) {\n const current = queue.shift()!\n component.push(current)\n for (const neighbor of adjacency.get(current) ?? []) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor)\n queue.push(neighbor)\n }\n }\n }\n components.push(component)\n }\n\n // Step 4: Filter by minimum members and shared anchors\n const today = new Date().toISOString().split('T')[0]\n const created: SchemaDefinition[] = []\n const updated: SchemaDefinition[] = []\n\n for (const component of components) {\n if (component.length < MIN_MEMBERS) continue\n\n // Compute shared anchors\n const anchorCounts = new Map<string, number>()\n for (const id of component) {\n const engram = engramMap.get(id)\n if (!engram) continue\n for (const anchor of engram.knowledge_anchors) {\n anchorCounts.set(anchor.path, (anchorCounts.get(anchor.path) ?? 0) + 1)\n }\n }\n const sharedAnchors = Array.from(anchorCounts.entries())\n .filter(([, count]) => count >= 2)\n .map(([path]) => path)\n\n if (sharedAnchors.length < MIN_SHARED_ANCHORS) continue\n\n // Compute confidence\n const memberScore = Math.min(component.length / 10, 1.0)\n const anchorScore = Math.min(sharedAnchors.length / 5, 1.0)\n let totalStrength = 0\n let edgePairs = 0\n for (const id of component) {\n const neighbors = adjacency.get(id) ?? new Set()\n for (const neighbor of neighbors) {\n if (component.includes(neighbor)) {\n totalStrength += getMaxStrength(engramMap.get(id)!, neighbor, engramMap)\n edgePairs++\n }\n }\n }\n const avgStrength = edgePairs > 0 ? totalStrength / edgePairs : 0\n const confidence = Math.round(memberScore * anchorScore * avgStrength * 1000) / 1000\n\n // Match existing schema by member overlap (Jaccard >= 0.5)\n const componentSet = new Set(component)\n let matched = false\n for (const schema of existing) {\n if (schema.status === 'archived') continue\n const schemaSet = new Set(schema.members)\n const intersection = component.filter(id => schemaSet.has(id)).length\n const union = new Set([...component, ...schema.members]).size\n const jaccard = intersection / union\n if (jaccard >= 0.5) {\n updated.push({\n ...schema,\n members: component.sort(),\n shared_anchors: sharedAnchors,\n confidence,\n updated: today,\n })\n matched = true\n break\n }\n }\n\n if (!matched) {\n const allExisting = [...existing, ...created]\n created.push({\n id: generateSchemaId(allExisting),\n name: `Schema from ${component.length} engrams`,\n members: component.sort(),\n confidence,\n status: 'candidate',\n shared_anchors: sharedAnchors,\n created: today,\n updated: today,\n })\n }\n }\n\n // Step 7: Flag stale schemas (90+ days since update)\n const flagged: SchemaDefinition[] = []\n const staleDate = new Date()\n staleDate.setDate(staleDate.getDate() - STALE_DAYS)\n const staleDateStr = staleDate.toISOString().split('T')[0]\n\n for (const schema of existing) {\n if (schema.status === 'archived') continue\n if (schema.updated < staleDateStr) {\n flagged.push(schema)\n }\n }\n\n return { created, updated, flagged }\n}\n\nfunction getMaxStrength(engram: Engram, targetId: string, engramMap: Map<string, Engram>): number {\n let max = 0\n for (const assoc of engram.associations) {\n if (assoc.target === targetId) {\n const effective = assoc.type === 'co_accessed' && assoc.updated_at\n ? decayedCoAccessStrength(assoc.strength, assoc.updated_at)\n : assoc.strength\n if (effective > max) max = effective\n }\n }\n // Also check reverse\n const target = engramMap.get(targetId)\n if (target) {\n for (const assoc of target.associations) {\n if (assoc.target === engram.id) {\n const effective = assoc.type === 'co_accessed' && assoc.updated_at\n ? decayedCoAccessStrength(assoc.strength, assoc.updated_at)\n : assoc.strength\n if (effective > max) max = effective\n }\n }\n }\n return max\n}\n","// src/tools/exchange.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport { createLEPPacket, validateLEPPacket, importLEPEngrams } from '../exchange.js'\nimport { buildHints } from '../hints.js'\nimport type { EngagementService } from '../engagement/index.js'\n\ninterface ExchangeArgs {\n action: 'export' | 'import' | 'status'\n engram_ids?: string[]\n filter_domain?: string\n path?: string\n sender?: string\n confirm?: boolean\n fitness_threshold?: number\n source_cap_percent?: number\n}\n\nexport async function handleExchange(\n args: ExchangeArgs,\n paths: { engramsPath: string; exchangeInboxPath: string; exchangeOutboxPath: string },\n engagementService?: EngagementService,\n): Promise<unknown> {\n switch (args.action) {\n case 'export': return exportAction(args, paths, engagementService)\n case 'import': return importAction(args, paths)\n case 'status': return statusAction(paths)\n default: throw new Error(`Unknown exchange action: ${args.action}`)\n }\n}\n\nasync function exportAction(\n args: ExchangeArgs,\n paths: { engramsPath: string; exchangeOutboxPath: string },\n engagementService?: EngagementService,\n) {\n const allEngrams = loadEngrams(paths.engramsPath)\n const sender = args.sender ?? 'anonymous'\n\n // Filter engrams for export\n let candidates = allEngrams.filter(e =>\n !e.pack &&\n e.status === 'active' &&\n (e.visibility === 'public' || e.visibility === 'template'),\n )\n\n if (args.engram_ids?.length) {\n const idSet = new Set(args.engram_ids)\n candidates = candidates.filter(e => idSet.has(e.id))\n }\n if (args.filter_domain) {\n candidates = candidates.filter(e => e.domain?.startsWith(args.filter_domain!))\n }\n\n if (candidates.length === 0) {\n return {\n exported: 0,\n message: 'No eligible engrams found. Only public/template visibility engrams can be exported.',\n _hints: buildHints({ next: 'Set visibility to public or template on engrams you want to share.', related: ['datacore.learn'] }),\n }\n }\n\n const packet = createLEPPacket(candidates, allEngrams, sender)\n\n // Ensure outbox dir exists\n fs.mkdirSync(paths.exchangeOutboxPath, { recursive: true })\n const outPath = path.join(paths.exchangeOutboxPath, `${packet.id}.yaml`)\n fs.writeFileSync(outPath, yaml.dump(packet, { lineWidth: 120, noRefs: true, quotingType: '\"' }))\n\n // Engagement XP\n if (engagementService?.isEnabled()) {\n try { await engagementService.award('pack_exported', { count: packet.engrams.length }) } catch { /* */ }\n }\n\n return {\n exported: packet.engrams.length,\n packet_id: packet.id,\n path: outPath,\n _hints: buildHints({ next: `Exported ${packet.engrams.length} engram(s) to ${outPath}`, related: ['datacore.exchange'] }),\n }\n}\n\nasync function importAction(\n args: ExchangeArgs,\n paths: { engramsPath: string; exchangeInboxPath: string },\n) {\n if (!args.path) throw new Error('path is required for import action')\n if (!fs.existsSync(args.path)) throw new Error(`File not found: ${args.path}`)\n\n const raw = yaml.load(fs.readFileSync(args.path, 'utf8'))\n const packet = validateLEPPacket(raw)\n const existing = loadEngrams(paths.engramsPath)\n\n const result = importLEPEngrams(packet, existing, {\n fitnessThreshold: args.fitness_threshold,\n sourceCapPercent: args.source_cap_percent,\n })\n\n if (result.skipped_source_cap) {\n return {\n imported: 0,\n message: `Source cap exceeded: too many engrams already from ${packet.sender}.`,\n _hints: buildHints({ next: 'Remove some imported engrams from this source first.', related: ['datacore.forget'] }),\n }\n }\n\n if (args.confirm && result.imported > 0) {\n saveEngrams(paths.engramsPath, existing)\n return {\n imported: result.imported,\n skipped_fitness: result.skipped_fitness,\n skipped_duplicate: result.skipped_duplicate,\n candidates: result.candidates,\n _hints: buildHints({\n next: `Imported ${result.imported} engram(s) as candidates. Use datacore.promote to activate.`,\n related: ['datacore.promote'],\n }),\n }\n }\n\n return {\n action: 'preview',\n would_import: result.imported,\n skipped_fitness: result.skipped_fitness,\n skipped_duplicate: result.skipped_duplicate,\n candidates: result.candidates,\n _hints: buildHints({\n next: result.imported > 0\n ? `Preview: ${result.imported} engram(s) would be imported. Set confirm=true to execute.`\n : 'No engrams passed fitness and duplicate filters.',\n related: ['datacore.exchange'],\n }),\n }\n}\n\nfunction statusAction(\n paths: { exchangeInboxPath: string; exchangeOutboxPath: string },\n) {\n const inboxCount = countYamlFiles(paths.exchangeInboxPath)\n const outboxCount = countYamlFiles(paths.exchangeOutboxPath)\n\n return {\n inbox: inboxCount,\n outbox: outboxCount,\n _hints: buildHints({\n next: inboxCount > 0\n ? `${inboxCount} packet(s) in inbox. Use action=\"import\" with path to process.`\n : 'No packets in inbox.',\n related: ['datacore.exchange'],\n }),\n }\n}\n\nfunction countYamlFiles(dir: string): number {\n if (!fs.existsSync(dir)) return 0\n return fs.readdirSync(dir).filter(f => f.endsWith('.yaml')).length\n}\n","// src/exchange.ts\n// LEP (Learning Exchange Packet) creation, validation, and import.\n// Per DIP-0019 Phase 4.\n\nimport { z } from 'zod'\nimport type { Engram } from './schemas/engram.js'\nimport { generateEngramId } from './tools/learn.js'\n\n// --- LEP Packet schema ---\n\nexport const LEPEngramSchema = z.object({\n id: z.string(),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n scope: z.string(),\n statement: z.string(),\n rationale: z.string().optional(),\n domain: z.string().optional(),\n tags: z.array(z.string()).default([]),\n fitness: z.number().min(0).max(1),\n provenance: z.object({\n origin: z.string(),\n chain: z.array(z.string()).default([]),\n }).optional(),\n})\n\nexport type LEPEngram = z.infer<typeof LEPEngramSchema>\n\nexport const LEPPacketSchema = z.object({\n id: z.string(),\n sender: z.string(),\n signature: z.string().nullable().default(null),\n created: z.string(),\n engrams: z.array(LEPEngramSchema),\n})\n\nexport type LEPPacket = z.infer<typeof LEPPacketSchema>\n\n// --- Fitness calculation ---\n\nexport function calculateFitness(engram: Engram, allEngrams: Engram[]): number {\n // adoptionScore = min(log2(adoptionCount + 1) / 6, 1) * envDiversity_norm * 0.4\n const adoptionCount = engram.derivation_count\n const adoptionBase = Math.min(Math.log2(adoptionCount + 1) / 6, 1)\n\n // envDiversity = distinct scope prefixes across associated engrams\n const associatedScopes = new Set<string>()\n for (const assoc of engram.associations) {\n if (assoc.target_type !== 'engram') continue\n const target = allEngrams.find(e => e.id === assoc.target)\n if (target) {\n const prefix = target.scope.split(':')[0]\n associatedScopes.add(prefix)\n }\n }\n const envDiversity = Math.max(associatedScopes.size, 1)\n const envDiversityNorm = Math.min(envDiversity / 5, 1)\n const adoptionScore = adoptionBase * envDiversityNorm * 0.4\n\n // rsScore = retrieval_strength * 0.3\n const rsScore = engram.activation.retrieval_strength * 0.3\n\n // ageScore = min(log(ageDays + 1) / 7, 1) * 0.2\n const createdDate = parseEngramDate(engram.id)\n const ageDays = createdDate\n ? Math.max(0, (Date.now() - createdDate.getTime()) / 86_400_000)\n : 0\n const ageScore = Math.min(Math.log(ageDays + 1) / 7, 1) * 0.2\n\n // contradictionScore = (1 - contradictionRate) * 0.1\n const feedback = engram.feedback_signals\n const totalFeedback = feedback\n ? feedback.positive + feedback.negative + feedback.neutral\n : 0\n const contradictionRate = totalFeedback > 0 && feedback\n ? feedback.negative / totalFeedback\n : 0\n const contradictionScore = (1 - contradictionRate) * 0.1\n\n return Math.round((adoptionScore + rsScore + ageScore + contradictionScore) * 1000) / 1000\n}\n\nfunction parseEngramDate(id: string): Date | null {\n // ENG-YYYY-MMDD-NNN → extract date\n const match = id.match(/^ENG-(\\d{4})-(\\d{4})-/)\n if (!match) return null\n const year = match[1]\n const mmdd = match[2]\n const month = mmdd.slice(0, 2)\n const day = mmdd.slice(2, 4)\n return new Date(`${year}-${month}-${day}`)\n}\n\n// --- LEP Packet creation ---\n\nexport function createLEPPacket(\n engrams: Engram[],\n allEngrams: Engram[],\n sender: string,\n): LEPPacket {\n const today = new Date().toISOString().split('T')[0]\n const id = `LEP-${today.replace(/-/g, '').slice(0, 4)}-${today.replace(/-/g, '').slice(4)}-${String(Date.now()).slice(-3)}`\n\n const lepEngrams: LEPEngram[] = engrams\n .filter(e => e.visibility === 'public' || e.visibility === 'template')\n .map(e => ({\n id: e.id,\n type: e.type,\n scope: e.scope,\n statement: e.statement,\n rationale: e.rationale,\n domain: e.domain,\n tags: e.tags,\n fitness: calculateFitness(e, allEngrams),\n provenance: {\n origin: sender,\n chain: [id],\n },\n }))\n\n return { id, sender, signature: null, created: today, engrams: lepEngrams }\n}\n\n// --- LEP Packet validation ---\n\nexport function validateLEPPacket(raw: unknown): LEPPacket {\n return LEPPacketSchema.parse(raw)\n}\n\n// --- Levenshtein distance ---\n\nexport function levenshteinDistance(a: string, b: string): number {\n const m = a.length\n const 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\nfunction normalizeStatement(s: string): string {\n return s.toLowerCase().replace(/[^\\w\\s]/g, '').replace(/\\s+/g, ' ').trim()\n}\n\n// --- LEP Import ---\n\nexport interface ImportResult {\n imported: number\n skipped_fitness: number\n skipped_duplicate: number\n skipped_source_cap: boolean\n candidates: Array<{ id: string; statement: string; fitness: number }>\n}\n\nexport function importLEPEngrams(\n packet: LEPPacket,\n existing: Engram[],\n config: { sourceCapPercent?: number; fitnessThreshold?: number } = {},\n): ImportResult {\n const sourceCapPercent = config.sourceCapPercent ?? 0.20\n const fitnessThreshold = config.fitnessThreshold ?? 0.3\n\n // Source cap check: count engrams from this sender via provenance.origin\n const personalCount = existing.filter(e => !e.pack).length\n if (personalCount > 0) {\n const fromSender = existing.filter(e => e.provenance?.origin === packet.sender).length\n if (fromSender / personalCount > sourceCapPercent) {\n return {\n imported: 0,\n skipped_fitness: 0,\n skipped_duplicate: 0,\n skipped_source_cap: true,\n candidates: [],\n }\n }\n }\n\n // Normalize existing statements for duplicate detection\n const existingNormalized = existing.map(e => normalizeStatement(e.statement))\n\n let skippedFitness = 0\n let skippedDuplicate = 0\n const candidates: ImportResult['candidates'] = []\n\n const now = new Date()\n const today = now.toISOString().split('T')[0]\n const trialExpiry = new Date(now)\n trialExpiry.setDate(trialExpiry.getDate() + 30)\n const trialExpiryTag = `_trial_expires:${trialExpiry.toISOString().split('T')[0]}`\n\n for (const lepEngram of packet.engrams) {\n // Fitness filter\n if (lepEngram.fitness < fitnessThreshold) {\n skippedFitness++\n continue\n }\n\n // Duplicate detection (Levenshtein, threshold 0.15)\n const normalized = normalizeStatement(lepEngram.statement)\n let isDuplicate = false\n for (const existingNorm of existingNormalized) {\n const dist = levenshteinDistance(normalized, existingNorm)\n const maxLen = Math.max(normalized.length, existingNorm.length)\n if (maxLen > 0 && dist / maxLen < 0.15) {\n isDuplicate = true\n break\n }\n }\n if (isDuplicate) {\n skippedDuplicate++\n continue\n }\n\n const newId = generateEngramId(existing)\n candidates.push({\n id: newId,\n statement: lepEngram.statement,\n fitness: lepEngram.fitness,\n })\n\n // Construct new engram as candidate\n const newEngram: Engram = {\n id: newId,\n version: 2,\n status: 'candidate',\n consolidated: false,\n type: lepEngram.type,\n scope: lepEngram.scope,\n visibility: 'private',\n statement: lepEngram.statement,\n rationale: lepEngram.rationale,\n derivation_count: 1,\n domain: lepEngram.domain,\n knowledge_anchors: [],\n associations: [],\n tags: [...lepEngram.tags, '_trial', trialExpiryTag],\n activation: {\n retrieval_strength: 0.5,\n storage_strength: 0.3,\n frequency: 0,\n last_accessed: today,\n },\n pack: packet.id,\n abstract: null,\n derived_from: lepEngram.id,\n provenance: {\n origin: lepEngram.provenance?.origin ?? packet.sender,\n chain: [...(lepEngram.provenance?.chain ?? []), packet.id],\n signature: null,\n license: 'cc-by-sa-4.0',\n },\n }\n\n existing.push(newEngram)\n existingNormalized.push(normalized)\n }\n\n return {\n imported: candidates.length,\n skipped_fitness: skippedFitness,\n skipped_duplicate: skippedDuplicate,\n skipped_source_cap: false,\n candidates,\n }\n}\n","// src/knowledge-surfacing.ts\n// State management for knowledge surfacing: zettel-to-engram and consolidation.\n// Per DIP-0019 Phase 4.\n\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\nimport { loadEngrams } from './engrams.js'\nimport { levenshteinDistance } from './exchange.js'\n\n// --- Zettel candidate ---\n\nexport const ZettelCandidateSchema = z.object({\n path: z.string(),\n title: z.string(),\n suggested_statement: z.string(),\n suggested_type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n suggested_scope: z.string(),\n suggested_anchors: z.array(z.string()),\n confidence: z.number().min(0).max(1),\n status: z.enum(['pending', 'accepted', 'rejected']),\n created: z.string(),\n})\n\nexport type ZettelCandidate = z.infer<typeof ZettelCandidateSchema>\n\n// --- Consolidation result ---\n\nexport interface ConsolidationResult {\n low_rs_engrams: Array<{ id: string; rs: number; last_accessed: string }>\n duplicate_clusters: Array<{ representative: string; duplicates: string[]; similarity: number }>\n action_taken: 'preview' | 'executed'\n executed_at: string | null\n}\n\n// --- State ---\n\nexport interface KnowledgeSurfacingState {\n last_zettel_scan: string | null\n scanned_paths: string[]\n zettel_candidates: ZettelCandidate[]\n last_consolidation: string | null\n consolidation_results: ConsolidationResult | null\n}\n\nconst defaultState: KnowledgeSurfacingState = {\n last_zettel_scan: null,\n scanned_paths: [],\n zettel_candidates: [],\n last_consolidation: null,\n consolidation_results: null,\n}\n\nexport function loadKnowledgeSurfacing(filePath: string): KnowledgeSurfacingState {\n if (!fs.existsSync(filePath)) return { ...defaultState }\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n return { ...defaultState, ...raw }\n } catch {\n return { ...defaultState }\n }\n}\n\nexport function saveKnowledgeSurfacing(filePath: string, state: KnowledgeSurfacingState): void {\n const dir = path.dirname(filePath)\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true })\n const content = yaml.dump(state, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\n// --- Zettel scanning ---\n\nconst ACTIONABLE_WORDS = /\\b(should|always|never|when|before|after|must|avoid|prefer|ensure|make sure)\\b/i\nconst PROCEDURAL_PATTERNS = /(\\d+\\.\\s|\\bhow to\\b|step \\d+)/i\nconst DECISION_PATTERNS = /\\b(because|due to|trade-?off|we chose|decided|rationale)\\b/i\n\nexport function scanZettels(\n knowledgePath: string,\n state: KnowledgeSurfacingState,\n): ZettelCandidate[] {\n const zettelDir = path.join(knowledgePath, 'zettel')\n if (!fs.existsSync(zettelDir)) return []\n\n const scannedSet = new Set(state.scanned_paths)\n const candidates: ZettelCandidate[] = []\n const today = new Date().toISOString().split('T')[0]\n\n const files = globMd(zettelDir)\n for (const filePath of files) {\n const relativePath = path.relative(path.dirname(knowledgePath), filePath)\n if (scannedSet.has(relativePath)) continue\n\n const content = fs.readFileSync(filePath, 'utf8')\n const candidate = analyzeZettel(content, relativePath, today)\n if (candidate) candidates.push(candidate)\n\n state.scanned_paths.push(relativePath)\n }\n\n state.last_zettel_scan = today\n return candidates\n}\n\nfunction globMd(dir: string): string[] {\n const results: string[] = []\n if (!fs.existsSync(dir)) return results\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n results.push(...globMd(full))\n } else if (entry.name.endsWith('.md')) {\n results.push(full)\n }\n }\n return results\n}\n\nfunction analyzeZettel(content: string, relativePath: string, today: string): ZettelCandidate | null {\n const lines = content.split('\\n')\n const title = extractTitle(lines) ?? path.basename(relativePath, '.md')\n\n const hasActionable = ACTIONABLE_WORDS.test(content)\n const hasProcedural = PROCEDURAL_PATTERNS.test(content)\n const hasDecision = DECISION_PATTERNS.test(content)\n\n // Skip pure factual/definitional content\n if (!hasActionable && !hasProcedural && !hasDecision) return null\n\n // Determine type\n let type: ZettelCandidate['suggested_type'] = 'behavioral'\n if (hasProcedural) type = 'procedural'\n else if (hasDecision) type = 'architectural'\n\n // Compute confidence\n let confidence = 0.4\n if (hasActionable) confidence += 0.3\n if (hasProcedural || hasDecision) confidence += 0.1\n confidence = Math.min(confidence, 1.0)\n\n // Skip low-confidence\n if (confidence < 0.4) return null\n\n // Extract suggested statement: first actionable sentence or title + first paragraph\n const statement = extractActionableSentence(content) ?? `${title}: ${firstParagraph(content)}`\n\n return {\n path: relativePath,\n title,\n suggested_statement: statement.slice(0, 300),\n suggested_type: type,\n suggested_scope: 'global',\n suggested_anchors: [relativePath],\n confidence: Math.round(confidence * 100) / 100,\n status: 'pending',\n created: today,\n }\n}\n\nfunction extractTitle(lines: string[]): string | null {\n for (const line of lines) {\n if (line.startsWith('# ')) return line.slice(2).trim()\n }\n return null\n}\n\nfunction extractActionableSentence(content: string): string | null {\n const sentences = content.split(/(?<=[.!?])\\s+/)\n for (const sentence of sentences) {\n if (ACTIONABLE_WORDS.test(sentence) && sentence.length > 20) {\n return sentence.replace(/^[-*#>\\s]+/, '').trim()\n }\n }\n return null\n}\n\nfunction firstParagraph(content: string): string {\n const lines = content.split('\\n')\n const para: string[] = []\n let started = false\n for (const line of lines) {\n if (line.startsWith('#')) continue\n if (line.trim() === '') {\n if (started) break\n continue\n }\n started = true\n para.push(line.trim())\n }\n return para.join(' ').slice(0, 200)\n}\n\n// --- Consolidation pass ---\n\nfunction normalizeStatement(s: string): string {\n return s.toLowerCase().replace(/[^\\w\\s]/g, '').replace(/\\s+/g, ' ').trim()\n}\n\nexport function consolidationPass(\n engramsPath: string,\n confirm: boolean = false,\n): ConsolidationResult {\n const engrams = loadEngrams(engramsPath)\n const active = engrams.filter(e => e.status === 'active' && !e.pack)\n\n // Low-RS identification\n const thirtyDaysAgo = new Date()\n thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30)\n const thirtyDaysAgoStr = thirtyDaysAgo.toISOString().split('T')[0]\n\n const lowRs = active.filter(\n e => e.activation.retrieval_strength < 0.15 && e.activation.last_accessed < thirtyDaysAgoStr,\n ).map(e => ({\n id: e.id,\n rs: e.activation.retrieval_strength,\n last_accessed: e.activation.last_accessed,\n }))\n\n // Duplicate clustering using union-find\n const normalized = active.map(e => ({\n id: e.id,\n norm: normalizeStatement(e.statement),\n rs: e.activation.retrieval_strength,\n }))\n\n const parent = new Map<string, string>()\n const find = (x: string): string => {\n let root = x\n while (parent.has(root) && parent.get(root) !== root) root = parent.get(root)!\n // Path compression\n let curr = x\n while (curr !== root) {\n const next = parent.get(curr) ?? curr\n parent.set(curr, root)\n curr = next\n }\n return root\n }\n const union = (a: string, b: string) => {\n const ra = find(a)\n const rb = find(b)\n if (ra !== rb) parent.set(ra, rb)\n }\n\n // Initialize each node as its own parent\n for (const item of normalized) parent.set(item.id, item.id)\n\n // Compare pairs\n for (let i = 0; i < normalized.length; i++) {\n for (let j = i + 1; j < normalized.length; j++) {\n const a = normalized[i]\n const b = normalized[j]\n const maxLen = Math.max(a.norm.length, b.norm.length)\n if (maxLen === 0) continue\n const dist = levenshteinDistance(a.norm, b.norm)\n if (dist / maxLen < 0.30) {\n union(a.id, b.id)\n }\n }\n }\n\n // Build clusters\n const clusters = new Map<string, string[]>()\n for (const item of normalized) {\n const root = find(item.id)\n if (!clusters.has(root)) clusters.set(root, [])\n clusters.get(root)!.push(item.id)\n }\n\n // Filter to clusters with 2+ members, pick representative (highest RS)\n const duplicateClusters: ConsolidationResult['duplicate_clusters'] = []\n for (const [, members] of clusters) {\n if (members.length < 2) continue\n const sorted = members\n .map(id => ({ id, rs: normalized.find(n => n.id === id)!.rs }))\n .sort((a, b) => b.rs - a.rs)\n duplicateClusters.push({\n representative: sorted[0].id,\n duplicates: sorted.slice(1).map(s => s.id),\n similarity: 0.7, // approximate\n })\n }\n\n const today = new Date().toISOString().split('T')[0]\n\n if (confirm) {\n // Execute: retire low-RS and duplicate engrams\n const toRetire = new Set([\n ...lowRs.map(e => e.id),\n ...duplicateClusters.flatMap(c => c.duplicates),\n ])\n\n for (const engram of engrams) {\n if (toRetire.has(engram.id)) {\n engram.status = 'retired'\n }\n }\n\n // Bump derivation_count for representatives\n for (const cluster of duplicateClusters) {\n const rep = engrams.find(e => e.id === cluster.representative)\n if (rep) rep.derivation_count += cluster.duplicates.length\n }\n\n if (toRetire.size > 0) {\n const content = yaml.dump({ engrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = engramsPath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, engramsPath)\n }\n }\n\n return {\n low_rs_engrams: lowRs,\n duplicate_clusters: duplicateClusters,\n action_taken: confirm ? 'executed' : 'preview',\n executed_at: confirm ? today : null,\n }\n}\n","// src/tools/knowledge-scan.ts\nimport {\n loadKnowledgeSurfacing,\n saveKnowledgeSurfacing,\n scanZettels,\n consolidationPass,\n} from '../knowledge-surfacing.js'\nimport { buildHints } from '../hints.js'\n\ninterface KnowledgeScanArgs {\n action: 'scan_zettels' | 'scan_status' | 'consolidation_pass'\n confirm?: boolean\n}\n\nexport async function handleKnowledgeScan(\n args: KnowledgeScanArgs,\n paths: { knowledgePath: string; knowledgeSurfacingPath: string; engramsPath: string },\n): Promise<unknown> {\n switch (args.action) {\n case 'scan_zettels': return scanZettelsAction(paths)\n case 'scan_status': return scanStatusAction(paths.knowledgeSurfacingPath)\n case 'consolidation_pass': return consolidationAction(paths, args.confirm)\n default: throw new Error(`Unknown knowledge.scan action: ${args.action}`)\n }\n}\n\nfunction scanZettelsAction(\n paths: { knowledgePath: string; knowledgeSurfacingPath: string },\n) {\n const state = loadKnowledgeSurfacing(paths.knowledgeSurfacingPath)\n const candidates = scanZettels(paths.knowledgePath, state)\n\n state.zettel_candidates.push(...candidates)\n saveKnowledgeSurfacing(paths.knowledgeSurfacingPath, state)\n\n return {\n new_candidates: candidates.length,\n total_scanned: state.scanned_paths.length,\n total_pending: state.zettel_candidates.filter(c => c.status === 'pending').length,\n candidates: candidates.map(c => ({\n path: c.path,\n title: c.title,\n suggested_statement: c.suggested_statement,\n suggested_type: c.suggested_type,\n confidence: c.confidence,\n })),\n _hints: buildHints({\n next: candidates.length > 0\n ? `Found ${candidates.length} zettel-to-engram candidate(s). Review and use datacore.learn to create engrams.`\n : 'No new candidates found.',\n related: ['datacore.learn', 'datacore.knowledge.scan'],\n }),\n }\n}\n\nfunction scanStatusAction(surfacingPath: string) {\n const state = loadKnowledgeSurfacing(surfacingPath)\n const pending = state.zettel_candidates.filter(c => c.status === 'pending').length\n const accepted = state.zettel_candidates.filter(c => c.status === 'accepted').length\n const rejected = state.zettel_candidates.filter(c => c.status === 'rejected').length\n\n return {\n last_scan: state.last_zettel_scan,\n scanned_paths: state.scanned_paths.length,\n candidates: { pending, accepted, rejected, total: state.zettel_candidates.length },\n last_consolidation: state.last_consolidation,\n _hints: buildHints({\n next: pending > 0\n ? `${pending} pending candidate(s). Use scan_zettels to find more, or review candidates.`\n : 'All candidates processed.',\n related: ['datacore.knowledge.scan'],\n }),\n }\n}\n\nfunction consolidationAction(\n paths: { engramsPath: string; knowledgeSurfacingPath: string },\n confirm?: boolean,\n) {\n const result = consolidationPass(paths.engramsPath, confirm ?? false)\n\n // Update state\n const state = loadKnowledgeSurfacing(paths.knowledgeSurfacingPath)\n state.last_consolidation = new Date().toISOString().split('T')[0]\n state.consolidation_results = result\n saveKnowledgeSurfacing(paths.knowledgeSurfacingPath, state)\n\n return {\n low_rs_count: result.low_rs_engrams.length,\n duplicate_clusters: result.duplicate_clusters.length,\n action: result.action_taken,\n low_rs_engrams: result.low_rs_engrams.slice(0, 10),\n clusters: result.duplicate_clusters.slice(0, 5).map(c => ({\n representative: c.representative,\n duplicates: c.duplicates.length,\n })),\n _hints: buildHints({\n next: result.action_taken === 'preview'\n ? `Preview: ${result.low_rs_engrams.length} low-RS + ${result.duplicate_clusters.length} duplicate cluster(s). Set confirm=true to execute.`\n : `Consolidated: retired ${result.low_rs_engrams.length + result.duplicate_clusters.flatMap(c => c.duplicates).length} engram(s).`,\n related: ['datacore.knowledge.scan'],\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## Use Proactively\n\nUse Datacore tools automatically — do not wait to be asked:\n- **session.start**: Call at the beginning of every conversation\n- **learn**: Call when you discover patterns, preferences, insights, or corrections\n- **feedback**: Call after engrams are injected to rate usefulness\n- **session.end**: Call before the conversation ends\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 active engrams (immediately available for injection)\n- datacore.feedback with positive signals strengthens injection priority\n- datacore.forget retires engrams permanently\n- Unused engrams naturally decay over time\n- datacore.promote activates candidate engrams (when auto_promote is disabled)\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| 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| promote | Activate candidate engrams (when auto_promote disabled) |\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## Use Proactively\n\nUse Datacore tools automatically — do not wait to be asked:\n- **session.start**: Call at the beginning of every conversation\n- **learn**: Call when you discover patterns, preferences, insights, or corrections\n- **feedback**: Call after engrams are injected to rate usefulness\n- **session.end**: Call before the conversation ends\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 (immediately active) |\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| **promote** | Activate candidate engrams (when auto_promote disabled) |\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 → active → inject → feedback → stronger/weaker → forget (retire)\n\\`\\`\\`\n\n- **active**: Appears in inject results when relevant. Created directly by learn.\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- Call **learn** proactively when you discover patterns or preferences\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","// src/session-tracker.ts\n// In-memory session co-access tracker. Lost on crash = acceptable per DIP-0019.\n// Tracks which engrams were injected together in a session so we can\n// write Hebbian co-access associations at session.end.\n\nexport class SessionTracker {\n private sessions = new Map<string, Set<string>>()\n\n trackInjected(sessionId: string, engramIds: string[]): void {\n if (!sessionId || engramIds.length === 0) return\n let set = this.sessions.get(sessionId)\n if (!set) {\n set = new Set()\n this.sessions.set(sessionId, set)\n }\n for (const id of engramIds) {\n set.add(id)\n }\n }\n\n getCoAccessPairs(sessionId: string): Array<[string, string]> {\n const set = this.sessions.get(sessionId)\n if (!set || set.size < 2) return []\n\n const ids = Array.from(set).sort() // sorted for deterministic pairs\n const pairs: Array<[string, string]> = []\n for (let i = 0; i < ids.length; i++) {\n for (let j = i + 1; j < ids.length; j++) {\n pairs.push([ids[i], ids[j]])\n }\n }\n return pairs\n }\n\n getInjectedIds(sessionId: string): string[] {\n const set = this.sessions.get(sessionId)\n return set ? Array.from(set) : []\n }\n\n clear(sessionId: string): void {\n this.sessions.delete(sessionId)\n }\n\n get size(): number {\n return this.sessions.size\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","path","yaml","fs","yaml","z","args","fs","path","args","start","fs","path","args","fs","path","fs","path","z","updateAvailable","engagementService","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","crypto","fs","path","fs","path","yaml","fs","path","yaml","profilePath","currentValue","args","storage","engagementService","args","storage","engagementService","args","storage","args","args","fs","path","args","fs","path","yaml","z","z","args","engagementService","fs","path","yaml","z","z","extractTitle","normalizeStatement","args","fs","path","storage","args","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/tools/search.ts","../src/fts.ts","../src/tools/ingest.ts","../src/hints.ts","../src/tools/status.ts","../src/tools/date.ts","../src/modules.ts","../src/tools/modules-list.ts","../src/tools/modules-info.ts","../src/tools/modules-health.ts","../src/logger.ts","../src/resources.ts","../src/prompts.ts","../src/datacortex.ts","../src/bench/session-logger.ts","../src/bench/types.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 { handleSearch } from './tools/search.js'\nimport { handleIngest } from './tools/ingest.js'\nimport { handleStatus } from './tools/status.js'\nimport { handleDate } from './tools/date.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 { logger } from './logger.js'\nimport { registerResources } from './resources.js'\nimport { registerPrompts } from './prompts.js'\nimport { DatacortexBridge } from './datacortex.js'\nimport { SessionLogger } from './bench/session-logger.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\nexport let benchLogger: SessionLogger | null = null\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n {\n capabilities: { tools: {}, logging: {}, resources: { subscribe: true }, prompts: {} },\n instructions: SERVER_INSTRUCTIONS,\n },\n )\n\n // Initialize bench logger for session instrumentation (DIP-0025)\n if (storage) {\n const benchLogDir = storage.statePath\n ? `${storage.statePath}/bench`\n : `${storage.basePath}/.datacore/state/bench`\n benchLogger = new SessionLogger(benchLogDir, currentVersion)\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_capture to write a journal entry, datacore_search to find information, 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\n/**\n * Canonicalize an incoming tool name to its advertised form.\n *\n * Tool names are advertised with underscores (e.g. `datacore_capture`) because\n * MCP clients such as Claude Desktop validate every tool name in `tools/list`\n * against `^[a-zA-Z0-9_-]{1,64}$` and hard-reject dots. Older callers (and our\n * own pre-1.6 docs) used dot-namespaced names like `datacore.capture` or\n * `datacore.gtd.add_task`; we still accept those by mapping dots to underscores.\n * No advertised name contains a dot, so this transform is unambiguous.\n */\nexport function canonicalToolName(name: string): string {\n return name.includes('.') ? name.replace(/\\./g, '_') : name\n}\n\nasync function routeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const callStart = Date.now()\n let callSuccess = true\n let callError: string | undefined\n let callResult: unknown\n\n try {\n callResult = await routeToolInner(name, args)\n return callResult\n } catch (e) {\n callSuccess = false\n callError = e instanceof Error ? e.message : String(e)\n throw e\n } finally {\n if (benchLogger) {\n benchLogger.logToolCall(name, args, callResult, Date.now() - callStart, callSuccess, callError)\n }\n }\n}\n\nasync function routeToolInner(name: string, args: Record<string, unknown>): Promise<unknown> {\n // Accept legacy dot-namespaced names; route by the advertised underscore form.\n const lookupName = canonicalToolName(name)\n const coreTool = TOOLS.find(t => t.name === lookupName)\n if (coreTool) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Zod validates at runtime; union type too wide for TS\n const validated: any = coreTool.inputSchema.parse(args)\n let result: unknown\n switch (lookupName) {\n case 'datacore_capture': result = await handleCapture(validated, storage); break\n case 'datacore_search': result = await handleSearch(validated, { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath, spaces: storage.spaces }, datacortexBridge); break\n case 'datacore_ingest': result = await handleIngest(validated, { knowledgePath: storage.knowledgePath }); break\n case 'datacore_status': result = await handleStatus({ journalPath: storage.journalPath, knowledgePath: storage.knowledgePath, packsPath: storage.packsPath, mode: storage.mode, basePath: storage.basePath }, updateAvailable); break\n case 'datacore_date': result = await handleDate(validated, storage.basePath); 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 return result\n }\n\n const modTool = moduleTools.find(t => t.fullName === lookupName)\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(lookupName, 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// --- Server instructions ---\n// Included in the MCP initialize response. Compliant clients (Claude Desktop,\n// Claude Code, Cursor, etc.) add this to the AI's system prompt so it uses\n// Datacore proactively without needing a separate CLAUDE.md or config file.\n\nconst SERVER_INSTRUCTIONS = `Datacore is your productivity system — GTD task management, journal entries, knowledge files, and module management.\n\nUse Datacore for:\n- datacore_capture — write journal entries and knowledge notes\n- datacore_search — find information in journal and knowledge files\n- datacore_ingest — import content into your knowledge base\n- datacore_status — check system health\n- datacore_modules_* — manage installed modules\n\nFor memory (engrams, learning, recall): use PLUR MCP tools (plur_session_start, plur_learn, plur_recall, etc.)`\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 SpacePaths {\n name: string\n journalPath: string\n knowledgePath: string\n}\n\nexport interface StorageConfig {\n mode: StorageMode\n basePath: string\n engramsPath: string\n journalPath: string\n knowledgePath: string\n spaces: SpacePaths[]\n packsPath: string\n schemasPath: string\n exchangeInboxPath: string\n exchangeOutboxPath: string\n knowledgeSurfacingPath: string\n archivePath: string\n statePath: 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 discoverSpaces(basePath: string): SpacePaths[] {\n const spaces: SpacePaths[] = []\n try {\n for (const entry of fs.readdirSync(basePath, { withFileTypes: true })) {\n if (!entry.isDirectory() || !/^\\d+-/.test(entry.name)) continue\n const spacePath = path.join(basePath, entry.name)\n const name = entry.name.split('-').slice(1).join('-')\n // Find journal path (notes/journals/ or journal/)\n const notesJournals = path.join(spacePath, 'notes', 'journals')\n const journal = path.join(spacePath, 'journal')\n const journalPath = fs.existsSync(notesJournals) ? notesJournals : journal\n // Knowledge path\n const knowledgePath = path.join(spacePath, '3-knowledge')\n spaces.push({ name, journalPath, knowledgePath })\n }\n } catch { /* ignore */ }\n return spaces\n}\n\nfunction fullConfig(basePath: string): StorageConfig {\n const spaces = discoverSpaces(basePath)\n // Primary space is 0-personal (first space found, or fallback)\n const primary = spaces.find(s => s.name === 'personal') ?? spaces[0]\n return {\n mode: 'full',\n basePath,\n engramsPath: path.join(basePath, '.datacore', 'learning', 'engrams.yaml'),\n journalPath: primary?.journalPath ?? path.join(basePath, '0-personal', 'journal'),\n knowledgePath: primary?.knowledgePath ?? path.join(basePath, '0-personal', '3-knowledge'),\n spaces,\n packsPath: path.join(basePath, '.datacore', 'learning', 'packs'),\n schemasPath: path.join(basePath, '.datacore', 'learning', 'schemas.yaml'),\n exchangeInboxPath: path.join(basePath, '.datacore', 'learning', 'exchange', 'inbox'),\n exchangeOutboxPath: path.join(basePath, '.datacore', 'learning', 'exchange', 'outbox'),\n knowledgeSurfacingPath: path.join(basePath, '.datacore', 'state', 'knowledge-surfacing.yaml'),\n archivePath: path.join(basePath, '.datacore', 'learning', 'archive'),\n statePath: path.join(basePath, '.datacore', 'state'),\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 spaces: [{ name: 'core', journalPath: path.join(basePath, 'journal'), knowledgePath: path.join(basePath, 'knowledge') }],\n packsPath: path.join(basePath, 'packs'),\n schemasPath: path.join(basePath, 'schemas.yaml'),\n exchangeInboxPath: path.join(basePath, 'exchange', 'inbox'),\n exchangeOutboxPath: path.join(basePath, 'exchange', 'outbox'),\n knowledgeSurfacingPath: path.join(basePath, 'state', 'knowledge-surfacing.yaml'),\n archivePath: path.join(basePath, 'archive'),\n statePath: path.join(basePath, 'state'),\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', 'exchange/inbox', 'exchange/outbox', 'archive', 'state']) {\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: true # engrams are active immediately (set false for manual review)\\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 provides AI assistants with productivity tools (capture, search, ingest, modules).\nPersistent memory (engrams, sessions, feedback) is handled by **PLUR MCP** — a separate MCP server.\n\n## Two MCP Servers\n\n| Server | Tools | Purpose |\n|--------|-------|---------|\n| **PLUR MCP** | plur_session_start, plur_session_end, plur_learn, plur_recall_hybrid, plur_feedback, plur_forget | Persistent memory |\n| **Datacore MCP** | datacore_capture, datacore_search, datacore_ingest, datacore_status, datacore_modules_* | Productivity |\n\n## Proactive Behavior\n\nUse memory tools automatically — do not wait to be asked:\n- **plur_session_start**: Call at the beginning of every conversation\n- **plur_learn**: Call when you discover patterns, preferences, insights, or corrections\n- **plur_feedback**: Call after engrams are injected to rate usefulness\n- **plur_session_end**: Call before the conversation ends\n\n## Session Workflow\n\n1. **plur_session_start** — Call this first. Gets relevant engrams + today's journal.\n2. Work on the task. Use **plur_recall_hybrid** to search memory, **datacore_search** for files.\n3. **plur_feedback** — Rate which injected engrams were helpful.\n4. **plur_session_end** — Capture summary + suggest new engrams.\n\n## Key Tools\n\n### Memory (PLUR MCP)\n\n| Tool | Purpose |\n|------|---------|\n| plur_session_start | Start here. Begin session with context injection. |\n| plur_session_end | End session, capture journal + new engrams. |\n| plur_learn | Record a reusable pattern, preference, or insight. |\n| plur_recall_hybrid | Search engrams by keyword or semantic similarity. |\n| plur_feedback | Rate engrams: positive/negative/neutral. |\n| plur_forget | Retire an engram permanently. |\n\n### Productivity (Datacore MCP)\n\n| Tool | Purpose |\n|------|---------|\n| datacore_capture | Write a journal entry or knowledge note. |\n| datacore_search | Search journal and knowledge files. |\n| datacore_ingest | Import text and extract engram suggestions. |\n| datacore_status | System health + recommendations. |\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\n## Engram Lifecycle\n\nplur_learn → active → inject → plur_feedback → stronger/weaker → plur_forget (retire)\n\n- **active**: Appears in injection results when relevant to the task.\n- **retired**: Permanently removed from injection.\n- Positive 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`\nconst CONTEXT_CLAUDE = `# Datacore\n\nThis is a Datacore installation — productivity tools for AI assistants.\n\n${DATACORE_GUIDE}\n\n## MCP Tools\n\nProductivity tools are prefixed with \\`datacore_\\` (e.g., \\`datacore_capture\\`).\nMemory tools use PLUR MCP (e.g., \\`plur_session_start\\`).\nCall \\`plur_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) — productivity tools for AI assistants.\n\n${DATACORE_GUIDE}\n\n## For AI Agents\n\nProductivity tools are in the \\`datacore_\\` namespace. Memory tools are in PLUR MCP.\nStart every session by calling \\`plur_session_start\\`.\n`\n\nconst CONTEXT_CURSORRULES = `# Datacore\n\nThis directory is managed by Datacore — productivity tools for AI assistants.\nProductivity tools are in the \\`datacore_\\` namespace. Memory tools are in PLUR MCP.\n\n${DATACORE_GUIDE}`\n\nconst CONTEXT_COPILOT = `# Datacore\n\nThis directory is managed by [Datacore](https://github.com/datacore-one/mcp) — productivity tools for AI assistants.\n\n${DATACORE_GUIDE}\n\n## MCP Integration\n\nProductivity tools are in the \\`datacore_\\` namespace. Memory tools are in PLUR MCP.\nStart every session by calling \\`plur_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(true),\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 engagement: z.object({\n enabled: z.boolean().default(true),\n inline_xp: z.boolean().default(false),\n }).default({}),\n injection: z.object({\n directive_cap: z.number().default(10),\n consider_cap: z.number().default(5),\n spread_cap: z.number().default(3),\n spread_budget: z.number().default(480),\n }).default({}),\n co_access: z.object({\n new_strength: z.number().default(0.1),\n increment: z.number().default(0.05),\n max_strength: z.number().default(0.95),\n decay_rate: z.number().default(0.05),\n prune_threshold: z.number().default(0.05),\n }).default({}),\n learning: z.object({\n decay_rate: z.number().default(0.05),\n abstraction_threshold: z.number().default(2),\n legacy_audit_rate: z.number().default(3),\n auto_defer_learning_review: z.boolean().default(false),\n daily_review_max_items: z.number().default(5),\n onboarding_max_items: z.number().default(15),\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.6.0\",\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 \"release\": \"npm test && npm version ${VERSION:-patch} && npm run build && npm publish --access public && npm install -g @datacore-one/mcp@$(node -p 'require(\\\"./package.json\\\").version')\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"better-sqlite3\": \"^12.8.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/better-sqlite3\": \"^7.6.13\",\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 \"journal\",\n \"second-brain\",\n \"productivity\"\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. Call proactively to record important decisions, meeting outcomes, and significant events.',\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_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',\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: note counts, module health, update info',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore_date',\n description: 'Canonical date operations — ALWAYS use this instead of typing dates from memory. LLMs hallucinate day-of-week names and anchor to training-era dates. Returns today\\'s date, validates day-of-week, adds/subtracts days, parses relative expressions, and formats org-mode timestamps.',\n inputSchema: z.object({\n op: z.enum(['today', 'dow', 'validate', 'add', 'sub', 'diff', 'parse', 'org-stamp']).describe('Operation: today (current date+dow), dow (day-of-week for a date), validate (check date matches claimed dow), add/sub (N days from date), diff (days between two dates), parse (relative expression like \"next monday\"), org-stamp (<YYYY-MM-DD Day>)'),\n date: z.string().optional().describe('ISO date YYYY-MM-DD (for dow/validate/add/sub/org-stamp)'),\n date2: z.string().optional().describe('Second date for diff'),\n day: z.string().optional().describe('Claimed day name (Mon..Sun) for validate'),\n n: z.number().optional().describe('Number of days for add/sub'),\n expr: z.string().optional().describe('Relative expression for parse (e.g. \"tomorrow\", \"next monday\", \"in 3 days\")'),\n inactive: z.boolean().optional().describe('For org-stamp: use [..] instead of <..>'),\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',\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/tools/search.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { DatacortexBridge } from '../datacortex.js'\nimport { getConfig } from '../config.js'\nimport { searchFts, resolveSpaceDbPath } from '../fts.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\ninterface SearchPaths {\n journalPath: string\n knowledgePath: string\n spaces?: Array<{ name: string; journalPath: string; knowledgePath: string }>\n}\n\nexport async function handleSearch(\n args: SearchArgs,\n paths: SearchPaths,\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: SearchPaths,\n): Promise<SearchResponse> {\n const scope = args.scope ?? 'all'\n const limit = args.limit ?? 20\n\n // Try FTS5 first — check space DBs\n const ftsResults: SearchResultItem[] = []\n const spaces = paths.spaces ?? [{ name: 'default', journalPath: paths.journalPath, knowledgePath: paths.knowledgePath }]\n\n for (const space of spaces) {\n // Derive space root from knowledgePath (handles both /3-knowledge and /knowledge paths)\n const spaceRoot = space.knowledgePath.replace(/\\/(3-)?knowledge$/, '')\n const spaceDbPath = resolveSpaceDbPath(spaceRoot)\n const results = searchFts(spaceDbPath, args.query, {\n scope: scope === 'all' ? undefined : scope,\n limit,\n includeStubs: (args as any).include_stubs,\n })\n for (const r of results) {\n ftsResults.push({\n path: r.path,\n snippet: r.snippet,\n score: r.score,\n title: r.title,\n })\n }\n }\n\n // If FTS returned results, use them\n if (ftsResults.length > 0) {\n ftsResults.sort((a, b) => b.score - a.score)\n return { results: ftsResults.slice(0, limit), method: 'fts5' }\n }\n\n // Fall back to filesystem walking (original behavior)\n const results: SearchResultItem[] = []\n for (const space of spaces) {\n if (scope === 'journal' || scope === 'all') {\n results.push(...searchDir(space.journalPath, args.query))\n }\n if (scope === 'knowledge' || scope === 'all') {\n results.push(...searchDir(space.knowledgePath, args.query))\n }\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/fts.ts\nimport Database from 'better-sqlite3'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nexport interface FtsResult {\n path: string\n snippet: string\n score: number\n title: string\n type: string\n}\n\nexport interface FtsOptions {\n includeStubs?: boolean\n limit?: number\n scope?: 'journal' | 'knowledge' | 'all'\n}\n\n/**\n * Resolve the knowledge.db path for a given space root directory.\n */\nexport function resolveSpaceDbPath(spacePath: string): string {\n return path.join(spacePath, '.datacore', 'knowledge.db')\n}\n\n/**\n * Tokenize a natural language query into FTS5 MATCH syntax.\n * \"SOL trading framework\" → \"SOL AND trading AND framework\"\n * Quoted phrases pass through: '\"exact phrase\"' → '\"exact phrase\"'\n */\nexport function tokenizeQuery(query: string): string {\n // Preserve quoted phrases\n const quoted: string[] = []\n const stripped = query.replace(/\"([^\"]+)\"/g, (_, phrase) => {\n quoted.push(`\"${phrase}\"`)\n return `__QUOTED_${quoted.length - 1}__`\n })\n\n // Split remaining words, filter very short ones (keep 2+ chars for AI, ML etc)\n const words = stripped\n .split(/\\s+/)\n .filter(w => w.length > 1 || w.startsWith('__QUOTED'))\n .map(w => {\n const match = w.match(/^__QUOTED_(\\d+)__$/)\n if (match) return quoted[parseInt(match[1])]\n // Strip non-alphanumeric for FTS safety\n return w.replace(/[^\\w-]/g, '')\n })\n .filter(Boolean)\n\n if (words.length === 0) return query\n return words.join(' AND ')\n}\n\n/**\n * Search the FTS5 index in a knowledge.db file.\n */\nexport function searchFts(dbPath: string, query: string, options: FtsOptions = {}): FtsResult[] {\n if (!fs.existsSync(dbPath)) return []\n\n const limit = options.limit ?? 20\n const ftsQuery = tokenizeQuery(query)\n\n let db: InstanceType<typeof Database>\n try {\n db = new Database(dbPath, { readonly: true })\n } catch {\n return []\n }\n\n try {\n const stubFilter = options.includeStubs ? '' : 'AND f.is_stub = 0'\n\n // Scope filter: journal type for journal scope, non-journal for knowledge scope\n let scopeFilter = ''\n if (options.scope === 'journal') {\n scopeFilter = \"AND f.type = 'journal'\"\n } else if (options.scope === 'knowledge') {\n scopeFilter = \"AND f.type != 'journal'\"\n }\n\n const stmt = db.prepare(`\n SELECT f.path,\n snippet(files_fts, 1, '', '', '...', 32) as snippet,\n rank * -1 as score,\n f.title,\n f.type\n FROM files_fts\n JOIN files f ON f.rowid = files_fts.rowid\n WHERE files_fts MATCH ?\n ${stubFilter}\n ${scopeFilter}\n ORDER BY rank\n LIMIT ?\n `)\n\n const rows = stmt.all(ftsQuery, limit) as Array<{\n path: string\n snippet: string\n score: number\n title: string\n type: string\n }>\n\n return rows.map(r => ({\n path: r.path,\n snippet: r.snippet,\n score: r.score,\n title: r.title,\n type: r.type,\n }))\n } catch (e) {\n // Log FTS errors for debugging — silent failures make FTS-to-fallback invisible\n if (process.env.DEBUG) console.error(`FTS query error for \"${query}\":`, e)\n return []\n } finally {\n db.close()\n }\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 error?: string\n _hints?: ReturnType<typeof buildHints>\n}\n\nexport async function handleIngest(\n args: IngestArgs,\n paths: { knowledgePath: 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\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 return {\n success: true,\n note_path: filePath,\n _hints: buildHints({\n next: 'Content saved as knowledge note. Use plur_ingest to also extract engrams from this content.',\n related: ['datacore_search'],\n }),\n }\n}\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/status.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { currentVersion } from '../version.js'\nimport { localDate } from './capture.js'\nimport { buildHints } from '../hints.js'\n\ninterface StatusPaths {\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 journal_entries: number\n knowledge_notes: number\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 journalCount = countFiles(paths.journalPath, '.md')\n const knowledgeCount = countFiles(paths.knowledgePath, '.md')\n\n // Build recommendations\n const recommendations: string[] = []\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 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_capture to write a journal entry.',\n related: ['datacore_search', 'datacore_capture'],\n }),\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","// src/tools/date.ts\n// Canonical date operations — shells out to .datacore/lib/date_utils.py\n// so Python and TS agents share one source of truth.\nimport { execFileSync } from 'child_process'\nimport * as path from 'path'\n\ninterface DateArgs {\n op: 'today' | 'dow' | 'validate' | 'add' | 'sub' | 'diff' | 'parse' | 'org-stamp'\n date?: string\n date2?: string\n day?: string\n n?: number\n expr?: string\n inactive?: boolean\n}\n\ninterface DateResult {\n op: string\n result?: string | number | boolean\n date?: string\n dow?: string\n valid?: boolean\n error?: string\n}\n\nfunction findScript(basePath: string): string {\n // Try the installation basePath first, then fall back to ~/Data\n const candidates = [\n path.join(basePath, '.datacore', 'lib', 'date_utils.py'),\n path.join(process.env.HOME || '', 'Data', '.datacore', 'lib', 'date_utils.py'),\n ]\n for (const c of candidates) {\n try {\n require('fs').accessSync(c)\n return c\n } catch {\n // continue\n }\n }\n return candidates[0] // let execFile fail with a clear error\n}\n\nexport async function handleDate(args: DateArgs, basePath: string): Promise<DateResult> {\n const script = findScript(basePath)\n const cmd: string[] = [script]\n\n try {\n switch (args.op) {\n case 'today':\n cmd.push('today')\n break\n case 'dow':\n if (!args.date) return { op: args.op, error: 'date required' }\n cmd.push('dow', args.date)\n break\n case 'validate':\n if (!args.date || !args.day) return { op: args.op, error: 'date and day required' }\n cmd.push('validate', args.date, args.day)\n break\n case 'add':\n if (!args.date || args.n == null) return { op: args.op, error: 'date and n required' }\n cmd.push('add', args.date, String(args.n))\n break\n case 'sub':\n if (!args.date || args.n == null) return { op: args.op, error: 'date and n required' }\n cmd.push('sub', args.date, String(args.n))\n break\n case 'diff':\n if (!args.date || !args.date2) return { op: args.op, error: 'date and date2 required' }\n cmd.push('diff', args.date, args.date2)\n break\n case 'parse':\n if (!args.expr) return { op: args.op, error: 'expr required' }\n cmd.push('parse', args.expr)\n break\n case 'org-stamp':\n if (!args.date) return { op: args.op, error: 'date required' }\n cmd.push('org-stamp', args.date)\n if (args.inactive) cmd.push('--inactive')\n break\n default:\n return { op: args.op, error: `unknown op: ${args.op}` }\n }\n\n const out = execFileSync('python3', cmd, { encoding: 'utf8' }).trim()\n\n // Shape the response\n if (args.op === 'today') {\n const [date, dow] = out.split(' ')\n return { op: args.op, date, dow, result: out }\n }\n if (args.op === 'validate') {\n return { op: args.op, valid: out.startsWith('ok'), result: out }\n }\n if (args.op === 'diff') {\n return { op: args.op, result: parseInt(out, 10) }\n }\n if (args.op === 'add' || args.op === 'sub' || args.op === 'parse') {\n const [date, dow] = out.split(' ')\n return { op: args.op, date, dow, result: out }\n }\n return { op: args.op, result: out }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e)\n // validate returns exit 1 on mismatch — still a valid answer\n if (args.op === 'validate' && msg.includes('mismatch')) {\n return { op: args.op, valid: false, result: msg }\n }\n return { op: args.op, error: msg }\n }\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: DiscoveredModule,\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as unknown 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 // Modules export tools as `export const tools = [{ name, handler }, ...]`\n // (see crm/tools/index.js, gtd/tools/index.js, etc). We accept either\n // that array shape or a top-level named export — older modules may\n // still use the per-name pattern.\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 try {\n const toolModule = await import(toolsIndex)\n const arrayTools: Array<{ name: string; handler?: unknown }> =\n (toolModule.tools as Array<{ name: string; handler?: unknown }>) ??\n (toolModule.default?.tools as Array<{ name: string; handler?: unknown }>) ??\n []\n const exportedNames = new Set(\n arrayTools.filter(t => typeof t?.handler === 'function').map(t => t.name),\n )\n for (const tool of declaredTools) {\n const handlerName = tool.handler || tool.name\n const inArray = exportedNames.has(tool.name)\n const asNamedExport = typeof toolModule[handlerName] === 'function'\n if (!inArray && !asNamedExport) {\n issues.push(`Tool '${tool.name}' declared in module.yaml but no matching handler exported`)\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 // package.json / package-lock.json / tsconfig*.json are config files\n // that legitimately live in the module dir for ESM dep resolution and\n // TypeScript builds — whitelist them.\n const suspectExts = ['.db', '.sqlite', '.json']\n const configWhitelist = new Set([\n 'package.json',\n 'package-lock.json',\n 'tsconfig.json',\n 'tsconfig.node.json',\n 'tsconfig.build.json',\n ])\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 (configWhitelist.has(entry)) continue\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/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/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 { 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://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: capture, search, ingest, modules',\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 }))\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 return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ version: currentVersion, mode: storage.mode }),\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 throw new Error(`Unknown resource: ${uri}`)\n })\n}\n\nconst AGENT_GUIDE = `# Datacore Agent Guide\n\n## Datacore Tools\n\nDatacore is a productivity system for journal entries, knowledge files, and module management.\n\n| Tool | Purpose |\n|------|---------|\n| capture | Write a journal entry or knowledge note |\n| search | Search journal and knowledge files |\n| ingest | Import text content as a knowledge note |\n| status | System health and recommendations |\n| modules.list | List installed modules |\n| modules.info | Module details |\n| modules.health | Module health check |\n\n## Memory Tools\n\nFor memory (engrams, learning, recall), use PLUR MCP tools:\n- plur_session_start — begin session with context injection\n- plur_learn — record a reusable learning\n- plur_recall — search engram memory\n- plur_feedback — rate engram usefulness\n- plur_session_end — end session, capture learnings\n`\n","// src/prompts.ts\n// MCP Prompts — server-suggested workflows that any MCP client can discover and use.\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-capture',\n title: 'Capture to Datacore',\n description: 'Write a journal entry or knowledge note to Datacore.',\n arguments: [\n { name: 'type', description: 'Type of capture: journal or knowledge', required: false },\n ],\n messages: (args) => [{\n role: 'user',\n content: {\n type: 'text',\n text: `Capture content to Datacore.${args.type ? ` Type: ${args.type}` : ''}\n\nCall datacore_capture to write a journal entry or knowledge note.\n\nAvailable tools:\n- datacore_capture — write journal entries and knowledge notes\n- datacore_search — find information in journal and knowledge files\n- datacore_ingest — import content into your knowledge base\n- datacore_status — check system health\n- datacore_modules_* — manage installed modules\n\nFor memory (engrams, learning, recall): use PLUR MCP tools.`,\n },\n }],\n },\n {\n name: 'datacore-guide',\n title: 'How to use Datacore',\n description: 'Guide to Datacore tools and workflows.',\n messages: () => [{\n role: 'assistant',\n content: {\n type: 'text',\n text: `# Datacore — Productivity System\n\nDatacore manages journal entries, knowledge files, and modules.\n\n## Tools\n\n| Tool | What it does |\n|------|-------------|\n| **capture** | Write a journal entry or knowledge note |\n| **search** | Search journal and knowledge files |\n| **ingest** | Import text as a knowledge note |\n| **status** | System health + recommendations |\n| **modules.list** | List installed modules |\n| **modules.info** | Module details |\n| **modules.health** | Module health check |\n\n## Memory\n\nFor persistent memory (engrams, learning, recall), use PLUR MCP tools:\n- plur_session_start, plur_session_end\n- plur_learn, plur_recall, plur_inject\n- plur_feedback, plur_forget\n\n## Data Storage\n\nAll data is in plain text files:\n- \\`journal/\\` — Daily session logs (YYYY-MM-DD.md)\n- \\`knowledge/\\` — Ingested reference material\n- \\`config.yaml\\` — Configuration`,\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 * as fs from 'fs'\nimport * as path from 'path'\nimport { SessionLog, ToolCallLog, FeedbackLog, SCHEMA_VERSION } from './types.js'\n\nexport class SessionLogger {\n private log: SessionLog | null = null\n private logDir: string\n private datacoreVersion: string\n private model: string\n\n constructor(logDir: string, datacoreVersion: string, model: string = 'unknown') {\n this.logDir = logDir\n this.datacoreVersion = datacoreVersion\n this.model = model\n }\n\n startSession(sessionId: string): void {\n this.log = {\n schema_version: SCHEMA_VERSION,\n session_id: sessionId,\n started_at: new Date().toISOString(),\n ended_at: null,\n duration_ms: 0,\n model: this.model,\n datacore_version: this.datacoreVersion,\n tool_calls: [],\n engrams_injected: [],\n engrams_created: [],\n feedback: []\n }\n }\n\n logToolCall(\n tool: string,\n args: unknown,\n result: unknown,\n durationMs: number,\n success: boolean,\n error?: string\n ): void {\n if (!this.log) return\n const entry: ToolCallLog = {\n tool,\n timestamp: new Date().toISOString(),\n duration_ms: durationMs,\n input_size: Math.ceil(JSON.stringify(args ?? {}).length / 4), // estimated tokens (chars/4)\n output_size: Math.ceil(JSON.stringify(result ?? {}).length / 4), // estimated tokens (chars/4)\n success\n }\n if (error) entry.error = error\n this.log.tool_calls.push(entry)\n }\n\n trackEngramsInjected(ids: string[]): void {\n if (!this.log) return\n this.log.engrams_injected.push(...ids)\n }\n\n trackEngramCreated(id: string): void {\n if (!this.log) return\n this.log.engrams_created.push(id)\n }\n\n trackFeedback(engramId: string, rating: 'positive' | 'negative' | 'neutral'): void {\n if (!this.log) return\n this.log.feedback.push({ engram_id: engramId, rating, timestamp: new Date().toISOString() })\n }\n\n getLog(): SessionLog {\n if (!this.log) throw new Error('No session started')\n return { ...this.log }\n }\n\n endSession(): void {\n if (!this.log) return\n this.log.ended_at = new Date().toISOString()\n this.log.duration_ms = new Date(this.log.ended_at).getTime() - new Date(this.log.started_at).getTime()\n fs.mkdirSync(this.logDir, { recursive: true })\n const filename = `${this.log.session_id}_${this.log.started_at.replace(/[:.]/g, '-')}.json`\n fs.writeFileSync(path.join(this.logDir, filename), JSON.stringify(this.log, null, 2))\n this.log = null\n }\n}\n","export const SCHEMA_VERSION = '1.0'\n\nexport interface ToolCallLog {\n tool: string\n timestamp: string\n duration_ms: number\n input_size: number // estimated tokens (chars/4 approximation)\n output_size: number // estimated tokens (chars/4 approximation)\n success: boolean\n error?: string\n}\n\nexport interface FeedbackLog {\n engram_id: string\n rating: 'positive' | 'negative' | 'neutral'\n timestamp: string\n}\n\nexport interface SessionLog {\n schema_version: string\n session_id: string\n started_at: string\n ended_at: string | null\n duration_ms: number\n model: string\n datacore_version: string\n tool_calls: ToolCallLog[]\n engrams_injected: string[]\n engrams_created: string[]\n feedback: FeedbackLog[]\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 Productivity\n datacore_capture Capture a journal entry or knowledge note\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 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\n Note: Memory tools (learn, recall, feedback, forget, sessions) are now\n in PLUR MCP (@plur-ai/mcp). Install separately for persistent memory.\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","path","fs","path","args","results","start","fs","path","args","fs","path","updateAvailable","path","args","fs","path","yaml","storage","moduleTools","storage","args","storage","fs","path","args","storage","fs","path","storage","args","fs","path","fs","path","args","args"]}