@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.
Files changed (70) hide show
  1. package/.deepquark/skills/bundled/knowledge-graph/SKILL.md +385 -0
  2. package/.deepquark/skills/bundled/knowledge-graph/STANDARDS.md +461 -0
  3. package/.deepquark/skills/bundled/knowledge-graph/lib/cli.ts +588 -0
  4. package/.deepquark/skills/bundled/knowledge-graph/lib/config.ts +630 -0
  5. package/.deepquark/skills/bundled/knowledge-graph/lib/connection-profile.ts +629 -0
  6. package/.deepquark/skills/bundled/knowledge-graph/lib/container.ts +756 -0
  7. package/.deepquark/skills/bundled/knowledge-graph/lib/mcp-client.ts +1310 -0
  8. package/.deepquark/skills/bundled/knowledge-graph/lib/output-formatter.ts +997 -0
  9. package/.deepquark/skills/bundled/knowledge-graph/lib/token-metrics.ts +335 -0
  10. package/.deepquark/skills/bundled/knowledge-graph/lib/transformation-log.ts +137 -0
  11. package/.deepquark/skills/bundled/knowledge-graph/lib/wrapper-config.ts +113 -0
  12. package/.deepquark/skills/bundled/knowledge-graph/server/.env.example +129 -0
  13. package/.deepquark/skills/bundled/knowledge-graph/server/compare-embeddings.ts +175 -0
  14. package/.deepquark/skills/bundled/knowledge-graph/server/config-falkordb.yaml +108 -0
  15. package/.deepquark/skills/bundled/knowledge-graph/server/config-neo4j.yaml +111 -0
  16. package/.deepquark/skills/bundled/knowledge-graph/server/diagnose.ts +483 -0
  17. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-falkordb-dev.yml +146 -0
  18. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-falkordb.yml +151 -0
  19. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j-dev-local.yml +161 -0
  20. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j-dev.yml +161 -0
  21. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-neo4j.yml +169 -0
  22. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-production.yml +128 -0
  23. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose-test.yml +10 -0
  24. package/.deepquark/skills/bundled/knowledge-graph/server/docker-compose.yml +84 -0
  25. package/.deepquark/skills/bundled/knowledge-graph/server/entrypoint.sh +40 -0
  26. package/.deepquark/skills/bundled/knowledge-graph/server/install.ts +2054 -0
  27. package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose-falkordb.yml +78 -0
  28. package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose-neo4j.yml +88 -0
  29. package/.deepquark/skills/bundled/knowledge-graph/server/podman-compose.yml +83 -0
  30. package/.deepquark/skills/bundled/knowledge-graph/server/test-all-llms-mcp.ts +387 -0
  31. package/.deepquark/skills/bundled/knowledge-graph/server/test-embedding-models.ts +201 -0
  32. package/.deepquark/skills/bundled/knowledge-graph/server/test-embedding-providers.ts +641 -0
  33. package/.deepquark/skills/bundled/knowledge-graph/server/test-graphiti-model.ts +217 -0
  34. package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-correct.ts +141 -0
  35. package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-llms-mcp.ts +386 -0
  36. package/.deepquark/skills/bundled/knowledge-graph/server/test-grok-models.ts +173 -0
  37. package/.deepquark/skills/bundled/knowledge-graph/server/test-llama-extraction.ts +188 -0
  38. package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-final.ts +240 -0
  39. package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-live.ts +187 -0
  40. package/.deepquark/skills/bundled/knowledge-graph/server/test-mcp-session.ts +127 -0
  41. package/.deepquark/skills/bundled/knowledge-graph/server/test-model-combinations.ts +316 -0
  42. package/.deepquark/skills/bundled/knowledge-graph/server/test-ollama-models.ts +228 -0
  43. package/.deepquark/skills/bundled/knowledge-graph/server/test-openrouter-models.ts +460 -0
  44. package/.deepquark/skills/bundled/knowledge-graph/server/test-real-life-mcp.ts +311 -0
  45. package/.deepquark/skills/bundled/knowledge-graph/server/test-search-debug.ts +199 -0
  46. package/.deepquark/skills/bundled/knowledge-graph/tools/Install.md +104 -0
  47. package/.deepquark/skills/bundled/knowledge-graph/tools/README.md +120 -0
  48. package/.deepquark/skills/bundled/knowledge-graph/tools/knowledge-cli.ts +996 -0
  49. package/.deepquark/skills/bundled/knowledge-graph/tools/server-cli.ts +531 -0
  50. package/.deepquark/skills/bundled/knowledge-graph/workflows/BulkImport.md +514 -0
  51. package/.deepquark/skills/bundled/knowledge-graph/workflows/CaptureEpisode.md +242 -0
  52. package/.deepquark/skills/bundled/knowledge-graph/workflows/ClearGraph.md +392 -0
  53. package/.deepquark/skills/bundled/knowledge-graph/workflows/GetRecent.md +352 -0
  54. package/.deepquark/skills/bundled/knowledge-graph/workflows/GetStatus.md +373 -0
  55. package/.deepquark/skills/bundled/knowledge-graph/workflows/HealthReport.md +212 -0
  56. package/.deepquark/skills/bundled/knowledge-graph/workflows/InvestigateEntity.md +142 -0
  57. package/.deepquark/skills/bundled/knowledge-graph/workflows/OntologyManagement.md +201 -0
  58. package/.deepquark/skills/bundled/knowledge-graph/workflows/RunMaintenance.md +302 -0
  59. package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchByDate.md +255 -0
  60. package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchFacts.md +382 -0
  61. package/.deepquark/skills/bundled/knowledge-graph/workflows/SearchKnowledge.md +374 -0
  62. package/.deepquark/skills/bundled/knowledge-graph/workflows/StixImport.md +212 -0
  63. package/bin/deepquark +0 -0
  64. package/package.json +1 -1
  65. package/.deepquark/skills/bundled/ge-payroll/SKILL.md +0 -153
  66. package/.deepquark/skills/bundled/ge-payroll/evals/evals.json +0 -23
  67. package/.deepquark/skills/bundled/ge-payroll/references/pain-points-improvements.md +0 -106
  68. package/.deepquark/skills/bundled/ge-payroll/references/process-detail.md +0 -217
  69. package/.deepquark/skills/bundled/ge-payroll/references/raci-stakeholders.md +0 -85
  70. 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();