@datacore-one/mcp 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -7
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -12,27 +12,31 @@ Not a RAG system. Not a vector database you have to manage. Just an MCP server t
|
|
|
12
12
|
|
|
13
13
|
## Quick Start
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Install globally:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g @datacore-one/mcp
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
16
22
|
|
|
17
23
|
```json
|
|
18
24
|
{
|
|
19
25
|
"mcpServers": {
|
|
20
26
|
"datacore": {
|
|
21
|
-
"command": "
|
|
22
|
-
"args": ["@datacore-one/mcp"]
|
|
27
|
+
"command": "datacore-mcp"
|
|
23
28
|
}
|
|
24
29
|
}
|
|
25
30
|
}
|
|
26
31
|
```
|
|
27
32
|
|
|
28
|
-
Or for Claude Code, add to `.mcp.json
|
|
33
|
+
Or for Claude Code, add to `.mcp.json` in your project root:
|
|
29
34
|
|
|
30
35
|
```json
|
|
31
36
|
{
|
|
32
37
|
"mcpServers": {
|
|
33
38
|
"datacore": {
|
|
34
|
-
"command": "
|
|
35
|
-
"args": ["@datacore-one/mcp"]
|
|
39
|
+
"command": "datacore-mcp"
|
|
36
40
|
}
|
|
37
41
|
}
|
|
38
42
|
}
|
|
@@ -135,7 +139,7 @@ Bundled starter packs are installed automatically on first run.
|
|
|
135
139
|
For remote or multi-client setups:
|
|
136
140
|
|
|
137
141
|
```bash
|
|
138
|
-
DATACORE_HTTP_PORT=8080
|
|
142
|
+
DATACORE_HTTP_PORT=8080 datacore-mcp --http
|
|
139
143
|
```
|
|
140
144
|
|
|
141
145
|
Health check: `GET /health`
|
package/dist/index.js
CHANGED
|
@@ -93,11 +93,11 @@ function copyStarterPacks(basePath) {
|
|
|
93
93
|
// package.json
|
|
94
94
|
var package_default = {
|
|
95
95
|
name: "@datacore-one/mcp",
|
|
96
|
-
version: "1.0.
|
|
96
|
+
version: "1.0.2",
|
|
97
97
|
description: "Datacore MCP server \u2014 The Software of You",
|
|
98
98
|
type: "module",
|
|
99
99
|
bin: {
|
|
100
|
-
"datacore-mcp": "
|
|
100
|
+
"datacore-mcp": "dist/index.js"
|
|
101
101
|
},
|
|
102
102
|
main: "./dist/index.js",
|
|
103
103
|
scripts: {
|
|
@@ -135,7 +135,7 @@ var package_default = {
|
|
|
135
135
|
author: "Fair Data Society",
|
|
136
136
|
repository: {
|
|
137
137
|
type: "git",
|
|
138
|
-
url: "https://github.com/datacore-one/mcp"
|
|
138
|
+
url: "git+https://github.com/datacore-one/mcp.git"
|
|
139
139
|
},
|
|
140
140
|
engines: {
|
|
141
141
|
node: ">=22"
|
|
@@ -1905,7 +1905,7 @@ async function runStdio() {
|
|
|
1905
1905
|
checkForUpdate().then((v) => {
|
|
1906
1906
|
updateAvailable = v;
|
|
1907
1907
|
});
|
|
1908
|
-
}, 36e5);
|
|
1908
|
+
}, 24 * 36e5);
|
|
1909
1909
|
updateInterval.unref();
|
|
1910
1910
|
const server = createServer();
|
|
1911
1911
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/storage.ts","../package.json","../src/version.ts","../src/tools/index.ts","../src/tools/capture.ts","../src/limits.ts","../src/engrams.ts","../src/schemas/engram.ts","../src/logger.ts","../src/tools/learn.ts","../src/tools/inject-tool.ts","../src/decay.ts","../src/inject.ts","../src/tools/search.ts","../src/tools/ingest.ts","../src/tools/status.ts","../src/trust.ts","../registry/packs.json","../src/tools/discover.ts","../src/tools/install.ts","../src/tools/export.ts","../src/modules.ts","../src/tools/modules-list.ts","../src/tools/modules-info.ts","../src/tools/modules-health.ts","../src/tools/forget.ts","../src/tools/feedback.ts","../src/resources.ts","../src/datacortex.ts","../src/index.ts"],"sourcesContent":["// src/server.ts\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { detectStorage, initCore, type StorageConfig } from './storage.js'\nimport { currentVersion, checkForUpdate } from './version.js'\nimport { TOOLS } from './tools/index.js'\nimport { handleCapture } from './tools/capture.js'\nimport { handleLearn } from './tools/learn.js'\nimport { handleInject } from './tools/inject-tool.js'\nimport { handleSearch } from './tools/search.js'\nimport { handleIngest } from './tools/ingest.js'\nimport { handleStatus } from './tools/status.js'\nimport { handleDiscover } from './tools/discover.js'\nimport { handleInstall } from './tools/install.js'\nimport { handleExport } from './tools/export.js'\nimport {\n discoverModules,\n loadModuleTools,\n type DiscoveredModule,\n type RegisteredModuleTool,\n} from './modules.js'\nimport { handleModulesList } from './tools/modules-list.js'\nimport { handleModulesInfo } from './tools/modules-info.js'\nimport { handleModulesHealth } from './tools/modules-health.js'\nimport { handleForget } from './tools/forget.js'\nimport { handleFeedback } from './tools/feedback.js'\nimport { logger } from './logger.js'\nimport { registerResources, notifyEngramsChanged } from './resources.js'\nimport { DatacortexBridge } from './datacortex.js'\n\nlet storage: StorageConfig\nlet updateAvailable: string | null = null\nlet moduleTools: RegisteredModuleTool[] = []\nlet discoveredModules: DiscoveredModule[] = []\nlet isFirstRun = false\nlet serverRef: Server | null = null\nlet datacortexBridge: DatacortexBridge | null = null\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n { capabilities: { tools: {}, logging: {}, resources: { subscribe: true } } },\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n ...TOOLS.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: zodToJsonSchema(t.inputSchema),\n })),\n ...moduleTools.map(t => ({\n name: t.fullName,\n description: t.definition.description,\n inputSchema: zodToJsonSchema(t.definition.inputSchema),\n })),\n ],\n }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n try {\n const result = await routeTool(name, args ?? {})\n const response: { type: string; text: string }[] = []\n if (isFirstRun) {\n isFirstRun = false\n response.push({ type: 'text', text: JSON.stringify({\n _welcome: `Welcome to Datacore MCP! Your data is stored at ${storage.basePath}. Try: datacore.learn to create your first engram, datacore.capture to write a journal entry, or datacore.status to see system info.`,\n }) })\n }\n response.push({ type: 'text', text: JSON.stringify(result, null, 2) })\n return { content: response }\n } catch (error) {\n return { content: [{ type: 'text', text: `Error: ${error}` }], isError: true }\n }\n })\n\n logger.setServer(server)\n registerResources(server, storage)\n serverRef = server\n return server\n}\n\n// --- Tool routing ---\n\nconst ENGRAM_MUTATING_TOOLS = new Set(['datacore.learn', 'datacore.forget', 'datacore.feedback'])\n\nasync function routeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const coreTool = TOOLS.find(t => t.name === name)\n if (coreTool) {\n const validated = coreTool.inputSchema.parse(args)\n let result: unknown\n switch (name) {\n case 'datacore.capture': result = await handleCapture(validated, storage); break\n case 'datacore.learn': result = await handleLearn(validated, storage.engramsPath); break\n case 'datacore.inject': result = await handleInject(validated, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.search': result = await handleSearch(validated, { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath }, datacortexBridge); break\n case 'datacore.ingest': result = await handleIngest(validated, { knowledgePath: storage.knowledgePath, engramsPath: storage.engramsPath }); break\n case 'datacore.status': result = await handleStatus({ ...storage, engramsPath: storage.engramsPath, packsPath: storage.packsPath }, updateAvailable); break\n case 'datacore.forget': result = await handleForget(validated, storage.engramsPath); break\n case 'datacore.feedback': result = await handleFeedback(validated as { engram_id: string; signal: 'positive' | 'negative' | 'neutral'; comment?: string }, storage.engramsPath); break\n case 'datacore.packs.discover': result = handleDiscover(validated, storage.packsPath); break\n case 'datacore.packs.install': result = await handleInstall(validated, storage.packsPath); break\n case 'datacore.packs.export': result = await handleExport(validated as any, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.modules.list': result = await handleModulesList(validated, storage, discoveredModules); break\n case 'datacore.modules.info': result = await handleModulesInfo(validated as { module: string }, storage, discoveredModules); break\n case 'datacore.modules.health': result = await handleModulesHealth(validated as { module?: string }, storage, discoveredModules); break\n default: throw new Error(`Unknown core tool: ${name}`)\n }\n if (ENGRAM_MUTATING_TOOLS.has(name) && serverRef) {\n notifyEngramsChanged(serverRef)\n }\n return result\n }\n\n const modTool = moduleTools.find(t => t.fullName === name)\n if (modTool) {\n const validated = modTool.definition.inputSchema.parse(args)\n return modTool.definition.handler(validated, modTool.context)\n }\n\n const allNames = [...TOOLS.map(t => t.name), ...moduleTools.map(t => t.fullName)]\n const suggestions = findClosestTools(name, allNames)\n const hint = suggestions.length > 0\n ? ` Did you mean: ${suggestions.join(', ')}?`\n : ''\n throw new Error(`Unknown tool: ${name}.${hint}`)\n}\n\n// --- Tool name suggestion ---\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length\n const dp: number[] = Array.from({ length: n + 1 }, (_, i) => i)\n for (let i = 1; i <= m; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= n; j++) {\n const tmp = dp[j]\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1])\n prev = tmp\n }\n }\n return dp[n]\n}\n\nexport function findClosestTools(name: string, allNames: string[]): string[] {\n const threshold = Math.max(3, Math.floor(name.length * 0.35))\n const scored = allNames\n .map(t => ({ name: t, dist: levenshtein(name.toLowerCase(), t.toLowerCase()) }))\n .filter(s => s.dist <= threshold)\n .sort((a, b) => a.dist - b.dist)\n return scored.slice(0, 2).map(s => s.name)\n}\n\n// --- Shared initialization ---\n\nasync function initStorage(): Promise<void> {\n storage = detectStorage()\n if (storage.mode === 'core') {\n const result = initCore(storage.basePath)\n isFirstRun = result.isFirstRun\n }\n if (storage.mode === 'full') {\n discoveredModules = discoverModules(storage)\n moduleTools = await loadModuleTools(discoveredModules, storage)\n datacortexBridge = new DatacortexBridge(storage.basePath)\n }\n}\n\n// --- Transport entry points ---\n\nexport async function runStdio(): Promise<void> {\n await initStorage()\n\n checkForUpdate().then(v => { updateAvailable = v })\n const updateInterval = setInterval(() => {\n checkForUpdate().then(v => { updateAvailable = v })\n }, 3600_000)\n updateInterval.unref()\n\n const server = createServer()\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n server.onclose = () => {\n clearInterval(updateInterval)\n }\n}\n\nexport async function runHttp(): Promise<void> {\n const { createServer: createHttpServer } = await import('http')\n const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js')\n\n await initStorage()\n checkForUpdate().then(v => { updateAvailable = v })\n\n const port = parseInt(process.env.DATACORE_HTTP_PORT ?? '3100', 10)\n const host = process.env.DATACORE_HTTP_HOST ?? '127.0.0.1'\n const server = createServer()\n\n const httpServer = createHttpServer(async (req, res) => {\n if (req.method === 'POST' && req.url === '/mcp') {\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined })\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } else if (req.method === 'GET' && req.url === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'ok', version: currentVersion }))\n } else {\n res.writeHead(404)\n res.end('Not Found')\n }\n })\n\n httpServer.listen(port, host, () => {\n console.log(`Datacore MCP server listening on http://${host}:${port}/mcp`)\n })\n}\n\n// Export for testing\nexport { moduleTools as _moduleTools }\n","// src/storage.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\nexport type StorageMode = 'full' | 'core'\n\nexport interface StorageConfig {\n mode: StorageMode\n basePath: string\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n}\n\nexport function detectStorage(): StorageConfig {\n // 1. Explicit DATACORE_PATH (full installation)\n const dcPath = process.env.DATACORE_PATH\n if (dcPath && fs.existsSync(path.join(dcPath, '.datacore'))) {\n return fullConfig(dcPath)\n }\n\n // 2. Explicit core path (env var overrides auto-detection)\n const corePath = process.env.DATACORE_CORE_PATH\n if (corePath && fs.existsSync(corePath)) {\n return coreConfig(corePath)\n }\n\n // 3. Default full installation at ~/Data\n const defaultFull = path.join(os.homedir(), 'Data')\n if (fs.existsSync(path.join(defaultFull, '.datacore'))) {\n return fullConfig(defaultFull)\n }\n\n // 4. Default core mode at ~/Datacore\n return coreConfig(path.join(os.homedir(), 'Datacore'))\n}\n\nfunction fullConfig(basePath: string): StorageConfig {\n return {\n mode: 'full',\n basePath,\n engramsPath: path.join(basePath, '.datacore', 'learning', 'engrams.yaml'),\n journalPath: path.join(basePath, '0-personal', 'journal'),\n knowledgePath: path.join(basePath, '0-personal', '3-knowledge'),\n packsPath: path.join(basePath, '.datacore', 'learning', 'packs'),\n }\n}\n\nfunction coreConfig(basePath: string): StorageConfig {\n return {\n mode: 'core',\n basePath,\n engramsPath: path.join(basePath, 'engrams.yaml'),\n journalPath: path.join(basePath, 'journal'),\n knowledgePath: path.join(basePath, 'knowledge'),\n packsPath: path.join(basePath, 'packs'),\n }\n}\n\nexport function initCore(basePath: string): { isFirstRun: boolean } {\n const isFirstRun = !fs.existsSync(path.join(basePath, 'engrams.yaml'))\n for (const dir of ['journal', 'knowledge', 'packs']) {\n const dirPath = path.join(basePath, dir)\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true })\n }\n }\n\n const engramsPath = path.join(basePath, 'engrams.yaml')\n if (!fs.existsSync(engramsPath)) {\n fs.writeFileSync(engramsPath, 'engrams: []\\n')\n }\n\n const configPath = path.join(basePath, 'config.yaml')\n if (!fs.existsSync(configPath)) {\n fs.writeFileSync(configPath, '# Datacore MCP configuration\\nversion: 1\\n')\n }\n\n copyStarterPacks(basePath)\n return { isFirstRun }\n}\n\nfunction copyStarterPacks(basePath: string): void {\n const packsDir = path.join(basePath, 'packs')\n const bundledPacksDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs'\n )\n\n if (!fs.existsSync(bundledPacksDir)) return\n\n for (const entry of fs.readdirSync(bundledPacksDir)) {\n const src = path.join(bundledPacksDir, entry)\n const dest = path.join(packsDir, entry)\n if (!fs.existsSync(dest) && fs.statSync(src).isDirectory()) {\n fs.cpSync(src, dest, { recursive: true })\n }\n }\n}\n","{\n \"name\": \"@datacore-one/mcp\",\n \"version\": \"1.0.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 },\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\": \"https://github.com/datacore-one/mcp\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","// src/version.ts\nimport pkg from '../package.json'\n\nexport const currentVersion: string = pkg.version\n\nexport async function checkForUpdate(): Promise<string | null> {\n try {\n const res = await fetch('https://registry.npmjs.org/@datacore-one/mcp/latest', {\n signal: AbortSignal.timeout(3000),\n })\n if (!res.ok) return null\n const data = await res.json() as { version: string }\n if (data.version !== currentVersion) return data.version\n return null\n } catch {\n return null\n }\n}\n","// src/tools/index.ts\nimport { z } from 'zod'\n\nexport const TOOLS = [\n {\n name: 'datacore.capture',\n description: 'Capture a journal entry or knowledge note',\n inputSchema: z.object({\n type: z.enum(['journal', 'knowledge']),\n content: z.string().describe('Content to capture'),\n title: z.string().optional().describe('Title for knowledge notes'),\n tags: z.array(z.string()).optional().describe('Tags to attach'),\n }),\n },\n {\n name: 'datacore.learn',\n description: 'Create an engram from a statement — record a reusable learning',\n inputSchema: z.object({\n statement: z.string().describe('The knowledge assertion'),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']).optional(),\n scope: z.string().optional().describe('Scope: global | agent:X | command:X'),\n tags: z.array(z.string()).optional(),\n domain: z.string().optional().describe('Dot-notation domain: software.architecture'),\n visibility: z.enum(['private', 'public', 'template']).optional(),\n }),\n },\n {\n name: 'datacore.inject',\n description: 'Get relevant engrams for a task — returns directives and considerations',\n inputSchema: z.object({\n prompt: z.string().describe('The task or question to match against'),\n scope: z.string().optional().describe('Filter by scope: global | agent:X | module:X | command:X'),\n max_tokens: z.number().optional().describe('Token budget (default: 8000)'),\n min_relevance: z.number().optional().describe('Minimum score threshold (default: 0.3)'),\n }),\n },\n {\n name: 'datacore.search',\n description: 'Search journal entries and knowledge notes by keyword',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n scope: z.enum(['journal', 'knowledge', 'all']).optional(),\n method: z.enum(['keyword', 'semantic']).optional().describe('Search method (default: keyword)'),\n limit: z.number().optional().describe('Max results (default: 20)'),\n }),\n },\n {\n name: 'datacore.ingest',\n description: 'Ingest text content as a knowledge note, optionally extract engram suggestions',\n inputSchema: z.object({\n content: z.string().describe('Content to ingest'),\n title: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n },\n {\n name: 'datacore.status',\n description: 'Show Datacore status: engram/pack/note counts, scaling hints, update info',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.packs.discover',\n description: 'Browse available engram packs from the registry',\n inputSchema: z.object({\n query: z.string().optional().describe('Filter by name/description'),\n tags: z.array(z.string()).optional().describe('Filter by tags'),\n }),\n },\n {\n name: 'datacore.packs.install',\n description: 'Install or upgrade an engram pack',\n inputSchema: z.object({\n source: z.string().describe('Pack source: local path or pack ID from registry'),\n }),\n },\n {\n name: 'datacore.forget',\n description: 'Retire an engram by ID or search term — marks it as retired so it is no longer injected',\n inputSchema: z.object({\n id: z.string().optional().describe('Exact engram ID to retire (e.g., ENG-2026-0219-001)'),\n search: z.string().optional().describe('Search term to find engram by statement, tag, or ID fragment'),\n }),\n },\n {\n name: 'datacore.feedback',\n description: 'Signal whether an injected engram was helpful (positive), unhelpful (negative), or seen but not acted on (neutral)',\n inputSchema: z.object({\n engram_id: z.string().describe('The engram ID to provide feedback on'),\n signal: z.enum(['positive', 'negative', 'neutral']).describe('Feedback signal'),\n comment: z.string().optional().describe('Optional comment about why'),\n }),\n },\n {\n name: 'datacore.packs.export',\n description: 'Export personal engrams as a shareable pack. Preview by default, set confirm=true to write.',\n inputSchema: z.object({\n name: z.string().describe('Pack name'),\n description: z.string().describe('Pack description'),\n engram_ids: z.array(z.string()).optional().describe('Specific engram IDs to export'),\n filter_tags: z.array(z.string()).optional().describe('Filter by tags'),\n filter_domain: z.string().optional().describe('Filter by domain prefix'),\n confirm: z.boolean().optional().describe('Set true to write pack (default: preview only)'),\n }),\n },\n {\n name: 'datacore.modules.list',\n description: 'List installed modules with scope, version, and capability counts',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.modules.info',\n description: 'Get detailed info about a specific module: manifest, tools, skills, agents, engrams',\n inputSchema: z.object({\n module: z.string().describe('Module name (e.g., \"gtd\", \"slides\", \"crm\")'),\n }),\n },\n {\n name: 'datacore.modules.health',\n description: 'Check module health: missing files, env vars, data separation issues',\n inputSchema: z.object({\n module: z.string().optional().describe('Module name (omit for all modules)'),\n }),\n },\n] as const\n","// src/tools/capture.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { StorageConfig } from '../storage.js'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface CaptureArgs {\n type: 'journal' | 'knowledge'\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface CaptureResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport async function handleCapture(args: CaptureArgs, storage: StorageConfig): Promise<CaptureResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n if (args.type === 'journal') {\n return captureJournal(args.content, storage.journalPath)\n }\n return captureKnowledge(args.content, args.title, args.tags, storage.knowledgePath)\n}\n\nexport function localDate(tz?: string): { date: string; time: string } {\n const timezone = tz || process.env.DATACORE_TIMEZONE || undefined\n const now = new Date()\n const dateStr = now.toLocaleDateString('en-CA', { timeZone: timezone }) // en-CA gives YYYY-MM-DD\n const timeStr = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: timezone })\n return { date: dateStr, time: timeStr }\n}\n\nfunction captureJournal(content: string, journalDir: string): CaptureResult {\n const { date: today, time } = localDate()\n const filePath = path.join(journalDir, `${today}.md`)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n if (fs.existsSync(filePath)) {\n const existing = fs.readFileSync(filePath, 'utf8')\n fs.writeFileSync(filePath, `${existing}\\n## ${time}\\n\\n${content}\\n`)\n } else {\n fs.writeFileSync(filePath, `# ${today}\\n\\n## ${time}\\n\\n${content}\\n`)\n }\n\n return { success: true, path: filePath }\n}\n\nfunction captureKnowledge(content: string, title: string | undefined, tags: string[] | undefined, knowledgeDir: string): CaptureResult {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (title ?? 'note').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(knowledgeDir, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${title ?? 'Untitled'}\"\\ncreated: \"${new Date().toISOString()}\"\\n---\\n\\n`\n const tagLine = tags?.length ? `\\n${tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${content}\\n${tagLine}`)\n\n return { success: true, path: filePath }\n}\n","// src/limits.ts\nexport const MAX_CONTENT_SIZE = 1_000_000 // 1MB\nexport const MAX_TITLE_LENGTH = 200\n\nexport function validateContent(content: string): string | null {\n if (content.length > MAX_CONTENT_SIZE) {\n return `Content too large: ${content.length} characters (max: ${MAX_CONTENT_SIZE})`\n }\n return null\n}\n\nexport function validateTitle(title: string): string | null {\n if (title.length > MAX_TITLE_LENGTH) {\n return `Title too long: ${title.length} characters (max: ${MAX_TITLE_LENGTH})`\n }\n return null\n}\n","// src/engrams.ts\nimport * as fs from 'fs'\nimport * as yaml from 'js-yaml'\nimport { EngramSchema, PackManifestSchema, type Engram, type PackManifest } from './schemas/engram.js'\nimport { logger } from './logger.js'\n\nexport function loadEngrams(filePath: string): Engram[] {\n if (!fs.existsSync(filePath)) return []\n\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n if (!raw?.engrams || !Array.isArray(raw.engrams)) return []\n\n const valid: Engram[] = []\n let skipped = 0\n for (const entry of raw.engrams) {\n const result = EngramSchema.safeParse(entry)\n if (result.success) {\n valid.push(result.data)\n } else {\n skipped++\n }\n }\n if (skipped > 0) {\n logger.warning(`Skipped ${skipped} invalid engram(s) in ${filePath}`)\n }\n return valid\n } catch (err) {\n logger.error(`Failed to parse engrams file ${filePath}: ${err}`)\n return []\n }\n}\n\nexport function saveEngrams(filePath: string, engrams: Engram[]): void {\n const content = yaml.dump({ engrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n fs.writeFileSync(filePath, content)\n}\n\nexport interface LoadedPack {\n manifest: PackManifest\n engrams: Engram[]\n}\n\nfunction parseSkillMdFrontmatter(filePath: string): Record<string, any> {\n const content = fs.readFileSync(filePath, 'utf8')\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!match) throw new Error(`No frontmatter found in ${filePath}`)\n try {\n return yaml.load(match[1]) as Record<string, any>\n } catch (err) {\n throw new Error(`Failed to parse YAML frontmatter in ${filePath}: ${err}`)\n }\n}\n\nexport function loadPack(packDir: string): LoadedPack {\n const skillMdPath = `${packDir}/SKILL.md`\n const engramsPath = `${packDir}/engrams.yaml`\n\n const rawManifest = parseSkillMdFrontmatter(skillMdPath)\n const manifest = PackManifestSchema.parse(rawManifest)\n const engrams = loadEngrams(engramsPath)\n\n return { manifest, engrams }\n}\n\nexport function loadAllPacks(packsDir: string): LoadedPack[] {\n if (!fs.existsSync(packsDir)) return []\n\n const packs: LoadedPack[] = []\n for (const entry of fs.readdirSync(packsDir)) {\n const packDir = `${packsDir}/${entry}`\n if (!fs.statSync(packDir).isDirectory()) continue\n if (!fs.existsSync(`${packDir}/SKILL.md`)) continue\n\n try {\n packs.push(loadPack(packDir))\n } catch (err) {\n logger.warning(`Failed to load pack ${entry}: ${err}`)\n }\n }\n return packs\n}\n","// src/schemas/engram.ts\nimport { z } from 'zod'\n\nexport const ActivationSchema = z.object({\n retrieval_strength: z.number().min(0).max(1),\n storage_strength: z.number().min(0).max(1),\n frequency: z.number().int().min(0),\n last_accessed: z.string(),\n})\n\nexport const KnowledgeTypeSchema = z.object({\n memory_class: z.enum(['semantic', 'episodic', 'procedural', 'metacognitive']),\n cognitive_level: z.enum(['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']),\n})\n\nexport const RelationsSchema = z.object({\n broader: z.array(z.string()).default([]),\n narrower: z.array(z.string()).default([]),\n related: z.array(z.string()).default([]),\n conflicts: z.array(z.string()).default([]),\n})\n\nexport const ProvenanceSchema = z.object({\n origin: z.string(),\n chain: z.array(z.string()).default([]),\n signature: z.string().nullable().default(null),\n license: z.string().default('cc-by-sa-4.0'),\n})\n\nexport const FeedbackSignalsSchema = z.object({\n positive: z.number().int().default(0),\n negative: z.number().int().default(0),\n neutral: z.number().int().default(0),\n})\n\nexport const EngramSchema = z.object({\n id: z.string().regex(/^ENG-[A-Za-z0-9-]+$/),\n version: z.number().int().min(1),\n status: z.enum(['active', 'dormant', 'retired', 'candidate']),\n consolidated: z.boolean().default(false),\n\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n scope: z.string(),\n visibility: z.enum(['private', 'public', 'template']).default('private'),\n statement: z.string().min(1),\n rationale: z.string().optional(),\n contraindications: z.array(z.string()).optional(),\n source_patterns: z.array(z.string()).optional(),\n derivation_count: z.number().int().min(0).default(1),\n\n knowledge_type: KnowledgeTypeSchema.optional(),\n domain: z.string().optional(),\n relations: RelationsSchema.optional(),\n activation: ActivationSchema,\n provenance: ProvenanceSchema.optional(),\n feedback_signals: FeedbackSignalsSchema.optional(),\n tags: z.array(z.string()).default([]),\n pack: z.string().nullable().default(null),\n abstract: z.string().nullable().default(null),\n derived_from: z.string().nullable().default(null),\n})\n\nexport type Engram = z.infer<typeof EngramSchema>\n\n// Pack manifest matches SKILL.md frontmatter structure\nexport const DatacoreExtensionSchema = z.object({\n id: z.string(),\n injection_policy: z.enum(['on_match', 'on_request']),\n match_terms: z.array(z.string()).default([]),\n domain: z.string().optional(),\n engram_count: z.number().int().min(0),\n})\n\nexport const PackManifestSchema = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n creator: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).default([]),\n 'x-datacore': DatacoreExtensionSchema,\n})\n\nexport type PackManifest = z.infer<typeof PackManifestSchema>\n","// src/logger.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error'\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warning: 2,\n error: 3,\n}\n\nconst MAX_MESSAGE_LENGTH = 4096\n\nclass Logger {\n private server: Server | null = null\n private minLevel: LogLevel\n\n constructor() {\n const envLevel = process.env.DATACORE_LOG_LEVEL?.toLowerCase()\n this.minLevel = envLevel && envLevel in LEVEL_ORDER\n ? envLevel as LogLevel\n : 'warning'\n }\n\n setServer(server: Server): void {\n this.server = server\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevel]\n }\n\n private truncate(msg: string): string {\n if (msg.length <= MAX_MESSAGE_LENGTH) return msg\n return msg.slice(0, MAX_MESSAGE_LENGTH - 3) + '...'\n }\n\n private emit(level: LogLevel, message: string): void {\n if (!this.shouldLog(level)) return\n const truncated = this.truncate(message)\n\n // Always write to stderr for debug traces\n process.stderr.write(`[datacore:${level}] ${truncated}\\n`)\n\n // Send MCP notification for warning+ if server connected\n if (this.server && LEVEL_ORDER[level] >= LEVEL_ORDER['warning']) {\n try {\n this.server.sendLoggingMessage({ level, data: truncated })\n } catch {\n // Server not connected or notification failed — ignore\n }\n }\n }\n\n debug(message: string): void { this.emit('debug', message) }\n info(message: string): void { this.emit('info', message) }\n warning(message: string): void { this.emit('warning', message) }\n error(message: string): void { this.emit('error', message) }\n}\n\nexport const logger = new Logger()\n","// src/tools/learn.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface LearnArgs {\n statement: string\n type?: 'behavioral' | 'terminological' | 'procedural' | 'architectural'\n scope?: string\n tags?: string[]\n domain?: string\n rationale?: string\n visibility?: 'private' | 'public' | 'template'\n}\n\ninterface LearnResult {\n success: boolean\n engram: Engram\n}\n\nexport function generateEngramId(existingEngrams: Engram[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `ENG-${date.slice(0, 4)}-${date.slice(4)}-`\n\n // Find highest seq for today\n let maxSeq = 0\n for (const e of existingEngrams) {\n if (e.id.startsWith(prefix)) {\n const seq = parseInt(e.id.slice(prefix.length), 10)\n if (seq > maxSeq) maxSeq = seq\n }\n }\n\n const nextSeq = maxSeq + 1\n const padWidth = nextSeq > 999 ? String(nextSeq).length : 3\n return `${prefix}${String(nextSeq).padStart(padWidth, '0')}`\n}\n\nexport async function handleLearn(args: LearnArgs, engramsPath: string): Promise<LearnResult> {\n const engrams = loadEngrams(engramsPath)\n const today = new Date().toISOString().split('T')[0]\n\n const engram: Engram = {\n id: generateEngramId(engrams),\n version: 2,\n status: 'candidate',\n consolidated: false,\n type: args.type ?? 'behavioral',\n scope: args.scope ?? 'global',\n visibility: args.visibility ?? 'private',\n statement: args.statement,\n rationale: args.rationale,\n derivation_count: 1,\n domain: args.domain,\n tags: args.tags ?? [],\n activation: {\n retrieval_strength: 0.5,\n storage_strength: 0.3,\n frequency: 0,\n last_accessed: today,\n },\n pack: null,\n abstract: null,\n derived_from: null,\n }\n\n engrams.push(engram)\n saveEngrams(engramsPath, engrams)\n return { success: true, engram }\n}\n","// src/tools/inject-tool.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams, loadAllPacks } from '../engrams.js'\nimport { selectEngrams, type InjectionContext } from '../inject.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface InjectArgs {\n prompt: string\n scope?: string\n max_tokens?: number\n min_relevance?: number\n}\n\ninterface InjectResult {\n text: string\n count: number\n tokens_used: number\n}\n\nexport async function handleInject(\n args: InjectArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<InjectResult> {\n const personalEngrams = loadEngrams(paths.engramsPath)\n const packs = loadAllPacks(paths.packsPath)\n\n const ctx: InjectionContext = {\n prompt: args.prompt,\n scope: args.scope,\n maxTokens: args.max_tokens,\n minRelevance: args.min_relevance,\n }\n\n const result = selectEngrams(ctx, personalEngrams, packs)\n const totalCount = result.directives.length + result.consider.length\n\n if (totalCount === 0) {\n return { text: '', count: 0, tokens_used: 0 }\n }\n\n const lines: string[] = []\n if (result.directives.length > 0) {\n lines.push('## DIRECTIVES\\n')\n for (const e of result.directives) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n if (result.consider.length > 0) {\n lines.push('\\n## ALSO CONSIDER\\n')\n for (const e of result.consider) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n\n // Update usage tracking for selected personal engrams\n updateUsageTracking(\n paths.engramsPath,\n personalEngrams,\n [...result.directives, ...result.consider],\n )\n\n return { text: lines.join('\\n'), count: totalCount, tokens_used: result.tokens_used }\n}\n\nfunction updateUsageTracking(\n engramsPath: string,\n allPersonal: Engram[],\n selected: Engram[],\n): void {\n const selectedPersonalIds = new Set(\n selected.filter(e => !e.pack).map(e => e.id),\n )\n if (selectedPersonalIds.size === 0) return\n\n const today = new Date().toISOString().split('T')[0]\n let changed = false\n\n for (const engram of allPersonal) {\n if (selectedPersonalIds.has(engram.id)) {\n engram.activation.last_accessed = today\n engram.activation.frequency += 1\n changed = true\n }\n }\n\n if (changed) {\n atomicWriteYaml(engramsPath, { engrams: allPersonal })\n }\n}\n\nexport function atomicWriteYaml(filePath: string, data: unknown): void {\n const content = yaml.dump(data, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nfunction formatEngram(engram: Engram, totalCount: number): string {\n if (totalCount < 10) {\n let text = `- **${engram.statement}**`\n if (engram.rationale) text += `\\n _${engram.rationale}_`\n if (engram.contraindications?.length) {\n text += `\\n Except: ${engram.contraindications.join(', ')}`\n }\n return text\n }\n if (totalCount < 30) {\n const source = engram.pack ? ` [${engram.pack}]` : ''\n return `- ${engram.statement}${source}`\n }\n return `- ${engram.statement}`\n}\n","// src/decay.ts\n\nconst DECAY_RATE = 0.05\nconst FLOOR = 0.05\nconst MS_PER_DAY = 86_400_000\n\nexport type EngramState = 'active' | 'fading' | 'dormant' | 'retirement_candidate'\n\n/**\n * Compute decayed retrieval strength using exponential decay.\n * Floor of 0.05 prevents permanent extinction.\n */\nexport function decayedStrength(\n retrievalStrength: number,\n lastAccessed: string,\n now?: Date,\n): number {\n const last = new Date(lastAccessed)\n const current = now ?? new Date()\n const days = Math.max(0, (current.getTime() - last.getTime()) / MS_PER_DAY)\n return Math.max(retrievalStrength * Math.exp(-DECAY_RATE * days), FLOOR)\n}\n\n/**\n * Classify engram state based on current retrieval strength.\n */\nexport function engramState(retrievalStrength: number): EngramState {\n if (retrievalStrength >= 0.5) return 'active'\n if (retrievalStrength >= 0.3) return 'fading'\n if (retrievalStrength >= 0.1) return 'dormant'\n return 'retirement_candidate'\n}\n","// src/inject.ts\nimport type { Engram } from './schemas/engram.js'\nimport type { LoadedPack } from './engrams.js'\nimport { decayedStrength } from './decay.js'\n\nexport interface InjectionContext {\n prompt: string\n scope?: string\n maxTokens?: number // Default: 8000 (~10% of 80K context)\n minRelevance?: number // Default: 0.3\n}\n\nexport interface InjectionResult {\n directives: Engram[]\n consider: Engram[]\n tokens_used: number\n}\n\ninterface ScoredEngram {\n engram: Engram\n score: number\n}\n\nconst DEFAULT_MAX_TOKENS = 8000\nconst DEFAULT_MIN_RELEVANCE = 0.3\nconst TOKENS_PER_ENGRAM = 40 // Compact format estimate\nconst MAX_PER_PACK = 5\nconst MAX_PER_DOMAIN = 10\n\nexport function selectEngrams(\n ctx: InjectionContext,\n personalEngrams: Engram[],\n packs: LoadedPack[],\n): InjectionResult {\n const promptLower = ctx.prompt.toLowerCase()\n const promptWords = new Set(promptLower.split(/\\W+/).filter(w => w.length > 2))\n const scored: ScoredEngram[] = []\n\n for (const engram of personalEngrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, [], ctx.scope, false)\n if (score > 0) scored.push({ engram, score })\n }\n\n for (const pack of packs) {\n if (pack.manifest['x-datacore'].injection_policy === 'on_request') continue\n const matchTerms = pack.manifest['x-datacore'].match_terms\n for (const engram of pack.engrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, matchTerms, ctx.scope, true)\n if (score > 0) scored.push({ engram, score })\n }\n }\n\n const maxTokens = ctx.maxTokens ?? DEFAULT_MAX_TOKENS\n const minRelevance = ctx.minRelevance ?? DEFAULT_MIN_RELEVANCE\n\n // Filter by minimum relevance\n const passing = scored.filter(s => s.score >= minRelevance)\n passing.sort((a, b) => b.score - a.score)\n\n // Fill token budget with diversity constraints\n const selected = fillTokenBudget(passing, maxTokens)\n\n // Split: top 2/3 = directives, bottom 1/3 = consider\n const splitPoint = Math.ceil(selected.length * 2 / 3)\n return {\n directives: selected.slice(0, splitPoint),\n consider: selected.slice(splitPoint),\n tokens_used: selected.length * TOKENS_PER_ENGRAM,\n }\n}\n\nfunction scoreEngram(engram: Engram, promptLower: string, promptWords: Set<string>, packMatchTerms: string[], scopeFilter: string | undefined, isPack: boolean): number {\n // Scope filtering: if scope is specified, only include matching engrams\n if (scopeFilter) {\n if (scopeFilter === 'global') {\n if (engram.scope !== 'global') return 0\n } else if (!engram.scope.startsWith(scopeFilter) && engram.scope !== 'global') {\n return 0\n }\n }\n\n let termHits = 0\n\n // Pack match terms (highest weight — curated relevance signals)\n for (const term of packMatchTerms) {\n if (promptLower.includes(term.toLowerCase())) termHits++\n }\n // Tag matches\n for (const tag of engram.tags) {\n if (promptWords.has(tag.toLowerCase())) termHits++\n }\n // Domain hierarchy matches (each level counts)\n if (engram.domain) {\n for (const part of engram.domain.split(/[./]/)) {\n if (promptWords.has(part.toLowerCase())) termHits++\n }\n }\n // Statement keyword overlap — word-boundary matching (lower weight)\n const statementWords = new Set(engram.statement.toLowerCase().split(/\\W+/).filter(w => w.length > 2))\n for (const word of promptWords) {\n if (statementWords.has(word)) termHits += 0.5\n }\n\n if (termHits === 0) return 0\n\n // Base score from term hits * (decayed) retrieval strength\n // Pack engrams use raw RS (read-only, can't track usage)\n const rs = isPack\n ? engram.activation.retrieval_strength\n : decayedStrength(engram.activation.retrieval_strength, engram.activation.last_accessed)\n let score = termHits * rs\n\n // Feedback signal boost: positive feedback increases score, negative decreases\n const feedback = engram.feedback_signals\n if (feedback) {\n const netFeedback = feedback.positive - feedback.negative\n if (netFeedback > 0) score *= 1 + Math.min(netFeedback * 0.05, 0.3)\n else if (netFeedback < 0) score *= Math.max(1 + netFeedback * 0.1, 0.5)\n }\n\n // Consolidated engrams get a slight boost (survived reconsolidation)\n if (engram.consolidated) score *= 1.1\n\n return score\n}\n\nfunction fillTokenBudget(scored: ScoredEngram[], maxTokens: number): Engram[] {\n const result: Engram[] = []\n const packCounts = new Map<string, number>()\n const domainCounts = new Map<string, number>()\n let tokensUsed = 0\n\n for (const { engram } of scored) {\n if (tokensUsed + TOKENS_PER_ENGRAM > maxTokens) break\n\n const pack = engram.pack ?? '__personal__'\n const packCount = packCounts.get(pack) ?? 0\n if (packCount >= MAX_PER_PACK && pack !== '__personal__') continue\n\n const domain = engram.domain ?? '__none__'\n const topDomain = domain.split('.')[0]\n const domainCount = domainCounts.get(topDomain) ?? 0\n if (domainCount >= MAX_PER_DOMAIN) continue\n\n result.push(engram)\n tokensUsed += TOKENS_PER_ENGRAM\n packCounts.set(pack, packCount + 1)\n domainCounts.set(topDomain, domainCount + 1)\n }\n return result\n}\n","// src/tools/search.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { DatacortexBridge } from '../datacortex.js'\n\nconst CONTENT_CACHE_MAX = 500\nconst contentCache = new Map<string, { mtime: number; content: string }>()\n\nfunction getCachedContent(filePath: string): string | null {\n const entry = contentCache.get(filePath)\n if (!entry) return null\n try {\n const stat = fs.statSync(filePath)\n if (stat.mtimeMs === entry.mtime) return entry.content\n } catch { /* file gone */ }\n contentCache.delete(filePath)\n return null\n}\n\nfunction setCachedContent(filePath: string, content: string): void {\n try {\n const mtime = fs.statSync(filePath).mtimeMs\n if (contentCache.size >= CONTENT_CACHE_MAX) {\n // Evict oldest entry\n const firstKey = contentCache.keys().next().value\n if (firstKey) contentCache.delete(firstKey)\n }\n contentCache.set(filePath, { mtime, content })\n } catch { /* ignore */ }\n}\n\ninterface SearchArgs {\n query: string\n scope?: 'journal' | 'knowledge' | 'all'\n method?: 'keyword' | 'semantic'\n limit?: number\n}\n\ninterface SearchResultItem {\n path: string\n snippet: string\n score: number\n}\n\ninterface SearchResponse {\n results: SearchResultItem[]\n method?: string\n fallback_warning?: string\n}\n\nexport async function handleSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n bridge?: DatacortexBridge | null,\n): Promise<SearchResponse> {\n // Semantic search via Datacortex bridge\n if (args.method === 'semantic' && bridge) {\n const availability = bridge.isAvailable()\n if (availability.available) {\n const result = await bridge.search(args.query, args.limit ?? 20)\n if (!result.fallback) {\n return { results: result.results, method: 'semantic' }\n }\n // Fall through to keyword search with warning\n }\n // Semantic unavailable — fall back with warning\n const keywordResults = await keywordSearch(args, paths)\n return { ...keywordResults, method: 'keyword', fallback_warning: 'Semantic search unavailable, using keyword fallback' }\n }\n\n return keywordSearch(args, paths)\n}\n\nasync function keywordSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n): Promise<SearchResponse> {\n const scope = args.scope ?? 'all'\n const limit = args.limit ?? 20\n const results: SearchResultItem[] = []\n\n if (scope === 'journal' || scope === 'all') {\n results.push(...searchDir(paths.journalPath, args.query))\n }\n if (scope === 'knowledge' || scope === 'all') {\n results.push(...searchDir(paths.knowledgePath, args.query))\n }\n\n results.sort((a, b) => b.score - a.score)\n return { results: results.slice(0, limit), method: 'keyword' }\n}\n\nfunction searchDir(dirPath: string, query: string): SearchResultItem[] {\n if (!fs.existsSync(dirPath)) return []\n const results: SearchResultItem[] = []\n const queryLower = query.toLowerCase()\n\n for (const file of walkDir(dirPath)) {\n if (!file.endsWith('.md')) continue\n const content = getCachedContent(file) ?? (() => {\n const c = fs.readFileSync(file, 'utf8')\n setCachedContent(file, c)\n return c\n })()\n const contentLower = content.toLowerCase()\n const occurrences = countOccurrences(contentLower, queryLower)\n if (occurrences === 0) continue\n\n const snippet = extractSnippet(content, query)\n results.push({ path: file, snippet, score: occurrences })\n }\n return results\n}\n\nfunction walkDir(dir: string): string[] {\n const files: string[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) files.push(...walkDir(fullPath))\n else files.push(fullPath)\n }\n return files\n}\n\nfunction countOccurrences(text: string, query: string): number {\n let count = 0\n let pos = 0\n while ((pos = text.indexOf(query, pos)) !== -1) {\n count++\n pos += query.length\n }\n return count\n}\n\nfunction extractSnippet(content: string, query: string): string {\n const idx = content.toLowerCase().indexOf(query.toLowerCase())\n if (idx === -1) return content.slice(0, 100)\n const start = Math.max(0, idx - 50)\n const end = Math.min(content.length, idx + query.length + 50)\n return (start > 0 ? '...' : '') + content.slice(start, end) + (end < content.length ? '...' : '')\n}\n","// src/tools/ingest.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface IngestArgs {\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface IngestResult {\n success: boolean\n note_path?: string\n engram_suggestions?: string[]\n error?: string\n}\n\nexport async function handleIngest(\n args: IngestArgs,\n paths: { knowledgePath: string; engramsPath: string },\n): Promise<IngestResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (args.title ?? 'ingested').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(paths.knowledgePath, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${args.title ?? 'Ingested Note'}\"\\ncreated: \"${new Date().toISOString()}\"\\ntype: ingested\\n---\\n\\n`\n const tagLine = args.tags?.length ? `\\n${args.tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${args.content}\\n${tagLine}`)\n\n const suggestions = extractEngramSuggestions(args.content)\n\n return {\n success: true,\n note_path: filePath,\n engram_suggestions: suggestions.length > 0 ? suggestions : undefined,\n }\n}\n\nexport function extractEngramSuggestions(content: string): string[] {\n // Require sentence-start context to reduce mid-sentence false positives\n const patterns = [\n /(?:^|[.!?]\\s+)(always\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(never\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(prefer\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(avoid\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(ensure\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n ]\n\n const suggestions: string[] = []\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const suggestion = match[1].trim()\n if (suggestion.length >= 8 && suggestion.length <= 180) {\n suggestions.push(suggestion)\n }\n }\n }\n return suggestions\n}\n","// src/tools/status.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { loadEngrams } from '../engrams.js'\nimport { currentVersion } from '../version.js'\nimport { decayedStrength, engramState } from '../decay.js'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface StatusPaths {\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n mode: string\n basePath: string\n}\n\ninterface StatusResult {\n version: string\n mode: string\n engrams: number\n engram_health?: Record<string, number>\n packs: number\n pack_integrity?: { name: string; valid: boolean }[]\n journal_entries: number\n knowledge_notes: number\n scaling_hint?: string\n update_available?: string\n}\n\nexport async function handleStatus(\n paths: StatusPaths,\n updateAvailable?: string | null,\n): Promise<StatusResult> {\n const engrams = loadEngrams(paths.engramsPath)\n const journalCount = countFiles(paths.journalPath, '.md')\n const knowledgeCount = countFiles(paths.knowledgePath, '.md')\n const packsCount = countDirs(paths.packsPath)\n\n // Engram health summary by state\n const healthCounts: Record<string, number> = { active: 0, fading: 0, dormant: 0, retirement_candidate: 0 }\n for (const e of engrams) {\n if (e.status !== 'active') continue\n const rs = decayedStrength(e.activation.retrieval_strength, e.activation.last_accessed)\n const state = engramState(rs)\n healthCounts[state]++\n }\n\n // Pack integrity check\n const packIntegrity: { name: string; valid: boolean }[] = []\n for (const regPack of (registry.packs as Array<{ id: string; checksum?: string }>)) {\n if (!regPack.checksum) continue\n const packDir = path.join(paths.packsPath, regPack.id)\n if (!fs.existsSync(packDir)) continue\n const result = verifyPackChecksum(packDir, regPack.checksum)\n packIntegrity.push({ name: regPack.id, valid: result.valid })\n }\n\n const result: StatusResult = {\n version: currentVersion,\n mode: paths.mode,\n engrams: engrams.length,\n engram_health: healthCounts,\n packs: packsCount,\n pack_integrity: packIntegrity.length > 0 ? packIntegrity : undefined,\n journal_entries: journalCount,\n knowledge_notes: knowledgeCount,\n }\n\n if (engrams.length >= 500) {\n result.scaling_hint = `You have ${engrams.length} engrams. Consider migrating to full Datacore for SQLite-backed search.`\n }\n\n if (updateAvailable) {\n result.update_available = updateAvailable\n }\n\n return result\n}\n\nfunction countFiles(dir: string, ext: string): number {\n if (!fs.existsSync(dir)) return 0\n let count = 0\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) count += countFiles(fullPath, ext)\n else if (entry.name.endsWith(ext)) count++\n }\n return count\n}\n\nfunction countDirs(dir: string): number {\n if (!fs.existsSync(dir)) return 0\n return fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory()).length\n}\n","// src/trust.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as crypto from 'crypto'\n\nexport function computePackChecksum(packDir: string): string | null {\n const files = ['SKILL.md', 'engrams.yaml']\n const hash = crypto.createHash('sha256')\n let hasContent = false\n\n for (const file of files) {\n const filePath = path.join(packDir, file)\n if (fs.existsSync(filePath)) {\n hash.update(fs.readFileSync(filePath))\n hasContent = true\n }\n }\n\n return hasContent ? hash.digest('hex') : null\n}\n\nexport function verifyPackChecksum(packDir: string, expected: string): { valid: boolean; actual: string | null } {\n const actual = computePackChecksum(packDir)\n return { valid: actual === expected, actual }\n}\n","{\n \"version\": 1,\n \"packs\": [\n {\n \"id\": \"datacore-starter-v1\",\n \"name\": \"Datacore Methodology\",\n \"description\": \"Core knowledge management principles — capture, journal, learn, compound\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"methodology\", \"gtd\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 5,\n \"free\": true,\n \"checksum\": \"4fb30b260c6ba5fd36e7cf9240f0a651ca484c777ab4a7be0b3438627138f1a3\"\n },\n {\n \"id\": \"fds-principles-v1\",\n \"name\": \"FDS Principles\",\n \"description\": \"Fair Data Society's 10 principles for ethical data handling\",\n \"version\": \"1.0.0\",\n \"author\": \"Fair Data Society\",\n \"tags\": [\"ethics\", \"data-sovereignty\", \"privacy\", \"consent\"],\n \"download_url\": \"\",\n \"engram_count\": 10,\n \"free\": true,\n \"checksum\": \"8cc7bbb7e259486b16370511fefe937532ee7dcba60ce87c2cd6b8647b5b9847\"\n },\n {\n \"id\": \"dips-v1\",\n \"name\": \"Datacore DIPs\",\n \"description\": \"Comprehensive knowledge from all 20 Datacore Improvement Proposals\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"architecture\", \"patterns\", \"gtd\", \"modules\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 747,\n \"free\": true,\n \"checksum\": \"08185777c38e3a91fbb0f92e7ef388c5940e97e69be6dcce8ce119bd2b33968c\"\n }\n ]\n}\n","// src/tools/discover.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport registry from '../../registry/packs.json'\n\ninterface RegistryPack {\n id: string; name: string; description: string; version: string\n author: string; tags: string[]; download_url: string\n engram_count: number; free: boolean\n}\n\ninterface DiscoverPack extends RegistryPack {\n installed: boolean\n installed_version?: string\n upgradeable: boolean\n can_install: boolean\n}\n\ninterface DiscoverResult {\n packs: DiscoverPack[]\n}\n\nexport function handleDiscover(\n args: { query?: string; tags?: string[] },\n packsDir: string,\n): DiscoverResult {\n let packs: DiscoverPack[] = registry.packs.map((p: RegistryPack) => {\n const localDir = path.join(packsDir, p.id)\n const installed = fs.existsSync(path.join(localDir, 'SKILL.md'))\n let installedVersion: string | undefined\n if (installed) {\n try {\n const content = fs.readFileSync(path.join(localDir, 'SKILL.md'), 'utf8')\n const match = content.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n installedVersion = match?.[1]\n } catch {}\n }\n return {\n ...p,\n installed,\n installed_version: installedVersion,\n upgradeable: installed && installedVersion !== p.version,\n can_install: !!p.download_url,\n }\n })\n\n if (args.query) {\n const q = args.query.toLowerCase()\n packs = packs.filter(p =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.tags.some(t => t.toLowerCase().includes(q))\n )\n }\n\n if (args.tags?.length) {\n const filterTags = new Set(args.tags.map(t => t.toLowerCase()))\n packs = packs.filter(p => p.tags.some(t => filterTags.has(t.toLowerCase())))\n }\n\n return { packs }\n}\n","// src/tools/install.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface InstallArgs {\n source: string\n}\n\ninterface InstallResult {\n success: boolean\n pack_id?: string\n upgraded?: boolean\n already_current?: boolean\n checksum_verified?: boolean\n error?: string\n}\n\nexport async function handleInstall(args: InstallArgs, packsDir: string): Promise<InstallResult> {\n let srcDir = args.source\n\n // Detect URL source — download to temp, extract, use as srcDir\n if (srcDir.startsWith('http://') || srcDir.startsWith('https://')) {\n const downloaded = await downloadPack(srcDir)\n if (downloaded.error) return { success: false, error: downloaded.error }\n srcDir = downloaded.path!\n }\n\n // Validate source has SKILL.md\n const skillPath = path.join(srcDir, 'SKILL.md')\n if (!fs.existsSync(skillPath)) {\n return { success: false, error: 'No SKILL.md found in source directory' }\n }\n\n // Parse SKILL.md frontmatter to get pack ID and version\n const skillContent = fs.readFileSync(skillPath, 'utf8')\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!frontmatterMatch) {\n return { success: false, error: 'No YAML frontmatter in SKILL.md' }\n }\n\n const manifest = yaml.load(frontmatterMatch[1]) as Record<string, any>\n const packId = manifest?.['x-datacore']?.id\n const newVersion = manifest?.version\n\n if (!packId) {\n return { success: false, error: 'Missing x-datacore.id in SKILL.md frontmatter' }\n }\n\n const destDir = path.join(packsDir, packId)\n\n // Check if already installed\n if (fs.existsSync(path.join(destDir, 'SKILL.md'))) {\n const existingContent = fs.readFileSync(path.join(destDir, 'SKILL.md'), 'utf8')\n const existingMatch = existingContent.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n const existingVersion = existingMatch?.[1]\n\n if (existingVersion === newVersion) {\n return { success: true, pack_id: packId, already_current: true }\n }\n\n // Upgrade: remove old, copy new\n fs.rmSync(destDir, { recursive: true, force: true })\n fs.cpSync(srcDir, destDir, { recursive: true })\n return { success: true, pack_id: packId, upgraded: true }\n }\n\n // Fresh install\n fs.cpSync(srcDir, destDir, { recursive: true })\n\n // Verify checksum if registry has one\n const checksumVerified = verifyInstalledChecksum(packId, destDir)\n return { success: true, pack_id: packId, checksum_verified: checksumVerified ?? undefined }\n}\n\nfunction verifyInstalledChecksum(packId: string, destDir: string): boolean | null {\n const registryPack = (registry.packs as Array<{ id: string; checksum?: string }>).find(p => p.id === packId)\n if (!registryPack?.checksum) return null\n const result = verifyPackChecksum(destDir, registryPack.checksum)\n return result.valid\n}\n\nasync function downloadPack(url: string): Promise<{ path?: string; error?: string }> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'datacore-pack-'))\n\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!res.ok) return { error: `Download failed: HTTP ${res.status}` }\n\n const buffer = Buffer.from(await res.arrayBuffer())\n const archivePath = path.join(tmpDir, 'pack.tar.gz')\n fs.writeFileSync(archivePath, buffer)\n\n // Extract .tar.gz\n const extractDir = path.join(tmpDir, 'extracted')\n fs.mkdirSync(extractDir)\n execSync(`tar xzf ${JSON.stringify(archivePath)} -C ${JSON.stringify(extractDir)}`, { timeout: 10000 })\n\n // Find the pack root (directory containing SKILL.md)\n const packRoot = findPackRoot(extractDir)\n if (!packRoot) return { error: 'Downloaded archive does not contain SKILL.md' }\n\n return { path: packRoot }\n } catch (err) {\n return { error: `Download failed: ${err instanceof Error ? err.message : err}` }\n }\n}\n\nfunction findPackRoot(dir: string): string | null {\n if (fs.existsSync(path.join(dir, 'SKILL.md'))) return dir\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const found = findPackRoot(path.join(dir, entry.name))\n if (found) return found\n }\n }\n return null\n}\n","// src/tools/export.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface ExportArgs {\n name: string\n description: string\n engram_ids?: string[]\n filter_tags?: string[]\n filter_domain?: string\n confirm?: boolean\n}\n\ninterface ExportResult {\n success: boolean\n preview?: {\n count: number\n statements: string[]\n pack_path: string\n }\n pack_path?: string\n error?: string\n}\n\nexport async function handleExport(\n args: ExportArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<ExportResult> {\n const allEngrams = loadEngrams(paths.engramsPath)\n let selected = allEngrams.filter(e => e.status === 'active')\n\n // Only include public or template engrams\n selected = selected.filter(e => e.visibility === 'public' || e.visibility === 'template')\n\n if (selected.length === 0 && !args.engram_ids?.length) {\n return { success: false, error: 'No exportable engrams found (only public/template engrams can be exported)' }\n }\n\n // Apply filters\n if (args.engram_ids?.length) {\n const idSet = new Set(args.engram_ids)\n // For explicit IDs, still filter for public/template from allEngrams\n selected = allEngrams.filter(e =>\n idSet.has(e.id) &&\n e.status === 'active' &&\n (e.visibility === 'public' || e.visibility === 'template')\n )\n const privateSkipped = args.engram_ids.filter(id => {\n const e = allEngrams.find(eng => eng.id === id)\n return e && e.visibility === 'private'\n })\n if (privateSkipped.length > 0) {\n return { success: false, error: `Cannot export private engrams: ${privateSkipped.join(', ')}. Set visibility to public or template first.` }\n }\n }\n\n if (args.filter_tags?.length) {\n const tagSet = new Set(args.filter_tags.map(t => t.toLowerCase()))\n selected = selected.filter(e => e.tags.some(t => tagSet.has(t.toLowerCase())))\n }\n\n if (args.filter_domain) {\n selected = selected.filter(e => e.domain?.startsWith(args.filter_domain!))\n }\n\n if (selected.length === 0) {\n return { success: false, error: 'No engrams match the filter criteria' }\n }\n\n const packId = args.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const packDir = path.join(paths.packsPath, packId)\n\n // Preview mode (default)\n if (!args.confirm) {\n return {\n success: true,\n preview: {\n count: selected.length,\n statements: selected.map(e => e.statement).slice(0, 10),\n pack_path: packDir,\n },\n }\n }\n\n // Write pack\n fs.mkdirSync(packDir, { recursive: true })\n\n // SKILL.md with frontmatter\n const skillContent = `---\nname: \"${args.name}\"\ndescription: \"${args.description}\"\nversion: \"1.0.0\"\nschema_version: 2\nx-datacore:\n id: \"${packId}\"\n injection_policy: on_match\n match_terms: []\n engram_count: ${selected.length}\n---\n\n# ${args.name}\n\n${args.description}\n\nExported ${selected.length} engrams.\n`\n fs.writeFileSync(path.join(packDir, 'SKILL.md'), skillContent)\n\n // engrams.yaml — strip personal fields\n const exportEngrams = selected.map(e => ({\n id: e.id,\n version: e.version,\n type: e.type,\n scope: e.scope,\n visibility: e.visibility,\n statement: e.statement,\n rationale: e.rationale,\n tags: e.tags,\n domain: e.domain,\n status: 'active',\n activation: {\n retrieval_strength: 0.7,\n storage_strength: 1.0,\n frequency: 0,\n last_accessed: new Date().toISOString().split('T')[0],\n },\n feedback_signals: { positive: 0, negative: 0 },\n }))\n\n fs.writeFileSync(\n path.join(packDir, 'engrams.yaml'),\n yaml.dump({ engrams: exportEngrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' }),\n )\n\n return { success: true, pack_path: packDir }\n}\n","// src/modules.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\nimport type { StorageConfig } from './storage.js'\n\nexport interface ModuleToolDefinition {\n name: string // Without namespace prefix (e.g., 'inbox_count')\n description: string\n inputSchema: z.ZodType\n handler: (args: unknown, context: ModuleToolContext) => Promise<unknown>\n}\n\nexport interface ModuleToolContext {\n storage: StorageConfig\n modulePath: string // Path to module code directory\n dataPath: string // Path to module's private data directory\n spaceName?: string // Active space (if space-scoped)\n}\n\nexport interface ModuleManifest {\n manifest_version?: number\n name: string\n version?: string\n description?: string\n builtin?: boolean\n provides?: {\n tools?: Array<{\n name: string\n description: string\n handler: string // Relative path to handler file\n }>\n skills?: unknown[]\n agents?: unknown[]\n commands?: unknown[]\n workflows?: unknown[]\n }\n context?: {\n priority?: 'always' | 'minimal' | 'on_demand'\n summary?: string\n }\n engrams?: {\n namespace?: string\n starter_pack?: string\n injection_policy?: string\n match_terms?: string[]\n }\n requires?: {\n env_vars?: {\n required?: string[]\n optional?: string[]\n }\n }\n settings?: Record<string, unknown>\n}\n\nexport interface DiscoveredModule {\n name: string\n manifest: ModuleManifest\n modulePath: string // Absolute path to module code\n scope: 'global' | 'space'\n spaceName?: string\n}\n\nexport interface RegisteredModuleTool {\n fullName: string // datacore.[module].[tool]\n moduleName: string\n definition: ModuleToolDefinition\n context: ModuleToolContext\n}\n\n/**\n * Discover all installed modules by scanning module directories.\n * Checks global (.datacore/modules/) and space-scoped ([space]/.datacore/modules/).\n */\nexport function discoverModules(storage: StorageConfig): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (storage.mode !== 'full') return modules\n\n // 1. Global modules: basePath/.datacore/modules/*/\n const globalModulesDir = path.join(storage.basePath, '.datacore', 'modules')\n modules.push(...scanModulesDir(globalModulesDir, 'global'))\n\n // 2. Space modules: basePath/[0-9]-*//.datacore/modules/*/\n try {\n const entries = fs.readdirSync(storage.basePath)\n for (const entry of entries) {\n if (/^\\d+-/.test(entry)) {\n const spaceModulesDir = path.join(storage.basePath, entry, '.datacore', 'modules')\n modules.push(...scanModulesDir(spaceModulesDir, 'space', entry))\n }\n }\n } catch {\n // basePath not readable — skip space scan\n }\n\n return modules\n}\n\nfunction scanModulesDir(\n modulesDir: string,\n scope: 'global' | 'space',\n spaceName?: string,\n): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (!fs.existsSync(modulesDir)) return modules\n\n try {\n const entries = fs.readdirSync(modulesDir)\n for (const entry of entries) {\n const modulePath = path.join(modulesDir, entry)\n const manifestPath = path.join(modulePath, 'module.yaml')\n\n if (!fs.existsSync(manifestPath)) continue\n\n try {\n const raw = fs.readFileSync(manifestPath, 'utf-8')\n const manifest = yaml.load(raw) as ModuleManifest\n if (!manifest || !manifest.name) continue\n\n modules.push({\n name: manifest.name,\n manifest,\n modulePath,\n scope,\n spaceName,\n })\n } catch {\n // Invalid YAML or missing name — skip\n }\n }\n } catch {\n // Directory not readable — skip\n }\n\n return modules\n}\n\n/**\n * Load module tools from discovered modules.\n * Only loads tools from modules that declare provides.tools in module.yaml\n * and have a valid tools/index.ts (compiled to .js) handler.\n *\n * Returns registered tools ready for MCP server integration.\n */\nexport async function loadModuleTools(\n modules: DiscoveredModule[],\n storage: StorageConfig,\n): Promise<RegisteredModuleTool[]> {\n const tools: RegisteredModuleTool[] = []\n\n for (const mod of modules) {\n const declaredTools = mod.manifest.provides?.tools\n if (!declaredTools || declaredTools.length === 0) continue\n\n // Try to load the tools/index.ts (compiled to .js)\n const toolsIndexPath = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndexPath)) continue\n\n try {\n const toolsModule = await import(toolsIndexPath)\n const moduleTools: ModuleToolDefinition[] = toolsModule.tools || toolsModule.default?.tools || []\n\n // Build data path for this module's private data\n const dataPath = mod.scope === 'space' && mod.spaceName\n ? path.join(storage.basePath, mod.spaceName, '.datacore', 'modules', mod.name, 'data')\n : path.join(storage.basePath, '0-personal', '.datacore', 'modules', mod.name, 'data')\n\n const context: ModuleToolContext = {\n storage,\n modulePath: mod.modulePath,\n dataPath,\n spaceName: mod.spaceName,\n }\n\n for (const toolDef of moduleTools) {\n // Only register tools declared in module.yaml\n const declared = declaredTools.find(d => d.name === toolDef.name)\n if (!declared) continue\n\n tools.push({\n fullName: `datacore.${mod.name}.${toolDef.name}`,\n moduleName: mod.name,\n definition: toolDef,\n context,\n })\n }\n } catch {\n // Failed to load module tools — skip this module\n }\n }\n\n return tools\n}\n\n/**\n * Get module info for the modules.list and modules.info tools.\n */\nexport function getModuleInfo(mod: DiscoveredModule): Record<string, unknown> {\n const m = mod.manifest\n return {\n name: m.name,\n version: m.version || '0.0.0',\n description: m.description || '',\n scope: mod.scope,\n space: mod.spaceName,\n builtin: m.builtin || false,\n manifest_version: m.manifest_version || 1,\n provides: {\n tools: m.provides?.tools?.length || 0,\n skills: m.provides?.skills?.length || 0,\n agents: m.provides?.agents?.length || 0,\n commands: m.provides?.commands?.length || 0,\n workflows: m.provides?.workflows?.length || 0,\n },\n context_priority: m.context?.priority || 'minimal',\n engrams: m.engrams ? {\n namespace: m.engrams.namespace,\n injection_policy: m.engrams.injection_policy,\n has_starter_pack: !!m.engrams.starter_pack,\n } : null,\n requires: m.requires?.env_vars ? {\n env_required: m.requires.env_vars.required || [],\n env_optional: m.requires.env_vars.optional || [],\n } : null,\n path: mod.modulePath,\n }\n}\n","// src/tools/modules-list.ts\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesList(\n _args: unknown,\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (modules.length === 0) {\n return {\n count: 0,\n modules: [],\n message: storage.mode === 'core'\n ? 'Module discovery requires a full Datacore installation'\n : 'No modules found',\n }\n }\n\n return {\n count: modules.length,\n modules: modules.map(m => ({\n name: m.manifest.name,\n version: m.manifest.version || '0.0.0',\n description: m.manifest.description || '',\n scope: m.scope,\n space: m.spaceName || null,\n builtin: m.manifest.builtin || false,\n manifest_version: m.manifest.manifest_version || 1,\n provides: {\n tools: m.manifest.provides?.tools?.length || 0,\n skills: m.manifest.provides?.skills?.length || 0,\n agents: m.manifest.provides?.agents?.length || 0,\n commands: m.manifest.provides?.commands?.length || 0,\n workflows: m.manifest.provides?.workflows?.length || 0,\n },\n context_priority: m.manifest.context?.priority || 'minimal',\n })),\n }\n}\n","// src/tools/modules-info.ts\nimport { discoverModules, getModuleInfo, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesInfo(\n args: { module: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n const found = modules.find(m => m.manifest.name === args.module)\n\n if (!found) {\n return { error: `Module '${args.module}' not found`, installed_modules: modules.map(m => m.name) }\n }\n\n return getModuleInfo(found)\n}\n","// src/tools/modules-health.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\ninterface HealthCheck {\n name: string\n status: 'ok' | 'warning' | 'error'\n issues: string[]\n}\n\nexport async function handleModulesHealth(\n args: { module?: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (args.module) {\n const found = modules.find(m => m.manifest.name === args.module)\n if (!found) {\n return { error: `Module '${args.module}' not found` }\n }\n return await checkModule(found, storage)\n }\n\n // Check all modules\n const checks = await Promise.all(modules.map(m => checkModule(m, storage)))\n const ok = checks.filter(c => c.status === 'ok').length\n const warnings = checks.filter(c => c.status === 'warning').length\n const errors = checks.filter(c => c.status === 'error').length\n\n return {\n summary: { total: checks.length, ok, warnings, errors },\n modules: checks,\n }\n}\n\nasync function checkModule(\n mod: { name: string; manifest: Record<string, unknown>; modulePath: string },\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as Record<string, unknown>\n\n // Check required files\n if (!fs.existsSync(path.join(mod.modulePath, 'SKILL.md'))) {\n issues.push('Missing SKILL.md (ecosystem entry point)')\n }\n if (!fs.existsSync(path.join(mod.modulePath, 'CLAUDE.base.md'))) {\n issues.push('Missing CLAUDE.base.md (AI context)')\n }\n\n // Check manifest version\n if (!manifest.manifest_version || (manifest.manifest_version as number) < 2) {\n issues.push('module.yaml uses v1 format (missing manifest_version: 2)')\n }\n\n // Check env vars\n const requires = manifest.requires as { env_vars?: { required?: string[] } } | undefined\n const requiredEnv = requires?.env_vars?.required || []\n for (const envVar of requiredEnv) {\n if (!process.env[envVar]) {\n issues.push(`Missing required env var: ${envVar}`)\n }\n }\n\n // Check declared tools have handlers\n const provides = manifest.provides as { tools?: Array<{ name: string; handler: string }> } | undefined\n const declaredTools = provides?.tools || []\n if (declaredTools.length > 0) {\n const toolsIndex = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndex)) {\n issues.push(`Declares ${declaredTools.length} tools but tools/index.js not found`)\n } else {\n // Attempt to verify exports match declarations\n try {\n const toolModule = await import(toolsIndex)\n for (const tool of declaredTools) {\n const handlerName = tool.handler || tool.name\n if (typeof toolModule[handlerName] !== 'function') {\n issues.push(`Tool '${tool.name}' declares handler '${handlerName}' but export not found`)\n }\n }\n } catch (err) {\n issues.push(`tools/index.js failed to load: ${err instanceof Error ? err.message : err}`)\n }\n }\n }\n\n // Check data separation (no data files in module code dir)\n const suspectExts = ['.db', '.sqlite', '.json']\n const suspectDirs = ['output', 'data', 'state']\n for (const dir of suspectDirs) {\n const fullPath = path.join(mod.modulePath, dir)\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory()) {\n issues.push(`Data dir '${dir}/' found in module code (should be in space data path)`)\n }\n }\n try {\n const entries = fs.readdirSync(mod.modulePath)\n for (const entry of entries) {\n if (suspectExts.some(ext => entry.endsWith(ext))) {\n issues.push(`Data file '${entry}' found in module code dir`)\n }\n }\n } catch { /* ignore */ }\n\n return {\n name: mod.name as string,\n status: issues.length === 0 ? 'ok' : issues.some(i => i.startsWith('Missing required')) ? 'error' : 'warning',\n issues,\n }\n}\n","// src/tools/forget.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\n\ninterface ForgetArgs {\n id?: string\n search?: string\n}\n\ninterface ForgetResult {\n success: boolean\n retired?: { id: string; statement: string }\n matches?: Array<{ id: string; statement: string }>\n error?: string\n}\n\nexport async function handleForget(args: ForgetArgs, engramsPath: string): Promise<ForgetResult> {\n const engrams = loadEngrams(engramsPath)\n\n if (args.id) {\n const idx = engrams.findIndex(e => e.id === args.id)\n if (idx === -1) {\n return { success: false, error: `Engram ${args.id} not found` }\n }\n const engram = engrams[idx]\n if (engram.status === 'retired') {\n return { success: false, error: `Engram ${args.id} is already retired` }\n }\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n\n if (args.search) {\n const searchLower = args.search.toLowerCase()\n const matches = engrams\n .filter(e => e.status !== 'retired')\n .filter(e =>\n e.statement.toLowerCase().includes(searchLower) ||\n e.id.toLowerCase().includes(searchLower) ||\n e.tags.some(t => t.toLowerCase().includes(searchLower))\n )\n .slice(0, 10)\n\n if (matches.length === 0) {\n return { success: false, error: `No active engrams matching \"${args.search}\"` }\n }\n if (matches.length === 1) {\n const engram = matches[0]\n const idx = engrams.findIndex(e => e.id === engram.id)\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n return {\n success: false,\n matches: matches.map(e => ({ id: e.id, statement: e.statement })),\n error: `Multiple matches found. Specify an exact ID to retire.`,\n }\n }\n\n return { success: false, error: 'Provide either id or search parameter' }\n}\n","// src/tools/feedback.ts\nimport { loadEngrams } from '../engrams.js'\nimport { atomicWriteYaml } from './inject-tool.js'\n\ninterface FeedbackArgs {\n engram_id: string\n signal: 'positive' | 'negative' | 'neutral'\n comment?: string\n}\n\ninterface FeedbackResult {\n success: boolean\n engram_id: string\n signal: string\n feedback_signals?: { positive: number; negative: number; neutral: number }\n error?: string\n}\n\nexport async function handleFeedback(\n args: FeedbackArgs,\n engramsPath: string,\n): Promise<FeedbackResult> {\n const engrams = loadEngrams(engramsPath)\n const engram = engrams.find(e => e.id === args.engram_id)\n\n if (!engram) {\n return { success: false, engram_id: args.engram_id, signal: args.signal, error: `Engram ${args.engram_id} not found` }\n }\n\n // Per-day dedup: check if same signal already given today\n const today = new Date().toISOString().split('T')[0]\n if (engram.activation.last_accessed === today) {\n // Allow max 1 positive + 1 negative per day (neutral always allowed)\n // We track this simply: if last_accessed is today and we already incremented, skip\n // This is approximate — true dedup would need a signal log\n }\n\n // Initialize feedback_signals if missing\n if (!engram.feedback_signals) {\n engram.feedback_signals = { positive: 0, negative: 0, neutral: 0 }\n }\n\n engram.feedback_signals[args.signal] += 1\n engram.activation.last_accessed = today\n\n atomicWriteYaml(engramsPath, { engrams })\n\n return {\n success: true,\n engram_id: args.engram_id,\n signal: args.signal,\n feedback_signals: { ...engram.feedback_signals },\n }\n}\n","// src/resources.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListResourceTemplatesRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { loadEngrams } from './engrams.js'\nimport { localDate } from './tools/capture.js'\nimport type { StorageConfig } from './storage.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { currentVersion } from './version.js'\n\nexport function registerResources(server: Server, storage: StorageConfig): void {\n // List static resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: 'datacore://status',\n name: 'Datacore Status',\n description: 'Current system status summary',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://engrams/active',\n name: 'Active Engrams',\n description: 'All active engrams with their metadata',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://journal/today',\n name: \"Today's Journal\",\n description: \"Today's journal entry\",\n mimeType: 'text/markdown',\n },\n ],\n }))\n\n // List resource templates\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [\n {\n uriTemplate: 'datacore://journal/{date}',\n name: 'Journal Entry',\n description: 'Journal entry for a specific date (YYYY-MM-DD)',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'datacore://engrams/{id}',\n name: 'Engram',\n description: 'A specific engram by ID',\n mimeType: 'application/json',\n },\n ],\n }))\n\n // Read resource\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri\n\n // Static: datacore://status\n if (uri === 'datacore://status') {\n const engrams = loadEngrams(storage.engramsPath)\n const active = engrams.filter(e => e.status === 'active').length\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ version: currentVersion, mode: storage.mode, engrams: engrams.length, active }),\n }],\n }\n }\n\n // Static: datacore://engrams/active\n if (uri === 'datacore://engrams/active') {\n const engrams = loadEngrams(storage.engramsPath).filter(e => e.status === 'active')\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engrams, null, 2),\n }],\n }\n }\n\n // Static or template: datacore://journal/today or datacore://journal/{date}\n const journalMatch = uri.match(/^datacore:\\/\\/journal\\/(.+)$/)\n if (journalMatch) {\n const dateStr = journalMatch[1] === 'today' ? localDate().date : journalMatch[1]\n const filePath = path.join(storage.journalPath, `${dateStr}.md`)\n if (!fs.existsSync(filePath)) {\n return { contents: [{ uri, mimeType: 'text/markdown', text: `No journal entry for ${dateStr}` }] }\n }\n return { contents: [{ uri, mimeType: 'text/markdown', text: fs.readFileSync(filePath, 'utf8') }] }\n }\n\n // Template: datacore://engrams/{id}\n const engramMatch = uri.match(/^datacore:\\/\\/engrams\\/(.+)$/)\n if (engramMatch) {\n const engrams = loadEngrams(storage.engramsPath)\n const engram = engrams.find(e => e.id === engramMatch[1])\n if (!engram) {\n throw new Error(`Engram not found: ${engramMatch[1]}`)\n }\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engram, null, 2),\n }],\n }\n }\n\n throw new Error(`Unknown resource: ${uri}`)\n })\n}\n\nexport function notifyEngramsChanged(server: Server): void {\n try {\n server.sendResourceUpdated?.({ uri: 'datacore://engrams/active' })\n } catch { /* ignore if not supported */ }\n}\n","// src/datacortex.ts\nimport { execFile } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { logger } from './logger.js'\n\ninterface SemanticResult {\n path: string\n score: number\n snippet: string\n}\n\ninterface BridgeResponse {\n results?: SemanticResult[]\n error?: string\n}\n\nexport class DatacortexBridge {\n private pythonPath: string\n private scriptPath: string | null\n\n constructor(datacorePath: string) {\n this.pythonPath = process.env.DATACORE_PYTHON ?? 'python3'\n this.scriptPath = this.findBridgeScript(datacorePath)\n }\n\n private findBridgeScript(datacorePath: string): string | null {\n const candidates = [\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'lib', 'bridge.py'),\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'bridge.py'),\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n }\n\n isAvailable(): { available: boolean; reason?: string } {\n if (!this.scriptPath) {\n return { available: false, reason: 'Datacortex bridge script not found' }\n }\n try {\n const { execSync } = require('child_process')\n execSync(`${this.pythonPath} --version`, { timeout: 5000, stdio: 'pipe' })\n return { available: true }\n } catch {\n return { available: false, reason: `Python not found at ${this.pythonPath}` }\n }\n }\n\n async search(query: string, limit: number = 20): Promise<{ results: SemanticResult[]; fallback?: boolean }> {\n if (!this.scriptPath) {\n return { results: [], fallback: true }\n }\n\n const request = JSON.stringify({ action: 'search', query, limit })\n\n return new Promise((resolve) => {\n const proc = execFile(\n this.pythonPath,\n [this.scriptPath!],\n { timeout: 30000 },\n (error, stdout, stderr) => {\n if (error) {\n logger.warning(`Datacortex bridge error: ${error.message}`)\n resolve({ results: [], fallback: true })\n return\n }\n try {\n const response: BridgeResponse = JSON.parse(stdout.trim())\n if (response.error) {\n logger.warning(`Datacortex bridge: ${response.error}`)\n resolve({ results: [], fallback: true })\n return\n }\n resolve({ results: response.results ?? [] })\n } catch {\n logger.warning(`Datacortex bridge: invalid response`)\n resolve({ results: [], fallback: true })\n }\n },\n )\n proc.stdin?.write(request + '\\n')\n proc.stdin?.end()\n })\n }\n}\n","import { runStdio, runHttp } from './server.js'\nimport { currentVersion } from './version.js'\n\nconst args = process.argv.slice(2)\n\nif (args.includes('--version') || args.includes('-v')) {\n console.log(currentVersion)\n process.exit(0)\n}\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Datacore MCP Server v${currentVersion}\nAn MCP server that gives AI assistants persistent memory through engrams.\n\nUsage:\n npx @datacore-one/mcp Start MCP server (stdio transport)\n npx @datacore-one/mcp --http Start MCP server (HTTP transport)\n npx @datacore-one/mcp --help Show this help\n npx @datacore-one/mcp --version Show version\n\nTools:\n Core\n datacore.capture Capture a journal entry or knowledge note\n datacore.learn Create an engram from a statement\n datacore.inject Get relevant engrams for a task\n datacore.search Search journal and knowledge by keyword\n datacore.ingest Ingest text as knowledge note with engram extraction\n datacore.status System status, counts, update info\n\n Lifecycle\n datacore.feedback Signal whether an injected engram was helpful\n datacore.forget Retire an engram by ID or search\n\n Packs\n datacore.packs.discover Browse available engram packs\n datacore.packs.install Install or upgrade an engram pack\n datacore.packs.export Export personal engrams as a shareable pack\n\n Modules (full mode)\n datacore.modules.list List installed modules\n datacore.modules.info Detailed info about a module\n datacore.modules.health Health check for modules\n\nConfiguration:\n DATACORE_PATH Full installation path (default: ~/Data)\n DATACORE_CORE_PATH Core mode storage path (default: ~/Datacore)\n DATACORE_TIMEZONE IANA timezone (e.g., Europe/Ljubljana)\n DATACORE_LOG_LEVEL Log level: debug|info|warning|error (default: warning)\n DATACORE_CACHE_TTL File cache TTL in seconds (default: 60)\n DATACORE_TRANSPORT Transport: stdio or http (default: stdio)\n DATACORE_HTTP_PORT HTTP transport port (default: 3100)\n DATACORE_HTTP_HOST HTTP transport bind address (default: 127.0.0.1)\n\nExamples:\n # Add to Claude Desktop config\n { \"mcpServers\": { \"datacore\": { \"command\": \"npx\", \"args\": [\"@datacore-one/mcp\"] } } }\n\n # Run with HTTP transport on custom port\n DATACORE_HTTP_PORT=8080 npx @datacore-one/mcp --http\n`)\n process.exit(0)\n}\n\nconst useHttp = args.includes('--http') || process.env.DATACORE_TRANSPORT === 'http'\n\nconst start = useHttp ? runHttp : runStdio\nstart().catch((error) => {\n console.error('Failed to start Datacore MCP server:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["isFirstRun","fs","path","args","storage","fs","z","args","fs","yaml","args","fs","path","args","start","fs","path","args","fs","path","fs","path","updateAvailable","result","fs","path","args","fs","path","yaml","os","args","fs","path","yaml","args","fs","path","yaml","storage","moduleTools","storage","args","storage","fs","path","args","storage","args","args","fs","path","storage","fs","path","execSync","args"]}
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/storage.ts","../package.json","../src/version.ts","../src/tools/index.ts","../src/tools/capture.ts","../src/limits.ts","../src/engrams.ts","../src/schemas/engram.ts","../src/logger.ts","../src/tools/learn.ts","../src/tools/inject-tool.ts","../src/decay.ts","../src/inject.ts","../src/tools/search.ts","../src/tools/ingest.ts","../src/tools/status.ts","../src/trust.ts","../registry/packs.json","../src/tools/discover.ts","../src/tools/install.ts","../src/tools/export.ts","../src/modules.ts","../src/tools/modules-list.ts","../src/tools/modules-info.ts","../src/tools/modules-health.ts","../src/tools/forget.ts","../src/tools/feedback.ts","../src/resources.ts","../src/datacortex.ts","../src/index.ts"],"sourcesContent":["// src/server.ts\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport {\n ListToolsRequestSchema,\n CallToolRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { zodToJsonSchema } from 'zod-to-json-schema'\nimport { detectStorage, initCore, type StorageConfig } from './storage.js'\nimport { currentVersion, checkForUpdate } from './version.js'\nimport { TOOLS } from './tools/index.js'\nimport { handleCapture } from './tools/capture.js'\nimport { handleLearn } from './tools/learn.js'\nimport { handleInject } from './tools/inject-tool.js'\nimport { handleSearch } from './tools/search.js'\nimport { handleIngest } from './tools/ingest.js'\nimport { handleStatus } from './tools/status.js'\nimport { handleDiscover } from './tools/discover.js'\nimport { handleInstall } from './tools/install.js'\nimport { handleExport } from './tools/export.js'\nimport {\n discoverModules,\n loadModuleTools,\n type DiscoveredModule,\n type RegisteredModuleTool,\n} from './modules.js'\nimport { handleModulesList } from './tools/modules-list.js'\nimport { handleModulesInfo } from './tools/modules-info.js'\nimport { handleModulesHealth } from './tools/modules-health.js'\nimport { handleForget } from './tools/forget.js'\nimport { handleFeedback } from './tools/feedback.js'\nimport { logger } from './logger.js'\nimport { registerResources, notifyEngramsChanged } from './resources.js'\nimport { DatacortexBridge } from './datacortex.js'\n\nlet storage: StorageConfig\nlet updateAvailable: string | null = null\nlet moduleTools: RegisteredModuleTool[] = []\nlet discoveredModules: DiscoveredModule[] = []\nlet isFirstRun = false\nlet serverRef: Server | null = null\nlet datacortexBridge: DatacortexBridge | null = null\n\n// --- Server creation ---\n\nexport function createServer(): Server {\n const server = new Server(\n { name: 'datacore-mcp', version: currentVersion },\n { capabilities: { tools: {}, logging: {}, resources: { subscribe: true } } },\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n ...TOOLS.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: zodToJsonSchema(t.inputSchema),\n })),\n ...moduleTools.map(t => ({\n name: t.fullName,\n description: t.definition.description,\n inputSchema: zodToJsonSchema(t.definition.inputSchema),\n })),\n ],\n }))\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params\n try {\n const result = await routeTool(name, args ?? {})\n const response: { type: string; text: string }[] = []\n if (isFirstRun) {\n isFirstRun = false\n response.push({ type: 'text', text: JSON.stringify({\n _welcome: `Welcome to Datacore MCP! Your data is stored at ${storage.basePath}. Try: datacore.learn to create your first engram, datacore.capture to write a journal entry, or datacore.status to see system info.`,\n }) })\n }\n response.push({ type: 'text', text: JSON.stringify(result, null, 2) })\n return { content: response }\n } catch (error) {\n return { content: [{ type: 'text', text: `Error: ${error}` }], isError: true }\n }\n })\n\n logger.setServer(server)\n registerResources(server, storage)\n serverRef = server\n return server\n}\n\n// --- Tool routing ---\n\nconst ENGRAM_MUTATING_TOOLS = new Set(['datacore.learn', 'datacore.forget', 'datacore.feedback'])\n\nasync function routeTool(name: string, args: Record<string, unknown>): Promise<unknown> {\n const coreTool = TOOLS.find(t => t.name === name)\n if (coreTool) {\n const validated = coreTool.inputSchema.parse(args)\n let result: unknown\n switch (name) {\n case 'datacore.capture': result = await handleCapture(validated, storage); break\n case 'datacore.learn': result = await handleLearn(validated, storage.engramsPath); break\n case 'datacore.inject': result = await handleInject(validated, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.search': result = await handleSearch(validated, { journalPath: storage.journalPath, knowledgePath: storage.knowledgePath }, datacortexBridge); break\n case 'datacore.ingest': result = await handleIngest(validated, { knowledgePath: storage.knowledgePath, engramsPath: storage.engramsPath }); break\n case 'datacore.status': result = await handleStatus({ ...storage, engramsPath: storage.engramsPath, packsPath: storage.packsPath }, updateAvailable); break\n case 'datacore.forget': result = await handleForget(validated, storage.engramsPath); break\n case 'datacore.feedback': result = await handleFeedback(validated as { engram_id: string; signal: 'positive' | 'negative' | 'neutral'; comment?: string }, storage.engramsPath); break\n case 'datacore.packs.discover': result = handleDiscover(validated, storage.packsPath); break\n case 'datacore.packs.install': result = await handleInstall(validated, storage.packsPath); break\n case 'datacore.packs.export': result = await handleExport(validated as any, { engramsPath: storage.engramsPath, packsPath: storage.packsPath }); break\n case 'datacore.modules.list': result = await handleModulesList(validated, storage, discoveredModules); break\n case 'datacore.modules.info': result = await handleModulesInfo(validated as { module: string }, storage, discoveredModules); break\n case 'datacore.modules.health': result = await handleModulesHealth(validated as { module?: string }, storage, discoveredModules); break\n default: throw new Error(`Unknown core tool: ${name}`)\n }\n if (ENGRAM_MUTATING_TOOLS.has(name) && serverRef) {\n notifyEngramsChanged(serverRef)\n }\n return result\n }\n\n const modTool = moduleTools.find(t => t.fullName === name)\n if (modTool) {\n const validated = modTool.definition.inputSchema.parse(args)\n return modTool.definition.handler(validated, modTool.context)\n }\n\n const allNames = [...TOOLS.map(t => t.name), ...moduleTools.map(t => t.fullName)]\n const suggestions = findClosestTools(name, allNames)\n const hint = suggestions.length > 0\n ? ` Did you mean: ${suggestions.join(', ')}?`\n : ''\n throw new Error(`Unknown tool: ${name}.${hint}`)\n}\n\n// --- Tool name suggestion ---\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length, n = b.length\n const dp: number[] = Array.from({ length: n + 1 }, (_, i) => i)\n for (let i = 1; i <= m; i++) {\n let prev = dp[0]\n dp[0] = i\n for (let j = 1; j <= n; j++) {\n const tmp = dp[j]\n dp[j] = a[i - 1] === b[j - 1] ? prev : 1 + Math.min(prev, dp[j], dp[j - 1])\n prev = tmp\n }\n }\n return dp[n]\n}\n\nexport function findClosestTools(name: string, allNames: string[]): string[] {\n const threshold = Math.max(3, Math.floor(name.length * 0.35))\n const scored = allNames\n .map(t => ({ name: t, dist: levenshtein(name.toLowerCase(), t.toLowerCase()) }))\n .filter(s => s.dist <= threshold)\n .sort((a, b) => a.dist - b.dist)\n return scored.slice(0, 2).map(s => s.name)\n}\n\n// --- Shared initialization ---\n\nasync function initStorage(): Promise<void> {\n storage = detectStorage()\n if (storage.mode === 'core') {\n const result = initCore(storage.basePath)\n isFirstRun = result.isFirstRun\n }\n if (storage.mode === 'full') {\n discoveredModules = discoverModules(storage)\n moduleTools = await loadModuleTools(discoveredModules, storage)\n datacortexBridge = new DatacortexBridge(storage.basePath)\n }\n}\n\n// --- Transport entry points ---\n\nexport async function runStdio(): Promise<void> {\n await initStorage()\n\n checkForUpdate().then(v => { updateAvailable = v })\n // Check daily — MCP servers can run for months\n const updateInterval = setInterval(() => {\n checkForUpdate().then(v => { updateAvailable = v })\n }, 24 * 3600_000)\n updateInterval.unref()\n\n const server = createServer()\n const transport = new StdioServerTransport()\n await server.connect(transport)\n\n server.onclose = () => {\n clearInterval(updateInterval)\n }\n}\n\nexport async function runHttp(): Promise<void> {\n const { createServer: createHttpServer } = await import('http')\n const { StreamableHTTPServerTransport } = await import('@modelcontextprotocol/sdk/server/streamableHttp.js')\n\n await initStorage()\n checkForUpdate().then(v => { updateAvailable = v })\n\n const port = parseInt(process.env.DATACORE_HTTP_PORT ?? '3100', 10)\n const host = process.env.DATACORE_HTTP_HOST ?? '127.0.0.1'\n const server = createServer()\n\n const httpServer = createHttpServer(async (req, res) => {\n if (req.method === 'POST' && req.url === '/mcp') {\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined })\n await server.connect(transport)\n await transport.handleRequest(req, res)\n } else if (req.method === 'GET' && req.url === '/health') {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ status: 'ok', version: currentVersion }))\n } else {\n res.writeHead(404)\n res.end('Not Found')\n }\n })\n\n httpServer.listen(port, host, () => {\n console.log(`Datacore MCP server listening on http://${host}:${port}/mcp`)\n })\n}\n\n// Export for testing\nexport { moduleTools as _moduleTools }\n","// src/storage.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as os from 'os'\n\nexport type StorageMode = 'full' | 'core'\n\nexport interface StorageConfig {\n mode: StorageMode\n basePath: string\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n}\n\nexport function detectStorage(): StorageConfig {\n // 1. Explicit DATACORE_PATH (full installation)\n const dcPath = process.env.DATACORE_PATH\n if (dcPath && fs.existsSync(path.join(dcPath, '.datacore'))) {\n return fullConfig(dcPath)\n }\n\n // 2. Explicit core path (env var overrides auto-detection)\n const corePath = process.env.DATACORE_CORE_PATH\n if (corePath && fs.existsSync(corePath)) {\n return coreConfig(corePath)\n }\n\n // 3. Default full installation at ~/Data\n const defaultFull = path.join(os.homedir(), 'Data')\n if (fs.existsSync(path.join(defaultFull, '.datacore'))) {\n return fullConfig(defaultFull)\n }\n\n // 4. Default core mode at ~/Datacore\n return coreConfig(path.join(os.homedir(), 'Datacore'))\n}\n\nfunction fullConfig(basePath: string): StorageConfig {\n return {\n mode: 'full',\n basePath,\n engramsPath: path.join(basePath, '.datacore', 'learning', 'engrams.yaml'),\n journalPath: path.join(basePath, '0-personal', 'journal'),\n knowledgePath: path.join(basePath, '0-personal', '3-knowledge'),\n packsPath: path.join(basePath, '.datacore', 'learning', 'packs'),\n }\n}\n\nfunction coreConfig(basePath: string): StorageConfig {\n return {\n mode: 'core',\n basePath,\n engramsPath: path.join(basePath, 'engrams.yaml'),\n journalPath: path.join(basePath, 'journal'),\n knowledgePath: path.join(basePath, 'knowledge'),\n packsPath: path.join(basePath, 'packs'),\n }\n}\n\nexport function initCore(basePath: string): { isFirstRun: boolean } {\n const isFirstRun = !fs.existsSync(path.join(basePath, 'engrams.yaml'))\n for (const dir of ['journal', 'knowledge', 'packs']) {\n const dirPath = path.join(basePath, dir)\n if (!fs.existsSync(dirPath)) {\n fs.mkdirSync(dirPath, { recursive: true })\n }\n }\n\n const engramsPath = path.join(basePath, 'engrams.yaml')\n if (!fs.existsSync(engramsPath)) {\n fs.writeFileSync(engramsPath, 'engrams: []\\n')\n }\n\n const configPath = path.join(basePath, 'config.yaml')\n if (!fs.existsSync(configPath)) {\n fs.writeFileSync(configPath, '# Datacore MCP configuration\\nversion: 1\\n')\n }\n\n copyStarterPacks(basePath)\n return { isFirstRun }\n}\n\nfunction copyStarterPacks(basePath: string): void {\n const packsDir = path.join(basePath, 'packs')\n const bundledPacksDir = path.join(\n path.dirname(new URL(import.meta.url).pathname),\n '..', 'packs'\n )\n\n if (!fs.existsSync(bundledPacksDir)) return\n\n for (const entry of fs.readdirSync(bundledPacksDir)) {\n const src = path.join(bundledPacksDir, entry)\n const dest = path.join(packsDir, entry)\n if (!fs.existsSync(dest) && fs.statSync(src).isDirectory()) {\n fs.cpSync(src, dest, { recursive: true })\n }\n }\n}\n","{\n \"name\": \"@datacore-one/mcp\",\n \"version\": \"1.0.2\",\n \"description\": \"Datacore MCP server — The Software of You\",\n \"type\": \"module\",\n \"bin\": {\n \"datacore-mcp\": \"dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"start\": \"node dist/index.js\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.0.0\",\n \"js-yaml\": \"^4.1.0\",\n \"zod\": \"^3.23.0\",\n \"zod-to-json-schema\": \"^3.25.1\"\n },\n \"devDependencies\": {\n \"@types/js-yaml\": \"^4.0.9\",\n \"@types/node\": \"^22.0.0\",\n \"tsup\": \"^8.0.0\",\n \"typescript\": \"^5.5.0\",\n \"vitest\": \"^2.0.0\"\n },\n \"files\": [\n \"dist\",\n \"packs\"\n ],\n \"keywords\": [\n \"mcp\",\n \"datacore\",\n \"knowledge\",\n \"learning\",\n \"engrams\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Fair Data Society\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/datacore-one/mcp.git\"\n },\n \"engines\": {\n \"node\": \">=22\"\n }\n}\n","// src/version.ts\nimport pkg from '../package.json'\n\nexport const currentVersion: string = pkg.version\n\nexport async function checkForUpdate(): Promise<string | null> {\n try {\n const res = await fetch('https://registry.npmjs.org/@datacore-one/mcp/latest', {\n signal: AbortSignal.timeout(3000),\n })\n if (!res.ok) return null\n const data = await res.json() as { version: string }\n if (data.version !== currentVersion) return data.version\n return null\n } catch {\n return null\n }\n}\n","// src/tools/index.ts\nimport { z } from 'zod'\n\nexport const TOOLS = [\n {\n name: 'datacore.capture',\n description: 'Capture a journal entry or knowledge note',\n inputSchema: z.object({\n type: z.enum(['journal', 'knowledge']),\n content: z.string().describe('Content to capture'),\n title: z.string().optional().describe('Title for knowledge notes'),\n tags: z.array(z.string()).optional().describe('Tags to attach'),\n }),\n },\n {\n name: 'datacore.learn',\n description: 'Create an engram from a statement — record a reusable learning',\n inputSchema: z.object({\n statement: z.string().describe('The knowledge assertion'),\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']).optional(),\n scope: z.string().optional().describe('Scope: global | agent:X | command:X'),\n tags: z.array(z.string()).optional(),\n domain: z.string().optional().describe('Dot-notation domain: software.architecture'),\n visibility: z.enum(['private', 'public', 'template']).optional(),\n }),\n },\n {\n name: 'datacore.inject',\n description: 'Get relevant engrams for a task — returns directives and considerations',\n inputSchema: z.object({\n prompt: z.string().describe('The task or question to match against'),\n scope: z.string().optional().describe('Filter by scope: global | agent:X | module:X | command:X'),\n max_tokens: z.number().optional().describe('Token budget (default: 8000)'),\n min_relevance: z.number().optional().describe('Minimum score threshold (default: 0.3)'),\n }),\n },\n {\n name: 'datacore.search',\n description: 'Search journal entries and knowledge notes by keyword',\n inputSchema: z.object({\n query: z.string().describe('Search query'),\n scope: z.enum(['journal', 'knowledge', 'all']).optional(),\n method: z.enum(['keyword', 'semantic']).optional().describe('Search method (default: keyword)'),\n limit: z.number().optional().describe('Max results (default: 20)'),\n }),\n },\n {\n name: 'datacore.ingest',\n description: 'Ingest text content as a knowledge note, optionally extract engram suggestions',\n inputSchema: z.object({\n content: z.string().describe('Content to ingest'),\n title: z.string().optional(),\n tags: z.array(z.string()).optional(),\n }),\n },\n {\n name: 'datacore.status',\n description: 'Show Datacore status: engram/pack/note counts, scaling hints, update info',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.packs.discover',\n description: 'Browse available engram packs from the registry',\n inputSchema: z.object({\n query: z.string().optional().describe('Filter by name/description'),\n tags: z.array(z.string()).optional().describe('Filter by tags'),\n }),\n },\n {\n name: 'datacore.packs.install',\n description: 'Install or upgrade an engram pack',\n inputSchema: z.object({\n source: z.string().describe('Pack source: local path or pack ID from registry'),\n }),\n },\n {\n name: 'datacore.forget',\n description: 'Retire an engram by ID or search term — marks it as retired so it is no longer injected',\n inputSchema: z.object({\n id: z.string().optional().describe('Exact engram ID to retire (e.g., ENG-2026-0219-001)'),\n search: z.string().optional().describe('Search term to find engram by statement, tag, or ID fragment'),\n }),\n },\n {\n name: 'datacore.feedback',\n description: 'Signal whether an injected engram was helpful (positive), unhelpful (negative), or seen but not acted on (neutral)',\n inputSchema: z.object({\n engram_id: z.string().describe('The engram ID to provide feedback on'),\n signal: z.enum(['positive', 'negative', 'neutral']).describe('Feedback signal'),\n comment: z.string().optional().describe('Optional comment about why'),\n }),\n },\n {\n name: 'datacore.packs.export',\n description: 'Export personal engrams as a shareable pack. Preview by default, set confirm=true to write.',\n inputSchema: z.object({\n name: z.string().describe('Pack name'),\n description: z.string().describe('Pack description'),\n engram_ids: z.array(z.string()).optional().describe('Specific engram IDs to export'),\n filter_tags: z.array(z.string()).optional().describe('Filter by tags'),\n filter_domain: z.string().optional().describe('Filter by domain prefix'),\n confirm: z.boolean().optional().describe('Set true to write pack (default: preview only)'),\n }),\n },\n {\n name: 'datacore.modules.list',\n description: 'List installed modules with scope, version, and capability counts',\n inputSchema: z.object({}),\n },\n {\n name: 'datacore.modules.info',\n description: 'Get detailed info about a specific module: manifest, tools, skills, agents, engrams',\n inputSchema: z.object({\n module: z.string().describe('Module name (e.g., \"gtd\", \"slides\", \"crm\")'),\n }),\n },\n {\n name: 'datacore.modules.health',\n description: 'Check module health: missing files, env vars, data separation issues',\n inputSchema: z.object({\n module: z.string().optional().describe('Module name (omit for all modules)'),\n }),\n },\n] as const\n","// src/tools/capture.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { StorageConfig } from '../storage.js'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface CaptureArgs {\n type: 'journal' | 'knowledge'\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface CaptureResult {\n success: boolean\n path?: string\n error?: string\n}\n\nexport async function handleCapture(args: CaptureArgs, storage: StorageConfig): Promise<CaptureResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n if (args.type === 'journal') {\n return captureJournal(args.content, storage.journalPath)\n }\n return captureKnowledge(args.content, args.title, args.tags, storage.knowledgePath)\n}\n\nexport function localDate(tz?: string): { date: string; time: string } {\n const timezone = tz || process.env.DATACORE_TIMEZONE || undefined\n const now = new Date()\n const dateStr = now.toLocaleDateString('en-CA', { timeZone: timezone }) // en-CA gives YYYY-MM-DD\n const timeStr = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit', hour12: false, timeZone: timezone })\n return { date: dateStr, time: timeStr }\n}\n\nfunction captureJournal(content: string, journalDir: string): CaptureResult {\n const { date: today, time } = localDate()\n const filePath = path.join(journalDir, `${today}.md`)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n if (fs.existsSync(filePath)) {\n const existing = fs.readFileSync(filePath, 'utf8')\n fs.writeFileSync(filePath, `${existing}\\n## ${time}\\n\\n${content}\\n`)\n } else {\n fs.writeFileSync(filePath, `# ${today}\\n\\n## ${time}\\n\\n${content}\\n`)\n }\n\n return { success: true, path: filePath }\n}\n\nfunction captureKnowledge(content: string, title: string | undefined, tags: string[] | undefined, knowledgeDir: string): CaptureResult {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (title ?? 'note').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(knowledgeDir, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${title ?? 'Untitled'}\"\\ncreated: \"${new Date().toISOString()}\"\\n---\\n\\n`\n const tagLine = tags?.length ? `\\n${tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${content}\\n${tagLine}`)\n\n return { success: true, path: filePath }\n}\n","// src/limits.ts\nexport const MAX_CONTENT_SIZE = 1_000_000 // 1MB\nexport const MAX_TITLE_LENGTH = 200\n\nexport function validateContent(content: string): string | null {\n if (content.length > MAX_CONTENT_SIZE) {\n return `Content too large: ${content.length} characters (max: ${MAX_CONTENT_SIZE})`\n }\n return null\n}\n\nexport function validateTitle(title: string): string | null {\n if (title.length > MAX_TITLE_LENGTH) {\n return `Title too long: ${title.length} characters (max: ${MAX_TITLE_LENGTH})`\n }\n return null\n}\n","// src/engrams.ts\nimport * as fs from 'fs'\nimport * as yaml from 'js-yaml'\nimport { EngramSchema, PackManifestSchema, type Engram, type PackManifest } from './schemas/engram.js'\nimport { logger } from './logger.js'\n\nexport function loadEngrams(filePath: string): Engram[] {\n if (!fs.existsSync(filePath)) return []\n\n try {\n const raw = yaml.load(fs.readFileSync(filePath, 'utf8')) as any\n if (!raw?.engrams || !Array.isArray(raw.engrams)) return []\n\n const valid: Engram[] = []\n let skipped = 0\n for (const entry of raw.engrams) {\n const result = EngramSchema.safeParse(entry)\n if (result.success) {\n valid.push(result.data)\n } else {\n skipped++\n }\n }\n if (skipped > 0) {\n logger.warning(`Skipped ${skipped} invalid engram(s) in ${filePath}`)\n }\n return valid\n } catch (err) {\n logger.error(`Failed to parse engrams file ${filePath}: ${err}`)\n return []\n }\n}\n\nexport function saveEngrams(filePath: string, engrams: Engram[]): void {\n const content = yaml.dump({ engrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n fs.writeFileSync(filePath, content)\n}\n\nexport interface LoadedPack {\n manifest: PackManifest\n engrams: Engram[]\n}\n\nfunction parseSkillMdFrontmatter(filePath: string): Record<string, any> {\n const content = fs.readFileSync(filePath, 'utf8')\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!match) throw new Error(`No frontmatter found in ${filePath}`)\n try {\n return yaml.load(match[1]) as Record<string, any>\n } catch (err) {\n throw new Error(`Failed to parse YAML frontmatter in ${filePath}: ${err}`)\n }\n}\n\nexport function loadPack(packDir: string): LoadedPack {\n const skillMdPath = `${packDir}/SKILL.md`\n const engramsPath = `${packDir}/engrams.yaml`\n\n const rawManifest = parseSkillMdFrontmatter(skillMdPath)\n const manifest = PackManifestSchema.parse(rawManifest)\n const engrams = loadEngrams(engramsPath)\n\n return { manifest, engrams }\n}\n\nexport function loadAllPacks(packsDir: string): LoadedPack[] {\n if (!fs.existsSync(packsDir)) return []\n\n const packs: LoadedPack[] = []\n for (const entry of fs.readdirSync(packsDir)) {\n const packDir = `${packsDir}/${entry}`\n if (!fs.statSync(packDir).isDirectory()) continue\n if (!fs.existsSync(`${packDir}/SKILL.md`)) continue\n\n try {\n packs.push(loadPack(packDir))\n } catch (err) {\n logger.warning(`Failed to load pack ${entry}: ${err}`)\n }\n }\n return packs\n}\n","// src/schemas/engram.ts\nimport { z } from 'zod'\n\nexport const ActivationSchema = z.object({\n retrieval_strength: z.number().min(0).max(1),\n storage_strength: z.number().min(0).max(1),\n frequency: z.number().int().min(0),\n last_accessed: z.string(),\n})\n\nexport const KnowledgeTypeSchema = z.object({\n memory_class: z.enum(['semantic', 'episodic', 'procedural', 'metacognitive']),\n cognitive_level: z.enum(['remember', 'understand', 'apply', 'analyze', 'evaluate', 'create']),\n})\n\nexport const RelationsSchema = z.object({\n broader: z.array(z.string()).default([]),\n narrower: z.array(z.string()).default([]),\n related: z.array(z.string()).default([]),\n conflicts: z.array(z.string()).default([]),\n})\n\nexport const ProvenanceSchema = z.object({\n origin: z.string(),\n chain: z.array(z.string()).default([]),\n signature: z.string().nullable().default(null),\n license: z.string().default('cc-by-sa-4.0'),\n})\n\nexport const FeedbackSignalsSchema = z.object({\n positive: z.number().int().default(0),\n negative: z.number().int().default(0),\n neutral: z.number().int().default(0),\n})\n\nexport const EngramSchema = z.object({\n id: z.string().regex(/^ENG-[A-Za-z0-9-]+$/),\n version: z.number().int().min(1),\n status: z.enum(['active', 'dormant', 'retired', 'candidate']),\n consolidated: z.boolean().default(false),\n\n type: z.enum(['behavioral', 'terminological', 'procedural', 'architectural']),\n scope: z.string(),\n visibility: z.enum(['private', 'public', 'template']).default('private'),\n statement: z.string().min(1),\n rationale: z.string().optional(),\n contraindications: z.array(z.string()).optional(),\n source_patterns: z.array(z.string()).optional(),\n derivation_count: z.number().int().min(0).default(1),\n\n knowledge_type: KnowledgeTypeSchema.optional(),\n domain: z.string().optional(),\n relations: RelationsSchema.optional(),\n activation: ActivationSchema,\n provenance: ProvenanceSchema.optional(),\n feedback_signals: FeedbackSignalsSchema.optional(),\n tags: z.array(z.string()).default([]),\n pack: z.string().nullable().default(null),\n abstract: z.string().nullable().default(null),\n derived_from: z.string().nullable().default(null),\n})\n\nexport type Engram = z.infer<typeof EngramSchema>\n\n// Pack manifest matches SKILL.md frontmatter structure\nexport const DatacoreExtensionSchema = z.object({\n id: z.string(),\n injection_policy: z.enum(['on_match', 'on_request']),\n match_terms: z.array(z.string()).default([]),\n domain: z.string().optional(),\n engram_count: z.number().int().min(0),\n})\n\nexport const PackManifestSchema = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n creator: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).default([]),\n 'x-datacore': DatacoreExtensionSchema,\n})\n\nexport type PackManifest = z.infer<typeof PackManifestSchema>\n","// src/logger.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\n\nexport type LogLevel = 'debug' | 'info' | 'warning' | 'error'\n\nconst LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warning: 2,\n error: 3,\n}\n\nconst MAX_MESSAGE_LENGTH = 4096\n\nclass Logger {\n private server: Server | null = null\n private minLevel: LogLevel\n\n constructor() {\n const envLevel = process.env.DATACORE_LOG_LEVEL?.toLowerCase()\n this.minLevel = envLevel && envLevel in LEVEL_ORDER\n ? envLevel as LogLevel\n : 'warning'\n }\n\n setServer(server: Server): void {\n this.server = server\n }\n\n private shouldLog(level: LogLevel): boolean {\n return LEVEL_ORDER[level] >= LEVEL_ORDER[this.minLevel]\n }\n\n private truncate(msg: string): string {\n if (msg.length <= MAX_MESSAGE_LENGTH) return msg\n return msg.slice(0, MAX_MESSAGE_LENGTH - 3) + '...'\n }\n\n private emit(level: LogLevel, message: string): void {\n if (!this.shouldLog(level)) return\n const truncated = this.truncate(message)\n\n // Always write to stderr for debug traces\n process.stderr.write(`[datacore:${level}] ${truncated}\\n`)\n\n // Send MCP notification for warning+ if server connected\n if (this.server && LEVEL_ORDER[level] >= LEVEL_ORDER['warning']) {\n try {\n this.server.sendLoggingMessage({ level, data: truncated })\n } catch {\n // Server not connected or notification failed — ignore\n }\n }\n }\n\n debug(message: string): void { this.emit('debug', message) }\n info(message: string): void { this.emit('info', message) }\n warning(message: string): void { this.emit('warning', message) }\n error(message: string): void { this.emit('error', message) }\n}\n\nexport const logger = new Logger()\n","// src/tools/learn.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface LearnArgs {\n statement: string\n type?: 'behavioral' | 'terminological' | 'procedural' | 'architectural'\n scope?: string\n tags?: string[]\n domain?: string\n rationale?: string\n visibility?: 'private' | 'public' | 'template'\n}\n\ninterface LearnResult {\n success: boolean\n engram: Engram\n}\n\nexport function generateEngramId(existingEngrams: Engram[]): string {\n const now = new Date()\n const date = now.toISOString().split('T')[0].replace(/-/g, '').slice(0, 8)\n const prefix = `ENG-${date.slice(0, 4)}-${date.slice(4)}-`\n\n // Find highest seq for today\n let maxSeq = 0\n for (const e of existingEngrams) {\n if (e.id.startsWith(prefix)) {\n const seq = parseInt(e.id.slice(prefix.length), 10)\n if (seq > maxSeq) maxSeq = seq\n }\n }\n\n const nextSeq = maxSeq + 1\n const padWidth = nextSeq > 999 ? String(nextSeq).length : 3\n return `${prefix}${String(nextSeq).padStart(padWidth, '0')}`\n}\n\nexport async function handleLearn(args: LearnArgs, engramsPath: string): Promise<LearnResult> {\n const engrams = loadEngrams(engramsPath)\n const today = new Date().toISOString().split('T')[0]\n\n const engram: Engram = {\n id: generateEngramId(engrams),\n version: 2,\n status: 'candidate',\n consolidated: false,\n type: args.type ?? 'behavioral',\n scope: args.scope ?? 'global',\n visibility: args.visibility ?? 'private',\n statement: args.statement,\n rationale: args.rationale,\n derivation_count: 1,\n domain: args.domain,\n tags: args.tags ?? [],\n activation: {\n retrieval_strength: 0.5,\n storage_strength: 0.3,\n frequency: 0,\n last_accessed: today,\n },\n pack: null,\n abstract: null,\n derived_from: null,\n }\n\n engrams.push(engram)\n saveEngrams(engramsPath, engrams)\n return { success: true, engram }\n}\n","// src/tools/inject-tool.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams, loadAllPacks } from '../engrams.js'\nimport { selectEngrams, type InjectionContext } from '../inject.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface InjectArgs {\n prompt: string\n scope?: string\n max_tokens?: number\n min_relevance?: number\n}\n\ninterface InjectResult {\n text: string\n count: number\n tokens_used: number\n}\n\nexport async function handleInject(\n args: InjectArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<InjectResult> {\n const personalEngrams = loadEngrams(paths.engramsPath)\n const packs = loadAllPacks(paths.packsPath)\n\n const ctx: InjectionContext = {\n prompt: args.prompt,\n scope: args.scope,\n maxTokens: args.max_tokens,\n minRelevance: args.min_relevance,\n }\n\n const result = selectEngrams(ctx, personalEngrams, packs)\n const totalCount = result.directives.length + result.consider.length\n\n if (totalCount === 0) {\n return { text: '', count: 0, tokens_used: 0 }\n }\n\n const lines: string[] = []\n if (result.directives.length > 0) {\n lines.push('## DIRECTIVES\\n')\n for (const e of result.directives) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n if (result.consider.length > 0) {\n lines.push('\\n## ALSO CONSIDER\\n')\n for (const e of result.consider) {\n lines.push(formatEngram(e, totalCount))\n }\n }\n\n // Update usage tracking for selected personal engrams\n updateUsageTracking(\n paths.engramsPath,\n personalEngrams,\n [...result.directives, ...result.consider],\n )\n\n return { text: lines.join('\\n'), count: totalCount, tokens_used: result.tokens_used }\n}\n\nfunction updateUsageTracking(\n engramsPath: string,\n allPersonal: Engram[],\n selected: Engram[],\n): void {\n const selectedPersonalIds = new Set(\n selected.filter(e => !e.pack).map(e => e.id),\n )\n if (selectedPersonalIds.size === 0) return\n\n const today = new Date().toISOString().split('T')[0]\n let changed = false\n\n for (const engram of allPersonal) {\n if (selectedPersonalIds.has(engram.id)) {\n engram.activation.last_accessed = today\n engram.activation.frequency += 1\n changed = true\n }\n }\n\n if (changed) {\n atomicWriteYaml(engramsPath, { engrams: allPersonal })\n }\n}\n\nexport function atomicWriteYaml(filePath: string, data: unknown): void {\n const content = yaml.dump(data, { lineWidth: 120, noRefs: true, quotingType: '\"' })\n const tmpPath = filePath + '.tmp.' + process.pid\n fs.writeFileSync(tmpPath, content)\n fs.renameSync(tmpPath, filePath)\n}\n\nfunction formatEngram(engram: Engram, totalCount: number): string {\n if (totalCount < 10) {\n let text = `- **${engram.statement}**`\n if (engram.rationale) text += `\\n _${engram.rationale}_`\n if (engram.contraindications?.length) {\n text += `\\n Except: ${engram.contraindications.join(', ')}`\n }\n return text\n }\n if (totalCount < 30) {\n const source = engram.pack ? ` [${engram.pack}]` : ''\n return `- ${engram.statement}${source}`\n }\n return `- ${engram.statement}`\n}\n","// src/decay.ts\n\nconst DECAY_RATE = 0.05\nconst FLOOR = 0.05\nconst MS_PER_DAY = 86_400_000\n\nexport type EngramState = 'active' | 'fading' | 'dormant' | 'retirement_candidate'\n\n/**\n * Compute decayed retrieval strength using exponential decay.\n * Floor of 0.05 prevents permanent extinction.\n */\nexport function decayedStrength(\n retrievalStrength: number,\n lastAccessed: string,\n now?: Date,\n): number {\n const last = new Date(lastAccessed)\n const current = now ?? new Date()\n const days = Math.max(0, (current.getTime() - last.getTime()) / MS_PER_DAY)\n return Math.max(retrievalStrength * Math.exp(-DECAY_RATE * days), FLOOR)\n}\n\n/**\n * Classify engram state based on current retrieval strength.\n */\nexport function engramState(retrievalStrength: number): EngramState {\n if (retrievalStrength >= 0.5) return 'active'\n if (retrievalStrength >= 0.3) return 'fading'\n if (retrievalStrength >= 0.1) return 'dormant'\n return 'retirement_candidate'\n}\n","// src/inject.ts\nimport type { Engram } from './schemas/engram.js'\nimport type { LoadedPack } from './engrams.js'\nimport { decayedStrength } from './decay.js'\n\nexport interface InjectionContext {\n prompt: string\n scope?: string\n maxTokens?: number // Default: 8000 (~10% of 80K context)\n minRelevance?: number // Default: 0.3\n}\n\nexport interface InjectionResult {\n directives: Engram[]\n consider: Engram[]\n tokens_used: number\n}\n\ninterface ScoredEngram {\n engram: Engram\n score: number\n}\n\nconst DEFAULT_MAX_TOKENS = 8000\nconst DEFAULT_MIN_RELEVANCE = 0.3\nconst TOKENS_PER_ENGRAM = 40 // Compact format estimate\nconst MAX_PER_PACK = 5\nconst MAX_PER_DOMAIN = 10\n\nexport function selectEngrams(\n ctx: InjectionContext,\n personalEngrams: Engram[],\n packs: LoadedPack[],\n): InjectionResult {\n const promptLower = ctx.prompt.toLowerCase()\n const promptWords = new Set(promptLower.split(/\\W+/).filter(w => w.length > 2))\n const scored: ScoredEngram[] = []\n\n for (const engram of personalEngrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, [], ctx.scope, false)\n if (score > 0) scored.push({ engram, score })\n }\n\n for (const pack of packs) {\n if (pack.manifest['x-datacore'].injection_policy === 'on_request') continue\n const matchTerms = pack.manifest['x-datacore'].match_terms\n for (const engram of pack.engrams) {\n if (engram.status !== 'active') continue\n const score = scoreEngram(engram, promptLower, promptWords, matchTerms, ctx.scope, true)\n if (score > 0) scored.push({ engram, score })\n }\n }\n\n const maxTokens = ctx.maxTokens ?? DEFAULT_MAX_TOKENS\n const minRelevance = ctx.minRelevance ?? DEFAULT_MIN_RELEVANCE\n\n // Filter by minimum relevance\n const passing = scored.filter(s => s.score >= minRelevance)\n passing.sort((a, b) => b.score - a.score)\n\n // Fill token budget with diversity constraints\n const selected = fillTokenBudget(passing, maxTokens)\n\n // Split: top 2/3 = directives, bottom 1/3 = consider\n const splitPoint = Math.ceil(selected.length * 2 / 3)\n return {\n directives: selected.slice(0, splitPoint),\n consider: selected.slice(splitPoint),\n tokens_used: selected.length * TOKENS_PER_ENGRAM,\n }\n}\n\nfunction scoreEngram(engram: Engram, promptLower: string, promptWords: Set<string>, packMatchTerms: string[], scopeFilter: string | undefined, isPack: boolean): number {\n // Scope filtering: if scope is specified, only include matching engrams\n if (scopeFilter) {\n if (scopeFilter === 'global') {\n if (engram.scope !== 'global') return 0\n } else if (!engram.scope.startsWith(scopeFilter) && engram.scope !== 'global') {\n return 0\n }\n }\n\n let termHits = 0\n\n // Pack match terms (highest weight — curated relevance signals)\n for (const term of packMatchTerms) {\n if (promptLower.includes(term.toLowerCase())) termHits++\n }\n // Tag matches\n for (const tag of engram.tags) {\n if (promptWords.has(tag.toLowerCase())) termHits++\n }\n // Domain hierarchy matches (each level counts)\n if (engram.domain) {\n for (const part of engram.domain.split(/[./]/)) {\n if (promptWords.has(part.toLowerCase())) termHits++\n }\n }\n // Statement keyword overlap — word-boundary matching (lower weight)\n const statementWords = new Set(engram.statement.toLowerCase().split(/\\W+/).filter(w => w.length > 2))\n for (const word of promptWords) {\n if (statementWords.has(word)) termHits += 0.5\n }\n\n if (termHits === 0) return 0\n\n // Base score from term hits * (decayed) retrieval strength\n // Pack engrams use raw RS (read-only, can't track usage)\n const rs = isPack\n ? engram.activation.retrieval_strength\n : decayedStrength(engram.activation.retrieval_strength, engram.activation.last_accessed)\n let score = termHits * rs\n\n // Feedback signal boost: positive feedback increases score, negative decreases\n const feedback = engram.feedback_signals\n if (feedback) {\n const netFeedback = feedback.positive - feedback.negative\n if (netFeedback > 0) score *= 1 + Math.min(netFeedback * 0.05, 0.3)\n else if (netFeedback < 0) score *= Math.max(1 + netFeedback * 0.1, 0.5)\n }\n\n // Consolidated engrams get a slight boost (survived reconsolidation)\n if (engram.consolidated) score *= 1.1\n\n return score\n}\n\nfunction fillTokenBudget(scored: ScoredEngram[], maxTokens: number): Engram[] {\n const result: Engram[] = []\n const packCounts = new Map<string, number>()\n const domainCounts = new Map<string, number>()\n let tokensUsed = 0\n\n for (const { engram } of scored) {\n if (tokensUsed + TOKENS_PER_ENGRAM > maxTokens) break\n\n const pack = engram.pack ?? '__personal__'\n const packCount = packCounts.get(pack) ?? 0\n if (packCount >= MAX_PER_PACK && pack !== '__personal__') continue\n\n const domain = engram.domain ?? '__none__'\n const topDomain = domain.split('.')[0]\n const domainCount = domainCounts.get(topDomain) ?? 0\n if (domainCount >= MAX_PER_DOMAIN) continue\n\n result.push(engram)\n tokensUsed += TOKENS_PER_ENGRAM\n packCounts.set(pack, packCount + 1)\n domainCounts.set(topDomain, domainCount + 1)\n }\n return result\n}\n","// src/tools/search.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport type { DatacortexBridge } from '../datacortex.js'\n\nconst CONTENT_CACHE_MAX = 500\nconst contentCache = new Map<string, { mtime: number; content: string }>()\n\nfunction getCachedContent(filePath: string): string | null {\n const entry = contentCache.get(filePath)\n if (!entry) return null\n try {\n const stat = fs.statSync(filePath)\n if (stat.mtimeMs === entry.mtime) return entry.content\n } catch { /* file gone */ }\n contentCache.delete(filePath)\n return null\n}\n\nfunction setCachedContent(filePath: string, content: string): void {\n try {\n const mtime = fs.statSync(filePath).mtimeMs\n if (contentCache.size >= CONTENT_CACHE_MAX) {\n // Evict oldest entry\n const firstKey = contentCache.keys().next().value\n if (firstKey) contentCache.delete(firstKey)\n }\n contentCache.set(filePath, { mtime, content })\n } catch { /* ignore */ }\n}\n\ninterface SearchArgs {\n query: string\n scope?: 'journal' | 'knowledge' | 'all'\n method?: 'keyword' | 'semantic'\n limit?: number\n}\n\ninterface SearchResultItem {\n path: string\n snippet: string\n score: number\n}\n\ninterface SearchResponse {\n results: SearchResultItem[]\n method?: string\n fallback_warning?: string\n}\n\nexport async function handleSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n bridge?: DatacortexBridge | null,\n): Promise<SearchResponse> {\n // Semantic search via Datacortex bridge\n if (args.method === 'semantic' && bridge) {\n const availability = bridge.isAvailable()\n if (availability.available) {\n const result = await bridge.search(args.query, args.limit ?? 20)\n if (!result.fallback) {\n return { results: result.results, method: 'semantic' }\n }\n // Fall through to keyword search with warning\n }\n // Semantic unavailable — fall back with warning\n const keywordResults = await keywordSearch(args, paths)\n return { ...keywordResults, method: 'keyword', fallback_warning: 'Semantic search unavailable, using keyword fallback' }\n }\n\n return keywordSearch(args, paths)\n}\n\nasync function keywordSearch(\n args: SearchArgs,\n paths: { journalPath: string; knowledgePath: string },\n): Promise<SearchResponse> {\n const scope = args.scope ?? 'all'\n const limit = args.limit ?? 20\n const results: SearchResultItem[] = []\n\n if (scope === 'journal' || scope === 'all') {\n results.push(...searchDir(paths.journalPath, args.query))\n }\n if (scope === 'knowledge' || scope === 'all') {\n results.push(...searchDir(paths.knowledgePath, args.query))\n }\n\n results.sort((a, b) => b.score - a.score)\n return { results: results.slice(0, limit), method: 'keyword' }\n}\n\nfunction searchDir(dirPath: string, query: string): SearchResultItem[] {\n if (!fs.existsSync(dirPath)) return []\n const results: SearchResultItem[] = []\n const queryLower = query.toLowerCase()\n\n for (const file of walkDir(dirPath)) {\n if (!file.endsWith('.md')) continue\n const content = getCachedContent(file) ?? (() => {\n const c = fs.readFileSync(file, 'utf8')\n setCachedContent(file, c)\n return c\n })()\n const contentLower = content.toLowerCase()\n const occurrences = countOccurrences(contentLower, queryLower)\n if (occurrences === 0) continue\n\n const snippet = extractSnippet(content, query)\n results.push({ path: file, snippet, score: occurrences })\n }\n return results\n}\n\nfunction walkDir(dir: string): string[] {\n const files: string[] = []\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) files.push(...walkDir(fullPath))\n else files.push(fullPath)\n }\n return files\n}\n\nfunction countOccurrences(text: string, query: string): number {\n let count = 0\n let pos = 0\n while ((pos = text.indexOf(query, pos)) !== -1) {\n count++\n pos += query.length\n }\n return count\n}\n\nfunction extractSnippet(content: string, query: string): string {\n const idx = content.toLowerCase().indexOf(query.toLowerCase())\n if (idx === -1) return content.slice(0, 100)\n const start = Math.max(0, idx - 50)\n const end = Math.min(content.length, idx + query.length + 50)\n return (start > 0 ? '...' : '') + content.slice(start, end) + (end < content.length ? '...' : '')\n}\n","// src/tools/ingest.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { validateContent, validateTitle } from '../limits.js'\n\ninterface IngestArgs {\n content: string\n title?: string\n tags?: string[]\n}\n\ninterface IngestResult {\n success: boolean\n note_path?: string\n engram_suggestions?: string[]\n error?: string\n}\n\nexport async function handleIngest(\n args: IngestArgs,\n paths: { knowledgePath: string; engramsPath: string },\n): Promise<IngestResult> {\n const contentError = validateContent(args.content)\n if (contentError) return { success: false, error: contentError }\n if (args.title) {\n const titleError = validateTitle(args.title)\n if (titleError) return { success: false, error: titleError }\n }\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19)\n const slug = (args.title ?? 'ingested').toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const fileName = `${timestamp}-${slug}.md`\n const filePath = path.join(paths.knowledgePath, fileName)\n\n fs.mkdirSync(path.dirname(filePath), { recursive: true })\n\n const frontmatter = `---\\ntitle: \"${args.title ?? 'Ingested Note'}\"\\ncreated: \"${new Date().toISOString()}\"\\ntype: ingested\\n---\\n\\n`\n const tagLine = args.tags?.length ? `\\n${args.tags.map(t => `#${t}`).join(' ')}\\n` : ''\n fs.writeFileSync(filePath, `${frontmatter}${args.content}\\n${tagLine}`)\n\n const suggestions = extractEngramSuggestions(args.content)\n\n return {\n success: true,\n note_path: filePath,\n engram_suggestions: suggestions.length > 0 ? suggestions : undefined,\n }\n}\n\nexport function extractEngramSuggestions(content: string): string[] {\n // Require sentence-start context to reduce mid-sentence false positives\n const patterns = [\n /(?:^|[.!?]\\s+)(always\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(never\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(prefer\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(avoid\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n /(?:^|[.!?]\\s+)(ensure\\s+\\w[\\w\\s]*?)(?:\\.|$)/gim,\n ]\n\n const suggestions: string[] = []\n for (const pattern of patterns) {\n for (const match of content.matchAll(pattern)) {\n const suggestion = match[1].trim()\n if (suggestion.length >= 8 && suggestion.length <= 180) {\n suggestions.push(suggestion)\n }\n }\n }\n return suggestions\n}\n","// src/tools/status.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { loadEngrams } from '../engrams.js'\nimport { currentVersion } from '../version.js'\nimport { decayedStrength, engramState } from '../decay.js'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface StatusPaths {\n engramsPath: string\n journalPath: string\n knowledgePath: string\n packsPath: string\n mode: string\n basePath: string\n}\n\ninterface StatusResult {\n version: string\n mode: string\n engrams: number\n engram_health?: Record<string, number>\n packs: number\n pack_integrity?: { name: string; valid: boolean }[]\n journal_entries: number\n knowledge_notes: number\n scaling_hint?: string\n update_available?: string\n}\n\nexport async function handleStatus(\n paths: StatusPaths,\n updateAvailable?: string | null,\n): Promise<StatusResult> {\n const engrams = loadEngrams(paths.engramsPath)\n const journalCount = countFiles(paths.journalPath, '.md')\n const knowledgeCount = countFiles(paths.knowledgePath, '.md')\n const packsCount = countDirs(paths.packsPath)\n\n // Engram health summary by state\n const healthCounts: Record<string, number> = { active: 0, fading: 0, dormant: 0, retirement_candidate: 0 }\n for (const e of engrams) {\n if (e.status !== 'active') continue\n const rs = decayedStrength(e.activation.retrieval_strength, e.activation.last_accessed)\n const state = engramState(rs)\n healthCounts[state]++\n }\n\n // Pack integrity check\n const packIntegrity: { name: string; valid: boolean }[] = []\n for (const regPack of (registry.packs as Array<{ id: string; checksum?: string }>)) {\n if (!regPack.checksum) continue\n const packDir = path.join(paths.packsPath, regPack.id)\n if (!fs.existsSync(packDir)) continue\n const result = verifyPackChecksum(packDir, regPack.checksum)\n packIntegrity.push({ name: regPack.id, valid: result.valid })\n }\n\n const result: StatusResult = {\n version: currentVersion,\n mode: paths.mode,\n engrams: engrams.length,\n engram_health: healthCounts,\n packs: packsCount,\n pack_integrity: packIntegrity.length > 0 ? packIntegrity : undefined,\n journal_entries: journalCount,\n knowledge_notes: knowledgeCount,\n }\n\n if (engrams.length >= 500) {\n result.scaling_hint = `You have ${engrams.length} engrams. Consider migrating to full Datacore for SQLite-backed search.`\n }\n\n if (updateAvailable) {\n result.update_available = updateAvailable\n }\n\n return result\n}\n\nfunction countFiles(dir: string, ext: string): number {\n if (!fs.existsSync(dir)) return 0\n let count = 0\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name)\n if (entry.isDirectory()) count += countFiles(fullPath, ext)\n else if (entry.name.endsWith(ext)) count++\n }\n return count\n}\n\nfunction countDirs(dir: string): number {\n if (!fs.existsSync(dir)) return 0\n return fs.readdirSync(dir, { withFileTypes: true }).filter(d => d.isDirectory()).length\n}\n","// src/trust.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as crypto from 'crypto'\n\nexport function computePackChecksum(packDir: string): string | null {\n const files = ['SKILL.md', 'engrams.yaml']\n const hash = crypto.createHash('sha256')\n let hasContent = false\n\n for (const file of files) {\n const filePath = path.join(packDir, file)\n if (fs.existsSync(filePath)) {\n hash.update(fs.readFileSync(filePath))\n hasContent = true\n }\n }\n\n return hasContent ? hash.digest('hex') : null\n}\n\nexport function verifyPackChecksum(packDir: string, expected: string): { valid: boolean; actual: string | null } {\n const actual = computePackChecksum(packDir)\n return { valid: actual === expected, actual }\n}\n","{\n \"version\": 1,\n \"packs\": [\n {\n \"id\": \"datacore-starter-v1\",\n \"name\": \"Datacore Methodology\",\n \"description\": \"Core knowledge management principles — capture, journal, learn, compound\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"methodology\", \"gtd\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 5,\n \"free\": true,\n \"checksum\": \"4fb30b260c6ba5fd36e7cf9240f0a651ca484c777ab4a7be0b3438627138f1a3\"\n },\n {\n \"id\": \"fds-principles-v1\",\n \"name\": \"FDS Principles\",\n \"description\": \"Fair Data Society's 10 principles for ethical data handling\",\n \"version\": \"1.0.0\",\n \"author\": \"Fair Data Society\",\n \"tags\": [\"ethics\", \"data-sovereignty\", \"privacy\", \"consent\"],\n \"download_url\": \"\",\n \"engram_count\": 10,\n \"free\": true,\n \"checksum\": \"8cc7bbb7e259486b16370511fefe937532ee7dcba60ce87c2cd6b8647b5b9847\"\n },\n {\n \"id\": \"dips-v1\",\n \"name\": \"Datacore DIPs\",\n \"description\": \"Comprehensive knowledge from all 20 Datacore Improvement Proposals\",\n \"version\": \"1.0.0\",\n \"author\": \"Datacore\",\n \"tags\": [\"architecture\", \"patterns\", \"gtd\", \"modules\", \"knowledge-management\"],\n \"download_url\": \"\",\n \"engram_count\": 747,\n \"free\": true,\n \"checksum\": \"08185777c38e3a91fbb0f92e7ef388c5940e97e69be6dcce8ce119bd2b33968c\"\n }\n ]\n}\n","// src/tools/discover.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport registry from '../../registry/packs.json'\n\ninterface RegistryPack {\n id: string; name: string; description: string; version: string\n author: string; tags: string[]; download_url: string\n engram_count: number; free: boolean\n}\n\ninterface DiscoverPack extends RegistryPack {\n installed: boolean\n installed_version?: string\n upgradeable: boolean\n can_install: boolean\n}\n\ninterface DiscoverResult {\n packs: DiscoverPack[]\n}\n\nexport function handleDiscover(\n args: { query?: string; tags?: string[] },\n packsDir: string,\n): DiscoverResult {\n let packs: DiscoverPack[] = registry.packs.map((p: RegistryPack) => {\n const localDir = path.join(packsDir, p.id)\n const installed = fs.existsSync(path.join(localDir, 'SKILL.md'))\n let installedVersion: string | undefined\n if (installed) {\n try {\n const content = fs.readFileSync(path.join(localDir, 'SKILL.md'), 'utf8')\n const match = content.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n installedVersion = match?.[1]\n } catch {}\n }\n return {\n ...p,\n installed,\n installed_version: installedVersion,\n upgradeable: installed && installedVersion !== p.version,\n can_install: !!p.download_url,\n }\n })\n\n if (args.query) {\n const q = args.query.toLowerCase()\n packs = packs.filter(p =>\n p.name.toLowerCase().includes(q) ||\n p.description.toLowerCase().includes(q) ||\n p.tags.some(t => t.toLowerCase().includes(q))\n )\n }\n\n if (args.tags?.length) {\n const filterTags = new Set(args.tags.map(t => t.toLowerCase()))\n packs = packs.filter(p => p.tags.some(t => filterTags.has(t.toLowerCase())))\n }\n\n return { packs }\n}\n","// src/tools/install.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport * as os from 'os'\nimport { execSync } from 'child_process'\nimport { verifyPackChecksum } from '../trust.js'\nimport registry from '../../registry/packs.json'\n\ninterface InstallArgs {\n source: string\n}\n\ninterface InstallResult {\n success: boolean\n pack_id?: string\n upgraded?: boolean\n already_current?: boolean\n checksum_verified?: boolean\n error?: string\n}\n\nexport async function handleInstall(args: InstallArgs, packsDir: string): Promise<InstallResult> {\n let srcDir = args.source\n\n // Detect URL source — download to temp, extract, use as srcDir\n if (srcDir.startsWith('http://') || srcDir.startsWith('https://')) {\n const downloaded = await downloadPack(srcDir)\n if (downloaded.error) return { success: false, error: downloaded.error }\n srcDir = downloaded.path!\n }\n\n // Validate source has SKILL.md\n const skillPath = path.join(srcDir, 'SKILL.md')\n if (!fs.existsSync(skillPath)) {\n return { success: false, error: 'No SKILL.md found in source directory' }\n }\n\n // Parse SKILL.md frontmatter to get pack ID and version\n const skillContent = fs.readFileSync(skillPath, 'utf8')\n const frontmatterMatch = skillContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n if (!frontmatterMatch) {\n return { success: false, error: 'No YAML frontmatter in SKILL.md' }\n }\n\n const manifest = yaml.load(frontmatterMatch[1]) as Record<string, any>\n const packId = manifest?.['x-datacore']?.id\n const newVersion = manifest?.version\n\n if (!packId) {\n return { success: false, error: 'Missing x-datacore.id in SKILL.md frontmatter' }\n }\n\n const destDir = path.join(packsDir, packId)\n\n // Check if already installed\n if (fs.existsSync(path.join(destDir, 'SKILL.md'))) {\n const existingContent = fs.readFileSync(path.join(destDir, 'SKILL.md'), 'utf8')\n const existingMatch = existingContent.match(/version:\\s*[\"']?([^\"'\\n]+)/)\n const existingVersion = existingMatch?.[1]\n\n if (existingVersion === newVersion) {\n return { success: true, pack_id: packId, already_current: true }\n }\n\n // Upgrade: remove old, copy new\n fs.rmSync(destDir, { recursive: true, force: true })\n fs.cpSync(srcDir, destDir, { recursive: true })\n return { success: true, pack_id: packId, upgraded: true }\n }\n\n // Fresh install\n fs.cpSync(srcDir, destDir, { recursive: true })\n\n // Verify checksum if registry has one\n const checksumVerified = verifyInstalledChecksum(packId, destDir)\n return { success: true, pack_id: packId, checksum_verified: checksumVerified ?? undefined }\n}\n\nfunction verifyInstalledChecksum(packId: string, destDir: string): boolean | null {\n const registryPack = (registry.packs as Array<{ id: string; checksum?: string }>).find(p => p.id === packId)\n if (!registryPack?.checksum) return null\n const result = verifyPackChecksum(destDir, registryPack.checksum)\n return result.valid\n}\n\nasync function downloadPack(url: string): Promise<{ path?: string; error?: string }> {\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'datacore-pack-'))\n\n try {\n const res = await fetch(url, { signal: AbortSignal.timeout(30000) })\n if (!res.ok) return { error: `Download failed: HTTP ${res.status}` }\n\n const buffer = Buffer.from(await res.arrayBuffer())\n const archivePath = path.join(tmpDir, 'pack.tar.gz')\n fs.writeFileSync(archivePath, buffer)\n\n // Extract .tar.gz\n const extractDir = path.join(tmpDir, 'extracted')\n fs.mkdirSync(extractDir)\n execSync(`tar xzf ${JSON.stringify(archivePath)} -C ${JSON.stringify(extractDir)}`, { timeout: 10000 })\n\n // Find the pack root (directory containing SKILL.md)\n const packRoot = findPackRoot(extractDir)\n if (!packRoot) return { error: 'Downloaded archive does not contain SKILL.md' }\n\n return { path: packRoot }\n } catch (err) {\n return { error: `Download failed: ${err instanceof Error ? err.message : err}` }\n }\n}\n\nfunction findPackRoot(dir: string): string | null {\n if (fs.existsSync(path.join(dir, 'SKILL.md'))) return dir\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n const found = findPackRoot(path.join(dir, entry.name))\n if (found) return found\n }\n }\n return null\n}\n","// src/tools/export.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { loadEngrams } from '../engrams.js'\nimport type { Engram } from '../schemas/engram.js'\n\ninterface ExportArgs {\n name: string\n description: string\n engram_ids?: string[]\n filter_tags?: string[]\n filter_domain?: string\n confirm?: boolean\n}\n\ninterface ExportResult {\n success: boolean\n preview?: {\n count: number\n statements: string[]\n pack_path: string\n }\n pack_path?: string\n error?: string\n}\n\nexport async function handleExport(\n args: ExportArgs,\n paths: { engramsPath: string; packsPath: string },\n): Promise<ExportResult> {\n const allEngrams = loadEngrams(paths.engramsPath)\n let selected = allEngrams.filter(e => e.status === 'active')\n\n // Only include public or template engrams\n selected = selected.filter(e => e.visibility === 'public' || e.visibility === 'template')\n\n if (selected.length === 0 && !args.engram_ids?.length) {\n return { success: false, error: 'No exportable engrams found (only public/template engrams can be exported)' }\n }\n\n // Apply filters\n if (args.engram_ids?.length) {\n const idSet = new Set(args.engram_ids)\n // For explicit IDs, still filter for public/template from allEngrams\n selected = allEngrams.filter(e =>\n idSet.has(e.id) &&\n e.status === 'active' &&\n (e.visibility === 'public' || e.visibility === 'template')\n )\n const privateSkipped = args.engram_ids.filter(id => {\n const e = allEngrams.find(eng => eng.id === id)\n return e && e.visibility === 'private'\n })\n if (privateSkipped.length > 0) {\n return { success: false, error: `Cannot export private engrams: ${privateSkipped.join(', ')}. Set visibility to public or template first.` }\n }\n }\n\n if (args.filter_tags?.length) {\n const tagSet = new Set(args.filter_tags.map(t => t.toLowerCase()))\n selected = selected.filter(e => e.tags.some(t => tagSet.has(t.toLowerCase())))\n }\n\n if (args.filter_domain) {\n selected = selected.filter(e => e.domain?.startsWith(args.filter_domain!))\n }\n\n if (selected.length === 0) {\n return { success: false, error: 'No engrams match the filter criteria' }\n }\n\n const packId = args.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 50)\n const packDir = path.join(paths.packsPath, packId)\n\n // Preview mode (default)\n if (!args.confirm) {\n return {\n success: true,\n preview: {\n count: selected.length,\n statements: selected.map(e => e.statement).slice(0, 10),\n pack_path: packDir,\n },\n }\n }\n\n // Write pack\n fs.mkdirSync(packDir, { recursive: true })\n\n // SKILL.md with frontmatter\n const skillContent = `---\nname: \"${args.name}\"\ndescription: \"${args.description}\"\nversion: \"1.0.0\"\nschema_version: 2\nx-datacore:\n id: \"${packId}\"\n injection_policy: on_match\n match_terms: []\n engram_count: ${selected.length}\n---\n\n# ${args.name}\n\n${args.description}\n\nExported ${selected.length} engrams.\n`\n fs.writeFileSync(path.join(packDir, 'SKILL.md'), skillContent)\n\n // engrams.yaml — strip personal fields\n const exportEngrams = selected.map(e => ({\n id: e.id,\n version: e.version,\n type: e.type,\n scope: e.scope,\n visibility: e.visibility,\n statement: e.statement,\n rationale: e.rationale,\n tags: e.tags,\n domain: e.domain,\n status: 'active',\n activation: {\n retrieval_strength: 0.7,\n storage_strength: 1.0,\n frequency: 0,\n last_accessed: new Date().toISOString().split('T')[0],\n },\n feedback_signals: { positive: 0, negative: 0 },\n }))\n\n fs.writeFileSync(\n path.join(packDir, 'engrams.yaml'),\n yaml.dump({ engrams: exportEngrams }, { lineWidth: 120, noRefs: true, quotingType: '\"' }),\n )\n\n return { success: true, pack_path: packDir }\n}\n","// src/modules.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport * as yaml from 'js-yaml'\nimport { z } from 'zod'\nimport type { StorageConfig } from './storage.js'\n\nexport interface ModuleToolDefinition {\n name: string // Without namespace prefix (e.g., 'inbox_count')\n description: string\n inputSchema: z.ZodType\n handler: (args: unknown, context: ModuleToolContext) => Promise<unknown>\n}\n\nexport interface ModuleToolContext {\n storage: StorageConfig\n modulePath: string // Path to module code directory\n dataPath: string // Path to module's private data directory\n spaceName?: string // Active space (if space-scoped)\n}\n\nexport interface ModuleManifest {\n manifest_version?: number\n name: string\n version?: string\n description?: string\n builtin?: boolean\n provides?: {\n tools?: Array<{\n name: string\n description: string\n handler: string // Relative path to handler file\n }>\n skills?: unknown[]\n agents?: unknown[]\n commands?: unknown[]\n workflows?: unknown[]\n }\n context?: {\n priority?: 'always' | 'minimal' | 'on_demand'\n summary?: string\n }\n engrams?: {\n namespace?: string\n starter_pack?: string\n injection_policy?: string\n match_terms?: string[]\n }\n requires?: {\n env_vars?: {\n required?: string[]\n optional?: string[]\n }\n }\n settings?: Record<string, unknown>\n}\n\nexport interface DiscoveredModule {\n name: string\n manifest: ModuleManifest\n modulePath: string // Absolute path to module code\n scope: 'global' | 'space'\n spaceName?: string\n}\n\nexport interface RegisteredModuleTool {\n fullName: string // datacore.[module].[tool]\n moduleName: string\n definition: ModuleToolDefinition\n context: ModuleToolContext\n}\n\n/**\n * Discover all installed modules by scanning module directories.\n * Checks global (.datacore/modules/) and space-scoped ([space]/.datacore/modules/).\n */\nexport function discoverModules(storage: StorageConfig): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (storage.mode !== 'full') return modules\n\n // 1. Global modules: basePath/.datacore/modules/*/\n const globalModulesDir = path.join(storage.basePath, '.datacore', 'modules')\n modules.push(...scanModulesDir(globalModulesDir, 'global'))\n\n // 2. Space modules: basePath/[0-9]-*//.datacore/modules/*/\n try {\n const entries = fs.readdirSync(storage.basePath)\n for (const entry of entries) {\n if (/^\\d+-/.test(entry)) {\n const spaceModulesDir = path.join(storage.basePath, entry, '.datacore', 'modules')\n modules.push(...scanModulesDir(spaceModulesDir, 'space', entry))\n }\n }\n } catch {\n // basePath not readable — skip space scan\n }\n\n return modules\n}\n\nfunction scanModulesDir(\n modulesDir: string,\n scope: 'global' | 'space',\n spaceName?: string,\n): DiscoveredModule[] {\n const modules: DiscoveredModule[] = []\n\n if (!fs.existsSync(modulesDir)) return modules\n\n try {\n const entries = fs.readdirSync(modulesDir)\n for (const entry of entries) {\n const modulePath = path.join(modulesDir, entry)\n const manifestPath = path.join(modulePath, 'module.yaml')\n\n if (!fs.existsSync(manifestPath)) continue\n\n try {\n const raw = fs.readFileSync(manifestPath, 'utf-8')\n const manifest = yaml.load(raw) as ModuleManifest\n if (!manifest || !manifest.name) continue\n\n modules.push({\n name: manifest.name,\n manifest,\n modulePath,\n scope,\n spaceName,\n })\n } catch {\n // Invalid YAML or missing name — skip\n }\n }\n } catch {\n // Directory not readable — skip\n }\n\n return modules\n}\n\n/**\n * Load module tools from discovered modules.\n * Only loads tools from modules that declare provides.tools in module.yaml\n * and have a valid tools/index.ts (compiled to .js) handler.\n *\n * Returns registered tools ready for MCP server integration.\n */\nexport async function loadModuleTools(\n modules: DiscoveredModule[],\n storage: StorageConfig,\n): Promise<RegisteredModuleTool[]> {\n const tools: RegisteredModuleTool[] = []\n\n for (const mod of modules) {\n const declaredTools = mod.manifest.provides?.tools\n if (!declaredTools || declaredTools.length === 0) continue\n\n // Try to load the tools/index.ts (compiled to .js)\n const toolsIndexPath = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndexPath)) continue\n\n try {\n const toolsModule = await import(toolsIndexPath)\n const moduleTools: ModuleToolDefinition[] = toolsModule.tools || toolsModule.default?.tools || []\n\n // Build data path for this module's private data\n const dataPath = mod.scope === 'space' && mod.spaceName\n ? path.join(storage.basePath, mod.spaceName, '.datacore', 'modules', mod.name, 'data')\n : path.join(storage.basePath, '0-personal', '.datacore', 'modules', mod.name, 'data')\n\n const context: ModuleToolContext = {\n storage,\n modulePath: mod.modulePath,\n dataPath,\n spaceName: mod.spaceName,\n }\n\n for (const toolDef of moduleTools) {\n // Only register tools declared in module.yaml\n const declared = declaredTools.find(d => d.name === toolDef.name)\n if (!declared) continue\n\n tools.push({\n fullName: `datacore.${mod.name}.${toolDef.name}`,\n moduleName: mod.name,\n definition: toolDef,\n context,\n })\n }\n } catch {\n // Failed to load module tools — skip this module\n }\n }\n\n return tools\n}\n\n/**\n * Get module info for the modules.list and modules.info tools.\n */\nexport function getModuleInfo(mod: DiscoveredModule): Record<string, unknown> {\n const m = mod.manifest\n return {\n name: m.name,\n version: m.version || '0.0.0',\n description: m.description || '',\n scope: mod.scope,\n space: mod.spaceName,\n builtin: m.builtin || false,\n manifest_version: m.manifest_version || 1,\n provides: {\n tools: m.provides?.tools?.length || 0,\n skills: m.provides?.skills?.length || 0,\n agents: m.provides?.agents?.length || 0,\n commands: m.provides?.commands?.length || 0,\n workflows: m.provides?.workflows?.length || 0,\n },\n context_priority: m.context?.priority || 'minimal',\n engrams: m.engrams ? {\n namespace: m.engrams.namespace,\n injection_policy: m.engrams.injection_policy,\n has_starter_pack: !!m.engrams.starter_pack,\n } : null,\n requires: m.requires?.env_vars ? {\n env_required: m.requires.env_vars.required || [],\n env_optional: m.requires.env_vars.optional || [],\n } : null,\n path: mod.modulePath,\n }\n}\n","// src/tools/modules-list.ts\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesList(\n _args: unknown,\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (modules.length === 0) {\n return {\n count: 0,\n modules: [],\n message: storage.mode === 'core'\n ? 'Module discovery requires a full Datacore installation'\n : 'No modules found',\n }\n }\n\n return {\n count: modules.length,\n modules: modules.map(m => ({\n name: m.manifest.name,\n version: m.manifest.version || '0.0.0',\n description: m.manifest.description || '',\n scope: m.scope,\n space: m.spaceName || null,\n builtin: m.manifest.builtin || false,\n manifest_version: m.manifest.manifest_version || 1,\n provides: {\n tools: m.manifest.provides?.tools?.length || 0,\n skills: m.manifest.provides?.skills?.length || 0,\n agents: m.manifest.provides?.agents?.length || 0,\n commands: m.manifest.provides?.commands?.length || 0,\n workflows: m.manifest.provides?.workflows?.length || 0,\n },\n context_priority: m.manifest.context?.priority || 'minimal',\n })),\n }\n}\n","// src/tools/modules-info.ts\nimport { discoverModules, getModuleInfo, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\nexport async function handleModulesInfo(\n args: { module: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n const found = modules.find(m => m.manifest.name === args.module)\n\n if (!found) {\n return { error: `Module '${args.module}' not found`, installed_modules: modules.map(m => m.name) }\n }\n\n return getModuleInfo(found)\n}\n","// src/tools/modules-health.ts\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { discoverModules, type DiscoveredModule } from '../modules.js'\nimport type { StorageConfig } from '../storage.js'\n\ninterface HealthCheck {\n name: string\n status: 'ok' | 'warning' | 'error'\n issues: string[]\n}\n\nexport async function handleModulesHealth(\n args: { module?: string },\n storage: StorageConfig,\n cachedModules?: DiscoveredModule[],\n): Promise<unknown> {\n const modules = cachedModules ?? discoverModules(storage)\n\n if (args.module) {\n const found = modules.find(m => m.manifest.name === args.module)\n if (!found) {\n return { error: `Module '${args.module}' not found` }\n }\n return await checkModule(found, storage)\n }\n\n // Check all modules\n const checks = await Promise.all(modules.map(m => checkModule(m, storage)))\n const ok = checks.filter(c => c.status === 'ok').length\n const warnings = checks.filter(c => c.status === 'warning').length\n const errors = checks.filter(c => c.status === 'error').length\n\n return {\n summary: { total: checks.length, ok, warnings, errors },\n modules: checks,\n }\n}\n\nasync function checkModule(\n mod: { name: string; manifest: Record<string, unknown>; modulePath: string },\n storage: StorageConfig,\n): Promise<HealthCheck> {\n const issues: string[] = []\n const manifest = mod.manifest as Record<string, unknown>\n\n // Check required files\n if (!fs.existsSync(path.join(mod.modulePath, 'SKILL.md'))) {\n issues.push('Missing SKILL.md (ecosystem entry point)')\n }\n if (!fs.existsSync(path.join(mod.modulePath, 'CLAUDE.base.md'))) {\n issues.push('Missing CLAUDE.base.md (AI context)')\n }\n\n // Check manifest version\n if (!manifest.manifest_version || (manifest.manifest_version as number) < 2) {\n issues.push('module.yaml uses v1 format (missing manifest_version: 2)')\n }\n\n // Check env vars\n const requires = manifest.requires as { env_vars?: { required?: string[] } } | undefined\n const requiredEnv = requires?.env_vars?.required || []\n for (const envVar of requiredEnv) {\n if (!process.env[envVar]) {\n issues.push(`Missing required env var: ${envVar}`)\n }\n }\n\n // Check declared tools have handlers\n const provides = manifest.provides as { tools?: Array<{ name: string; handler: string }> } | undefined\n const declaredTools = provides?.tools || []\n if (declaredTools.length > 0) {\n const toolsIndex = path.join(mod.modulePath, 'tools', 'index.js')\n if (!fs.existsSync(toolsIndex)) {\n issues.push(`Declares ${declaredTools.length} tools but tools/index.js not found`)\n } else {\n // Attempt to verify exports match declarations\n try {\n const toolModule = await import(toolsIndex)\n for (const tool of declaredTools) {\n const handlerName = tool.handler || tool.name\n if (typeof toolModule[handlerName] !== 'function') {\n issues.push(`Tool '${tool.name}' declares handler '${handlerName}' but export not found`)\n }\n }\n } catch (err) {\n issues.push(`tools/index.js failed to load: ${err instanceof Error ? err.message : err}`)\n }\n }\n }\n\n // Check data separation (no data files in module code dir)\n const suspectExts = ['.db', '.sqlite', '.json']\n const suspectDirs = ['output', 'data', 'state']\n for (const dir of suspectDirs) {\n const fullPath = path.join(mod.modulePath, dir)\n if (fs.existsSync(fullPath) && fs.statSync(fullPath).isDirectory()) {\n issues.push(`Data dir '${dir}/' found in module code (should be in space data path)`)\n }\n }\n try {\n const entries = fs.readdirSync(mod.modulePath)\n for (const entry of entries) {\n if (suspectExts.some(ext => entry.endsWith(ext))) {\n issues.push(`Data file '${entry}' found in module code dir`)\n }\n }\n } catch { /* ignore */ }\n\n return {\n name: mod.name as string,\n status: issues.length === 0 ? 'ok' : issues.some(i => i.startsWith('Missing required')) ? 'error' : 'warning',\n issues,\n }\n}\n","// src/tools/forget.ts\nimport { loadEngrams, saveEngrams } from '../engrams.js'\n\ninterface ForgetArgs {\n id?: string\n search?: string\n}\n\ninterface ForgetResult {\n success: boolean\n retired?: { id: string; statement: string }\n matches?: Array<{ id: string; statement: string }>\n error?: string\n}\n\nexport async function handleForget(args: ForgetArgs, engramsPath: string): Promise<ForgetResult> {\n const engrams = loadEngrams(engramsPath)\n\n if (args.id) {\n const idx = engrams.findIndex(e => e.id === args.id)\n if (idx === -1) {\n return { success: false, error: `Engram ${args.id} not found` }\n }\n const engram = engrams[idx]\n if (engram.status === 'retired') {\n return { success: false, error: `Engram ${args.id} is already retired` }\n }\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n\n if (args.search) {\n const searchLower = args.search.toLowerCase()\n const matches = engrams\n .filter(e => e.status !== 'retired')\n .filter(e =>\n e.statement.toLowerCase().includes(searchLower) ||\n e.id.toLowerCase().includes(searchLower) ||\n e.tags.some(t => t.toLowerCase().includes(searchLower))\n )\n .slice(0, 10)\n\n if (matches.length === 0) {\n return { success: false, error: `No active engrams matching \"${args.search}\"` }\n }\n if (matches.length === 1) {\n const engram = matches[0]\n const idx = engrams.findIndex(e => e.id === engram.id)\n engrams[idx] = { ...engram, status: 'retired' }\n saveEngrams(engramsPath, engrams)\n return { success: true, retired: { id: engram.id, statement: engram.statement } }\n }\n return {\n success: false,\n matches: matches.map(e => ({ id: e.id, statement: e.statement })),\n error: `Multiple matches found. Specify an exact ID to retire.`,\n }\n }\n\n return { success: false, error: 'Provide either id or search parameter' }\n}\n","// src/tools/feedback.ts\nimport { loadEngrams } from '../engrams.js'\nimport { atomicWriteYaml } from './inject-tool.js'\n\ninterface FeedbackArgs {\n engram_id: string\n signal: 'positive' | 'negative' | 'neutral'\n comment?: string\n}\n\ninterface FeedbackResult {\n success: boolean\n engram_id: string\n signal: string\n feedback_signals?: { positive: number; negative: number; neutral: number }\n error?: string\n}\n\nexport async function handleFeedback(\n args: FeedbackArgs,\n engramsPath: string,\n): Promise<FeedbackResult> {\n const engrams = loadEngrams(engramsPath)\n const engram = engrams.find(e => e.id === args.engram_id)\n\n if (!engram) {\n return { success: false, engram_id: args.engram_id, signal: args.signal, error: `Engram ${args.engram_id} not found` }\n }\n\n // Per-day dedup: check if same signal already given today\n const today = new Date().toISOString().split('T')[0]\n if (engram.activation.last_accessed === today) {\n // Allow max 1 positive + 1 negative per day (neutral always allowed)\n // We track this simply: if last_accessed is today and we already incremented, skip\n // This is approximate — true dedup would need a signal log\n }\n\n // Initialize feedback_signals if missing\n if (!engram.feedback_signals) {\n engram.feedback_signals = { positive: 0, negative: 0, neutral: 0 }\n }\n\n engram.feedback_signals[args.signal] += 1\n engram.activation.last_accessed = today\n\n atomicWriteYaml(engramsPath, { engrams })\n\n return {\n success: true,\n engram_id: args.engram_id,\n signal: args.signal,\n feedback_signals: { ...engram.feedback_signals },\n }\n}\n","// src/resources.ts\nimport type { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport {\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n ListResourceTemplatesRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js'\nimport { loadEngrams } from './engrams.js'\nimport { localDate } from './tools/capture.js'\nimport type { StorageConfig } from './storage.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { currentVersion } from './version.js'\n\nexport function registerResources(server: Server, storage: StorageConfig): void {\n // List static resources\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n {\n uri: 'datacore://status',\n name: 'Datacore Status',\n description: 'Current system status summary',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://engrams/active',\n name: 'Active Engrams',\n description: 'All active engrams with their metadata',\n mimeType: 'application/json',\n },\n {\n uri: 'datacore://journal/today',\n name: \"Today's Journal\",\n description: \"Today's journal entry\",\n mimeType: 'text/markdown',\n },\n ],\n }))\n\n // List resource templates\n server.setRequestHandler(ListResourceTemplatesRequestSchema, async () => ({\n resourceTemplates: [\n {\n uriTemplate: 'datacore://journal/{date}',\n name: 'Journal Entry',\n description: 'Journal entry for a specific date (YYYY-MM-DD)',\n mimeType: 'text/markdown',\n },\n {\n uriTemplate: 'datacore://engrams/{id}',\n name: 'Engram',\n description: 'A specific engram by ID',\n mimeType: 'application/json',\n },\n ],\n }))\n\n // Read resource\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri\n\n // Static: datacore://status\n if (uri === 'datacore://status') {\n const engrams = loadEngrams(storage.engramsPath)\n const active = engrams.filter(e => e.status === 'active').length\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify({ version: currentVersion, mode: storage.mode, engrams: engrams.length, active }),\n }],\n }\n }\n\n // Static: datacore://engrams/active\n if (uri === 'datacore://engrams/active') {\n const engrams = loadEngrams(storage.engramsPath).filter(e => e.status === 'active')\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engrams, null, 2),\n }],\n }\n }\n\n // Static or template: datacore://journal/today or datacore://journal/{date}\n const journalMatch = uri.match(/^datacore:\\/\\/journal\\/(.+)$/)\n if (journalMatch) {\n const dateStr = journalMatch[1] === 'today' ? localDate().date : journalMatch[1]\n const filePath = path.join(storage.journalPath, `${dateStr}.md`)\n if (!fs.existsSync(filePath)) {\n return { contents: [{ uri, mimeType: 'text/markdown', text: `No journal entry for ${dateStr}` }] }\n }\n return { contents: [{ uri, mimeType: 'text/markdown', text: fs.readFileSync(filePath, 'utf8') }] }\n }\n\n // Template: datacore://engrams/{id}\n const engramMatch = uri.match(/^datacore:\\/\\/engrams\\/(.+)$/)\n if (engramMatch) {\n const engrams = loadEngrams(storage.engramsPath)\n const engram = engrams.find(e => e.id === engramMatch[1])\n if (!engram) {\n throw new Error(`Engram not found: ${engramMatch[1]}`)\n }\n return {\n contents: [{\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(engram, null, 2),\n }],\n }\n }\n\n throw new Error(`Unknown resource: ${uri}`)\n })\n}\n\nexport function notifyEngramsChanged(server: Server): void {\n try {\n server.sendResourceUpdated?.({ uri: 'datacore://engrams/active' })\n } catch { /* ignore if not supported */ }\n}\n","// src/datacortex.ts\nimport { execFile } from 'child_process'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { logger } from './logger.js'\n\ninterface SemanticResult {\n path: string\n score: number\n snippet: string\n}\n\ninterface BridgeResponse {\n results?: SemanticResult[]\n error?: string\n}\n\nexport class DatacortexBridge {\n private pythonPath: string\n private scriptPath: string | null\n\n constructor(datacorePath: string) {\n this.pythonPath = process.env.DATACORE_PYTHON ?? 'python3'\n this.scriptPath = this.findBridgeScript(datacorePath)\n }\n\n private findBridgeScript(datacorePath: string): string | null {\n const candidates = [\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'lib', 'bridge.py'),\n path.join(datacorePath, '.datacore', 'modules', 'datacortex', 'bridge.py'),\n ]\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate\n }\n return null\n }\n\n isAvailable(): { available: boolean; reason?: string } {\n if (!this.scriptPath) {\n return { available: false, reason: 'Datacortex bridge script not found' }\n }\n try {\n const { execSync } = require('child_process')\n execSync(`${this.pythonPath} --version`, { timeout: 5000, stdio: 'pipe' })\n return { available: true }\n } catch {\n return { available: false, reason: `Python not found at ${this.pythonPath}` }\n }\n }\n\n async search(query: string, limit: number = 20): Promise<{ results: SemanticResult[]; fallback?: boolean }> {\n if (!this.scriptPath) {\n return { results: [], fallback: true }\n }\n\n const request = JSON.stringify({ action: 'search', query, limit })\n\n return new Promise((resolve) => {\n const proc = execFile(\n this.pythonPath,\n [this.scriptPath!],\n { timeout: 30000 },\n (error, stdout, stderr) => {\n if (error) {\n logger.warning(`Datacortex bridge error: ${error.message}`)\n resolve({ results: [], fallback: true })\n return\n }\n try {\n const response: BridgeResponse = JSON.parse(stdout.trim())\n if (response.error) {\n logger.warning(`Datacortex bridge: ${response.error}`)\n resolve({ results: [], fallback: true })\n return\n }\n resolve({ results: response.results ?? [] })\n } catch {\n logger.warning(`Datacortex bridge: invalid response`)\n resolve({ results: [], fallback: true })\n }\n },\n )\n proc.stdin?.write(request + '\\n')\n proc.stdin?.end()\n })\n }\n}\n","import { runStdio, runHttp } from './server.js'\nimport { currentVersion } from './version.js'\n\nconst args = process.argv.slice(2)\n\nif (args.includes('--version') || args.includes('-v')) {\n console.log(currentVersion)\n process.exit(0)\n}\n\nif (args.includes('--help') || args.includes('-h')) {\n console.log(`Datacore MCP Server v${currentVersion}\nAn MCP server that gives AI assistants persistent memory through engrams.\n\nUsage:\n npx @datacore-one/mcp Start MCP server (stdio transport)\n npx @datacore-one/mcp --http Start MCP server (HTTP transport)\n npx @datacore-one/mcp --help Show this help\n npx @datacore-one/mcp --version Show version\n\nTools:\n Core\n datacore.capture Capture a journal entry or knowledge note\n datacore.learn Create an engram from a statement\n datacore.inject Get relevant engrams for a task\n datacore.search Search journal and knowledge by keyword\n datacore.ingest Ingest text as knowledge note with engram extraction\n datacore.status System status, counts, update info\n\n Lifecycle\n datacore.feedback Signal whether an injected engram was helpful\n datacore.forget Retire an engram by ID or search\n\n Packs\n datacore.packs.discover Browse available engram packs\n datacore.packs.install Install or upgrade an engram pack\n datacore.packs.export Export personal engrams as a shareable pack\n\n Modules (full mode)\n datacore.modules.list List installed modules\n datacore.modules.info Detailed info about a module\n datacore.modules.health Health check for modules\n\nConfiguration:\n DATACORE_PATH Full installation path (default: ~/Data)\n DATACORE_CORE_PATH Core mode storage path (default: ~/Datacore)\n DATACORE_TIMEZONE IANA timezone (e.g., Europe/Ljubljana)\n DATACORE_LOG_LEVEL Log level: debug|info|warning|error (default: warning)\n DATACORE_CACHE_TTL File cache TTL in seconds (default: 60)\n DATACORE_TRANSPORT Transport: stdio or http (default: stdio)\n DATACORE_HTTP_PORT HTTP transport port (default: 3100)\n DATACORE_HTTP_HOST HTTP transport bind address (default: 127.0.0.1)\n\nExamples:\n # Add to Claude Desktop config\n { \"mcpServers\": { \"datacore\": { \"command\": \"npx\", \"args\": [\"@datacore-one/mcp\"] } } }\n\n # Run with HTTP transport on custom port\n DATACORE_HTTP_PORT=8080 npx @datacore-one/mcp --http\n`)\n process.exit(0)\n}\n\nconst useHttp = args.includes('--http') || process.env.DATACORE_TRANSPORT === 'http'\n\nconst start = useHttp ? runHttp : runStdio\nstart().catch((error) => {\n console.error('Failed to start Datacore MCP server:', error)\n process.exit(1)\n})\n"],"mappings":"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","names":["isFirstRun","fs","path","args","storage","fs","z","args","fs","yaml","args","fs","path","args","start","fs","path","args","fs","path","fs","path","updateAvailable","result","fs","path","args","fs","path","yaml","os","args","fs","path","yaml","args","fs","path","yaml","storage","moduleTools","storage","args","storage","fs","path","args","storage","args","args","fs","path","storage","fs","path","execSync","args"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datacore-one/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Datacore MCP server — The Software of You",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
|
-
"datacore-mcp": "
|
|
7
|
+
"datacore-mcp": "dist/index.js"
|
|
8
8
|
},
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"scripts": {
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"author": "Fair Data Society",
|
|
43
43
|
"repository": {
|
|
44
44
|
"type": "git",
|
|
45
|
-
"url": "https://github.com/datacore-one/mcp"
|
|
45
|
+
"url": "git+https://github.com/datacore-one/mcp.git"
|
|
46
46
|
},
|
|
47
47
|
"engines": {
|
|
48
48
|
"node": ">=22"
|