@duckmind/deepquark-darwin-arm64 0.9.83 → 0.9.90
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/.deepquark/skills/bundled/knowledge-graph/SKILL.md +385 -0
- package/.deepquark/skills/bundled/knowledge-graph/STANDARDS.md +461 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/cli.ts +588 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/config.ts +630 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/connection-profile.ts +629 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/container.ts +756 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/mcp-client.ts +1310 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/output-formatter.ts +997 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/token-metrics.ts +335 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/transformation-log.ts +137 -0
- package/.deepquark/skills/bundled/knowledge-graph/lib/wrapper-config.ts +113 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/.env.example +129 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/compare-embeddings.ts +175 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/config-falkordb.yaml +108 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/config-neo4j.yaml +111 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/diagnose.ts +483 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-falkordb-dev.yml +146 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-falkordb.yml +151 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j-dev-local.yml +161 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j-dev.yml +161 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j.yml +169 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-production.yml +128 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-test.yml +10 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose.yml +84 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/entrypoint.sh +40 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/install.ts +2054 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose-falkordb.yml +78 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose-neo4j.yml +88 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose.yml +83 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-all-llms-mcp.ts +387 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-embedding-models.ts +201 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-embedding-providers.ts +641 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-graphiti-model.ts +217 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-correct.ts +141 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-llms-mcp.ts +386 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-models.ts +173 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-llama-extraction.ts +188 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-final.ts +240 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-live.ts +187 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-session.ts +127 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-model-combinations.ts +316 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-ollama-models.ts +228 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-openrouter-models.ts +460 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-real-life-mcp.ts +311 -0
- package/.deepquark/skills/bundled/knowledge-graph/server/test-search-debug.ts +199 -0
- package/.deepquark/skills/bundled/knowledge-graph/tools/Install.md +104 -0
- package/.deepquark/skills/bundled/knowledge-graph/tools/README.md +120 -0
- package/.deepquark/skills/bundled/knowledge-graph/tools/knowledge-cli.ts +996 -0
- package/.deepquark/skills/bundled/knowledge-graph/tools/server-cli.ts +531 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/BulkImport.md +514 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/CaptureEpisode.md +242 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/ClearGraph.md +392 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/GetRecent.md +352 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/GetStatus.md +373 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/HealthReport.md +212 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/InvestigateEntity.md +142 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/OntologyManagement.md +201 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/RunMaintenance.md +302 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchByDate.md +255 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchFacts.md +382 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchKnowledge.md +374 -0
- package/.deepquark/skills/bundled/knowledge-graph/workflows/StixImport.md +212 -0
- package/bin/deepquark +0 -0
- package/package.json +1 -1
- package/.deepquark/skills/bundled/ge-payroll/SKILL.md +0 -153
- package/.deepquark/skills/bundled/ge-payroll/evals/evals.json +0 -23
- package/.deepquark/skills/bundled/ge-payroll/references/pain-points-improvements.md +0 -106
- package/.deepquark/skills/bundled/ge-payroll/references/process-detail.md +0 -217
- package/.deepquark/skills/bundled/ge-payroll/references/raci-stakeholders.md +0 -85
- package/.deepquark/skills/bundled/ge-payroll/references/timeline-mandays.md +0 -64
|
@@ -0,0 +1,531 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Unified server management tool for madeinoz-knowledge-system
|
|
4
|
+
* Consolidates start, stop, restart, status, and logs commands
|
|
5
|
+
* @module src/skills/tools/server-cli.ts
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'node:path';
|
|
8
|
+
import { createComposeManager, ComposeManager, type DatabaseBackend } from '../lib/container.js';
|
|
9
|
+
import { createConfigLoader, loadConfig, type KnowledgeConfig } from '../lib/config.js';
|
|
10
|
+
import { cli } from '../lib/cli.js';
|
|
11
|
+
|
|
12
|
+
const serverDir = join(import.meta.dir, '../server');
|
|
13
|
+
|
|
14
|
+
// Parse command and flags
|
|
15
|
+
const args = process.argv.slice(2);
|
|
16
|
+
const command = args[0]?.toLowerCase() || 'help';
|
|
17
|
+
|
|
18
|
+
// Extract flags
|
|
19
|
+
const flags = {
|
|
20
|
+
dev: args.includes('--dev') || args.includes('-d'),
|
|
21
|
+
mcp: args.includes('--mcp'),
|
|
22
|
+
db: args.includes('--db'),
|
|
23
|
+
noFollow: args.includes('--no-follow'),
|
|
24
|
+
tail: (() => {
|
|
25
|
+
const tailIdx = args.indexOf('--tail');
|
|
26
|
+
if (tailIdx !== -1 && args[tailIdx + 1]) {
|
|
27
|
+
return Number.parseInt(args[tailIdx + 1], 10);
|
|
28
|
+
}
|
|
29
|
+
return 100;
|
|
30
|
+
})(),
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Generate environment files for containers
|
|
35
|
+
* Maps MADEINOZ_KNOWLEDGE_* prefixed variables to unprefixed container variables
|
|
36
|
+
* Creates /tmp/madeinoz-knowledge-*.env files that compose files reference
|
|
37
|
+
*/
|
|
38
|
+
async function generateEnvFiles(
|
|
39
|
+
config: KnowledgeConfig,
|
|
40
|
+
databaseType: DatabaseBackend,
|
|
41
|
+
devMode = false
|
|
42
|
+
): Promise<void> {
|
|
43
|
+
const configLoader = createConfigLoader();
|
|
44
|
+
const containerEnv = configLoader.getContainerEnv(config);
|
|
45
|
+
|
|
46
|
+
// Determine file paths based on mode
|
|
47
|
+
const envFiles = devMode
|
|
48
|
+
? {
|
|
49
|
+
neo4j: ComposeManager.ENV_FILES.neo4jDev,
|
|
50
|
+
mcp: ComposeManager.ENV_FILES.mcpDev,
|
|
51
|
+
}
|
|
52
|
+
: {
|
|
53
|
+
neo4j: ComposeManager.ENV_FILES.neo4j,
|
|
54
|
+
mcp: ComposeManager.ENV_FILES.mcp,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Generate Neo4j env file (minimal - just auth)
|
|
58
|
+
const defaultPassword = devMode ? 'devpassword' : 'madeinozknowledge';
|
|
59
|
+
const neo4jContent = [
|
|
60
|
+
'# Generated by server.ts - Neo4j container environment',
|
|
61
|
+
`# Generated: ${new Date().toISOString()}`,
|
|
62
|
+
'',
|
|
63
|
+
`NEO4J_PASSWORD=${config.NEO4J_PASSWORD || defaultPassword}`,
|
|
64
|
+
'',
|
|
65
|
+
].join('\n');
|
|
66
|
+
|
|
67
|
+
await Bun.write(envFiles.neo4j, neo4jContent);
|
|
68
|
+
cli.dim(` Generated: ${envFiles.neo4j}`);
|
|
69
|
+
|
|
70
|
+
// Generate MCP server env file (full config)
|
|
71
|
+
const mcpLines = [
|
|
72
|
+
'# Generated by server.ts - MCP server environment',
|
|
73
|
+
`# Generated: ${new Date().toISOString()}`,
|
|
74
|
+
'',
|
|
75
|
+
'# LLM Provider Configuration',
|
|
76
|
+
`LLM_PROVIDER=${containerEnv.LLM_PROVIDER}`,
|
|
77
|
+
`MODEL_NAME=${containerEnv.MODEL_NAME}`,
|
|
78
|
+
'',
|
|
79
|
+
'# API Keys',
|
|
80
|
+
];
|
|
81
|
+
|
|
82
|
+
// Add API keys (only if set)
|
|
83
|
+
if (containerEnv.OPENAI_API_KEY) mcpLines.push(`OPENAI_API_KEY=${containerEnv.OPENAI_API_KEY}`);
|
|
84
|
+
if (containerEnv.OPENAI_BASE_URL)
|
|
85
|
+
mcpLines.push(`OPENAI_BASE_URL=${containerEnv.OPENAI_BASE_URL}`);
|
|
86
|
+
if (containerEnv.ANTHROPIC_API_KEY)
|
|
87
|
+
mcpLines.push(`ANTHROPIC_API_KEY=${containerEnv.ANTHROPIC_API_KEY}`);
|
|
88
|
+
if (containerEnv.GOOGLE_API_KEY) mcpLines.push(`GOOGLE_API_KEY=${containerEnv.GOOGLE_API_KEY}`);
|
|
89
|
+
if (containerEnv.GROQ_API_KEY) mcpLines.push(`GROQ_API_KEY=${containerEnv.GROQ_API_KEY}`);
|
|
90
|
+
if (containerEnv.VOYAGE_API_KEY) mcpLines.push(`VOYAGE_API_KEY=${containerEnv.VOYAGE_API_KEY}`);
|
|
91
|
+
|
|
92
|
+
mcpLines.push('');
|
|
93
|
+
mcpLines.push('# Embedder Configuration');
|
|
94
|
+
mcpLines.push(`EMBEDDER_PROVIDER=${containerEnv.EMBEDDER_PROVIDER}`);
|
|
95
|
+
if (containerEnv.EMBEDDER_MODEL) mcpLines.push(`EMBEDDER_MODEL=${containerEnv.EMBEDDER_MODEL}`);
|
|
96
|
+
if (containerEnv.EMBEDDER_DIMENSIONS)
|
|
97
|
+
mcpLines.push(`EMBEDDER_DIMENSIONS=${containerEnv.EMBEDDER_DIMENSIONS}`);
|
|
98
|
+
if (containerEnv.EMBEDDER_PROVIDER_URL)
|
|
99
|
+
mcpLines.push(`EMBEDDER_PROVIDER_URL=${containerEnv.EMBEDDER_PROVIDER_URL}`);
|
|
100
|
+
|
|
101
|
+
mcpLines.push('');
|
|
102
|
+
mcpLines.push('# Database Configuration');
|
|
103
|
+
mcpLines.push(`DATABASE_TYPE=${databaseType}`);
|
|
104
|
+
|
|
105
|
+
if (databaseType === 'neo4j') {
|
|
106
|
+
mcpLines.push(`NEO4J_URI=${containerEnv.NEO4J_URI || 'bolt://neo4j:7687'}`);
|
|
107
|
+
mcpLines.push(`NEO4J_USER=${containerEnv.NEO4J_USER}`);
|
|
108
|
+
mcpLines.push(`NEO4J_PASSWORD=${containerEnv.NEO4J_PASSWORD}`);
|
|
109
|
+
} else {
|
|
110
|
+
mcpLines.push(`FALKORDB_HOST=${containerEnv.FALKORDB_HOST}`);
|
|
111
|
+
mcpLines.push(`FALKORDB_PORT=${containerEnv.FALKORDB_PORT}`);
|
|
112
|
+
if (containerEnv.FALKORDB_PASSWORD)
|
|
113
|
+
mcpLines.push(`FALKORDB_PASSWORD=${containerEnv.FALKORDB_PASSWORD}`);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
mcpLines.push('');
|
|
117
|
+
mcpLines.push('# Application Configuration');
|
|
118
|
+
mcpLines.push(`SEMAPHORE_LIMIT=${containerEnv.SEMAPHORE_LIMIT}`);
|
|
119
|
+
mcpLines.push(`GROUP_ID=${containerEnv.GROUP_ID}`);
|
|
120
|
+
mcpLines.push(`GRAPHITI_GROUP_ID=${containerEnv.GROUP_ID}`);
|
|
121
|
+
mcpLines.push(`GRAPHITI_TELEMETRY_ENABLED=${containerEnv.GRAPHITI_TELEMETRY_ENABLED}`);
|
|
122
|
+
mcpLines.push('');
|
|
123
|
+
|
|
124
|
+
// Prompt Caching Configuration (Gemini)
|
|
125
|
+
if (containerEnv.PROMPT_CACHE_ENABLED) {
|
|
126
|
+
mcpLines.push('# Prompt Caching Configuration');
|
|
127
|
+
mcpLines.push(`PROMPT_CACHE_ENABLED=${containerEnv.PROMPT_CACHE_ENABLED}`);
|
|
128
|
+
if (containerEnv.PROMPT_CACHE_METRICS_ENABLED)
|
|
129
|
+
mcpLines.push(`PROMPT_CACHE_METRICS_ENABLED=${containerEnv.PROMPT_CACHE_METRICS_ENABLED}`);
|
|
130
|
+
if (containerEnv.PROMPT_CACHE_LOG_REQUESTS)
|
|
131
|
+
mcpLines.push(`PROMPT_CACHE_LOG_REQUESTS=${containerEnv.PROMPT_CACHE_LOG_REQUESTS}`);
|
|
132
|
+
if (containerEnv.PROMPT_CACHE_TTL)
|
|
133
|
+
mcpLines.push(`PROMPT_CACHE_TTL=${containerEnv.PROMPT_CACHE_TTL}`);
|
|
134
|
+
if (containerEnv.METRICS_PORT)
|
|
135
|
+
mcpLines.push(`METRICS_PORT=${containerEnv.METRICS_PORT}`);
|
|
136
|
+
mcpLines.push('');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
await Bun.write(envFiles.mcp, mcpLines.join('\n'));
|
|
140
|
+
cli.dim(` Generated: ${envFiles.mcp}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Start the server containers
|
|
145
|
+
*/
|
|
146
|
+
async function start(): Promise<void> {
|
|
147
|
+
cli.header('Starting Knowledge System');
|
|
148
|
+
|
|
149
|
+
const compose = createComposeManager(serverDir);
|
|
150
|
+
|
|
151
|
+
// Check if runtime is available
|
|
152
|
+
if (!compose.isRuntimeAvailable()) {
|
|
153
|
+
cli.error('No container runtime found!');
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
cli.success(`Using container runtime: ${compose.getRuntimeCommand()}`);
|
|
158
|
+
cli.blank();
|
|
159
|
+
|
|
160
|
+
if (flags.dev) {
|
|
161
|
+
cli.info('*** DEVELOPMENT MODE ***');
|
|
162
|
+
cli.blank();
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Load configuration to determine database type
|
|
166
|
+
const config = await loadConfig();
|
|
167
|
+
const databaseType = (config.DATABASE_TYPE || 'neo4j') as DatabaseBackend;
|
|
168
|
+
|
|
169
|
+
cli.info(`Database backend: ${databaseType}`);
|
|
170
|
+
cli.blank();
|
|
171
|
+
|
|
172
|
+
// Generate environment files for containers
|
|
173
|
+
cli.info('Generating container environment files...');
|
|
174
|
+
await generateEnvFiles(config, databaseType, flags.dev);
|
|
175
|
+
cli.blank();
|
|
176
|
+
|
|
177
|
+
// Get compose file path for display
|
|
178
|
+
const composeFile = compose.getComposeFilePath(databaseType, flags.dev);
|
|
179
|
+
cli.dim(`Compose file: ${composeFile}`);
|
|
180
|
+
cli.blank();
|
|
181
|
+
|
|
182
|
+
// Start containers
|
|
183
|
+
cli.info('Starting containers...');
|
|
184
|
+
const result = await compose.up(databaseType, flags.dev);
|
|
185
|
+
|
|
186
|
+
if (result.success) {
|
|
187
|
+
cli.success('Server started successfully');
|
|
188
|
+
cli.blank();
|
|
189
|
+
|
|
190
|
+
// Show access URLs
|
|
191
|
+
cli.info('Access Points:');
|
|
192
|
+
if (databaseType === 'neo4j') {
|
|
193
|
+
const browserPort = flags.dev ? 7475 : 7474;
|
|
194
|
+
cli.url('Neo4j Browser', `http://localhost:${browserPort}`);
|
|
195
|
+
cli.url('Bolt', `bolt://localhost:${flags.dev ? 7688 : 7687}`);
|
|
196
|
+
} else {
|
|
197
|
+
const falkorPort = flags.dev ? 3001 : 3000;
|
|
198
|
+
cli.url('FalkorDB Browser', `http://localhost:${falkorPort}`);
|
|
199
|
+
cli.url('Redis', 'localhost:6379');
|
|
200
|
+
}
|
|
201
|
+
const mcpPort = flags.dev ? 8001 : 8000;
|
|
202
|
+
cli.url('MCP Server', `http://localhost:${mcpPort}/mcp/`);
|
|
203
|
+
} else {
|
|
204
|
+
cli.error(`Failed to start: ${result.stderr || 'Unknown error'}`);
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Stop the server containers
|
|
211
|
+
*/
|
|
212
|
+
async function stop(): Promise<void> {
|
|
213
|
+
cli.header('Stopping Knowledge System');
|
|
214
|
+
|
|
215
|
+
const compose = createComposeManager(serverDir);
|
|
216
|
+
|
|
217
|
+
// Check if runtime is available
|
|
218
|
+
if (!compose.isRuntimeAvailable()) {
|
|
219
|
+
cli.error('No container runtime found!');
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
cli.success(`Using container runtime: ${compose.getRuntimeCommand()}`);
|
|
224
|
+
cli.blank();
|
|
225
|
+
|
|
226
|
+
if (flags.dev) {
|
|
227
|
+
cli.info('*** DEVELOPMENT MODE ***');
|
|
228
|
+
cli.blank();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Load configuration to determine database type
|
|
232
|
+
const config = await loadConfig();
|
|
233
|
+
const databaseType = (config.DATABASE_TYPE || 'neo4j') as DatabaseBackend;
|
|
234
|
+
|
|
235
|
+
cli.info(`Database backend: ${databaseType}`);
|
|
236
|
+
cli.blank();
|
|
237
|
+
|
|
238
|
+
// Stop containers
|
|
239
|
+
cli.info('Stopping containers...');
|
|
240
|
+
const result = await compose.down(databaseType, flags.dev);
|
|
241
|
+
|
|
242
|
+
if (result.success) {
|
|
243
|
+
cli.success('Server stopped successfully');
|
|
244
|
+
} else {
|
|
245
|
+
cli.error(`Failed to stop: ${result.stderr || 'Unknown error'}`);
|
|
246
|
+
process.exit(1);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Restart the server containers
|
|
252
|
+
*/
|
|
253
|
+
async function restart(): Promise<void> {
|
|
254
|
+
cli.header('Restarting Knowledge System');
|
|
255
|
+
|
|
256
|
+
const compose = createComposeManager(serverDir);
|
|
257
|
+
|
|
258
|
+
// Check if runtime is available
|
|
259
|
+
if (!compose.isRuntimeAvailable()) {
|
|
260
|
+
cli.error('No container runtime found!');
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
cli.success(`Using container runtime: ${compose.getRuntimeCommand()}`);
|
|
265
|
+
cli.blank();
|
|
266
|
+
|
|
267
|
+
if (flags.dev) {
|
|
268
|
+
cli.info('*** DEVELOPMENT MODE ***');
|
|
269
|
+
cli.blank();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Load configuration to determine database type
|
|
273
|
+
const config = await loadConfig();
|
|
274
|
+
const databaseType = (config.DATABASE_TYPE || 'neo4j') as DatabaseBackend;
|
|
275
|
+
|
|
276
|
+
cli.info(`Database backend: ${databaseType}`);
|
|
277
|
+
cli.blank();
|
|
278
|
+
|
|
279
|
+
// Generate environment files for containers (needed for dev mode)
|
|
280
|
+
cli.info('Regenerating container environment files...');
|
|
281
|
+
await generateEnvFiles(config, databaseType, flags.dev);
|
|
282
|
+
cli.blank();
|
|
283
|
+
|
|
284
|
+
// Restart containers
|
|
285
|
+
cli.info('Restarting containers...');
|
|
286
|
+
const result = await compose.restart(databaseType, undefined, flags.dev);
|
|
287
|
+
|
|
288
|
+
if (result.success) {
|
|
289
|
+
cli.success('Server restarted successfully');
|
|
290
|
+
cli.blank();
|
|
291
|
+
|
|
292
|
+
// Show access URLs
|
|
293
|
+
cli.info('Access Points:');
|
|
294
|
+
if (databaseType === 'neo4j') {
|
|
295
|
+
const browserPort = flags.dev ? 7475 : 7474;
|
|
296
|
+
cli.url('Neo4j Browser', `http://localhost:${browserPort}`);
|
|
297
|
+
cli.url('Bolt', `bolt://localhost:${flags.dev ? 7688 : 7687}`);
|
|
298
|
+
} else {
|
|
299
|
+
const falkorPort = flags.dev ? 3001 : 3000;
|
|
300
|
+
cli.url('FalkorDB Browser', `http://localhost:${falkorPort}`);
|
|
301
|
+
cli.url('Redis', 'localhost:6379');
|
|
302
|
+
}
|
|
303
|
+
const mcpPort = flags.dev ? 8001 : 8000;
|
|
304
|
+
cli.url('MCP Server', `http://localhost:${mcpPort}/mcp/`);
|
|
305
|
+
} else {
|
|
306
|
+
cli.error(`Failed to restart: ${result.stderr || 'Unknown error'}`);
|
|
307
|
+
process.exit(1);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Show server status
|
|
313
|
+
*/
|
|
314
|
+
async function status(): Promise<void> {
|
|
315
|
+
cli.header('Knowledge System Status');
|
|
316
|
+
|
|
317
|
+
const compose = createComposeManager(serverDir);
|
|
318
|
+
|
|
319
|
+
// Check if runtime is available
|
|
320
|
+
if (!compose.isRuntimeAvailable()) {
|
|
321
|
+
cli.error('No container runtime found!');
|
|
322
|
+
process.exit(1);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
cli.success(`Using container runtime: ${compose.getRuntimeCommand()}`);
|
|
326
|
+
cli.blank();
|
|
327
|
+
|
|
328
|
+
if (flags.dev) {
|
|
329
|
+
cli.info('*** DEVELOPMENT MODE ***');
|
|
330
|
+
cli.blank();
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Load configuration to determine database type
|
|
334
|
+
const config = await loadConfig();
|
|
335
|
+
const databaseType = (config.DATABASE_TYPE || 'neo4j') as DatabaseBackend;
|
|
336
|
+
|
|
337
|
+
cli.info(`Database backend: ${databaseType}`);
|
|
338
|
+
cli.blank();
|
|
339
|
+
|
|
340
|
+
// Get compose file path for display
|
|
341
|
+
const composeFile = compose.getComposeFilePath(databaseType, flags.dev);
|
|
342
|
+
cli.dim(`Compose file: ${composeFile}`);
|
|
343
|
+
cli.blank();
|
|
344
|
+
|
|
345
|
+
// Get container status using docker-compose ps
|
|
346
|
+
cli.info('Container Status:');
|
|
347
|
+
cli.blank();
|
|
348
|
+
|
|
349
|
+
const result = await compose.ps(databaseType, flags.dev);
|
|
350
|
+
|
|
351
|
+
if (result.success && result.stdout) {
|
|
352
|
+
console.log(result.stdout);
|
|
353
|
+
} else if (result.stderr) {
|
|
354
|
+
cli.warning('Could not get container status');
|
|
355
|
+
cli.dim(result.stderr);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
cli.blank();
|
|
359
|
+
|
|
360
|
+
// Determine ports based on database type and mode
|
|
361
|
+
const mcpPort = flags.dev ? 8001 : 8000;
|
|
362
|
+
const dbPort = databaseType === 'neo4j' ? (flags.dev ? 7475 : 7474) : flags.dev ? 3001 : 3000;
|
|
363
|
+
const dbName = databaseType === 'neo4j' ? 'Neo4j Browser' : 'FalkorDB UI';
|
|
364
|
+
|
|
365
|
+
// Test health endpoint
|
|
366
|
+
cli.info('Health Check:');
|
|
367
|
+
cli.blank();
|
|
368
|
+
|
|
369
|
+
try {
|
|
370
|
+
const healthUrl = `http://localhost:${mcpPort}/health`;
|
|
371
|
+
const response = await fetch(healthUrl, {
|
|
372
|
+
signal: AbortSignal.timeout(5000),
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
if (response.ok) {
|
|
376
|
+
const data = await response.json();
|
|
377
|
+
if (data.status === 'healthy' || data.status === 'ok') {
|
|
378
|
+
cli.success(' MCP Server: healthy');
|
|
379
|
+
} else {
|
|
380
|
+
cli.warning(` MCP Server: ${data.status}`);
|
|
381
|
+
}
|
|
382
|
+
} else {
|
|
383
|
+
cli.warning(' MCP Server: unhealthy (server may be starting up)');
|
|
384
|
+
}
|
|
385
|
+
} catch {
|
|
386
|
+
cli.warning(' MCP Server: not responding (server may be starting up)');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
cli.blank();
|
|
390
|
+
cli.separator();
|
|
391
|
+
cli.blank();
|
|
392
|
+
|
|
393
|
+
// Display access URLs
|
|
394
|
+
cli.info('Access Points:');
|
|
395
|
+
cli.url(` ${dbName}`, `http://localhost:${dbPort}`);
|
|
396
|
+
cli.url(' MCP Server', `http://localhost:${mcpPort}/mcp/`);
|
|
397
|
+
cli.url(' Health Check', `http://localhost:${mcpPort}/health`);
|
|
398
|
+
cli.blank();
|
|
399
|
+
|
|
400
|
+
// Check if services are running
|
|
401
|
+
const isRunning = await compose.isRunning(databaseType, flags.dev);
|
|
402
|
+
|
|
403
|
+
if (isRunning) {
|
|
404
|
+
cli.success('System operational');
|
|
405
|
+
process.exit(0);
|
|
406
|
+
} else {
|
|
407
|
+
cli.warning('System not fully running');
|
|
408
|
+
cli.blank();
|
|
409
|
+
cli.info('To start the system:');
|
|
410
|
+
cli.dim(' bun run server start');
|
|
411
|
+
process.exit(1);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/**
|
|
416
|
+
* Show container logs
|
|
417
|
+
*/
|
|
418
|
+
async function logs(): Promise<void> {
|
|
419
|
+
const compose = createComposeManager(serverDir);
|
|
420
|
+
|
|
421
|
+
// Check if runtime is available
|
|
422
|
+
if (!compose.isRuntimeAvailable()) {
|
|
423
|
+
cli.error('No container runtime found!');
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Load configuration to determine database type
|
|
428
|
+
const config = await loadConfig();
|
|
429
|
+
const databaseType = (config.DATABASE_TYPE || 'neo4j') as DatabaseBackend;
|
|
430
|
+
|
|
431
|
+
// Determine which service to show logs for
|
|
432
|
+
let service: string | undefined;
|
|
433
|
+
if (flags.mcp) {
|
|
434
|
+
service = 'graphiti-mcp';
|
|
435
|
+
} else if (flags.db) {
|
|
436
|
+
service = databaseType === 'neo4j' ? 'neo4j' : 'falkordb';
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
const header = service ? `Logs: ${service}` : 'Logs: all services';
|
|
440
|
+
cli.header(header);
|
|
441
|
+
cli.info(`Backend: ${databaseType}`);
|
|
442
|
+
cli.info(`Runtime: ${compose.getRuntimeCommand()}`);
|
|
443
|
+
cli.separator();
|
|
444
|
+
|
|
445
|
+
// Get logs (this will stream if follow is enabled)
|
|
446
|
+
const result = await compose.logs(
|
|
447
|
+
databaseType,
|
|
448
|
+
service,
|
|
449
|
+
!flags.noFollow, // follow
|
|
450
|
+
flags.dev,
|
|
451
|
+
flags.tail
|
|
452
|
+
);
|
|
453
|
+
|
|
454
|
+
if (!result.success) {
|
|
455
|
+
cli.error(`Failed to get logs: ${result.stderr || 'Unknown error'}`);
|
|
456
|
+
process.exit(1);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Output logs
|
|
460
|
+
if (result.stdout) {
|
|
461
|
+
console.log(result.stdout);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Show help
|
|
467
|
+
*/
|
|
468
|
+
function showHelp(): void {
|
|
469
|
+
console.log(`
|
|
470
|
+
Usage: bun run server-cli <command> [options]
|
|
471
|
+
|
|
472
|
+
Commands:
|
|
473
|
+
start Start the server containers
|
|
474
|
+
stop Stop the server containers
|
|
475
|
+
restart Restart the server containers
|
|
476
|
+
status Show server status and health
|
|
477
|
+
logs Show container logs
|
|
478
|
+
|
|
479
|
+
Options:
|
|
480
|
+
--dev, -d Use development configuration
|
|
481
|
+
--mcp (logs) Show only MCP server logs
|
|
482
|
+
--db (logs) Show only database logs
|
|
483
|
+
--tail N (logs) Number of lines to show (default: 100)
|
|
484
|
+
--no-follow (logs) Don't follow log output
|
|
485
|
+
|
|
486
|
+
Examples:
|
|
487
|
+
bun run server-cli start
|
|
488
|
+
bun run server-cli stop
|
|
489
|
+
bun run server-cli restart
|
|
490
|
+
bun run server-cli status
|
|
491
|
+
bun run server-cli logs --mcp --tail 50
|
|
492
|
+
bun run server-cli logs --db --no-follow
|
|
493
|
+
`);
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
// Main execution
|
|
497
|
+
async function main(): Promise<void> {
|
|
498
|
+
try {
|
|
499
|
+
switch (command) {
|
|
500
|
+
case 'start':
|
|
501
|
+
await start();
|
|
502
|
+
break;
|
|
503
|
+
case 'stop':
|
|
504
|
+
await stop();
|
|
505
|
+
break;
|
|
506
|
+
case 'restart':
|
|
507
|
+
await restart();
|
|
508
|
+
break;
|
|
509
|
+
case 'status':
|
|
510
|
+
await status();
|
|
511
|
+
break;
|
|
512
|
+
case 'logs':
|
|
513
|
+
await logs();
|
|
514
|
+
break;
|
|
515
|
+
case 'help':
|
|
516
|
+
case '--help':
|
|
517
|
+
case '-h':
|
|
518
|
+
showHelp();
|
|
519
|
+
break;
|
|
520
|
+
default:
|
|
521
|
+
cli.error(`Unknown command: ${command}`);
|
|
522
|
+
showHelp();
|
|
523
|
+
process.exit(1);
|
|
524
|
+
}
|
|
525
|
+
} catch (error) {
|
|
526
|
+
cli.error(`Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
527
|
+
process.exit(1);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
main();
|