@phantomind/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/aider.d.ts +12 -0
- package/dist/adapters/aider.d.ts.map +1 -0
- package/dist/adapters/aider.js +24 -0
- package/dist/adapters/aider.js.map +1 -0
- package/dist/adapters/base.d.ts +21 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +83 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-code.d.ts +12 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +31 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/cline.d.ts +12 -0
- package/dist/adapters/cline.d.ts.map +1 -0
- package/dist/adapters/cline.js +32 -0
- package/dist/adapters/cline.js.map +1 -0
- package/dist/adapters/codex.d.ts +18 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +38 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/continue.d.ts +12 -0
- package/dist/adapters/continue.d.ts.map +1 -0
- package/dist/adapters/continue.js +29 -0
- package/dist/adapters/continue.js.map +1 -0
- package/dist/adapters/copilot.d.ts +12 -0
- package/dist/adapters/copilot.d.ts.map +1 -0
- package/dist/adapters/copilot.js +31 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor.d.ts +12 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +34 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/index.d.ts +32 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +64 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/windsurf.d.ts +12 -0
- package/dist/adapters/windsurf.d.ts.map +1 -0
- package/dist/adapters/windsurf.js +32 -0
- package/dist/adapters/windsurf.js.map +1 -0
- package/dist/adapters/zed.d.ts +12 -0
- package/dist/adapters/zed.d.ts.map +1 -0
- package/dist/adapters/zed.js +27 -0
- package/dist/adapters/zed.js.map +1 -0
- package/dist/agent/decomposer.d.ts +55 -0
- package/dist/agent/decomposer.d.ts.map +1 -0
- package/dist/agent/decomposer.js +172 -0
- package/dist/agent/decomposer.js.map +1 -0
- package/dist/agent/executor.d.ts +33 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +260 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +8 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +8 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/memory.d.ts +95 -0
- package/dist/agent/memory.d.ts.map +1 -0
- package/dist/agent/memory.js +211 -0
- package/dist/agent/memory.js.map +1 -0
- package/dist/agent/orchestrator.d.ts +54 -0
- package/dist/agent/orchestrator.d.ts.map +1 -0
- package/dist/agent/orchestrator.js +190 -0
- package/dist/agent/orchestrator.js.map +1 -0
- package/dist/agent/queue.d.ts +95 -0
- package/dist/agent/queue.d.ts.map +1 -0
- package/dist/agent/queue.js +231 -0
- package/dist/agent/queue.js.map +1 -0
- package/dist/agent/retry.d.ts +61 -0
- package/dist/agent/retry.d.ts.map +1 -0
- package/dist/agent/retry.js +162 -0
- package/dist/agent/retry.js.map +1 -0
- package/dist/agent/roles.d.ts +35 -0
- package/dist/agent/roles.d.ts.map +1 -0
- package/dist/agent/roles.js +269 -0
- package/dist/agent/roles.js.map +1 -0
- package/dist/cli/agent.d.ts +12 -0
- package/dist/cli/agent.d.ts.map +1 -0
- package/dist/cli/agent.js +85 -0
- package/dist/cli/agent.js.map +1 -0
- package/dist/cli/audit.d.ts +11 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +63 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/eval.d.ts +11 -0
- package/dist/cli/eval.d.ts.map +1 -0
- package/dist/cli/eval.js +79 -0
- package/dist/cli/eval.js.map +1 -0
- package/dist/cli/index.d.ts +9 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +13 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +157 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/main.d.ts +7 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +153 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/serve.d.ts +11 -0
- package/dist/cli/serve.d.ts.map +1 -0
- package/dist/cli/serve.js +23 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/stats.d.ts +10 -0
- package/dist/cli/stats.d.ts.map +1 -0
- package/dist/cli/stats.js +68 -0
- package/dist/cli/stats.js.map +1 -0
- package/dist/cli/sync.d.ts +11 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +49 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli/validate.d.ts +13 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +125 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +25 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +190 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/context/embedder.d.ts +53 -0
- package/dist/context/embedder.d.ts.map +1 -0
- package/dist/context/embedder.js +235 -0
- package/dist/context/embedder.js.map +1 -0
- package/dist/context/engine.d.ts +82 -0
- package/dist/context/engine.d.ts.map +1 -0
- package/dist/context/engine.js +343 -0
- package/dist/context/engine.js.map +1 -0
- package/dist/context/index.d.ts +5 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +5 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/learner.d.ts +44 -0
- package/dist/context/learner.d.ts.map +1 -0
- package/dist/context/learner.js +246 -0
- package/dist/context/learner.js.map +1 -0
- package/dist/context/versioning.d.ts +29 -0
- package/dist/context/versioning.d.ts.map +1 -0
- package/dist/context/versioning.js +81 -0
- package/dist/context/versioning.js.map +1 -0
- package/dist/index.d.ts +169 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +285 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +2 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +31 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +334 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/observability/audit.d.ts +61 -0
- package/dist/observability/audit.d.ts.map +1 -0
- package/dist/observability/audit.js +168 -0
- package/dist/observability/audit.js.map +1 -0
- package/dist/observability/cost-tracker.d.ts +71 -0
- package/dist/observability/cost-tracker.d.ts.map +1 -0
- package/dist/observability/cost-tracker.js +206 -0
- package/dist/observability/cost-tracker.js.map +1 -0
- package/dist/observability/dashboard.d.ts +52 -0
- package/dist/observability/dashboard.d.ts.map +1 -0
- package/dist/observability/dashboard.js +134 -0
- package/dist/observability/dashboard.js.map +1 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +4 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +14 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +99 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +52 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +68 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/deepseek.d.ts +15 -0
- package/dist/providers/deepseek.d.ts.map +1 -0
- package/dist/providers/deepseek.js +99 -0
- package/dist/providers/deepseek.js.map +1 -0
- package/dist/providers/gemini.d.ts +15 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +118 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/groq.d.ts +15 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +101 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/index.d.ts +11 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +11 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/mistral.d.ts +15 -0
- package/dist/providers/mistral.d.ts.map +1 -0
- package/dist/providers/mistral.js +99 -0
- package/dist/providers/mistral.js.map +1 -0
- package/dist/providers/ollama.d.ts +14 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +122 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +14 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +80 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +15 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +101 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/router.d.ts +51 -0
- package/dist/providers/router.d.ts.map +1 -0
- package/dist/providers/router.js +198 -0
- package/dist/providers/router.js.map +1 -0
- package/dist/quality/anomaly.d.ts +32 -0
- package/dist/quality/anomaly.d.ts.map +1 -0
- package/dist/quality/anomaly.js +126 -0
- package/dist/quality/anomaly.js.map +1 -0
- package/dist/quality/consistency.d.ts +26 -0
- package/dist/quality/consistency.d.ts.map +1 -0
- package/dist/quality/consistency.js +156 -0
- package/dist/quality/consistency.js.map +1 -0
- package/dist/quality/dual-verifier.d.ts +22 -0
- package/dist/quality/dual-verifier.d.ts.map +1 -0
- package/dist/quality/dual-verifier.js +137 -0
- package/dist/quality/dual-verifier.js.map +1 -0
- package/dist/quality/hallucination-guard.d.ts +57 -0
- package/dist/quality/hallucination-guard.d.ts.map +1 -0
- package/dist/quality/hallucination-guard.js +245 -0
- package/dist/quality/hallucination-guard.js.map +1 -0
- package/dist/quality/index.d.ts +7 -0
- package/dist/quality/index.d.ts.map +1 -0
- package/dist/quality/index.js +7 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/regression.d.ts +44 -0
- package/dist/quality/regression.d.ts.map +1 -0
- package/dist/quality/regression.js +181 -0
- package/dist/quality/regression.js.map +1 -0
- package/dist/quality/secret-scanner.d.ts +36 -0
- package/dist/quality/secret-scanner.d.ts.map +1 -0
- package/dist/quality/secret-scanner.js +187 -0
- package/dist/quality/secret-scanner.js.map +1 -0
- package/dist/schemas/index.d.ts +2 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +2 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/registry.d.ts +72 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/registry.js +483 -0
- package/dist/schemas/registry.js.map +1 -0
- package/dist/templates/engine.d.ts +70 -0
- package/dist/templates/engine.d.ts.map +1 -0
- package/dist/templates/engine.js +71 -0
- package/dist/templates/engine.js.map +1 -0
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +2 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/types.d.ts +912 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +75 -0
- package/dist/types.js.map +1 -0
- package/package.json +85 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhantomMindAI — Main Entry Point
|
|
3
|
+
* Universal AI Development Enhancement Layer
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { phantom } from '@phantomind/core';
|
|
8
|
+
*
|
|
9
|
+
* // Initialize
|
|
10
|
+
* await phantom.init();
|
|
11
|
+
*
|
|
12
|
+
* // Get context
|
|
13
|
+
* const ctx = await phantom.ctx();
|
|
14
|
+
*
|
|
15
|
+
* // Complete with auto-routing
|
|
16
|
+
* const response = await phantom.complete('Explain this code');
|
|
17
|
+
*
|
|
18
|
+
* // Run agent
|
|
19
|
+
* const result = await phantom.agent('refactor auth module');
|
|
20
|
+
*
|
|
21
|
+
* // Orchestrate multi-agent
|
|
22
|
+
* const orchestrated = await phantom.orchestrate(
|
|
23
|
+
* 'build user dashboard',
|
|
24
|
+
* ['architect', 'implementer', 'testWriter'],
|
|
25
|
+
* );
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
import { loadConfig } from './config/loader.js';
|
|
29
|
+
import { ContextEngine } from './context/engine.js';
|
|
30
|
+
import { CodebaseEmbedder } from './context/embedder.js';
|
|
31
|
+
import { ContextLearner } from './context/learner.js';
|
|
32
|
+
import { ProviderRouter } from './providers/router.js';
|
|
33
|
+
import { AgentExecutor } from './agent/executor.js';
|
|
34
|
+
import { AgentOrchestrator } from './agent/orchestrator.js';
|
|
35
|
+
import { TaskDecomposer } from './agent/decomposer.js';
|
|
36
|
+
import { RetryIntelligence } from './agent/retry.js';
|
|
37
|
+
import { TaskQueue } from './agent/queue.js';
|
|
38
|
+
import { AgentMemory } from './agent/memory.js';
|
|
39
|
+
import { SchemaRegistry } from './schemas/registry.js';
|
|
40
|
+
import { AuditTrail } from './observability/audit.js';
|
|
41
|
+
import { CostTracker } from './observability/cost-tracker.js';
|
|
42
|
+
import { AnalyticsDashboard } from './observability/dashboard.js';
|
|
43
|
+
import { SecretScanner } from './quality/secret-scanner.js';
|
|
44
|
+
import { HallucinationGuard } from './quality/hallucination-guard.js';
|
|
45
|
+
import { ConsistencyEnforcer } from './quality/consistency.js';
|
|
46
|
+
import { syncAllAdapters } from './adapters/index.js';
|
|
47
|
+
export class PhantomMind {
|
|
48
|
+
projectRoot;
|
|
49
|
+
config;
|
|
50
|
+
router;
|
|
51
|
+
contextEngine;
|
|
52
|
+
embedder;
|
|
53
|
+
learner;
|
|
54
|
+
schemaRegistry;
|
|
55
|
+
auditTrail;
|
|
56
|
+
costTracker;
|
|
57
|
+
memory;
|
|
58
|
+
queue;
|
|
59
|
+
initialized = false;
|
|
60
|
+
constructor(projectRoot) {
|
|
61
|
+
this.projectRoot = projectRoot ?? process.cwd();
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Initialize PhantomMindAI
|
|
65
|
+
*/
|
|
66
|
+
async init(configOverride) {
|
|
67
|
+
this.config = await loadConfig(this.projectRoot);
|
|
68
|
+
if (configOverride) {
|
|
69
|
+
Object.assign(this.config, configOverride);
|
|
70
|
+
}
|
|
71
|
+
this.router = new ProviderRouter(this.config.providers, this.config.budget ? {
|
|
72
|
+
maxCostPerDay: this.config.budget.maxCostPerDay,
|
|
73
|
+
warningAt: this.config.budget.warningAt,
|
|
74
|
+
fallbackOnBudget: this.config.budget.fallbackOnBudget,
|
|
75
|
+
} : undefined);
|
|
76
|
+
this.contextEngine = new ContextEngine(this.config, this.projectRoot);
|
|
77
|
+
this.embedder = new CodebaseEmbedder(this.projectRoot);
|
|
78
|
+
this.learner = new ContextLearner(this.projectRoot);
|
|
79
|
+
this.schemaRegistry = new SchemaRegistry(this.projectRoot);
|
|
80
|
+
this.auditTrail = new AuditTrail(this.projectRoot);
|
|
81
|
+
this.costTracker = new CostTracker(this.projectRoot, {
|
|
82
|
+
daily: this.config.budget?.maxCostPerDay,
|
|
83
|
+
});
|
|
84
|
+
this.memory = new AgentMemory(this.projectRoot);
|
|
85
|
+
this.queue = new TaskQueue({ maxConcurrent: 3 });
|
|
86
|
+
await this.schemaRegistry.loadCustomSchemas();
|
|
87
|
+
await this.auditTrail.init();
|
|
88
|
+
await this.costTracker.load();
|
|
89
|
+
await this.memory.load();
|
|
90
|
+
// Wire up audit logging for provider requests
|
|
91
|
+
this.router.on('provider:response', ({ provider, model, usage, duration }) => {
|
|
92
|
+
this.auditTrail.logProviderRequest(provider, model, usage.inputTokens, usage.outputTokens, usage.estimatedCost, duration, true);
|
|
93
|
+
this.costTracker.record(provider, model, usage);
|
|
94
|
+
});
|
|
95
|
+
this.initialized = true;
|
|
96
|
+
}
|
|
97
|
+
ensureInit() {
|
|
98
|
+
if (!this.initialized) {
|
|
99
|
+
throw new Error('PhantomMindAI not initialized. Call phantom.init() first.');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get project context
|
|
104
|
+
*/
|
|
105
|
+
async ctx(options) {
|
|
106
|
+
this.ensureInit();
|
|
107
|
+
return this.contextEngine.getProjectContext(options);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Complete a prompt with auto-routing
|
|
111
|
+
*/
|
|
112
|
+
async complete(prompt, options) {
|
|
113
|
+
this.ensureInit();
|
|
114
|
+
const context = await this.contextEngine.getProjectContext({ maxTokens: 2000 });
|
|
115
|
+
const contextText = context.layers.map(l => l.content).join('\n\n');
|
|
116
|
+
return this.router.complete({
|
|
117
|
+
systemPrompt: `You are an AI assistant with deep knowledge of this project.\n\n${contextText}`,
|
|
118
|
+
prompt,
|
|
119
|
+
temperature: 0.7,
|
|
120
|
+
maxTokens: 2000,
|
|
121
|
+
...options,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Complete with intelligent retry
|
|
126
|
+
*/
|
|
127
|
+
async completeWithRetry(prompt, options) {
|
|
128
|
+
this.ensureInit();
|
|
129
|
+
const retry = new RetryIntelligence(this.router, this.contextEngine);
|
|
130
|
+
const result = await retry.execute({
|
|
131
|
+
prompt,
|
|
132
|
+
temperature: 0.7,
|
|
133
|
+
maxTokens: 2000,
|
|
134
|
+
...options,
|
|
135
|
+
});
|
|
136
|
+
if (!result.success || !result.response) {
|
|
137
|
+
throw new Error(`Failed after ${result.attempts} attempts: ${result.error}`);
|
|
138
|
+
}
|
|
139
|
+
return result.response;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Run an agent task
|
|
143
|
+
*/
|
|
144
|
+
async agent(task, options) {
|
|
145
|
+
this.ensureInit();
|
|
146
|
+
const executor = new AgentExecutor(this.router, this.contextEngine, this.projectRoot, {
|
|
147
|
+
role: options?.role ?? 'implementer',
|
|
148
|
+
maxSteps: options?.maxSteps ?? 30,
|
|
149
|
+
});
|
|
150
|
+
return executor.run(task);
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Orchestrate multi-agent task
|
|
154
|
+
*/
|
|
155
|
+
async orchestrate(task, roles) {
|
|
156
|
+
this.ensureInit();
|
|
157
|
+
const orchestrator = new AgentOrchestrator(this.router, this.contextEngine, this.projectRoot);
|
|
158
|
+
return orchestrator.orchestrate(task, roles);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Decompose a task
|
|
162
|
+
*/
|
|
163
|
+
async decompose(task) {
|
|
164
|
+
this.ensureInit();
|
|
165
|
+
const decomposer = new TaskDecomposer(this.router, this.contextEngine);
|
|
166
|
+
return decomposer.decompose(task);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Queue a task
|
|
170
|
+
*/
|
|
171
|
+
enqueue(task, options) {
|
|
172
|
+
this.ensureInit();
|
|
173
|
+
return this.queue.enqueue(task, options);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Semantic search across codebase
|
|
177
|
+
*/
|
|
178
|
+
async search(query, limit = 10) {
|
|
179
|
+
this.ensureInit();
|
|
180
|
+
await this.embedder.build();
|
|
181
|
+
return this.embedder.search(query, limit);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Sync adapter configurations
|
|
185
|
+
*/
|
|
186
|
+
async sync(targets, dryRun = false) {
|
|
187
|
+
this.ensureInit();
|
|
188
|
+
let syncConfig = this.config;
|
|
189
|
+
if (targets && targets.length > 0) {
|
|
190
|
+
syncConfig = { ...this.config, adapters: targets };
|
|
191
|
+
}
|
|
192
|
+
return syncAllAdapters(this.projectRoot, syncConfig, dryRun);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Validate code
|
|
196
|
+
*/
|
|
197
|
+
async validate(content, filename) {
|
|
198
|
+
this.ensureInit();
|
|
199
|
+
const scanner = new SecretScanner();
|
|
200
|
+
const guard = new HallucinationGuard(this.projectRoot);
|
|
201
|
+
const secrets = scanner.scan(content, filename);
|
|
202
|
+
const hallucinations = await guard.check(content, filename);
|
|
203
|
+
return { secrets, hallucinations };
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check code consistency
|
|
207
|
+
*/
|
|
208
|
+
async checkConsistency() {
|
|
209
|
+
this.ensureInit();
|
|
210
|
+
const enforcer = new ConsistencyEnforcer(this.projectRoot);
|
|
211
|
+
return enforcer.scan();
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get schema
|
|
215
|
+
*/
|
|
216
|
+
schema(name) {
|
|
217
|
+
this.ensureInit();
|
|
218
|
+
return this.schemaRegistry.get(name);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get cost report
|
|
222
|
+
*/
|
|
223
|
+
costs(period) {
|
|
224
|
+
this.ensureInit();
|
|
225
|
+
return this.costTracker.getReport(period);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get dashboard
|
|
229
|
+
*/
|
|
230
|
+
dashboard() {
|
|
231
|
+
this.ensureInit();
|
|
232
|
+
return new AnalyticsDashboard(this.costTracker, this.auditTrail);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Learn project patterns
|
|
236
|
+
*/
|
|
237
|
+
async learn() {
|
|
238
|
+
this.ensureInit();
|
|
239
|
+
await this.learner.learn();
|
|
240
|
+
return this.learner.generateSkillsContent();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Save state (costs, memory, etc.)
|
|
244
|
+
*/
|
|
245
|
+
async save() {
|
|
246
|
+
this.ensureInit();
|
|
247
|
+
await this.costTracker.save();
|
|
248
|
+
await this.memory.save();
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Access internals
|
|
252
|
+
*/
|
|
253
|
+
get internals() {
|
|
254
|
+
this.ensureInit();
|
|
255
|
+
return {
|
|
256
|
+
router: this.router,
|
|
257
|
+
contextEngine: this.contextEngine,
|
|
258
|
+
embedder: this.embedder,
|
|
259
|
+
learner: this.learner,
|
|
260
|
+
schemaRegistry: this.schemaRegistry,
|
|
261
|
+
auditTrail: this.auditTrail,
|
|
262
|
+
costTracker: this.costTracker,
|
|
263
|
+
memory: this.memory,
|
|
264
|
+
queue: this.queue,
|
|
265
|
+
config: this.config,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Default phantom instance
|
|
271
|
+
*/
|
|
272
|
+
export const phantom = new PhantomMind();
|
|
273
|
+
// Re-export everything
|
|
274
|
+
export * from './types.js';
|
|
275
|
+
export * from './config/index.js';
|
|
276
|
+
export * from './providers/index.js';
|
|
277
|
+
export * from './context/index.js';
|
|
278
|
+
export * from './adapters/index.js';
|
|
279
|
+
export * from './mcp/index.js';
|
|
280
|
+
export * from './agent/index.js';
|
|
281
|
+
export * from './quality/index.js';
|
|
282
|
+
export * from './schemas/index.js';
|
|
283
|
+
export * from './observability/index.js';
|
|
284
|
+
export * from './templates/index.js';
|
|
285
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhantomMindAI — MCP Server
|
|
3
|
+
* Model Context Protocol server with all project-aware tools.
|
|
4
|
+
*/
|
|
5
|
+
export declare class PhantomMCPServer {
|
|
6
|
+
private server;
|
|
7
|
+
private contextEngine;
|
|
8
|
+
private embedder;
|
|
9
|
+
private projectRoot;
|
|
10
|
+
private config;
|
|
11
|
+
constructor();
|
|
12
|
+
private setupHandlers;
|
|
13
|
+
private handleGetProjectContext;
|
|
14
|
+
private handleGetRelevantContext;
|
|
15
|
+
private handleGetSchema;
|
|
16
|
+
private handleSearchCodebase;
|
|
17
|
+
private handleValidateOutput;
|
|
18
|
+
private handleGetExamples;
|
|
19
|
+
private handleGetPrd;
|
|
20
|
+
private handleGetDecisionLog;
|
|
21
|
+
private handleCheckConsistency;
|
|
22
|
+
/**
|
|
23
|
+
* Start the MCP server
|
|
24
|
+
*/
|
|
25
|
+
start(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Start MCP server (entry point)
|
|
29
|
+
*/
|
|
30
|
+
export declare function startMCPServer(): Promise<void>;
|
|
31
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,MAAM,CAAiB;;IAkB/B,OAAO,CAAC,aAAa;YAiJP,uBAAuB;YAevB,wBAAwB;YAkBxB,eAAe;YAyBf,oBAAoB;YAcpB,oBAAoB;YAyBpB,iBAAiB;YA0BjB,YAAY;YAUZ,oBAAoB;YA8BpB,sBAAsB;IAepC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAY7B;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAGpD"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PhantomMindAI — MCP Server
|
|
3
|
+
* Model Context Protocol server with all project-aware tools.
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
7
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
8
|
+
import { ContextEngine } from '../context/engine.js';
|
|
9
|
+
import { CodebaseEmbedder } from '../context/embedder.js';
|
|
10
|
+
import { loadConfig, findProjectRoot } from '../config/index.js';
|
|
11
|
+
export class PhantomMCPServer {
|
|
12
|
+
server;
|
|
13
|
+
contextEngine;
|
|
14
|
+
embedder;
|
|
15
|
+
projectRoot;
|
|
16
|
+
config;
|
|
17
|
+
constructor() {
|
|
18
|
+
this.server = new Server({
|
|
19
|
+
name: 'phantomind',
|
|
20
|
+
version: '0.1.0',
|
|
21
|
+
}, {
|
|
22
|
+
capabilities: {
|
|
23
|
+
tools: {},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
this.setupHandlers();
|
|
27
|
+
}
|
|
28
|
+
setupHandlers() {
|
|
29
|
+
// List tools
|
|
30
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
31
|
+
tools: [
|
|
32
|
+
{
|
|
33
|
+
name: 'get_project_context',
|
|
34
|
+
description: 'Get the full project context including architecture, conventions, and rules from PhantomMindAI. Returns SKILLS.md + RULES.md content, semantically ranked for the current file.',
|
|
35
|
+
inputSchema: {
|
|
36
|
+
type: 'object',
|
|
37
|
+
properties: {
|
|
38
|
+
file: { type: 'string', description: 'Current file path for relevance ranking' },
|
|
39
|
+
maxTokens: { type: 'number', description: 'Maximum tokens to return (default: 4000)' },
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: 'get_relevant_context',
|
|
45
|
+
description: 'Get semantically-ranked context relevant to the current file being edited. Prevents context overflow by only returning highly relevant sections.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
file: { type: 'string', description: 'Current file path' },
|
|
50
|
+
maxTokens: { type: 'number', description: 'Maximum tokens (default: 2000)' },
|
|
51
|
+
},
|
|
52
|
+
required: ['file'],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'get_schema',
|
|
57
|
+
description: 'Get the output contract/schema for a specific task type from the project schema registry.',
|
|
58
|
+
inputSchema: {
|
|
59
|
+
type: 'object',
|
|
60
|
+
properties: {
|
|
61
|
+
name: { type: 'string', description: 'Schema name from registry' },
|
|
62
|
+
},
|
|
63
|
+
required: ['name'],
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: 'search_codebase',
|
|
68
|
+
description: 'Semantic search across project source files. Uses TF-IDF embeddings to find relevant code.',
|
|
69
|
+
inputSchema: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: {
|
|
72
|
+
query: { type: 'string', description: 'Search query' },
|
|
73
|
+
limit: { type: 'number', description: 'Maximum results (default: 5)' },
|
|
74
|
+
},
|
|
75
|
+
required: ['query'],
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'validate_output',
|
|
80
|
+
description: 'Validate generated code or content against project schema and conventions.',
|
|
81
|
+
inputSchema: {
|
|
82
|
+
type: 'object',
|
|
83
|
+
properties: {
|
|
84
|
+
content: { type: 'string', description: 'Content to validate' },
|
|
85
|
+
schema: { type: 'string', description: 'Schema name from registry' },
|
|
86
|
+
},
|
|
87
|
+
required: ['content', 'schema'],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
name: 'get_examples',
|
|
92
|
+
description: 'Find relevant existing code examples from the project codebase.',
|
|
93
|
+
inputSchema: {
|
|
94
|
+
type: 'object',
|
|
95
|
+
properties: {
|
|
96
|
+
query: { type: 'string', description: 'What kind of code examples to find' },
|
|
97
|
+
limit: { type: 'number', description: 'Maximum examples (default: 3)' },
|
|
98
|
+
},
|
|
99
|
+
required: ['query'],
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
name: 'get_prd',
|
|
104
|
+
description: 'Return a relevant PRD (Product Requirements Document) section.',
|
|
105
|
+
inputSchema: {
|
|
106
|
+
type: 'object',
|
|
107
|
+
properties: {
|
|
108
|
+
name: { type: 'string', description: 'PRD name or feature name' },
|
|
109
|
+
},
|
|
110
|
+
required: ['name'],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: 'get_decision_log',
|
|
115
|
+
description: 'Get past architectural decisions made by agents.',
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
properties: {
|
|
119
|
+
file: { type: 'string', description: 'Filter by affected file' },
|
|
120
|
+
limit: { type: 'number', description: 'Maximum entries (default: 10)' },
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
name: 'check_consistency',
|
|
126
|
+
description: 'Find naming and pattern inconsistencies across the codebase.',
|
|
127
|
+
inputSchema: {
|
|
128
|
+
type: 'object',
|
|
129
|
+
properties: {
|
|
130
|
+
scope: { type: 'string', description: 'Scope of check: naming, pattern, architecture, all (default: all)' },
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
}));
|
|
136
|
+
// Handle tool calls
|
|
137
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
138
|
+
const { name, arguments: args } = request.params;
|
|
139
|
+
try {
|
|
140
|
+
switch (name) {
|
|
141
|
+
case 'get_project_context':
|
|
142
|
+
return await this.handleGetProjectContext(args);
|
|
143
|
+
case 'get_relevant_context':
|
|
144
|
+
return await this.handleGetRelevantContext(args);
|
|
145
|
+
case 'get_schema':
|
|
146
|
+
return await this.handleGetSchema(args);
|
|
147
|
+
case 'search_codebase':
|
|
148
|
+
return await this.handleSearchCodebase(args);
|
|
149
|
+
case 'validate_output':
|
|
150
|
+
return await this.handleValidateOutput(args);
|
|
151
|
+
case 'get_examples':
|
|
152
|
+
return await this.handleGetExamples(args);
|
|
153
|
+
case 'get_prd':
|
|
154
|
+
return await this.handleGetPrd(args);
|
|
155
|
+
case 'get_decision_log':
|
|
156
|
+
return await this.handleGetDecisionLog(args);
|
|
157
|
+
case 'check_consistency':
|
|
158
|
+
return await this.handleCheckConsistency(args);
|
|
159
|
+
default:
|
|
160
|
+
return { content: [{ type: 'text', text: `Unknown tool: ${name}` }], isError: true };
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
return {
|
|
165
|
+
content: [{ type: 'text', text: `Error: ${error.message}` }],
|
|
166
|
+
isError: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
async handleGetProjectContext(args) {
|
|
172
|
+
const result = await this.contextEngine.getProjectContext({
|
|
173
|
+
file: args?.file,
|
|
174
|
+
maxTokens: args?.maxTokens ?? 4000,
|
|
175
|
+
});
|
|
176
|
+
const content = result.layers.map(l => l.content).join('\n\n---\n\n');
|
|
177
|
+
return {
|
|
178
|
+
content: [{
|
|
179
|
+
type: 'text',
|
|
180
|
+
text: content || 'No project context found. Run `phantomind init` to set up.',
|
|
181
|
+
}],
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
async handleGetRelevantContext(args) {
|
|
185
|
+
const result = await this.contextEngine.getFileContext(args.file, args?.maxTokens ?? 2000);
|
|
186
|
+
const content = result.layers
|
|
187
|
+
.map(l => `[relevance: ${(l.relevanceScore * 100).toFixed(0)}%] ${l.type}\n${l.content}`)
|
|
188
|
+
.join('\n\n---\n\n');
|
|
189
|
+
return {
|
|
190
|
+
content: [{
|
|
191
|
+
type: 'text',
|
|
192
|
+
text: content || 'No relevant context found for this file.',
|
|
193
|
+
}],
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
async handleGetSchema(args) {
|
|
197
|
+
const { readFile } = await import('node:fs/promises');
|
|
198
|
+
const { join } = await import('node:path');
|
|
199
|
+
try {
|
|
200
|
+
const schemaContent = await readFile(join(this.projectRoot, this.config.context.schema), 'utf-8');
|
|
201
|
+
const schemas = JSON.parse(schemaContent);
|
|
202
|
+
const schema = schemas[args.name] ?? schemas;
|
|
203
|
+
return {
|
|
204
|
+
content: [{
|
|
205
|
+
type: 'text',
|
|
206
|
+
text: JSON.stringify(schema, null, 2),
|
|
207
|
+
}],
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return {
|
|
212
|
+
content: [{ type: 'text', text: `Schema '${args.name}' not found.` }],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async handleSearchCodebase(args) {
|
|
217
|
+
const results = await this.embedder.search(args.query, args?.limit ?? 5);
|
|
218
|
+
if (results.length === 0) {
|
|
219
|
+
return { content: [{ type: 'text', text: 'No results found.' }] };
|
|
220
|
+
}
|
|
221
|
+
const text = results
|
|
222
|
+
.map((r, i) => `### Result ${i + 1}: ${r.path} (score: ${r.score.toFixed(3)})\n\`\`\`\n${r.snippet}\n\`\`\``)
|
|
223
|
+
.join('\n\n');
|
|
224
|
+
return { content: [{ type: 'text', text }] };
|
|
225
|
+
}
|
|
226
|
+
async handleValidateOutput(args) {
|
|
227
|
+
// Basic validation against project conventions
|
|
228
|
+
const context = await this.contextEngine.getProjectContext({ includeRules: true, maxTokens: 2000 });
|
|
229
|
+
const rulesLayer = context.layers.find(l => l.type === 'rules');
|
|
230
|
+
const issues = [];
|
|
231
|
+
// Check for common issues
|
|
232
|
+
if (args.content.includes('any')) {
|
|
233
|
+
issues.push('⚠️ Usage of `any` type detected — consider using specific types.');
|
|
234
|
+
}
|
|
235
|
+
if (args.content.match(/console\.(log|debug|warn)/)) {
|
|
236
|
+
issues.push('⚠️ Console statements detected — consider using proper logging.');
|
|
237
|
+
}
|
|
238
|
+
if (args.content.includes('TODO') || args.content.includes('FIXME')) {
|
|
239
|
+
issues.push('⚠️ TODO/FIXME comments detected — consider resolving before committing.');
|
|
240
|
+
}
|
|
241
|
+
const text = issues.length > 0
|
|
242
|
+
? `Validation Report:\n${issues.join('\n')}`
|
|
243
|
+
: '✅ No issues detected.';
|
|
244
|
+
return { content: [{ type: 'text', text }] };
|
|
245
|
+
}
|
|
246
|
+
async handleGetExamples(args) {
|
|
247
|
+
const results = await this.embedder.search(args.query, args?.limit ?? 3);
|
|
248
|
+
if (results.length === 0) {
|
|
249
|
+
return { content: [{ type: 'text', text: 'No matching examples found.' }] };
|
|
250
|
+
}
|
|
251
|
+
const { readFile } = await import('node:fs/promises');
|
|
252
|
+
const { join } = await import('node:path');
|
|
253
|
+
const examples = await Promise.all(results.map(async (r) => {
|
|
254
|
+
try {
|
|
255
|
+
const content = await readFile(join(this.projectRoot, r.path), 'utf-8');
|
|
256
|
+
// Return first 100 lines
|
|
257
|
+
const lines = content.split('\n').slice(0, 100).join('\n');
|
|
258
|
+
return `### ${r.path}\n\`\`\`\n${lines}\n\`\`\``;
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return `### ${r.path}\n(could not read file)`;
|
|
262
|
+
}
|
|
263
|
+
}));
|
|
264
|
+
return { content: [{ type: 'text', text: examples.join('\n\n') }] };
|
|
265
|
+
}
|
|
266
|
+
async handleGetPrd(args) {
|
|
267
|
+
const prd = await this.contextEngine.getPrdContext(args.name);
|
|
268
|
+
if (!prd) {
|
|
269
|
+
return { content: [{ type: 'text', text: `PRD '${args.name}' not found.` }] };
|
|
270
|
+
}
|
|
271
|
+
return { content: [{ type: 'text', text: prd.content }] };
|
|
272
|
+
}
|
|
273
|
+
async handleGetDecisionLog(args) {
|
|
274
|
+
const { readFile, readdir } = await import('node:fs/promises');
|
|
275
|
+
const { join } = await import('node:path');
|
|
276
|
+
try {
|
|
277
|
+
const decisionDir = join(this.projectRoot, this.config.context.decisions);
|
|
278
|
+
const files = await readdir(decisionDir);
|
|
279
|
+
const mdFiles = files.filter(f => f.endsWith('.md')).sort().reverse();
|
|
280
|
+
const limit = args?.limit ?? 10;
|
|
281
|
+
const entries = [];
|
|
282
|
+
for (const file of mdFiles.slice(0, limit)) {
|
|
283
|
+
const content = await readFile(join(decisionDir, file), 'utf-8');
|
|
284
|
+
if (args?.file && !content.includes(args.file))
|
|
285
|
+
continue;
|
|
286
|
+
entries.push(content);
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
content: [{
|
|
290
|
+
type: 'text',
|
|
291
|
+
text: entries.length > 0 ? entries.join('\n\n---\n\n') : 'No decision log entries found.',
|
|
292
|
+
}],
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
return {
|
|
297
|
+
content: [{ type: 'text', text: 'No decision log directory found.' }],
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
async handleCheckConsistency(args) {
|
|
302
|
+
const sections = await this.contextEngine.searchContext('naming convention pattern', 10);
|
|
303
|
+
const scope = args?.scope ?? 'all';
|
|
304
|
+
const report = [
|
|
305
|
+
'# Consistency Check Report',
|
|
306
|
+
`Scope: ${scope}`,
|
|
307
|
+
`Timestamp: ${new Date().toISOString()}`,
|
|
308
|
+
'',
|
|
309
|
+
'Run `phantomind check consistency` for a full detailed report.',
|
|
310
|
+
];
|
|
311
|
+
return { content: [{ type: 'text', text: report.join('\n') }] };
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Start the MCP server
|
|
315
|
+
*/
|
|
316
|
+
async start() {
|
|
317
|
+
this.projectRoot = await findProjectRoot();
|
|
318
|
+
this.config = await loadConfig(this.projectRoot);
|
|
319
|
+
this.contextEngine = new ContextEngine(this.config, this.projectRoot);
|
|
320
|
+
this.embedder = new CodebaseEmbedder(this.projectRoot);
|
|
321
|
+
// Build embeddings in background
|
|
322
|
+
this.embedder.build().catch(() => { });
|
|
323
|
+
const transport = new StdioServerTransport();
|
|
324
|
+
await this.server.connect(transport);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Start MCP server (entry point)
|
|
329
|
+
*/
|
|
330
|
+
export async function startMCPServer() {
|
|
331
|
+
const server = new PhantomMCPServer();
|
|
332
|
+
await server.start();
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=server.js.map
|