@bhimudev/gnanai 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +270 -0
- package/dist/bin/cli.d.ts +3 -0
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +188 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/cleanup.d.ts +21 -0
- package/dist/commands/cleanup.d.ts.map +1 -0
- package/dist/commands/cleanup.js +380 -0
- package/dist/commands/cleanup.js.map +1 -0
- package/dist/commands/dispatch.d.ts +13 -0
- package/dist/commands/dispatch.d.ts.map +1 -0
- package/dist/commands/dispatch.js +85 -0
- package/dist/commands/dispatch.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +155 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/generate.d.ts +3 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +167 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +10 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +711 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/knowledge-sync.d.ts +69 -0
- package/dist/commands/knowledge-sync.d.ts.map +1 -0
- package/dist/commands/knowledge-sync.js +661 -0
- package/dist/commands/knowledge-sync.js.map +1 -0
- package/dist/commands/knowledge.d.ts +35 -0
- package/dist/commands/knowledge.d.ts.map +1 -0
- package/dist/commands/knowledge.js +254 -0
- package/dist/commands/knowledge.js.map +1 -0
- package/dist/commands/rollback.d.ts +13 -0
- package/dist/commands/rollback.d.ts.map +1 -0
- package/dist/commands/rollback.js +186 -0
- package/dist/commands/rollback.js.map +1 -0
- package/dist/commands/setup-config.d.ts +6 -0
- package/dist/commands/setup-config.d.ts.map +1 -0
- package/dist/commands/setup-config.js +663 -0
- package/dist/commands/setup-config.js.map +1 -0
- package/dist/commands/setup-project.d.ts +6 -0
- package/dist/commands/setup-project.d.ts.map +1 -0
- package/dist/commands/setup-project.js +361 -0
- package/dist/commands/setup-project.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +293 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/status.d.ts +51 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +182 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +3 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +173 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +10 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +435 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/worktree.d.ts +30 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +262 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/generator/claude-cli.d.ts +24 -0
- package/dist/generator/claude-cli.d.ts.map +1 -0
- package/dist/generator/claude-cli.js +239 -0
- package/dist/generator/claude-cli.js.map +1 -0
- package/dist/generator/prompt-builder.d.ts +7 -0
- package/dist/generator/prompt-builder.d.ts.map +1 -0
- package/dist/generator/prompt-builder.js +144 -0
- package/dist/generator/prompt-builder.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/embeddings.d.ts +53 -0
- package/dist/mcp/embeddings.d.ts.map +1 -0
- package/dist/mcp/embeddings.js +68 -0
- package/dist/mcp/embeddings.js.map +1 -0
- package/dist/mcp/hybrid-search.d.ts +25 -0
- package/dist/mcp/hybrid-search.d.ts.map +1 -0
- package/dist/mcp/hybrid-search.js +72 -0
- package/dist/mcp/hybrid-search.js.map +1 -0
- package/dist/mcp/knowledge-server.d.ts +4 -0
- package/dist/mcp/knowledge-server.d.ts.map +1 -0
- package/dist/mcp/knowledge-server.js +294 -0
- package/dist/mcp/knowledge-server.js.map +1 -0
- package/dist/mcp/knowledge-utils.d.ts +65 -0
- package/dist/mcp/knowledge-utils.d.ts.map +1 -0
- package/dist/mcp/knowledge-utils.js +207 -0
- package/dist/mcp/knowledge-utils.js.map +1 -0
- package/dist/mcp/search-factory.d.ts +9 -0
- package/dist/mcp/search-factory.d.ts.map +1 -0
- package/dist/mcp/search-factory.js +23 -0
- package/dist/mcp/search-factory.js.map +1 -0
- package/dist/mcp/search-index.d.ts +45 -0
- package/dist/mcp/search-index.d.ts.map +1 -0
- package/dist/mcp/search-index.js +2 -0
- package/dist/mcp/search-index.js.map +1 -0
- package/dist/mcp/search-minisearch.d.ts +46 -0
- package/dist/mcp/search-minisearch.d.ts.map +1 -0
- package/dist/mcp/search-minisearch.js +99 -0
- package/dist/mcp/search-minisearch.js.map +1 -0
- package/dist/mcp/search-sqlite.d.ts +30 -0
- package/dist/mcp/search-sqlite.d.ts.map +1 -0
- package/dist/mcp/search-sqlite.js +188 -0
- package/dist/mcp/search-sqlite.js.map +1 -0
- package/dist/mcp/vector-store.d.ts +52 -0
- package/dist/mcp/vector-store.d.ts.map +1 -0
- package/dist/mcp/vector-store.js +183 -0
- package/dist/mcp/vector-store.js.map +1 -0
- package/dist/scaffold/copy-core-agents.d.ts +2 -0
- package/dist/scaffold/copy-core-agents.d.ts.map +1 -0
- package/dist/scaffold/copy-core-agents.js +90 -0
- package/dist/scaffold/copy-core-agents.js.map +1 -0
- package/dist/scaffold/create-claude-settings.d.ts +40 -0
- package/dist/scaffold/create-claude-settings.d.ts.map +1 -0
- package/dist/scaffold/create-claude-settings.js +422 -0
- package/dist/scaffold/create-claude-settings.js.map +1 -0
- package/dist/scaffold/create-config.d.ts +14 -0
- package/dist/scaffold/create-config.d.ts.map +1 -0
- package/dist/scaffold/create-config.js +199 -0
- package/dist/scaffold/create-config.js.map +1 -0
- package/dist/scaffold/create-project-description.d.ts +12 -0
- package/dist/scaffold/create-project-description.d.ts.map +1 -0
- package/dist/scaffold/create-project-description.js +104 -0
- package/dist/scaffold/create-project-description.js.map +1 -0
- package/dist/scaffold/create-structure.d.ts +2 -0
- package/dist/scaffold/create-structure.d.ts.map +1 -0
- package/dist/scaffold/create-structure.js +146 -0
- package/dist/scaffold/create-structure.js.map +1 -0
- package/dist/types/dependency-analysis.d.ts +11 -0
- package/dist/types/dependency-analysis.d.ts.map +1 -0
- package/dist/types/dependency-analysis.js +2 -0
- package/dist/types/dependency-analysis.js.map +1 -0
- package/dist/types/index.d.ts +526 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/task.d.ts +25 -0
- package/dist/types/task.d.ts.map +1 -0
- package/dist/types/task.js +3 -0
- package/dist/types/task.js.map +1 -0
- package/dist/utils/analyze-files.d.ts +7 -0
- package/dist/utils/analyze-files.d.ts.map +1 -0
- package/dist/utils/analyze-files.js +27 -0
- package/dist/utils/analyze-files.js.map +1 -0
- package/dist/utils/backup.d.ts +102 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +352 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/ci-provider.d.ts +23 -0
- package/dist/utils/ci-provider.d.ts.map +1 -0
- package/dist/utils/ci-provider.js +525 -0
- package/dist/utils/ci-provider.js.map +1 -0
- package/dist/utils/ci-status.d.ts +57 -0
- package/dist/utils/ci-status.d.ts.map +1 -0
- package/dist/utils/ci-status.js +349 -0
- package/dist/utils/ci-status.js.map +1 -0
- package/dist/utils/dependency-analysis.d.ts +34 -0
- package/dist/utils/dependency-analysis.d.ts.map +1 -0
- package/dist/utils/dependency-analysis.js +298 -0
- package/dist/utils/dependency-analysis.js.map +1 -0
- package/dist/utils/detect-git.d.ts +57 -0
- package/dist/utils/detect-git.d.ts.map +1 -0
- package/dist/utils/detect-git.js +439 -0
- package/dist/utils/detect-git.js.map +1 -0
- package/dist/utils/detect-mcp.d.ts +32 -0
- package/dist/utils/detect-mcp.d.ts.map +1 -0
- package/dist/utils/detect-mcp.js +178 -0
- package/dist/utils/detect-mcp.js.map +1 -0
- package/dist/utils/detect-project.d.ts +3 -0
- package/dist/utils/detect-project.d.ts.map +1 -0
- package/dist/utils/detect-project.js +155 -0
- package/dist/utils/detect-project.js.map +1 -0
- package/dist/utils/file-comparison.d.ts +89 -0
- package/dist/utils/file-comparison.d.ts.map +1 -0
- package/dist/utils/file-comparison.js +301 -0
- package/dist/utils/file-comparison.js.map +1 -0
- package/dist/utils/file-merger.d.ts +74 -0
- package/dist/utils/file-merger.d.ts.map +1 -0
- package/dist/utils/file-merger.js +350 -0
- package/dist/utils/file-merger.js.map +1 -0
- package/dist/utils/logger.d.ts +26 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/managed-process.d.ts +109 -0
- package/dist/utils/managed-process.d.ts.map +1 -0
- package/dist/utils/managed-process.js +481 -0
- package/dist/utils/managed-process.js.map +1 -0
- package/dist/utils/merge-claude-settings.d.ts +65 -0
- package/dist/utils/merge-claude-settings.d.ts.map +1 -0
- package/dist/utils/merge-claude-settings.js +133 -0
- package/dist/utils/merge-claude-settings.js.map +1 -0
- package/dist/utils/migration.d.ts +74 -0
- package/dist/utils/migration.d.ts.map +1 -0
- package/dist/utils/migration.js +345 -0
- package/dist/utils/migration.js.map +1 -0
- package/dist/utils/process-health.d.ts +51 -0
- package/dist/utils/process-health.d.ts.map +1 -0
- package/dist/utils/process-health.js +123 -0
- package/dist/utils/process-health.js.map +1 -0
- package/dist/utils/process-registry.d.ts +20 -0
- package/dist/utils/process-registry.d.ts.map +1 -0
- package/dist/utils/process-registry.js +151 -0
- package/dist/utils/process-registry.js.map +1 -0
- package/dist/utils/process-tree.d.ts +51 -0
- package/dist/utils/process-tree.d.ts.map +1 -0
- package/dist/utils/process-tree.js +499 -0
- package/dist/utils/process-tree.js.map +1 -0
- package/dist/utils/repair-mcp-config.d.ts +15 -0
- package/dist/utils/repair-mcp-config.d.ts.map +1 -0
- package/dist/utils/repair-mcp-config.js +129 -0
- package/dist/utils/repair-mcp-config.js.map +1 -0
- package/dist/utils/task-lifecycle.d.ts +60 -0
- package/dist/utils/task-lifecycle.d.ts.map +1 -0
- package/dist/utils/task-lifecycle.js +310 -0
- package/dist/utils/task-lifecycle.js.map +1 -0
- package/dist/utils/update-agent-mcp.d.ts +7 -0
- package/dist/utils/update-agent-mcp.d.ts.map +1 -0
- package/dist/utils/update-agent-mcp.js +115 -0
- package/dist/utils/update-agent-mcp.js.map +1 -0
- package/dist/utils/update-agent-templates.d.ts +6 -0
- package/dist/utils/update-agent-templates.d.ts.map +1 -0
- package/dist/utils/update-agent-templates.js +56 -0
- package/dist/utils/update-agent-templates.js.map +1 -0
- package/dist/utils/update-config-ci.d.ts +7 -0
- package/dist/utils/update-config-ci.d.ts.map +1 -0
- package/dist/utils/update-config-ci.js +72 -0
- package/dist/utils/update-config-ci.js.map +1 -0
- package/dist/utils/update-config-git.d.ts +18 -0
- package/dist/utils/update-config-git.d.ts.map +1 -0
- package/dist/utils/update-config-git.js +146 -0
- package/dist/utils/update-config-git.js.map +1 -0
- package/dist/utils/update-config-mcp.d.ts +7 -0
- package/dist/utils/update-config-mcp.d.ts.map +1 -0
- package/dist/utils/update-config-mcp.js +98 -0
- package/dist/utils/update-config-mcp.js.map +1 -0
- package/dist/utils/validate-config.d.ts +3 -0
- package/dist/utils/validate-config.d.ts.map +1 -0
- package/dist/utils/validate-config.js +109 -0
- package/dist/utils/validate-config.js.map +1 -0
- package/dist/utils/version-tracker.d.ts +130 -0
- package/dist/utils/version-tracker.d.ts.map +1 -0
- package/dist/utils/version-tracker.js +298 -0
- package/dist/utils/version-tracker.js.map +1 -0
- package/dist/utils/worktree.d.ts +68 -0
- package/dist/utils/worktree.d.ts.map +1 -0
- package/dist/utils/worktree.js +446 -0
- package/dist/utils/worktree.js.map +1 -0
- package/package.json +77 -0
- package/templates/ARCHAI_README.md +329 -0
- package/templates/CLAUDE.md +67 -0
- package/templates/PROMPTS.md +506 -0
- package/templates/core-agents/boss-agent.md +671 -0
- package/templates/core-agents/cleanup-agent.md +145 -0
- package/templates/core-agents/code-reviewer.md +175 -0
- package/templates/core-agents/critical-reviewer.md +117 -0
- package/templates/core-agents/deep-analyst.md +216 -0
- package/templates/core-agents/finalization-agent.md +252 -0
- package/templates/core-agents/git-coordinator.md +240 -0
- package/templates/core-agents/implementation-agent.md +151 -0
- package/templates/core-agents/maestro-agent.md +413 -0
- package/templates/core-agents/maestro-headless-agent.md +422 -0
- package/templates/core-agents/plan-validator.md +198 -0
- package/templates/core-agents/quick-fix.md +56 -0
- package/templates/core-agents/routing-templates.md +338 -0
- package/templates/core-agents/task-orchestrator.md +143 -0
- package/templates/core-agents/task-prep.md +202 -0
- package/templates/core-agents/tdd-designer.md +143 -0
- package/templates/specialist-meta.md +275 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
3
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import { VALID_CATEGORIES, validateCategory, generateId, parseEntry, buildEntry, atomicWriteFile, findEntryById, listEntryFiles, } from './knowledge-utils.js';
|
|
8
|
+
import { createSearchIndex } from './search-factory.js';
|
|
9
|
+
import { LocalEmbeddingEngine } from './embeddings.js';
|
|
10
|
+
import { VectorStore } from './vector-store.js';
|
|
11
|
+
import { hybridSearch } from './hybrid-search.js';
|
|
12
|
+
export async function startKnowledgeMcpServer(options) {
|
|
13
|
+
const { group } = options;
|
|
14
|
+
const groupPath = path.join(os.homedir(), '.archai', 'knowledge', 'groups', group);
|
|
15
|
+
const groupJsonPath = path.join(groupPath, 'group.json');
|
|
16
|
+
if (!(await fs.pathExists(groupJsonPath))) {
|
|
17
|
+
process.stderr.write('Error: Knowledge group "' + group + '" does not exist.\n');
|
|
18
|
+
process.exitCode = 1;
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const entryFiles = await listEntryFiles(groupPath);
|
|
22
|
+
const entries = [];
|
|
23
|
+
for (const fp of entryFiles) {
|
|
24
|
+
try {
|
|
25
|
+
entries.push(await parseEntry(fp));
|
|
26
|
+
}
|
|
27
|
+
catch { /* skip */ }
|
|
28
|
+
}
|
|
29
|
+
let searchIndex;
|
|
30
|
+
try {
|
|
31
|
+
searchIndex = await createSearchIndex(groupPath, entries);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
process.stderr.write('Search index init failed: ' + (err instanceof Error ? err.message : String(err)) + '\n');
|
|
35
|
+
process.exitCode = 1;
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const embeddingEngine = new LocalEmbeddingEngine();
|
|
39
|
+
await embeddingEngine.initialize();
|
|
40
|
+
const vectorsPath = path.join(groupPath, '.vectors.json');
|
|
41
|
+
const vectorStore = new VectorStore(vectorsPath, embeddingEngine);
|
|
42
|
+
await vectorStore.load(async () => {
|
|
43
|
+
const rebuildFiles = await listEntryFiles(groupPath);
|
|
44
|
+
const rebuildEntries = [];
|
|
45
|
+
for (const fp of rebuildFiles) {
|
|
46
|
+
try {
|
|
47
|
+
rebuildEntries.push(await parseEntry(fp));
|
|
48
|
+
}
|
|
49
|
+
catch { /* skip */ }
|
|
50
|
+
}
|
|
51
|
+
return rebuildEntries;
|
|
52
|
+
});
|
|
53
|
+
if (embeddingEngine.isReady && vectorStore.entryCount !== entries.length && entries.length > 0) {
|
|
54
|
+
await vectorStore.rebuild(entries);
|
|
55
|
+
}
|
|
56
|
+
process.on('beforeExit', () => { searchIndex.close(); });
|
|
57
|
+
const server = new Server({ name: 'archai-knowledge-' + group, version: '0.3.0' }, { capabilities: { tools: {} } });
|
|
58
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
59
|
+
return {
|
|
60
|
+
tools: [
|
|
61
|
+
{
|
|
62
|
+
name: 'knowledge_list',
|
|
63
|
+
description: 'List knowledge entries in the group, optionally filtered by category',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
type: 'object',
|
|
66
|
+
properties: {
|
|
67
|
+
category: { type: 'string', description: 'Filter by category: decisions, patterns, constraints, learnings, context' },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: 'knowledge_read',
|
|
73
|
+
description: 'Read the full content of a knowledge entry by its ID',
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: 'object',
|
|
76
|
+
properties: {
|
|
77
|
+
id: { type: 'string', description: 'Entry ID (e.g., 20260214-143022-789-api-errors)' },
|
|
78
|
+
},
|
|
79
|
+
required: ['id'],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: 'knowledge_write',
|
|
84
|
+
description: 'Create a new knowledge entry',
|
|
85
|
+
inputSchema: {
|
|
86
|
+
type: 'object',
|
|
87
|
+
properties: {
|
|
88
|
+
category: { type: 'string', description: 'Category: decisions, patterns, constraints, learnings, context' },
|
|
89
|
+
title: { type: 'string', description: 'Entry title' },
|
|
90
|
+
content: { type: 'string', description: 'Entry content in markdown' },
|
|
91
|
+
tags: { type: 'array', items: { type: 'string' }, description: 'Optional tags' },
|
|
92
|
+
source_repo: { type: 'string', description: 'Optional source repository name' },
|
|
93
|
+
},
|
|
94
|
+
required: ['category', 'title', 'content'],
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: 'knowledge_delete',
|
|
99
|
+
description: 'Delete a knowledge entry by its ID',
|
|
100
|
+
inputSchema: {
|
|
101
|
+
type: 'object',
|
|
102
|
+
properties: {
|
|
103
|
+
id: { type: 'string', description: 'Entry ID to delete' },
|
|
104
|
+
},
|
|
105
|
+
required: ['id'],
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'knowledge_group_info',
|
|
110
|
+
description: 'Get information about the knowledge group',
|
|
111
|
+
inputSchema: { type: 'object', properties: {} },
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'knowledge_search',
|
|
115
|
+
description: 'Search knowledge entries. Supports hybrid (keyword + semantic), semantic-only, or keyword-only modes.',
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
properties: {
|
|
119
|
+
query: { type: 'string', description: 'Search query' },
|
|
120
|
+
mode: { type: 'string', enum: ['hybrid', 'semantic', 'keyword'], description: 'Search mode (default: hybrid)' },
|
|
121
|
+
category: { type: 'string', description: 'Optional category filter' },
|
|
122
|
+
limit: { type: 'number', description: 'Max results (default: 5)' },
|
|
123
|
+
},
|
|
124
|
+
required: ['query'],
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
131
|
+
const { name, arguments: args } = request.params;
|
|
132
|
+
try {
|
|
133
|
+
switch (name) {
|
|
134
|
+
case 'knowledge_list':
|
|
135
|
+
return await handleList(groupPath, args);
|
|
136
|
+
case 'knowledge_read':
|
|
137
|
+
return await handleRead(groupPath, group, args);
|
|
138
|
+
case 'knowledge_write':
|
|
139
|
+
return await handleWrite(groupPath, searchIndex, vectorStore, embeddingEngine, args);
|
|
140
|
+
case 'knowledge_delete':
|
|
141
|
+
return await handleDelete(groupPath, group, searchIndex, vectorStore, args);
|
|
142
|
+
case 'knowledge_group_info':
|
|
143
|
+
return await handleGroupInfo(groupPath, groupJsonPath);
|
|
144
|
+
case 'knowledge_search':
|
|
145
|
+
return await handleSearch(searchIndex, vectorStore, embeddingEngine, args);
|
|
146
|
+
default:
|
|
147
|
+
return { content: [{ type: 'text', text: 'Unknown tool: ' + name }], isError: true };
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
152
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
const transport = new StdioServerTransport();
|
|
156
|
+
await server.connect(transport);
|
|
157
|
+
}
|
|
158
|
+
async function handleList(groupPath, args) {
|
|
159
|
+
if (args.category) {
|
|
160
|
+
validateCategory(args.category);
|
|
161
|
+
}
|
|
162
|
+
const files = await listEntryFiles(groupPath, args.category);
|
|
163
|
+
const entries = [];
|
|
164
|
+
for (const filePath of files) {
|
|
165
|
+
try {
|
|
166
|
+
const entry = await parseEntry(filePath);
|
|
167
|
+
entries.push({
|
|
168
|
+
id: entry.id, title: entry.title, category: entry.category,
|
|
169
|
+
created: entry.created, tags: entry.tags, source_repo: entry.source_repo,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
catch { /* skip */ }
|
|
173
|
+
}
|
|
174
|
+
return { content: [{ type: 'text', text: JSON.stringify(entries, null, 2) }] };
|
|
175
|
+
}
|
|
176
|
+
async function handleRead(groupPath, groupName, args) {
|
|
177
|
+
if (!args.id) {
|
|
178
|
+
throw new Error('Parameter "id" is required.');
|
|
179
|
+
}
|
|
180
|
+
const filePath = await findEntryById(groupPath, args.id);
|
|
181
|
+
if (!filePath) {
|
|
182
|
+
throw new Error('Entry ' + JSON.stringify(args.id) + ' not found in group ' + JSON.stringify(groupName) + '.');
|
|
183
|
+
}
|
|
184
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
185
|
+
return { content: [{ type: 'text', text: content }] };
|
|
186
|
+
}
|
|
187
|
+
async function handleWrite(groupPath, searchIndex, vectorStore, embeddingEngine, args) {
|
|
188
|
+
if (!args.title || !args.title.trim()) {
|
|
189
|
+
throw new Error('Parameter "title" must be non-empty.');
|
|
190
|
+
}
|
|
191
|
+
if (!args.content || !args.content.trim()) {
|
|
192
|
+
throw new Error('Parameter "content" must be non-empty.');
|
|
193
|
+
}
|
|
194
|
+
const category = validateCategory(args.category);
|
|
195
|
+
const id = generateId(args.title);
|
|
196
|
+
const created = new Date().toISOString();
|
|
197
|
+
const metadata = {
|
|
198
|
+
id, title: args.title.trim(), category, created,
|
|
199
|
+
source_repo: args.source_repo, tags: args.tags || [],
|
|
200
|
+
};
|
|
201
|
+
const markdown = buildEntry(metadata, args.content);
|
|
202
|
+
const filePath = path.join(groupPath, category, id + '.md');
|
|
203
|
+
await atomicWriteFile(filePath, markdown);
|
|
204
|
+
const entry = {
|
|
205
|
+
id, title: metadata.title, category, created,
|
|
206
|
+
source_repo: args.source_repo, tags: metadata.tags, content: args.content,
|
|
207
|
+
};
|
|
208
|
+
searchIndex.add(entry);
|
|
209
|
+
if (embeddingEngine.isReady) {
|
|
210
|
+
try {
|
|
211
|
+
const textToEmbed = metadata.title + ' ' + args.content;
|
|
212
|
+
const vector = await embeddingEngine.embed(textToEmbed);
|
|
213
|
+
await vectorStore.add(id, vector, { category, title: metadata.title, content: args.content });
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
process.stderr.write('Failed to embed entry: ' + (err instanceof Error ? err.message : String(err)) + '\n');
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { content: [{ type: 'text', text: JSON.stringify({ id, path: filePath }, null, 2) }] };
|
|
220
|
+
}
|
|
221
|
+
async function handleDelete(groupPath, groupName, searchIndex, vectorStore, args) {
|
|
222
|
+
if (!args.id) {
|
|
223
|
+
throw new Error('Parameter "id" is required.');
|
|
224
|
+
}
|
|
225
|
+
const filePath = await findEntryById(groupPath, args.id);
|
|
226
|
+
if (!filePath) {
|
|
227
|
+
throw new Error('Entry ' + JSON.stringify(args.id) + ' not found in group ' + JSON.stringify(groupName) + '.');
|
|
228
|
+
}
|
|
229
|
+
await fs.remove(filePath);
|
|
230
|
+
searchIndex.remove(args.id);
|
|
231
|
+
await vectorStore.remove(args.id);
|
|
232
|
+
return {
|
|
233
|
+
content: [{ type: 'text', text: 'Deleted entry ' + JSON.stringify(args.id) + ' from group ' + JSON.stringify(groupName) + '.' }],
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
async function handleGroupInfo(groupPath, groupJsonPath) {
|
|
237
|
+
const raw = await fs.readFile(groupJsonPath, 'utf-8');
|
|
238
|
+
const groupData = JSON.parse(raw);
|
|
239
|
+
const categories = [];
|
|
240
|
+
let totalCount = 0;
|
|
241
|
+
for (const cat of VALID_CATEGORIES) {
|
|
242
|
+
const catDir = path.join(groupPath, cat);
|
|
243
|
+
let count = 0;
|
|
244
|
+
if (await fs.pathExists(catDir)) {
|
|
245
|
+
const files = await fs.readdir(catDir);
|
|
246
|
+
count = files.filter(f => f.endsWith('.md') && !f.startsWith('.')).length;
|
|
247
|
+
}
|
|
248
|
+
categories.push({ name: cat, count });
|
|
249
|
+
totalCount += count;
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
content: [{ type: 'text', text: JSON.stringify({
|
|
253
|
+
name: groupData.name, created: groupData.created, members: groupData.members,
|
|
254
|
+
entryCount: totalCount, categories, remote: groupData.remote,
|
|
255
|
+
}, null, 2) }],
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
async function handleSearch(searchIndex, vectorStore, embeddingEngine, args) {
|
|
259
|
+
if (!args.query || !args.query.trim()) {
|
|
260
|
+
throw new Error('Parameter "query" must be non-empty.');
|
|
261
|
+
}
|
|
262
|
+
const query = args.query.trim();
|
|
263
|
+
const mode = args.mode || 'hybrid';
|
|
264
|
+
const limit = args.limit ?? 5;
|
|
265
|
+
const category = args.category;
|
|
266
|
+
let results;
|
|
267
|
+
switch (mode) {
|
|
268
|
+
case 'keyword':
|
|
269
|
+
results = searchIndex.search(query, { category, limit });
|
|
270
|
+
break;
|
|
271
|
+
case 'semantic': {
|
|
272
|
+
if (!embeddingEngine.isReady) {
|
|
273
|
+
results = searchIndex.search(query, { category, limit })
|
|
274
|
+
.map(r => ({ ...r, degraded: true }));
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
const queryVector = await embeddingEngine.embed(query);
|
|
278
|
+
let semanticResults = vectorStore.search(queryVector, limit);
|
|
279
|
+
if (category) {
|
|
280
|
+
semanticResults = semanticResults.filter(r => r.category === category);
|
|
281
|
+
}
|
|
282
|
+
results = semanticResults.map(r => ({
|
|
283
|
+
id: r.id, title: r.title, category: r.category, snippet: r.snippet, score: r.score,
|
|
284
|
+
}));
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
case 'hybrid':
|
|
288
|
+
default:
|
|
289
|
+
results = await hybridSearch(query, searchIndex, vectorStore, embeddingEngine, { limit, category });
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };
|
|
293
|
+
}
|
|
294
|
+
//# sourceMappingURL=knowledge-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-server.js","sourceRoot":"","sources":["../../src/mcp/knowledge-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Valid knowledge entry categories.
|
|
3
|
+
*/
|
|
4
|
+
export declare const VALID_CATEGORIES: readonly ["decisions", "patterns", "constraints", "learnings", "context"];
|
|
5
|
+
export type KnowledgeCategory = typeof VALID_CATEGORIES[number];
|
|
6
|
+
/**
|
|
7
|
+
* Parsed metadata from a knowledge entry markdown file.
|
|
8
|
+
*/
|
|
9
|
+
export interface EntryMetadata {
|
|
10
|
+
id: string;
|
|
11
|
+
title: string;
|
|
12
|
+
category: KnowledgeCategory;
|
|
13
|
+
created: string;
|
|
14
|
+
source_repo?: string;
|
|
15
|
+
tags: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Full parsed knowledge entry (metadata + content body).
|
|
19
|
+
*/
|
|
20
|
+
export interface KnowledgeEntry extends EntryMetadata {
|
|
21
|
+
content: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate a category string against the allowed list.
|
|
25
|
+
* Returns the validated category or throws a descriptive error.
|
|
26
|
+
*/
|
|
27
|
+
export declare function validateCategory(category: string): KnowledgeCategory;
|
|
28
|
+
/**
|
|
29
|
+
* Convert a title to a filename-safe slug.
|
|
30
|
+
*/
|
|
31
|
+
export declare function slugify(title: string): string;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a unique entry ID with timestamp + milliseconds + slug.
|
|
34
|
+
* Format: YYYYMMDD-HHMMSS-mmm-slug
|
|
35
|
+
*/
|
|
36
|
+
export declare function generateId(title: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the base path for a knowledge group.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveGroupPath(groupName: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Parse entry content from a raw markdown string.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseEntryContent(raw: string, filePath: string): KnowledgeEntry;
|
|
45
|
+
/**
|
|
46
|
+
* Parse a knowledge entry markdown file into structured data.
|
|
47
|
+
*/
|
|
48
|
+
export declare function parseEntry(filePath: string): Promise<KnowledgeEntry>;
|
|
49
|
+
/**
|
|
50
|
+
* Build a markdown string from structured entry data.
|
|
51
|
+
*/
|
|
52
|
+
export declare function buildEntry(metadata: EntryMetadata, content: string): string;
|
|
53
|
+
/**
|
|
54
|
+
* Atomically write a file using temp file + rename.
|
|
55
|
+
*/
|
|
56
|
+
export declare function atomicWriteFile(filePath: string, content: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Find a knowledge entry file by ID across all category directories.
|
|
59
|
+
*/
|
|
60
|
+
export declare function findEntryById(groupPath: string, id: string): Promise<string | null>;
|
|
61
|
+
/**
|
|
62
|
+
* List all entry files in a group, optionally filtered by category.
|
|
63
|
+
*/
|
|
64
|
+
export declare function listEntryFiles(groupPath: string, category?: string): Promise<string[]>;
|
|
65
|
+
//# sourceMappingURL=knowledge-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-utils.d.ts","sourceRoot":"","sources":["../../src/mcp/knowledge-utils.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,eAAO,MAAM,gBAAgB,2EAA4E,CAAC;AAC1G,MAAM,MAAM,iBAAiB,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,aAAa;IACnD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAOpE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWhD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CA2E/E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAG1E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAkB3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQzF;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiB5F"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
/**
|
|
5
|
+
* Valid knowledge entry categories.
|
|
6
|
+
*/
|
|
7
|
+
export const VALID_CATEGORIES = ['decisions', 'patterns', 'constraints', 'learnings', 'context'];
|
|
8
|
+
/**
|
|
9
|
+
* Validate a category string against the allowed list.
|
|
10
|
+
* Returns the validated category or throws a descriptive error.
|
|
11
|
+
*/
|
|
12
|
+
export function validateCategory(category) {
|
|
13
|
+
if (!VALID_CATEGORIES.includes(category)) {
|
|
14
|
+
throw new Error('Invalid category \'' + category + '\'. Valid: ' + VALID_CATEGORIES.join(', '));
|
|
15
|
+
}
|
|
16
|
+
return category;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Convert a title to a filename-safe slug.
|
|
20
|
+
*/
|
|
21
|
+
export function slugify(title) {
|
|
22
|
+
return title
|
|
23
|
+
.toLowerCase()
|
|
24
|
+
.replace(/[^a-z0-9\s-]/g, '')
|
|
25
|
+
.replace(/\s+/g, '-')
|
|
26
|
+
.replace(/-+/g, '-')
|
|
27
|
+
.replace(/^-|-$/g, '')
|
|
28
|
+
.slice(0, 50);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a unique entry ID with timestamp + milliseconds + slug.
|
|
32
|
+
* Format: YYYYMMDD-HHMMSS-mmm-slug
|
|
33
|
+
*/
|
|
34
|
+
export function generateId(title) {
|
|
35
|
+
const now = new Date();
|
|
36
|
+
const yyyy = now.getFullYear().toString();
|
|
37
|
+
const MM = (now.getMonth() + 1).toString().padStart(2, '0');
|
|
38
|
+
const dd = now.getDate().toString().padStart(2, '0');
|
|
39
|
+
const HH = now.getHours().toString().padStart(2, '0');
|
|
40
|
+
const mm = now.getMinutes().toString().padStart(2, '0');
|
|
41
|
+
const ss = now.getSeconds().toString().padStart(2, '0');
|
|
42
|
+
const ms = now.getMilliseconds().toString().padStart(3, '0');
|
|
43
|
+
const slug = slugify(title);
|
|
44
|
+
return yyyy + MM + dd + '-' + HH + mm + ss + '-' + ms + '-' + slug;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Resolve the base path for a knowledge group.
|
|
48
|
+
*/
|
|
49
|
+
export function resolveGroupPath(groupName) {
|
|
50
|
+
return path.join(os.homedir(), '.archai', 'knowledge', 'groups', groupName);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Parse entry content from a raw markdown string.
|
|
54
|
+
*/
|
|
55
|
+
export function parseEntryContent(raw, filePath) {
|
|
56
|
+
const lines = raw.split('\n');
|
|
57
|
+
let title = '';
|
|
58
|
+
let titleLineIndex = -1;
|
|
59
|
+
for (let i = 0; i < lines.length; i++) {
|
|
60
|
+
const match = lines[i].match(/^#\s+(.+)/);
|
|
61
|
+
if (match) {
|
|
62
|
+
title = match[1].trim();
|
|
63
|
+
titleLineIndex = i;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
let category = '';
|
|
68
|
+
let created = '';
|
|
69
|
+
let source_repo;
|
|
70
|
+
let tags = [];
|
|
71
|
+
let metadataEndIndex = titleLineIndex + 1;
|
|
72
|
+
for (let i = titleLineIndex + 1; i < lines.length; i++) {
|
|
73
|
+
const metaMatch = lines[i].match(/^-\s+\*\*(.+?):\*\*\s*(.*)/);
|
|
74
|
+
if (metaMatch) {
|
|
75
|
+
const key = metaMatch[1].toLowerCase().trim();
|
|
76
|
+
const value = metaMatch[2].trim();
|
|
77
|
+
switch (key) {
|
|
78
|
+
case 'category':
|
|
79
|
+
category = value;
|
|
80
|
+
break;
|
|
81
|
+
case 'created':
|
|
82
|
+
created = value;
|
|
83
|
+
break;
|
|
84
|
+
case 'source':
|
|
85
|
+
source_repo = value || undefined;
|
|
86
|
+
break;
|
|
87
|
+
case 'tags':
|
|
88
|
+
tags = value.split(',').map(t => t.trim()).filter(Boolean);
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
metadataEndIndex = i + 1;
|
|
92
|
+
}
|
|
93
|
+
else if (lines[i].trim() === '') {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
else if (lines[i].startsWith('#')) {
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
else if (metadataEndIndex > titleLineIndex + 1) {
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const basename = path.basename(filePath, '.md');
|
|
104
|
+
const id = basename;
|
|
105
|
+
if (!category) {
|
|
106
|
+
const parentDir = path.basename(path.dirname(filePath));
|
|
107
|
+
if (VALID_CATEGORIES.includes(parentDir)) {
|
|
108
|
+
category = parentDir;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const contentLines = lines.slice(metadataEndIndex);
|
|
112
|
+
let contentStart = 0;
|
|
113
|
+
while (contentStart < contentLines.length && contentLines[contentStart].trim() === '') {
|
|
114
|
+
contentStart++;
|
|
115
|
+
}
|
|
116
|
+
const content = contentLines.slice(contentStart).join('\n').trimEnd();
|
|
117
|
+
return {
|
|
118
|
+
id,
|
|
119
|
+
title: title || basename,
|
|
120
|
+
category: (VALID_CATEGORIES.includes(category) ? category : 'context'),
|
|
121
|
+
created: created || '',
|
|
122
|
+
source_repo,
|
|
123
|
+
tags,
|
|
124
|
+
content,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Parse a knowledge entry markdown file into structured data.
|
|
129
|
+
*/
|
|
130
|
+
export async function parseEntry(filePath) {
|
|
131
|
+
const raw = await fs.readFile(filePath, 'utf-8');
|
|
132
|
+
return parseEntryContent(raw, filePath);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Build a markdown string from structured entry data.
|
|
136
|
+
*/
|
|
137
|
+
export function buildEntry(metadata, content) {
|
|
138
|
+
const lines = [];
|
|
139
|
+
lines.push('# ' + metadata.title);
|
|
140
|
+
lines.push('');
|
|
141
|
+
lines.push('- **Category:** ' + metadata.category);
|
|
142
|
+
lines.push('- **Created:** ' + metadata.created);
|
|
143
|
+
if (metadata.source_repo) {
|
|
144
|
+
lines.push('- **Source:** ' + metadata.source_repo);
|
|
145
|
+
}
|
|
146
|
+
if (metadata.tags.length > 0) {
|
|
147
|
+
lines.push('- **Tags:** ' + metadata.tags.join(', '));
|
|
148
|
+
}
|
|
149
|
+
lines.push('');
|
|
150
|
+
lines.push(content);
|
|
151
|
+
lines.push('');
|
|
152
|
+
return lines.join('\n');
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Atomically write a file using temp file + rename.
|
|
156
|
+
*/
|
|
157
|
+
export async function atomicWriteFile(filePath, content) {
|
|
158
|
+
const dir = path.dirname(filePath);
|
|
159
|
+
await fs.ensureDir(dir);
|
|
160
|
+
const rand = Math.random().toString(36).slice(2);
|
|
161
|
+
const tmpPath = path.join(dir, '.tmp.' + Date.now() + '.' + rand + '.md');
|
|
162
|
+
try {
|
|
163
|
+
await fs.writeFile(tmpPath, content, 'utf-8');
|
|
164
|
+
await fs.rename(tmpPath, filePath);
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
try {
|
|
168
|
+
await fs.remove(tmpPath);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// ignore cleanup errors
|
|
172
|
+
}
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Find a knowledge entry file by ID across all category directories.
|
|
178
|
+
*/
|
|
179
|
+
export async function findEntryById(groupPath, id) {
|
|
180
|
+
for (const category of VALID_CATEGORIES) {
|
|
181
|
+
const candidate = path.join(groupPath, category, id + '.md');
|
|
182
|
+
if (await fs.pathExists(candidate)) {
|
|
183
|
+
return candidate;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* List all entry files in a group, optionally filtered by category.
|
|
190
|
+
*/
|
|
191
|
+
export async function listEntryFiles(groupPath, category) {
|
|
192
|
+
const categories = category ? [category] : [...VALID_CATEGORIES];
|
|
193
|
+
const files = [];
|
|
194
|
+
for (const cat of categories) {
|
|
195
|
+
const catDir = path.join(groupPath, cat);
|
|
196
|
+
if (!(await fs.pathExists(catDir)))
|
|
197
|
+
continue;
|
|
198
|
+
const entries = await fs.readdir(catDir);
|
|
199
|
+
for (const entry of entries) {
|
|
200
|
+
if (entry.endsWith('.md') && !entry.startsWith('.')) {
|
|
201
|
+
files.push(path.join(catDir, entry));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return files;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=knowledge-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-utils.js","sourceRoot":"","sources":["../../src/mcp/knowledge-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { SearchIndex, KnowledgeEntry } from './search-index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create a search index for the given group.
|
|
4
|
+
* Tries SQLite FTS5 first (via better-sqlite3), falls back to MiniSearch (pure JS).
|
|
5
|
+
*
|
|
6
|
+
* Both better-sqlite3 and minisearch are loaded via dynamic import() for ESM compatibility.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createSearchIndex(groupPath: string, entries: KnowledgeEntry[]): Promise<SearchIndex>;
|
|
9
|
+
//# sourceMappingURL=search-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-factory.d.ts","sourceRoot":"","sources":["../../src/mcp/search-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAErE;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EAAE,GACxB,OAAO,CAAC,WAAW,CAAC,CAgBtB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Create a search index for the given group.
|
|
3
|
+
* Tries SQLite FTS5 first (via better-sqlite3), falls back to MiniSearch (pure JS).
|
|
4
|
+
*
|
|
5
|
+
* Both better-sqlite3 and minisearch are loaded via dynamic import() for ESM compatibility.
|
|
6
|
+
*/
|
|
7
|
+
export async function createSearchIndex(groupPath, entries) {
|
|
8
|
+
try {
|
|
9
|
+
const { default: Database } = await import('better-sqlite3');
|
|
10
|
+
const { createSqliteSearchIndex } = await import('./search-sqlite.js');
|
|
11
|
+
return await createSqliteSearchIndex(groupPath, Database, entries);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
process.stderr.write('SQLite unavailable, falling back to MiniSearch: ' + (err instanceof Error ? err.message : String(err)) + '\n');
|
|
15
|
+
const MiniSearchModule = await import('minisearch');
|
|
16
|
+
const MiniSearch = MiniSearchModule.default;
|
|
17
|
+
const { MiniSearchIndex } = await import('./search-minisearch.js');
|
|
18
|
+
const index = new MiniSearchIndex(MiniSearch);
|
|
19
|
+
index.rebuild(entries);
|
|
20
|
+
return index;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=search-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-factory.js","sourceRoot":"","sources":["../../src/mcp/search-factory.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,OAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAC7D,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvE,OAAO,MAAM,uBAAuB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,kDAAkD,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAC/G,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAC5C,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,UAAiB,CAAC,CAAC;QACrD,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|