context-gatekeeper 0.3.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/LICENSE +21 -0
- package/README.md +774 -0
- package/README.zh.md +765 -0
- package/bin/context-gatekeeper-cli.js +60 -0
- package/dist/api/gdpr.d.ts +104 -0
- package/dist/api/gdpr.d.ts.map +1 -0
- package/dist/api/gdpr.js +229 -0
- package/dist/api/gdpr.js.map +1 -0
- package/dist/api/health-check.d.ts +13 -0
- package/dist/api/health-check.d.ts.map +1 -0
- package/dist/api/health-check.js +2 -0
- package/dist/api/health-check.js.map +1 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/observability.d.ts +39 -0
- package/dist/api/observability.d.ts.map +1 -0
- package/dist/api/observability.js +132 -0
- package/dist/api/observability.js.map +1 -0
- package/dist/api/session-manager.d.ts +41 -0
- package/dist/api/session-manager.d.ts.map +1 -0
- package/dist/api/session-manager.js +129 -0
- package/dist/api/session-manager.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +613 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/configure-llm.d.ts +26 -0
- package/dist/mcp/tools/configure-llm.d.ts.map +1 -0
- package/dist/mcp/tools/configure-llm.js +32 -0
- package/dist/mcp/tools/configure-llm.js.map +1 -0
- package/dist/mcp/tools/context-compress.d.ts +15 -0
- package/dist/mcp/tools/context-compress.d.ts.map +1 -0
- package/dist/mcp/tools/context-compress.js +15 -0
- package/dist/mcp/tools/context-compress.js.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts +78 -0
- package/dist/mcp/tools/dual-mode-execute.d.ts.map +1 -0
- package/dist/mcp/tools/dual-mode-execute.js +299 -0
- package/dist/mcp/tools/dual-mode-execute.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +19 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +20 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/intelligent-recall.d.ts +67 -0
- package/dist/mcp/tools/intelligent-recall.d.ts.map +1 -0
- package/dist/mcp/tools/intelligent-recall.js +208 -0
- package/dist/mcp/tools/intelligent-recall.js.map +1 -0
- package/dist/mcp/tools/memory-anchor.d.ts +13 -0
- package/dist/mcp/tools/memory-anchor.d.ts.map +1 -0
- package/dist/mcp/tools/memory-anchor.js +16 -0
- package/dist/mcp/tools/memory-anchor.js.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts +16 -0
- package/dist/mcp/tools/memory-delete-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-delete-batch.js +26 -0
- package/dist/mcp/tools/memory-delete-batch.js.map +1 -0
- package/dist/mcp/tools/memory-extract.d.ts +68 -0
- package/dist/mcp/tools/memory-extract.d.ts.map +1 -0
- package/dist/mcp/tools/memory-extract.js +280 -0
- package/dist/mcp/tools/memory-extract.js.map +1 -0
- package/dist/mcp/tools/memory-recall.d.ts +42 -0
- package/dist/mcp/tools/memory-recall.d.ts.map +1 -0
- package/dist/mcp/tools/memory-recall.js +37 -0
- package/dist/mcp/tools/memory-recall.js.map +1 -0
- package/dist/mcp/tools/memory-report-usage.d.ts +17 -0
- package/dist/mcp/tools/memory-report-usage.d.ts.map +1 -0
- package/dist/mcp/tools/memory-report-usage.js +15 -0
- package/dist/mcp/tools/memory-report-usage.js.map +1 -0
- package/dist/mcp/tools/memory-search.d.ts +43 -0
- package/dist/mcp/tools/memory-search.d.ts.map +1 -0
- package/dist/mcp/tools/memory-search.js +38 -0
- package/dist/mcp/tools/memory-search.js.map +1 -0
- package/dist/mcp/tools/memory-session.d.ts +118 -0
- package/dist/mcp/tools/memory-session.d.ts.map +1 -0
- package/dist/mcp/tools/memory-session.js +113 -0
- package/dist/mcp/tools/memory-session.js.map +1 -0
- package/dist/mcp/tools/memory-stats.d.ts +10 -0
- package/dist/mcp/tools/memory-stats.d.ts.map +1 -0
- package/dist/mcp/tools/memory-stats.js +35 -0
- package/dist/mcp/tools/memory-stats.js.map +1 -0
- package/dist/mcp/tools/memory-store-batch.d.ts +49 -0
- package/dist/mcp/tools/memory-store-batch.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store-batch.js +48 -0
- package/dist/mcp/tools/memory-store-batch.js.map +1 -0
- package/dist/mcp/tools/memory-store.d.ts +37 -0
- package/dist/mcp/tools/memory-store.d.ts.map +1 -0
- package/dist/mcp/tools/memory-store.js +34 -0
- package/dist/mcp/tools/memory-store.js.map +1 -0
- package/dist/mcp/tools/project-create.d.ts +16 -0
- package/dist/mcp/tools/project-create.d.ts.map +1 -0
- package/dist/mcp/tools/project-create.js +14 -0
- package/dist/mcp/tools/project-create.js.map +1 -0
- package/dist/models/types.d.ts +88 -0
- package/dist/models/types.d.ts.map +1 -0
- package/dist/models/types.js +19 -0
- package/dist/models/types.js.map +1 -0
- package/dist/schema/compression.d.ts +7 -0
- package/dist/schema/compression.d.ts.map +1 -0
- package/dist/schema/compression.js +66 -0
- package/dist/schema/compression.js.map +1 -0
- package/dist/schema/fulltext-search.d.ts +10 -0
- package/dist/schema/fulltext-search.d.ts.map +1 -0
- package/dist/schema/fulltext-search.js +73 -0
- package/dist/schema/fulltext-search.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +9 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/knowledge-graph.d.ts +108 -0
- package/dist/schema/knowledge-graph.d.ts.map +1 -0
- package/dist/schema/knowledge-graph.js +372 -0
- package/dist/schema/knowledge-graph.js.map +1 -0
- package/dist/schema/memory-session.d.ts +62 -0
- package/dist/schema/memory-session.d.ts.map +1 -0
- package/dist/schema/memory-session.js +258 -0
- package/dist/schema/memory-session.js.map +1 -0
- package/dist/schema/memory.d.ts +84 -0
- package/dist/schema/memory.d.ts.map +1 -0
- package/dist/schema/memory.js +622 -0
- package/dist/schema/memory.js.map +1 -0
- package/dist/schema/project.d.ts +8 -0
- package/dist/schema/project.d.ts.map +1 -0
- package/dist/schema/project.js +68 -0
- package/dist/schema/project.js.map +1 -0
- package/dist/schema/schema-init.d.ts +2 -0
- package/dist/schema/schema-init.d.ts.map +1 -0
- package/dist/schema/schema-init.js +199 -0
- package/dist/schema/schema-init.js.map +1 -0
- package/dist/schema/vector-index.d.ts +28 -0
- package/dist/schema/vector-index.d.ts.map +1 -0
- package/dist/schema/vector-index.js +179 -0
- package/dist/schema/vector-index.js.map +1 -0
- package/dist/scripts/agents/base.d.ts +89 -0
- package/dist/scripts/agents/base.d.ts.map +1 -0
- package/dist/scripts/agents/base.js +148 -0
- package/dist/scripts/agents/base.js.map +1 -0
- package/dist/scripts/agents/base.ts +193 -0
- package/dist/scripts/agents/claude-code.d.ts +21 -0
- package/dist/scripts/agents/claude-code.d.ts.map +1 -0
- package/dist/scripts/agents/claude-code.js +33 -0
- package/dist/scripts/agents/claude-code.js.map +1 -0
- package/dist/scripts/agents/claude-code.ts +36 -0
- package/dist/scripts/agents/claude-desktop.d.ts +25 -0
- package/dist/scripts/agents/claude-desktop.d.ts.map +1 -0
- package/dist/scripts/agents/claude-desktop.js +36 -0
- package/dist/scripts/agents/claude-desktop.js.map +1 -0
- package/dist/scripts/agents/claude-desktop.ts +39 -0
- package/dist/scripts/agents/cline.d.ts +22 -0
- package/dist/scripts/agents/cline.d.ts.map +1 -0
- package/dist/scripts/agents/cline.js +35 -0
- package/dist/scripts/agents/cline.js.map +1 -0
- package/dist/scripts/agents/cline.ts +38 -0
- package/dist/scripts/agents/continue.d.ts +20 -0
- package/dist/scripts/agents/continue.d.ts.map +1 -0
- package/dist/scripts/agents/continue.js +35 -0
- package/dist/scripts/agents/continue.js.map +1 -0
- package/dist/scripts/agents/continue.ts +38 -0
- package/dist/scripts/agents/cursor.d.ts +27 -0
- package/dist/scripts/agents/cursor.d.ts.map +1 -0
- package/dist/scripts/agents/cursor.js +38 -0
- package/dist/scripts/agents/cursor.js.map +1 -0
- package/dist/scripts/agents/cursor.ts +41 -0
- package/dist/scripts/cli/config-gen.d.ts +59 -0
- package/dist/scripts/cli/config-gen.d.ts.map +1 -0
- package/dist/scripts/cli/config-gen.js +156 -0
- package/dist/scripts/cli/config-gen.js.map +1 -0
- package/dist/scripts/cli/config-gen.ts +164 -0
- package/dist/scripts/cli/detect.d.ts +42 -0
- package/dist/scripts/cli/detect.d.ts.map +1 -0
- package/dist/scripts/cli/detect.js +131 -0
- package/dist/scripts/cli/detect.js.map +1 -0
- package/dist/scripts/cli/detect.ts +162 -0
- package/dist/scripts/cli/install.d.ts +31 -0
- package/dist/scripts/cli/install.d.ts.map +1 -0
- package/dist/scripts/cli/install.js +125 -0
- package/dist/scripts/cli/install.js.map +1 -0
- package/dist/scripts/cli/install.ts +157 -0
- package/dist/scripts/cli/status.d.ts +8 -0
- package/dist/scripts/cli/status.d.ts.map +1 -0
- package/dist/scripts/cli/status.js +39 -0
- package/dist/scripts/cli/status.js.map +1 -0
- package/dist/scripts/cli/status.ts +48 -0
- package/dist/scripts/cli/uninstall.d.ts +22 -0
- package/dist/scripts/cli/uninstall.d.ts.map +1 -0
- package/dist/scripts/cli/uninstall.js +141 -0
- package/dist/scripts/cli/uninstall.js.map +1 -0
- package/dist/scripts/cli/uninstall.ts +157 -0
- package/dist/scripts/cli.d.ts +23 -0
- package/dist/scripts/cli.d.ts.map +1 -0
- package/dist/scripts/cli.js +166 -0
- package/dist/scripts/cli.js.map +1 -0
- package/dist/scripts/cli.ts +173 -0
- package/dist/services/classifier/index.d.ts +36 -0
- package/dist/services/classifier/index.d.ts.map +1 -0
- package/dist/services/classifier/index.js +104 -0
- package/dist/services/classifier/index.js.map +1 -0
- package/dist/services/classifier/llm.d.ts +37 -0
- package/dist/services/classifier/llm.d.ts.map +1 -0
- package/dist/services/classifier/llm.js +119 -0
- package/dist/services/classifier/llm.js.map +1 -0
- package/dist/services/classifier/rules.d.ts +22 -0
- package/dist/services/classifier/rules.d.ts.map +1 -0
- package/dist/services/classifier/rules.js +98 -0
- package/dist/services/classifier/rules.js.map +1 -0
- package/dist/services/compressor/index.d.ts +3 -0
- package/dist/services/compressor/index.d.ts.map +1 -0
- package/dist/services/compressor/index.js +3 -0
- package/dist/services/compressor/index.js.map +1 -0
- package/dist/services/compressor/threshold.d.ts +35 -0
- package/dist/services/compressor/threshold.d.ts.map +1 -0
- package/dist/services/compressor/threshold.js +60 -0
- package/dist/services/compressor/threshold.js.map +1 -0
- package/dist/services/compressor/trigger.d.ts +24 -0
- package/dist/services/compressor/trigger.d.ts.map +1 -0
- package/dist/services/compressor/trigger.js +91 -0
- package/dist/services/compressor/trigger.js.map +1 -0
- package/dist/services/constraint-extractor.d.ts +25 -0
- package/dist/services/constraint-extractor.d.ts.map +1 -0
- package/dist/services/constraint-extractor.js +97 -0
- package/dist/services/constraint-extractor.js.map +1 -0
- package/dist/services/database-health.d.ts +22 -0
- package/dist/services/database-health.d.ts.map +1 -0
- package/dist/services/database-health.js +122 -0
- package/dist/services/database-health.js.map +1 -0
- package/dist/services/embedding-fixed.d.ts +9 -0
- package/dist/services/embedding-fixed.d.ts.map +1 -0
- package/dist/services/embedding-fixed.js +70 -0
- package/dist/services/embedding-fixed.js.map +1 -0
- package/dist/services/embedding-provider.d.ts +79 -0
- package/dist/services/embedding-provider.d.ts.map +1 -0
- package/dist/services/embedding-provider.js +229 -0
- package/dist/services/embedding-provider.js.map +1 -0
- package/dist/services/embedding.d.ts +17 -0
- package/dist/services/embedding.d.ts.map +1 -0
- package/dist/services/embedding.js +99 -0
- package/dist/services/embedding.js.map +1 -0
- package/dist/services/hnsw-index.d.ts +76 -0
- package/dist/services/hnsw-index.d.ts.map +1 -0
- package/dist/services/hnsw-index.js +301 -0
- package/dist/services/hnsw-index.js.map +1 -0
- package/dist/services/llm.d.ts +39 -0
- package/dist/services/llm.d.ts.map +1 -0
- package/dist/services/llm.js +207 -0
- package/dist/services/llm.js.map +1 -0
- package/dist/services/memory-tiers.d.ts +75 -0
- package/dist/services/memory-tiers.d.ts.map +1 -0
- package/dist/services/memory-tiers.js +275 -0
- package/dist/services/memory-tiers.js.map +1 -0
- package/dist/services/memory.d.ts +33 -0
- package/dist/services/memory.d.ts.map +1 -0
- package/dist/services/memory.js +209 -0
- package/dist/services/memory.js.map +1 -0
- package/dist/services/multi-agent-sharing.d.ts +83 -0
- package/dist/services/multi-agent-sharing.d.ts.map +1 -0
- package/dist/services/multi-agent-sharing.js +278 -0
- package/dist/services/multi-agent-sharing.js.map +1 -0
- package/dist/services/reranker.d.ts +88 -0
- package/dist/services/reranker.d.ts.map +1 -0
- package/dist/services/reranker.js +234 -0
- package/dist/services/reranker.js.map +1 -0
- package/dist/services/triple-extractor.d.ts +35 -0
- package/dist/services/triple-extractor.d.ts.map +1 -0
- package/dist/services/triple-extractor.js +293 -0
- package/dist/services/triple-extractor.js.map +1 -0
- package/dist/services/vector-provider.d.ts +40 -0
- package/dist/services/vector-provider.d.ts.map +1 -0
- package/dist/services/vector-provider.js +225 -0
- package/dist/services/vector-provider.js.map +1 -0
- package/dist/utils/after-chain-executor.d.ts +26 -0
- package/dist/utils/after-chain-executor.d.ts.map +1 -0
- package/dist/utils/after-chain-executor.js +135 -0
- package/dist/utils/after-chain-executor.js.map +1 -0
- package/dist/utils/after-chain.d.ts +94 -0
- package/dist/utils/after-chain.d.ts.map +1 -0
- package/dist/utils/after-chain.js +155 -0
- package/dist/utils/after-chain.js.map +1 -0
- package/dist/utils/db.d.ts +29 -0
- package/dist/utils/db.d.ts.map +1 -0
- package/dist/utils/db.js +201 -0
- package/dist/utils/db.js.map +1 -0
- package/dist/utils/encryption.d.ts +87 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +175 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +56 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +177 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/priority.d.ts +26 -0
- package/dist/utils/priority.d.ts.map +1 -0
- package/dist/utils/priority.js +43 -0
- package/dist/utils/priority.js.map +1 -0
- package/dist/utils/watchdog.d.ts +57 -0
- package/dist/utils/watchdog.d.ts.map +1 -0
- package/dist/utils/watchdog.js +164 -0
- package/dist/utils/watchdog.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* context-gatekeeper install helper CLI.
|
|
4
|
+
*
|
|
5
|
+
* Subcommands:
|
|
6
|
+
* install [agent ...] - merge the MCP entry into one or more agents' configs
|
|
7
|
+
* uninstall [agent ...] - remove the MCP entry from one or more agents' configs
|
|
8
|
+
* status - print a table of detected agents and install state
|
|
9
|
+
* help - print usage
|
|
10
|
+
*
|
|
11
|
+
* Examples:
|
|
12
|
+
* npx context-gatekeeper install --all
|
|
13
|
+
* npx context-gatekeeper install cursor claude-code
|
|
14
|
+
* npx context-gatekeeper uninstall --all
|
|
15
|
+
* npx context-gatekeeper status
|
|
16
|
+
*
|
|
17
|
+
* Exit codes:
|
|
18
|
+
* 0 - success
|
|
19
|
+
* 1 - one or more operations failed (or were skipped, for uninstall)
|
|
20
|
+
* 2 - invalid usage
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { installAgents, InstallResult } from './cli/install.ts';
|
|
24
|
+
import { uninstallAgents, UninstallResult } from './cli/uninstall.ts';
|
|
25
|
+
import { printStatus } from './cli/status.ts';
|
|
26
|
+
import { detectAll, isValidAgent, AgentName, SUPPORTED_AGENTS } from './cli/detect.ts';
|
|
27
|
+
|
|
28
|
+
const HELP = `context-gatekeeper installer
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
context-gatekeeper install [agent ...] [--all] [--local]
|
|
32
|
+
context-gatekeeper uninstall [agent ...] [--all] [--local]
|
|
33
|
+
context-gatekeeper status [--local]
|
|
34
|
+
context-gatekeeper help
|
|
35
|
+
|
|
36
|
+
Agents:
|
|
37
|
+
${SUPPORTED_AGENTS.join(', ')}
|
|
38
|
+
|
|
39
|
+
Options:
|
|
40
|
+
--all target every supported agent (default for uninstall when none given)
|
|
41
|
+
--local write to project-local config (./.cursor/mcp.json, etc.) instead of global
|
|
42
|
+
(Claude Desktop is always global-only)
|
|
43
|
+
|
|
44
|
+
Examples:
|
|
45
|
+
context-gatekeeper install --all
|
|
46
|
+
context-gatekeeper install cursor claude-code
|
|
47
|
+
context-gatekeeper uninstall cursor
|
|
48
|
+
context-gatekeeper status
|
|
49
|
+
`;
|
|
50
|
+
|
|
51
|
+
interface ParsedArgs {
|
|
52
|
+
command: string;
|
|
53
|
+
positional: string[];
|
|
54
|
+
flags: Set<string>;
|
|
55
|
+
flagValues: Map<string, string>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function parseArgs(argv: string[]): ParsedArgs {
|
|
59
|
+
const [command = 'help', ...rest] = argv;
|
|
60
|
+
const positional: string[] = [];
|
|
61
|
+
const flags = new Set<string>();
|
|
62
|
+
const flagValues = new Map<string, string>();
|
|
63
|
+
for (let i = 0; i < rest.length; i++) {
|
|
64
|
+
const a = rest[i];
|
|
65
|
+
if (a.startsWith('--')) {
|
|
66
|
+
const eq = a.indexOf('=');
|
|
67
|
+
if (eq >= 0) {
|
|
68
|
+
const name = a.slice(2, eq);
|
|
69
|
+
const value = a.slice(eq + 1);
|
|
70
|
+
flags.add(name);
|
|
71
|
+
flagValues.set(name, value);
|
|
72
|
+
} else {
|
|
73
|
+
const name = a.slice(2);
|
|
74
|
+
const next = rest[i + 1];
|
|
75
|
+
if (next !== undefined && !next.startsWith('--') && TAKES_VALUE.has(name)) {
|
|
76
|
+
flags.add(name);
|
|
77
|
+
flagValues.set(name, next);
|
|
78
|
+
i++;
|
|
79
|
+
} else {
|
|
80
|
+
flags.add(name);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
positional.push(a);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { command, positional, flags, flagValues };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const TAKES_VALUE = new Set(['cwd']);
|
|
91
|
+
|
|
92
|
+
function resolveAgents(positional: string[], allFlag: boolean): AgentName[] {
|
|
93
|
+
if (allFlag) return [...SUPPORTED_AGENTS];
|
|
94
|
+
if (positional.length === 0) return [];
|
|
95
|
+
const invalid = positional.filter((a) => !isValidAgent(a));
|
|
96
|
+
if (invalid.length > 0) {
|
|
97
|
+
console.error(`Unknown agent(s): ${invalid.join(', ')}`);
|
|
98
|
+
console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
|
|
99
|
+
process.exit(2);
|
|
100
|
+
}
|
|
101
|
+
return positional as AgentName[];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function reportInstall(results: InstallResult[]): number {
|
|
105
|
+
let failed = 0;
|
|
106
|
+
for (const r of results) {
|
|
107
|
+
const tag = r.status === 'error' ? 'ERROR' : r.status.toUpperCase().padEnd(9);
|
|
108
|
+
console.log(`[${tag}] ${r.agent.padEnd(15)} ${r.configPath}`);
|
|
109
|
+
if (r.message) console.log(` ${r.message}`);
|
|
110
|
+
if (r.status === 'error') failed++;
|
|
111
|
+
}
|
|
112
|
+
return failed === 0 ? 0 : 1;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function reportUninstall(results: UninstallResult[]): number {
|
|
116
|
+
let failed = 0;
|
|
117
|
+
for (const r of results) {
|
|
118
|
+
const tag = r.status === 'error' ? 'ERROR' : r.status.toUpperCase().padEnd(9);
|
|
119
|
+
console.log(`[${tag}] ${r.agent.padEnd(15)} ${r.configPath}`);
|
|
120
|
+
if (r.message) console.log(` ${r.message}`);
|
|
121
|
+
if (r.status === 'error') failed++;
|
|
122
|
+
}
|
|
123
|
+
return failed === 0 ? 0 : 1;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function main(argv: string[]): number {
|
|
127
|
+
const { command, positional, flags, flagValues } = parseArgs(argv);
|
|
128
|
+
const scope = flags.has('local') ? 'project' : 'global';
|
|
129
|
+
const allFlag = flags.has('all');
|
|
130
|
+
const cwd = flagValues.get('cwd');
|
|
131
|
+
const opts = cwd ? { scope, cwd } : { scope };
|
|
132
|
+
|
|
133
|
+
switch (command) {
|
|
134
|
+
case 'help':
|
|
135
|
+
case '--help':
|
|
136
|
+
case '-h': {
|
|
137
|
+
console.log(HELP);
|
|
138
|
+
return 0;
|
|
139
|
+
}
|
|
140
|
+
case 'install': {
|
|
141
|
+
const agents = resolveAgents(positional, allFlag);
|
|
142
|
+
if (agents.length === 0) {
|
|
143
|
+
console.error('No agents specified. Use --all or pass agent names.');
|
|
144
|
+
console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
|
|
145
|
+
return 2;
|
|
146
|
+
}
|
|
147
|
+
const results = installAgents(agents, opts);
|
|
148
|
+
return reportInstall(results);
|
|
149
|
+
}
|
|
150
|
+
case 'uninstall': {
|
|
151
|
+
const agents = resolveAgents(positional, allFlag);
|
|
152
|
+
if (agents.length === 0) {
|
|
153
|
+
console.error('No agents specified. Use --all or pass agent names.');
|
|
154
|
+
console.error(`Available: ${SUPPORTED_AGENTS.join(', ')}`);
|
|
155
|
+
return 2;
|
|
156
|
+
}
|
|
157
|
+
const results = uninstallAgents(agents, opts);
|
|
158
|
+
return reportUninstall(results);
|
|
159
|
+
}
|
|
160
|
+
case 'status': {
|
|
161
|
+
printStatus(detectAll(opts));
|
|
162
|
+
return 0;
|
|
163
|
+
}
|
|
164
|
+
default: {
|
|
165
|
+
console.error(`Unknown command: ${command}`);
|
|
166
|
+
console.log(HELP);
|
|
167
|
+
return 2;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const exitCode = main(process.argv.slice(2));
|
|
173
|
+
process.exit(exitCode);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Memory } from '../../models/types.js';
|
|
2
|
+
import { LLMConfig } from './llm.js';
|
|
3
|
+
export interface ClassificationResult {
|
|
4
|
+
memory: Memory;
|
|
5
|
+
relevance: number;
|
|
6
|
+
matchedBy: 'rule' | 'llm' | 'both';
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Hybrid Classifier - combines rule-based and LLM-based classification
|
|
10
|
+
*/
|
|
11
|
+
export declare class HybridClassifier {
|
|
12
|
+
private memoryService;
|
|
13
|
+
private llmClassifier;
|
|
14
|
+
constructor(llmConfig?: LLMConfig);
|
|
15
|
+
/**
|
|
16
|
+
* Configure LLM settings
|
|
17
|
+
*/
|
|
18
|
+
configureLLM(config: Partial<LLMConfig>): void;
|
|
19
|
+
/**
|
|
20
|
+
* Classify and rank memories for a given user input
|
|
21
|
+
*
|
|
22
|
+
* Process:
|
|
23
|
+
* 1. Rule-based quick filter (anchored + constraint)
|
|
24
|
+
* 2. LLM-based precise classification
|
|
25
|
+
* 3. Merge and deduplicate results
|
|
26
|
+
* 4. Sort by relevance
|
|
27
|
+
*/
|
|
28
|
+
classify(userInput: string, projectTags?: string[], limit?: number): Promise<ClassificationResult[]>;
|
|
29
|
+
/**
|
|
30
|
+
* Quick classify using only rules (no LLM)
|
|
31
|
+
* Useful when LLM is unavailable
|
|
32
|
+
*/
|
|
33
|
+
classifyWithRules(userInput: string, projectTags?: string[], limit?: number): ClassificationResult[];
|
|
34
|
+
}
|
|
35
|
+
export declare function getHybridClassifier(llmConfig?: LLMConfig): HybridClassifier;
|
|
36
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAG/C,OAAO,EAAmC,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,aAAa,CAAgB;gBAEzB,SAAS,CAAC,EAAE,SAAS;IAIjC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAI9C;;;;;;;;OAQG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,oBAAoB,EAAE,CAAC;IA2DlC;;;OAGG;IACH,iBAAiB,CACf,SAAS,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EAAE,EACtB,KAAK,GAAE,MAAW,GACjB,oBAAoB,EAAE;CAa1B;AAKD,wBAAgB,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAK3E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { getMemoryService } from '../memory.js';
|
|
2
|
+
import { extractKeywords, extractFileTypes, quickFilterHighPriority } from './rules.js';
|
|
3
|
+
import { getLLMClassifier } from './llm.js';
|
|
4
|
+
/**
|
|
5
|
+
* Hybrid Classifier - combines rule-based and LLM-based classification
|
|
6
|
+
*/
|
|
7
|
+
export class HybridClassifier {
|
|
8
|
+
memoryService = getMemoryService();
|
|
9
|
+
llmClassifier;
|
|
10
|
+
constructor(llmConfig) {
|
|
11
|
+
this.llmClassifier = getLLMClassifier(llmConfig);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Configure LLM settings
|
|
15
|
+
*/
|
|
16
|
+
configureLLM(config) {
|
|
17
|
+
this.llmClassifier.configure(config);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Classify and rank memories for a given user input
|
|
21
|
+
*
|
|
22
|
+
* Process:
|
|
23
|
+
* 1. Rule-based quick filter (anchored + constraint)
|
|
24
|
+
* 2. LLM-based precise classification
|
|
25
|
+
* 3. Merge and deduplicate results
|
|
26
|
+
* 4. Sort by relevance
|
|
27
|
+
*/
|
|
28
|
+
async classify(userInput, projectTags, limit = 10) {
|
|
29
|
+
// Extract features for rule matching
|
|
30
|
+
const keywords = extractKeywords(userInput);
|
|
31
|
+
const fileTypes = extractFileTypes(userInput);
|
|
32
|
+
// Step 1: Rule-based quick filter
|
|
33
|
+
const allMemories = this.memoryService.listAllMemories(projectTags);
|
|
34
|
+
const ruleMatches = quickFilterHighPriority(allMemories, keywords, fileTypes);
|
|
35
|
+
// Step 2: LLM-based precise classification
|
|
36
|
+
let llmResults = [];
|
|
37
|
+
try {
|
|
38
|
+
llmResults = await this.llmClassifier.classify(userInput, allMemories);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
// LLM failed, continue with rules only
|
|
42
|
+
}
|
|
43
|
+
// Step 3: Merge results
|
|
44
|
+
const resultsMap = new Map();
|
|
45
|
+
// Add rule matches
|
|
46
|
+
for (const memory of ruleMatches) {
|
|
47
|
+
resultsMap.set(memory.id, {
|
|
48
|
+
memory,
|
|
49
|
+
relevance: 0.8, // Rule matches get high base relevance
|
|
50
|
+
matchedBy: 'rule'
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// Add LLM matches (boost if already matched by rules)
|
|
54
|
+
for (const { memoryId, relevance } of llmResults) {
|
|
55
|
+
const existing = resultsMap.get(memoryId);
|
|
56
|
+
if (existing) {
|
|
57
|
+
existing.relevance = Math.min(1.0, existing.relevance + relevance * 0.2);
|
|
58
|
+
existing.matchedBy = 'both';
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
const memory = this.memoryService.getMemory(memoryId);
|
|
62
|
+
if (memory) {
|
|
63
|
+
resultsMap.set(memoryId, {
|
|
64
|
+
memory,
|
|
65
|
+
relevance,
|
|
66
|
+
matchedBy: 'llm'
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Step 4: Sort by relevance
|
|
72
|
+
const results = Array.from(resultsMap.values());
|
|
73
|
+
results.sort((a, b) => b.relevance - a.relevance);
|
|
74
|
+
// Update access counts for returned memories
|
|
75
|
+
for (const result of results) {
|
|
76
|
+
this.memoryService.getMemory(result.memory.id); // Triggers access count increment
|
|
77
|
+
}
|
|
78
|
+
return results.slice(0, limit);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Quick classify using only rules (no LLM)
|
|
82
|
+
* Useful when LLM is unavailable
|
|
83
|
+
*/
|
|
84
|
+
classifyWithRules(userInput, projectTags, limit = 10) {
|
|
85
|
+
const keywords = extractKeywords(userInput);
|
|
86
|
+
const fileTypes = extractFileTypes(userInput);
|
|
87
|
+
const allMemories = this.memoryService.listAllMemories(projectTags);
|
|
88
|
+
const ruleMatches = quickFilterHighPriority(allMemories, keywords, fileTypes);
|
|
89
|
+
return ruleMatches.slice(0, limit).map(memory => ({
|
|
90
|
+
memory,
|
|
91
|
+
relevance: 0.8,
|
|
92
|
+
matchedBy: 'rule'
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Singleton instance
|
|
97
|
+
let hybridClassifierInstance = null;
|
|
98
|
+
export function getHybridClassifier(llmConfig) {
|
|
99
|
+
if (!hybridClassifierInstance) {
|
|
100
|
+
hybridClassifierInstance = new HybridClassifier(llmConfig);
|
|
101
|
+
}
|
|
102
|
+
return hybridClassifierInstance;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/classifier/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Memory } from '../../models/types.js';
|
|
2
|
+
export interface LLMConfig {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
model?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ClassifierResult {
|
|
8
|
+
memoryId: string;
|
|
9
|
+
relevance: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Default LLM classifier using the agent's own model
|
|
13
|
+
* This can be overridden by user configuration
|
|
14
|
+
*/
|
|
15
|
+
export declare class LLMClassifier {
|
|
16
|
+
private config;
|
|
17
|
+
constructor(config?: LLMConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Configure the LLM settings
|
|
20
|
+
*/
|
|
21
|
+
configure(config: Partial<LLMConfig>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Classify memories using LLM
|
|
24
|
+
* Returns memory IDs with relevance scores
|
|
25
|
+
*/
|
|
26
|
+
classify(userInput: string, memories: Memory[]): Promise<ClassifierResult[]>;
|
|
27
|
+
/**
|
|
28
|
+
* Call the LLM API
|
|
29
|
+
*/
|
|
30
|
+
private callLLM;
|
|
31
|
+
/**
|
|
32
|
+
* Parse LLM response to extract memory IDs
|
|
33
|
+
*/
|
|
34
|
+
private parseLLMResponse;
|
|
35
|
+
}
|
|
36
|
+
export declare function getLLMClassifier(config?: LLMConfig): LLMClassifier;
|
|
37
|
+
//# sourceMappingURL=llm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAI/C,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AA2BD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,GAAE,SAAc;IAOlC;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IAI3C;;;OAGG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAoB9B;;OAEG;YACW,OAAO;IAgCrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;CAYzB;AAKD,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,aAAa,CAOlE"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { LLMError } from '../../utils/errors.js';
|
|
2
|
+
import { logger } from '../../utils/logger.js';
|
|
3
|
+
/**
|
|
4
|
+
* Build the prompt for LLM-based memory classification
|
|
5
|
+
*/
|
|
6
|
+
function buildClassificationPrompt(userInput, memories) {
|
|
7
|
+
const memoryList = memories
|
|
8
|
+
.map(m => `- [${m.id}] (${m.priority}${m.anchored ? ', anchored' : ''}): ${m.content}`)
|
|
9
|
+
.join('\n');
|
|
10
|
+
return `Given the following user input and available memories, identify which memories are relevant to inject into the context.
|
|
11
|
+
|
|
12
|
+
User Input:
|
|
13
|
+
${userInput}
|
|
14
|
+
|
|
15
|
+
Available Memories:
|
|
16
|
+
${memoryList}
|
|
17
|
+
|
|
18
|
+
Respond with a JSON array of memory IDs that should be injected, ordered by relevance (most relevant first).
|
|
19
|
+
Format: ["memory-id-1", "memory-id-2", ...]
|
|
20
|
+
If no memories are relevant, respond with an empty array: []
|
|
21
|
+
Only respond with the JSON array, nothing else.`;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Default LLM classifier using the agent's own model
|
|
25
|
+
* This can be overridden by user configuration
|
|
26
|
+
*/
|
|
27
|
+
export class LLMClassifier {
|
|
28
|
+
config;
|
|
29
|
+
constructor(config = {}) {
|
|
30
|
+
this.config = {
|
|
31
|
+
model: 'gpt-4o',
|
|
32
|
+
...config
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Configure the LLM settings
|
|
37
|
+
*/
|
|
38
|
+
configure(config) {
|
|
39
|
+
this.config = { ...this.config, ...config };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Classify memories using LLM
|
|
43
|
+
* Returns memory IDs with relevance scores
|
|
44
|
+
*/
|
|
45
|
+
async classify(userInput, memories) {
|
|
46
|
+
if (memories.length === 0) {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
const prompt = buildClassificationPrompt(userInput, memories);
|
|
50
|
+
try {
|
|
51
|
+
const response = await this.callLLM(prompt);
|
|
52
|
+
const memoryIds = this.parseLLMResponse(response);
|
|
53
|
+
// Calculate relevance scores (uniform initially, could be refined)
|
|
54
|
+
return memoryIds.map(id => ({ memoryId: id, relevance: 1.0 }));
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// Don't throw - let the fallback handle it
|
|
58
|
+
logger.error('LLM classification failed', { error: error instanceof Error ? error.message : String(error) });
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Call the LLM API
|
|
64
|
+
*/
|
|
65
|
+
async callLLM(prompt) {
|
|
66
|
+
const { apiKey, baseUrl, model } = this.config;
|
|
67
|
+
// If no API key is configured, we can't make the call
|
|
68
|
+
if (!apiKey) {
|
|
69
|
+
throw new LLMError('No LLM API key configured');
|
|
70
|
+
}
|
|
71
|
+
const url = baseUrl || 'https://api.openai.com/v1/chat/completions';
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: {
|
|
75
|
+
'Content-Type': 'application/json',
|
|
76
|
+
'Authorization': `Bearer ${apiKey}`
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify({
|
|
79
|
+
model: model || 'gpt-4o',
|
|
80
|
+
messages: [{ role: 'user', content: prompt }],
|
|
81
|
+
max_tokens: 500,
|
|
82
|
+
temperature: 0.1
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
if (!response.ok) {
|
|
86
|
+
throw new LLMError(`LLM API error: ${response.status} ${response.statusText}`);
|
|
87
|
+
}
|
|
88
|
+
const data = await response.json();
|
|
89
|
+
return data.choices[0]?.message?.content || '[]';
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parse LLM response to extract memory IDs
|
|
93
|
+
*/
|
|
94
|
+
parseLLMResponse(response) {
|
|
95
|
+
try {
|
|
96
|
+
// Try to extract JSON from the response
|
|
97
|
+
const jsonMatch = response.match(/\[[\s\S]*\]/);
|
|
98
|
+
if (jsonMatch) {
|
|
99
|
+
return JSON.parse(jsonMatch[0]);
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Singleton instance
|
|
109
|
+
let llmClassifierInstance = null;
|
|
110
|
+
export function getLLMClassifier(config) {
|
|
111
|
+
if (!llmClassifierInstance) {
|
|
112
|
+
llmClassifierInstance = new LLMClassifier(config);
|
|
113
|
+
}
|
|
114
|
+
else if (config) {
|
|
115
|
+
llmClassifierInstance.configure(config);
|
|
116
|
+
}
|
|
117
|
+
return llmClassifierInstance;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sourceRoot":"","sources":["../../../src/services/classifier/llm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Memory } from '../../models/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Extract keywords from user input for rule-based matching
|
|
4
|
+
*/
|
|
5
|
+
export declare function extractKeywords(input: string): string[];
|
|
6
|
+
/**
|
|
7
|
+
* Extract file types mentioned in input
|
|
8
|
+
*/
|
|
9
|
+
export declare function extractFileTypes(input: string): string[];
|
|
10
|
+
/**
|
|
11
|
+
* Check if a memory matches the input based on rules
|
|
12
|
+
*/
|
|
13
|
+
export declare function memoryMatchesRules(memory: Memory, keywords: string[], fileTypes: string[]): {
|
|
14
|
+
matches: boolean;
|
|
15
|
+
relevance: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Quick filter for high-priority memories
|
|
19
|
+
* Returns memories that should be directly included
|
|
20
|
+
*/
|
|
21
|
+
export declare function quickFilterHighPriority(memories: Memory[], keywords: string[], fileTypes: string[]): Memory[];
|
|
22
|
+
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../../src/services/classifier/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBxD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAmCzC;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CA2BV"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract keywords from user input for rule-based matching
|
|
3
|
+
*/
|
|
4
|
+
export function extractKeywords(input) {
|
|
5
|
+
// Simple word extraction (could be enhanced with NLP)
|
|
6
|
+
const words = input.toLowerCase()
|
|
7
|
+
.replace(/[^\w\s]/g, ' ')
|
|
8
|
+
.split(/\s+/)
|
|
9
|
+
.filter(word => word.length > 2);
|
|
10
|
+
// Remove common stop words
|
|
11
|
+
const stopWords = new Set([
|
|
12
|
+
'the', 'and', 'for', 'are', 'but', 'not', 'you', 'all', 'can',
|
|
13
|
+
'had', 'her', 'was', 'one', 'our', 'out', 'has', 'have', 'been',
|
|
14
|
+
'would', 'could', 'this', 'that', 'with', 'they', 'from', 'what',
|
|
15
|
+
'when', 'where', 'which', 'their', 'there', 'these', 'those',
|
|
16
|
+
'over' // common preposition
|
|
17
|
+
]);
|
|
18
|
+
return [...new Set(words.filter(word => !stopWords.has(word)))];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Extract file types mentioned in input
|
|
22
|
+
*/
|
|
23
|
+
export function extractFileTypes(input) {
|
|
24
|
+
const fileTypePatterns = [
|
|
25
|
+
/\b(\w+)\.(ts|js|tsx|jsx|py|rs|go|java|cpp|c|h|hpp|rs)\b/gi,
|
|
26
|
+
/\b(config|test|spec|index|main|app)\b/gi
|
|
27
|
+
];
|
|
28
|
+
const types = [];
|
|
29
|
+
for (const pattern of fileTypePatterns) {
|
|
30
|
+
const matches = input.match(pattern);
|
|
31
|
+
if (matches) {
|
|
32
|
+
types.push(...matches.map(m => m.toLowerCase()));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return [...new Set(types)];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if a memory matches the input based on rules
|
|
39
|
+
*/
|
|
40
|
+
export function memoryMatchesRules(memory, keywords, fileTypes) {
|
|
41
|
+
const contentLower = memory.content.toLowerCase();
|
|
42
|
+
const memoryTags = memory.projectTags.map(t => t.toLowerCase());
|
|
43
|
+
let matchCount = 0;
|
|
44
|
+
let totalWeight = 0;
|
|
45
|
+
// Check keyword matches
|
|
46
|
+
for (const keyword of keywords) {
|
|
47
|
+
if (contentLower.includes(keyword)) {
|
|
48
|
+
matchCount += 2; // Keywords are more important
|
|
49
|
+
totalWeight += 2;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Check file type matches
|
|
53
|
+
for (const fileType of fileTypes) {
|
|
54
|
+
if (contentLower.includes(fileType)) {
|
|
55
|
+
matchCount += 1;
|
|
56
|
+
totalWeight += 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Check project tag matches
|
|
60
|
+
for (const tag of memoryTags) {
|
|
61
|
+
if (keywords.some(k => tag.includes(k) || k.includes(tag))) {
|
|
62
|
+
matchCount += 1;
|
|
63
|
+
totalWeight += 1;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const matches = matchCount > 0;
|
|
67
|
+
const relevance = totalWeight > 0 ? matchCount / totalWeight : 0;
|
|
68
|
+
return { matches, relevance };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Quick filter for high-priority memories
|
|
72
|
+
* Returns memories that should be directly included
|
|
73
|
+
*/
|
|
74
|
+
export function quickFilterHighPriority(memories, keywords, fileTypes) {
|
|
75
|
+
const anchoredMemories = memories.filter(m => m.anchored);
|
|
76
|
+
const constraintMemories = memories.filter(m => m.priority === 'constraint');
|
|
77
|
+
// Anchored memories are always included
|
|
78
|
+
const anchoredResults = anchoredMemories.map(m => ({
|
|
79
|
+
memory: m,
|
|
80
|
+
relevance: 1.0
|
|
81
|
+
}));
|
|
82
|
+
// Check constraint memories against rules
|
|
83
|
+
const constraintResults = [];
|
|
84
|
+
for (const memory of constraintMemories) {
|
|
85
|
+
const { matches, relevance } = memoryMatchesRules(memory, keywords, fileTypes);
|
|
86
|
+
if (matches) {
|
|
87
|
+
constraintResults.push({ memory, relevance });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Sort constraint results by relevance
|
|
91
|
+
constraintResults.sort((a, b) => b.relevance - a.relevance);
|
|
92
|
+
// Combine and return
|
|
93
|
+
return [
|
|
94
|
+
...anchoredResults.map(r => r.memory),
|
|
95
|
+
...constraintResults.slice(0, 5).map(r => r.memory) // Limit to top 5 constraints
|
|
96
|
+
];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../../src/services/classifier/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/compressor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/compressor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|