@omiron33/omi-neuron-web 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.
Files changed (55) hide show
  1. package/README.md +55 -0
  2. package/dist/api/index.cjs +943 -0
  3. package/dist/api/index.cjs.map +1 -0
  4. package/dist/api/index.d.cts +140 -0
  5. package/dist/api/index.d.ts +140 -0
  6. package/dist/api/index.js +934 -0
  7. package/dist/api/index.js.map +1 -0
  8. package/dist/chunk-BSOSHBDR.cjs +300 -0
  9. package/dist/chunk-BSOSHBDR.cjs.map +1 -0
  10. package/dist/chunk-COO66N7H.cjs +950 -0
  11. package/dist/chunk-COO66N7H.cjs.map +1 -0
  12. package/dist/chunk-FXKXMSLY.cjs +270 -0
  13. package/dist/chunk-FXKXMSLY.cjs.map +1 -0
  14. package/dist/chunk-PSDVPB7Y.js +289 -0
  15. package/dist/chunk-PSDVPB7Y.js.map +1 -0
  16. package/dist/chunk-RQCGONPN.js +937 -0
  17. package/dist/chunk-RQCGONPN.js.map +1 -0
  18. package/dist/chunk-RTSFO7BW.cjs +592 -0
  19. package/dist/chunk-RTSFO7BW.cjs.map +1 -0
  20. package/dist/chunk-TFLMPBX7.js +262 -0
  21. package/dist/chunk-TFLMPBX7.js.map +1 -0
  22. package/dist/chunk-XNR42GCJ.js +547 -0
  23. package/dist/chunk-XNR42GCJ.js.map +1 -0
  24. package/dist/cli/index.cjs +571 -0
  25. package/dist/cli/index.cjs.map +1 -0
  26. package/dist/cli/index.d.cts +1 -0
  27. package/dist/cli/index.d.ts +1 -0
  28. package/dist/cli/index.js +563 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/database-B0vplyA4.d.cts +41 -0
  31. package/dist/database-B0vplyA4.d.ts +41 -0
  32. package/dist/edge-BzsYe2Ed.d.cts +269 -0
  33. package/dist/edge-BzsYe2Ed.d.ts +269 -0
  34. package/dist/index.cjs +895 -0
  35. package/dist/index.cjs.map +1 -0
  36. package/dist/index.d.cts +1484 -0
  37. package/dist/index.d.ts +1484 -0
  38. package/dist/index.js +654 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/migration/index.cjs +32 -0
  41. package/dist/migration/index.cjs.map +1 -0
  42. package/dist/migration/index.d.cts +51 -0
  43. package/dist/migration/index.d.ts +51 -0
  44. package/dist/migration/index.js +3 -0
  45. package/dist/migration/index.js.map +1 -0
  46. package/dist/query-helpers-D8po5Mn-.d.cts +777 -0
  47. package/dist/query-helpers-DvQTA2_Z.d.ts +777 -0
  48. package/dist/visualization/index.cjs +485 -0
  49. package/dist/visualization/index.cjs.map +1 -0
  50. package/dist/visualization/index.d.cts +134 -0
  51. package/dist/visualization/index.d.ts +134 -0
  52. package/dist/visualization/index.js +460 -0
  53. package/dist/visualization/index.js.map +1 -0
  54. package/docker/docker-compose.template.yml +28 -0
  55. package/package.json +116 -0
@@ -0,0 +1,563 @@
1
+ #!/usr/bin/env node
2
+ import { DockerManager } from '../chunk-TFLMPBX7.js';
3
+ import { Database, EventBus, EmbeddingsService, ClusteringEngine, RelationshipEngine, AnalysisPipeline } from '../chunk-RQCGONPN.js';
4
+ import { MigrationRunner } from '../chunk-PSDVPB7Y.js';
5
+ import { Command, program } from 'commander';
6
+ import path2 from 'path';
7
+ import fs from 'fs/promises';
8
+ import chalk from 'chalk';
9
+ import { pathToFileURL } from 'url';
10
+ import { createInterface } from 'readline/promises';
11
+ import { stdout, stdin } from 'process';
12
+
13
+ var logger = {
14
+ info: (message) => {
15
+ console.log(chalk.cyan(`[omi-neuron] ${message}`));
16
+ },
17
+ success: (message) => {
18
+ console.log(chalk.green(`[omi-neuron] ${message}`));
19
+ },
20
+ warn: (message) => {
21
+ console.warn(chalk.yellow(`[omi-neuron] ${message}`));
22
+ },
23
+ error: (message) => {
24
+ console.error(chalk.red(`[omi-neuron] ${message}`));
25
+ }
26
+ };
27
+ var renderTemplate = (template, values) => {
28
+ let output2 = template;
29
+ for (const [key, value] of Object.entries(values)) {
30
+ output2 = output2.replace(new RegExp(`{{${key}}}`, "g"), value);
31
+ }
32
+ return output2;
33
+ };
34
+ async function writeTemplateFile(filePath, template, values, force = false) {
35
+ const resolved = path2.resolve(filePath);
36
+ await fs.mkdir(path2.dirname(resolved), { recursive: true });
37
+ try {
38
+ await fs.access(resolved);
39
+ if (!force) {
40
+ throw new Error(`File already exists: ${resolved}`);
41
+ }
42
+ } catch {
43
+ }
44
+ const content = renderTemplate(template, values);
45
+ await fs.writeFile(resolved, content, "utf8");
46
+ }
47
+
48
+ // src/cli/commands/init.ts
49
+ var CONFIG_TEMPLATE = `import { defineNeuronConfig, DEFAULT_ANALYSIS_SETTINGS, DEFAULT_VISUALIZATION_SETTINGS } from 'omi-neuron-web';
50
+
51
+ export default defineNeuronConfig({
52
+ instance: {
53
+ name: '{{INSTANCE_NAME}}',
54
+ version: '0.1.0',
55
+ repoName: '{{REPO_NAME}}',
56
+ },
57
+ visualization: DEFAULT_VISUALIZATION_SETTINGS,
58
+ analysis: DEFAULT_ANALYSIS_SETTINGS,
59
+ nodeTypes: [],
60
+ domains: [],
61
+ relationshipTypes: [],
62
+ openai: {
63
+ apiKey: process.env.OPENAI_API_KEY ?? '',
64
+ },
65
+ database: {
66
+ mode: 'docker',
67
+ port: {{DB_PORT}},
68
+ user: 'neuron',
69
+ password: 'neuron_dev',
70
+ database: 'neuron_web',
71
+ },
72
+ api: {
73
+ basePath: '/api/neuron',
74
+ enableCors: false,
75
+ },
76
+ logging: {
77
+ level: 'info',
78
+ prettyPrint: true,
79
+ },
80
+ });
81
+ `;
82
+ var ENV_TEMPLATE = `# omi-neuron-web environment variables
83
+ OPENAI_API_KEY=
84
+ DATABASE_URL=
85
+ `;
86
+ var DOCKER_TEMPLATE = `version: '3.8'
87
+
88
+ services:
89
+ pg-{{REPO_NAME}}:
90
+ image: pgvector/pgvector:pg16
91
+ container_name: pg-{{REPO_NAME}}
92
+ restart: unless-stopped
93
+ environment:
94
+ POSTGRES_USER: neuron
95
+ POSTGRES_PASSWORD: neuron_dev
96
+ POSTGRES_DB: neuron_web
97
+ ports:
98
+ - "{{DB_PORT}}:5432"
99
+ volumes:
100
+ - {{REPO_NAME}}_neuron_data:/var/lib/postgresql/data
101
+ healthcheck:
102
+ test: ["CMD-SHELL", "pg_isready -U neuron -d neuron_web"]
103
+ interval: 10s
104
+ timeout: 5s
105
+ retries: 5
106
+
107
+ volumes:
108
+ {{REPO_NAME}}_neuron_data:
109
+ name: {{REPO_NAME}}_neuron_data
110
+ `;
111
+ var API_ROUTE_TEMPLATE = `import { createNeuronRoutes } from 'omi-neuron-web/api';
112
+ import config from '../../../../neuron.config';
113
+
114
+ const routes = createNeuronRoutes(config);
115
+
116
+ export const GET = routes.health.GET;
117
+ export const POST = routes.health.GET;
118
+ `;
119
+ var initCommand = new Command("init").description("Initialize omi-neuron-web in your project").option("--name <name>", "Instance name (default: directory name)").option("--port <port>", "PostgreSQL port (default: 5433)", "5433").option("--skip-docker", "Don't generate Docker files").option("--skip-api", "Don't generate API route files").option("--skip-config", "Don't generate neuron.config.ts").option("--app-dir <path>", "Path to Next.js app directory", "./app").option("--force", "Overwrite existing files").action(async (options) => {
120
+ const repoName = path2.basename(process.cwd());
121
+ const instanceName = options.name ?? repoName;
122
+ const port = Number(options.port ?? 5433);
123
+ if (!options.skipConfig) {
124
+ await writeTemplateFile(
125
+ path2.join(process.cwd(), "neuron.config.ts"),
126
+ CONFIG_TEMPLATE,
127
+ {
128
+ INSTANCE_NAME: instanceName,
129
+ REPO_NAME: repoName,
130
+ DB_PORT: String(port)
131
+ },
132
+ options.force
133
+ );
134
+ logger.success("Created neuron.config.ts");
135
+ }
136
+ if (!options.skipDocker) {
137
+ await writeTemplateFile(
138
+ path2.join(process.cwd(), "docker-compose.neuron.yml"),
139
+ DOCKER_TEMPLATE,
140
+ {
141
+ REPO_NAME: repoName,
142
+ DB_PORT: String(port)
143
+ },
144
+ options.force
145
+ );
146
+ logger.success("Created docker-compose.neuron.yml");
147
+ }
148
+ await writeTemplateFile(
149
+ path2.join(process.cwd(), ".env.neuron.local"),
150
+ ENV_TEMPLATE,
151
+ {},
152
+ options.force
153
+ );
154
+ logger.success("Created .env.neuron.local");
155
+ if (!options.skipApi) {
156
+ const apiPath = path2.join(process.cwd(), options.appDir, "api", "neuron", "[...path]");
157
+ await fs.mkdir(apiPath, { recursive: true });
158
+ await fs.writeFile(path2.join(apiPath, "route.ts"), API_ROUTE_TEMPLATE, "utf8");
159
+ logger.success("Created Next.js API route stub");
160
+ }
161
+ logger.info("Initialization complete.");
162
+ });
163
+ async function loadNeuronConfig() {
164
+ const configPath = path2.resolve("neuron.config.ts");
165
+ try {
166
+ await fs.access(configPath);
167
+ } catch {
168
+ return null;
169
+ }
170
+ try {
171
+ const module = await import(pathToFileURL(configPath).toString());
172
+ return module.default ?? module;
173
+ } catch (error) {
174
+ throw new Error(
175
+ `Unable to load neuron.config.ts. Consider transpiling or using a JS config. ${String(error)}`
176
+ );
177
+ }
178
+ }
179
+ async function resolveCliConfig(overrides) {
180
+ const repoName = overrides?.repoName ?? path2.basename(process.cwd());
181
+ let config = null;
182
+ try {
183
+ config = await loadNeuronConfig();
184
+ } catch {
185
+ config = null;
186
+ }
187
+ return {
188
+ repoName,
189
+ port: overrides?.port ?? config?.database?.port ?? (process.env.DB_PORT ? Number(process.env.DB_PORT) : 5433),
190
+ containerName: overrides?.containerName ?? config?.database?.containerName,
191
+ databaseUrl: overrides?.databaseUrl ?? config?.database?.url ?? process.env.DATABASE_URL,
192
+ databaseUser: overrides?.databaseUser ?? config?.database?.user ?? process.env.DB_USER,
193
+ databasePassword: overrides?.databasePassword ?? config?.database?.password ?? process.env.DB_PASSWORD,
194
+ databaseName: overrides?.databaseName ?? config?.database?.database ?? process.env.DB_NAME
195
+ };
196
+ }
197
+ async function confirmPrompt(message) {
198
+ const rl = createInterface({ input: stdin, output: stdout });
199
+ const answer = await rl.question(`${message} (y/N): `);
200
+ rl.close();
201
+ return answer.trim().toLowerCase() === "y";
202
+ }
203
+
204
+ // src/cli/utils/spinner.ts
205
+ var Spinner = class {
206
+ constructor(message) {
207
+ this.message = message;
208
+ }
209
+ state = "stopped";
210
+ intervalId = null;
211
+ frames = ["-", "\\", "|", "/"];
212
+ frameIndex = 0;
213
+ start() {
214
+ if (this.state === "running") return;
215
+ this.state = "running";
216
+ this.intervalId = setInterval(() => {
217
+ const frame = this.frames[this.frameIndex % this.frames.length];
218
+ this.frameIndex += 1;
219
+ process.stdout.write(`\r${frame} ${this.message}`);
220
+ }, 120);
221
+ }
222
+ stop(success = true, finalMessage) {
223
+ if (this.intervalId) {
224
+ clearInterval(this.intervalId);
225
+ }
226
+ this.state = "stopped";
227
+ const symbol = success ? "\u2713" : "\u2717";
228
+ process.stdout.write(`\r${symbol} ${finalMessage ?? this.message}
229
+ `);
230
+ }
231
+ };
232
+
233
+ // src/cli/commands/db.ts
234
+ var buildConnectionString = (config) => {
235
+ if (config.databaseUrl) return config.databaseUrl;
236
+ const user = config.databaseUser ?? "neuron";
237
+ const password = config.databasePassword ?? "neuron_dev";
238
+ const database = config.databaseName ?? "neuron_web";
239
+ return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;
240
+ };
241
+ var dbCommand = new Command("db").description("Database management commands").addCommand(
242
+ new Command("up").description("Start PostgreSQL container").option("--port <port>", "Override port").option("--force-recreate", "Force recreate container").option("--wait", "Wait for readiness", true).action(async (options) => {
243
+ const config = await resolveCliConfig({
244
+ port: options.port ? Number(options.port) : void 0
245
+ });
246
+ const docker = new DockerManager({
247
+ repoName: config.repoName,
248
+ port: config.port,
249
+ containerName: config.containerName,
250
+ user: config.databaseUser,
251
+ password: config.databasePassword,
252
+ database: config.databaseName
253
+ });
254
+ const spinner = new Spinner("Starting PostgreSQL container");
255
+ spinner.start();
256
+ await docker.start({
257
+ forceRecreate: options.forceRecreate,
258
+ waitForReady: options.wait
259
+ });
260
+ spinner.stop(true, "Database ready");
261
+ const connectionString = await docker.getConnectionString();
262
+ logger.info(`Connection string: ${connectionString}`);
263
+ })
264
+ ).addCommand(
265
+ new Command("down").description("Stop PostgreSQL container").option("--remove-volumes", "Remove volumes (destructive)").action(async (options) => {
266
+ const config = await resolveCliConfig();
267
+ const docker = new DockerManager({
268
+ repoName: config.repoName,
269
+ port: config.port,
270
+ containerName: config.containerName
271
+ });
272
+ await docker.stop({ removeVolumes: options.removeVolumes });
273
+ logger.success("Database container stopped");
274
+ })
275
+ ).addCommand(
276
+ new Command("migrate").description("Run migrations").option("--status", "Show status only").option("--rollback <count>", "Rollback N migrations").option("--to <version>", "Migrate to specific version").option("--dry-run", "Show SQL without executing").action(async (options) => {
277
+ const config = await resolveCliConfig();
278
+ const db = new Database({
279
+ connectionString: buildConnectionString(config)
280
+ });
281
+ const runner = new MigrationRunner(db);
282
+ if (options.status) {
283
+ const status = await runner.getStatus();
284
+ status.forEach((item) => {
285
+ logger.info(`${item.version} ${item.name} - ${item.status}`);
286
+ });
287
+ return;
288
+ }
289
+ if (options.dryRun) {
290
+ const sql = await runner.dryRun(options.rollback ? "down" : "up");
291
+ logger.info(sql.join("\n\n"));
292
+ return;
293
+ }
294
+ if (options.rollback) {
295
+ await runner.down({ count: Number(options.rollback) });
296
+ logger.success("Rollback complete");
297
+ return;
298
+ }
299
+ await runner.up({ to: options.to });
300
+ logger.success("Migrations complete");
301
+ })
302
+ ).addCommand(
303
+ new Command("status").description("Show database status").option("--json", "Output JSON").option("--verbose", "Include stats").action(async (options) => {
304
+ const config = await resolveCliConfig();
305
+ const docker = new DockerManager({
306
+ repoName: config.repoName,
307
+ port: config.port,
308
+ containerName: config.containerName
309
+ });
310
+ const health = await docker.healthCheck();
311
+ if (options.json) {
312
+ console.log(JSON.stringify(health, null, 2));
313
+ return;
314
+ }
315
+ logger.info(`Container running: ${health.containerRunning}`);
316
+ logger.info(`Database ready: ${health.databaseReady}`);
317
+ if (options.verbose) {
318
+ const stats = await docker.getStats();
319
+ logger.info(`Stats: ${JSON.stringify(stats)}`);
320
+ }
321
+ })
322
+ ).addCommand(
323
+ new Command("reset").description("Reset database schema").option("--confirm", "Skip confirmation prompt").action(async (options) => {
324
+ if (!options.confirm) {
325
+ const confirmed = await confirmPrompt("This will drop and reapply all migrations. Continue?");
326
+ if (!confirmed) return;
327
+ }
328
+ const config = await resolveCliConfig();
329
+ const db = new Database({
330
+ connectionString: buildConnectionString(config)
331
+ });
332
+ const runner = new MigrationRunner(db);
333
+ await runner.reset();
334
+ logger.success("Database reset complete");
335
+ })
336
+ ).addCommand(
337
+ new Command("seed").description("Seed database with sample data").option("--file <path>", "Custom seed file").option("--clear", "Clear before seeding").option("--count <n>", "Number of example nodes", "10").action(async (options) => {
338
+ const config = await resolveCliConfig();
339
+ const db = new Database({
340
+ connectionString: buildConnectionString(config)
341
+ });
342
+ if (options.clear) {
343
+ await db.execute("DELETE FROM edges");
344
+ await db.execute("DELETE FROM nodes");
345
+ }
346
+ const count = Number(options.count ?? 10);
347
+ for (let i = 0; i < count; i += 1) {
348
+ await db.execute(
349
+ "INSERT INTO nodes (slug, label, node_type, domain, metadata) VALUES ($1, $2, $3, $4, $5)",
350
+ [`seed-${i + 1}`, `Seed Node ${i + 1}`, "concept", "general", {}]
351
+ );
352
+ }
353
+ logger.success("Seed data inserted");
354
+ })
355
+ );
356
+ var buildConnectionString2 = (config) => {
357
+ if (config.databaseUrl) return config.databaseUrl;
358
+ const user = config.databaseUser ?? "neuron";
359
+ const password = config.databasePassword ?? "neuron_dev";
360
+ const database = config.databaseName ?? "neuron_web";
361
+ return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;
362
+ };
363
+ async function buildPipeline() {
364
+ const config = await resolveCliConfig();
365
+ const db = new Database({ connectionString: buildConnectionString2(config) });
366
+ const events = new EventBus();
367
+ const embeddings = new EmbeddingsService(
368
+ {
369
+ openaiApiKey: process.env.OPENAI_API_KEY ?? "",
370
+ model: "text-embedding-3-small",
371
+ batchSize: 20,
372
+ rateLimit: 60,
373
+ cacheTTL: 86400,
374
+ maxRetries: 3
375
+ },
376
+ db
377
+ );
378
+ const clustering = new ClusteringEngine(db, embeddings);
379
+ const relationships = new RelationshipEngine(db, {
380
+ model: "gpt-4o-mini",
381
+ minConfidence: 0.7,
382
+ maxPerNode: 10,
383
+ similarityThreshold: 0.75,
384
+ includeExisting: false,
385
+ batchSize: 10,
386
+ rateLimit: 30
387
+ });
388
+ return new AnalysisPipeline(db, embeddings, clustering, relationships, events);
389
+ }
390
+ var analyzeCommand = new Command("analyze").description("Analysis commands").addCommand(
391
+ new Command("embeddings").description("Generate embeddings").option("--node-ids <ids>", "Comma-separated node IDs").option("--force", "Regenerate existing").action(async (options) => {
392
+ const pipeline = await buildPipeline();
393
+ const nodeIds = options.nodeIds ? options.nodeIds.split(",") : void 0;
394
+ await pipeline.runEmbeddings({ nodeIds, forceRecompute: options.force });
395
+ logger.success("Embeddings complete");
396
+ })
397
+ ).addCommand(
398
+ new Command("cluster").description("Run clustering").option("--count <n>", "Number of clusters").option("--algorithm <alg>", "kmeans, dbscan, hierarchical", "kmeans").action(async (options) => {
399
+ const pipeline = await buildPipeline();
400
+ await pipeline.runClustering({
401
+ clusterCount: options.count ? Number(options.count) : void 0,
402
+ clusteringAlgorithm: options.algorithm
403
+ });
404
+ logger.success("Clustering complete");
405
+ })
406
+ ).addCommand(
407
+ new Command("relationships").description("Infer relationships").option("--threshold <n>", "Min confidence (0-1)", "0.7").option("--dry-run", "Show without saving").action(async (options) => {
408
+ const pipeline = await buildPipeline();
409
+ await pipeline.runRelationships({
410
+ relationshipThreshold: Number(options.threshold)
411
+ });
412
+ logger.success("Relationship inference complete");
413
+ })
414
+ ).addCommand(
415
+ new Command("full").description("Run full analysis pipeline").option("--force", "Force recompute all").action(async (options) => {
416
+ const pipeline = await buildPipeline();
417
+ await pipeline.runFull({ forceRecompute: options.force });
418
+ logger.success("Analysis pipeline complete");
419
+ })
420
+ );
421
+ var buildConnectionString3 = (config) => {
422
+ if (config.databaseUrl) return config.databaseUrl;
423
+ const user = config.databaseUser ?? "neuron";
424
+ const password = config.databasePassword ?? "neuron_dev";
425
+ const database = config.databaseName ?? "neuron_web";
426
+ return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;
427
+ };
428
+ var validateCommand = new Command("validate").description("Validate configuration and setup").option("--fix", "Attempt to fix issues").option("--verbose", "Show detailed validation").action(async (options) => {
429
+ const config = await resolveCliConfig();
430
+ let hasError = false;
431
+ const configPath = path2.resolve("neuron.config.ts");
432
+ try {
433
+ await fs.access(configPath);
434
+ logger.success("neuron.config.ts exists");
435
+ } catch {
436
+ hasError = true;
437
+ logger.error("neuron.config.ts not found");
438
+ }
439
+ try {
440
+ const docker = new DockerManager({ repoName: config.repoName, port: config.port });
441
+ const health = await docker.healthCheck();
442
+ logger.info(`Docker container running: ${health.containerRunning}`);
443
+ logger.info(`Database ready: ${health.databaseReady}`);
444
+ } catch (error) {
445
+ hasError = true;
446
+ logger.error(`Docker check failed: ${String(error)}`);
447
+ }
448
+ try {
449
+ const db = new Database({ connectionString: buildConnectionString3(config) });
450
+ await db.connect();
451
+ logger.success("Database connection ok");
452
+ const runner = new MigrationRunner(db);
453
+ const pending = await runner.getPending();
454
+ if (pending.length > 0) {
455
+ logger.warn(`Pending migrations: ${pending.map((m) => m.version).join(", ")}`);
456
+ } else {
457
+ logger.success("Migrations up to date");
458
+ }
459
+ } catch (error) {
460
+ hasError = true;
461
+ logger.error(`Database check failed: ${String(error)}`);
462
+ }
463
+ if (!process.env.OPENAI_API_KEY) {
464
+ logger.warn("OPENAI_API_KEY not set");
465
+ if (options.fix) {
466
+ logger.info("Set OPENAI_API_KEY in your environment to enable analysis");
467
+ }
468
+ }
469
+ if (hasError) {
470
+ process.exitCode = 1;
471
+ }
472
+ });
473
+ var CONFIG_FILE = path2.resolve("neuron.config.ts");
474
+ var serializeConfig = (config) => `import { defineNeuronConfig } from 'omi-neuron-web';
475
+
476
+ export default defineNeuronConfig(${JSON.stringify(
477
+ config,
478
+ null,
479
+ 2
480
+ )});
481
+ `;
482
+ var getNestedValue = (obj, key) => {
483
+ return key.split(".").reduce((acc, part) => {
484
+ if (acc && typeof acc === "object" && part in acc) {
485
+ return acc[part];
486
+ }
487
+ return void 0;
488
+ }, obj);
489
+ };
490
+ var setNestedValue = (obj, key, value) => {
491
+ const parts = key.split(".");
492
+ let current = obj;
493
+ for (let i = 0; i < parts.length - 1; i += 1) {
494
+ const part = parts[i];
495
+ if (!current[part] || typeof current[part] !== "object") {
496
+ current[part] = {};
497
+ }
498
+ current = current[part];
499
+ }
500
+ current[parts[parts.length - 1]] = value;
501
+ };
502
+ var configCommand = new Command("config").description("Manage neuron.config.ts").addCommand(
503
+ new Command("get").argument("<key>", "Dot path key").action(async (key) => {
504
+ const config = await loadNeuronConfig();
505
+ if (!config) {
506
+ logger.error("neuron.config.ts not found");
507
+ return;
508
+ }
509
+ const value = getNestedValue(config, key);
510
+ console.log(JSON.stringify(value, null, 2));
511
+ })
512
+ ).addCommand(
513
+ new Command("set").argument("<key>", "Dot path key").argument("<value>", "Value (JSON)").action(async (key, value) => {
514
+ const config = await loadNeuronConfig();
515
+ if (!config) {
516
+ logger.error("neuron.config.ts not found");
517
+ return;
518
+ }
519
+ const parsed = JSON.parse(value);
520
+ const updated = { ...config };
521
+ setNestedValue(updated, key, parsed);
522
+ await fs.writeFile(CONFIG_FILE, serializeConfig(updated), "utf8");
523
+ logger.success(`Updated ${key}`);
524
+ })
525
+ ).addCommand(
526
+ new Command("list").action(async () => {
527
+ const config = await loadNeuronConfig();
528
+ if (!config) {
529
+ logger.error("neuron.config.ts not found");
530
+ return;
531
+ }
532
+ console.log(JSON.stringify(config, null, 2));
533
+ })
534
+ ).addCommand(
535
+ new Command("reset").option("--section <section>", "Section to reset").action(async (options) => {
536
+ const config = await loadNeuronConfig();
537
+ if (!config) {
538
+ logger.error("neuron.config.ts not found");
539
+ return;
540
+ }
541
+ const updated = { ...config };
542
+ if (options.section) {
543
+ delete updated[options.section];
544
+ } else {
545
+ for (const key of Object.keys(updated)) {
546
+ delete updated[key];
547
+ }
548
+ }
549
+ await fs.writeFile(CONFIG_FILE, serializeConfig(updated), "utf8");
550
+ logger.success("Config reset");
551
+ })
552
+ );
553
+
554
+ // src/cli/index.ts
555
+ program.name("omi-neuron").description("CLI for omi-neuron-web library").version("0.1.0");
556
+ program.addCommand(initCommand);
557
+ program.addCommand(dbCommand);
558
+ program.addCommand(analyzeCommand);
559
+ program.addCommand(validateCommand);
560
+ program.addCommand(configCommand);
561
+ program.parse();
562
+ //# sourceMappingURL=index.js.map
563
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/utils/logger.ts","../../src/cli/utils/templates.ts","../../src/cli/commands/init.ts","../../src/cli/utils/config.ts","../../src/cli/utils/prompts.ts","../../src/cli/utils/spinner.ts","../../src/cli/commands/db.ts","../../src/cli/commands/analyze.ts","../../src/cli/commands/validate.ts","../../src/cli/commands/config.ts","../../src/cli/index.ts"],"names":["output","path","fs","input","Command","buildConnectionString"],"mappings":"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","file":"index.js","sourcesContent":["import chalk from 'chalk';\n\nexport const logger = {\n info: (message: string) => {\n console.log(chalk.cyan(`[omi-neuron] ${message}`));\n },\n success: (message: string) => {\n console.log(chalk.green(`[omi-neuron] ${message}`));\n },\n warn: (message: string) => {\n console.warn(chalk.yellow(`[omi-neuron] ${message}`));\n },\n error: (message: string) => {\n console.error(chalk.red(`[omi-neuron] ${message}`));\n },\n};\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport const renderTemplate = (template: string, values: Record<string, string>): string => {\n let output = template;\n for (const [key, value] of Object.entries(values)) {\n output = output.replace(new RegExp(`{{${key}}}`, 'g'), value);\n }\n return output;\n};\n\nexport async function writeTemplateFile(\n filePath: string,\n template: string,\n values: Record<string, string>,\n force = false\n): Promise<void> {\n const resolved = path.resolve(filePath);\n await fs.mkdir(path.dirname(resolved), { recursive: true });\n try {\n await fs.access(resolved);\n if (!force) {\n throw new Error(`File already exists: ${resolved}`);\n }\n } catch {\n // File does not exist; continue.\n }\n\n const content = renderTemplate(template, values);\n await fs.writeFile(resolved, content, 'utf8');\n}\n","import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport { Command } from 'commander';\nimport { logger } from '../utils/logger';\nimport { writeTemplateFile } from '../utils/templates';\n\nconst CONFIG_TEMPLATE = `import { defineNeuronConfig, DEFAULT_ANALYSIS_SETTINGS, DEFAULT_VISUALIZATION_SETTINGS } from 'omi-neuron-web';\n\nexport default defineNeuronConfig({\n instance: {\n name: '{{INSTANCE_NAME}}',\n version: '0.1.0',\n repoName: '{{REPO_NAME}}',\n },\n visualization: DEFAULT_VISUALIZATION_SETTINGS,\n analysis: DEFAULT_ANALYSIS_SETTINGS,\n nodeTypes: [],\n domains: [],\n relationshipTypes: [],\n openai: {\n apiKey: process.env.OPENAI_API_KEY ?? '',\n },\n database: {\n mode: 'docker',\n port: {{DB_PORT}},\n user: 'neuron',\n password: 'neuron_dev',\n database: 'neuron_web',\n },\n api: {\n basePath: '/api/neuron',\n enableCors: false,\n },\n logging: {\n level: 'info',\n prettyPrint: true,\n },\n});\n`;\n\nconst ENV_TEMPLATE = `# omi-neuron-web environment variables\nOPENAI_API_KEY=\nDATABASE_URL=\n`;\n\nconst DOCKER_TEMPLATE = `version: '3.8'\n\nservices:\n pg-{{REPO_NAME}}:\n image: pgvector/pgvector:pg16\n container_name: pg-{{REPO_NAME}}\n restart: unless-stopped\n environment:\n POSTGRES_USER: neuron\n POSTGRES_PASSWORD: neuron_dev\n POSTGRES_DB: neuron_web\n ports:\n - \"{{DB_PORT}}:5432\"\n volumes:\n - {{REPO_NAME}}_neuron_data:/var/lib/postgresql/data\n healthcheck:\n test: [\"CMD-SHELL\", \"pg_isready -U neuron -d neuron_web\"]\n interval: 10s\n timeout: 5s\n retries: 5\n\nvolumes:\n {{REPO_NAME}}_neuron_data:\n name: {{REPO_NAME}}_neuron_data\n`;\n\nconst API_ROUTE_TEMPLATE = `import { createNeuronRoutes } from 'omi-neuron-web/api';\nimport config from '../../../../neuron.config';\n\nconst routes = createNeuronRoutes(config);\n\nexport const GET = routes.health.GET;\nexport const POST = routes.health.GET;\n`;\n\nexport const initCommand = new Command('init')\n .description('Initialize omi-neuron-web in your project')\n .option('--name <name>', 'Instance name (default: directory name)')\n .option('--port <port>', 'PostgreSQL port (default: 5433)', '5433')\n .option('--skip-docker', \"Don't generate Docker files\")\n .option('--skip-api', \"Don't generate API route files\")\n .option('--skip-config', \"Don't generate neuron.config.ts\")\n .option('--app-dir <path>', 'Path to Next.js app directory', './app')\n .option('--force', 'Overwrite existing files')\n .action(async (options) => {\n const repoName = path.basename(process.cwd());\n const instanceName = options.name ?? repoName;\n const port = Number(options.port ?? 5433);\n\n if (!options.skipConfig) {\n await writeTemplateFile(\n path.join(process.cwd(), 'neuron.config.ts'),\n CONFIG_TEMPLATE,\n {\n INSTANCE_NAME: instanceName,\n REPO_NAME: repoName,\n DB_PORT: String(port),\n },\n options.force\n );\n logger.success('Created neuron.config.ts');\n }\n\n if (!options.skipDocker) {\n await writeTemplateFile(\n path.join(process.cwd(), 'docker-compose.neuron.yml'),\n DOCKER_TEMPLATE,\n {\n REPO_NAME: repoName,\n DB_PORT: String(port),\n },\n options.force\n );\n logger.success('Created docker-compose.neuron.yml');\n }\n\n await writeTemplateFile(\n path.join(process.cwd(), '.env.neuron.local'),\n ENV_TEMPLATE,\n {},\n options.force\n );\n logger.success('Created .env.neuron.local');\n\n if (!options.skipApi) {\n const apiPath = path.join(process.cwd(), options.appDir, 'api', 'neuron', '[...path]');\n await fs.mkdir(apiPath, { recursive: true });\n await fs.writeFile(path.join(apiPath, 'route.ts'), API_ROUTE_TEMPLATE, 'utf8');\n logger.success('Created Next.js API route stub');\n }\n\n logger.info('Initialization complete.');\n });\n","import path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport fs from 'node:fs/promises';\nimport type { NeuronConfig } from '../../core/types/settings';\n\nexport interface CliConfig {\n repoName: string;\n port: number;\n containerName?: string;\n databaseUrl?: string;\n databaseUser?: string;\n databasePassword?: string;\n databaseName?: string;\n}\n\nexport async function loadNeuronConfig(): Promise<NeuronConfig | null> {\n const configPath = path.resolve('neuron.config.ts');\n try {\n await fs.access(configPath);\n } catch {\n return null;\n }\n\n try {\n const module = await import(pathToFileURL(configPath).toString());\n return module.default ?? module;\n } catch (error) {\n throw new Error(\n `Unable to load neuron.config.ts. Consider transpiling or using a JS config. ${String(error)}`\n );\n }\n}\n\nexport async function resolveCliConfig(overrides?: Partial<CliConfig>): Promise<CliConfig> {\n const repoName = overrides?.repoName ?? path.basename(process.cwd());\n let config: NeuronConfig | null = null;\n\n try {\n config = await loadNeuronConfig();\n } catch {\n config = null;\n }\n\n return {\n repoName,\n port:\n overrides?.port ??\n config?.database?.port ??\n (process.env.DB_PORT ? Number(process.env.DB_PORT) : 5433),\n containerName: overrides?.containerName ?? config?.database?.containerName,\n databaseUrl: overrides?.databaseUrl ?? config?.database?.url ?? process.env.DATABASE_URL,\n databaseUser: overrides?.databaseUser ?? config?.database?.user ?? process.env.DB_USER,\n databasePassword:\n overrides?.databasePassword ?? config?.database?.password ?? process.env.DB_PASSWORD,\n databaseName: overrides?.databaseName ?? config?.database?.database ?? process.env.DB_NAME,\n };\n}\n","import { createInterface } from 'node:readline/promises';\nimport { stdin as input, stdout as output } from 'node:process';\n\nexport async function confirmPrompt(message: string): Promise<boolean> {\n const rl = createInterface({ input, output });\n const answer = await rl.question(`${message} (y/N): `);\n rl.close();\n return answer.trim().toLowerCase() === 'y';\n}\n","type SpinnerState = 'running' | 'stopped';\n\nexport class Spinner {\n private state: SpinnerState = 'stopped';\n private intervalId: NodeJS.Timeout | null = null;\n private frames = ['-', '\\\\', '|', '/'];\n private frameIndex = 0;\n\n constructor(private message: string) {}\n\n start(): void {\n if (this.state === 'running') return;\n this.state = 'running';\n this.intervalId = setInterval(() => {\n const frame = this.frames[this.frameIndex % this.frames.length];\n this.frameIndex += 1;\n process.stdout.write(`\\r${frame} ${this.message}`);\n }, 120);\n }\n\n stop(success = true, finalMessage?: string): void {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n this.state = 'stopped';\n const symbol = success ? '✓' : '✗';\n process.stdout.write(`\\r${symbol} ${finalMessage ?? this.message}\\n`);\n }\n}\n","import { Command } from 'commander';\nimport { DockerManager } from '../../storage/docker-manager';\nimport { Database } from '../../storage/database';\nimport { MigrationRunner } from '../../storage/migrations/runner';\nimport { resolveCliConfig } from '../utils/config';\nimport { logger } from '../utils/logger';\nimport { confirmPrompt } from '../utils/prompts';\nimport { Spinner } from '../utils/spinner';\n\nconst buildConnectionString = (config: {\n databaseUrl?: string;\n databaseUser?: string;\n databasePassword?: string;\n databaseName?: string;\n port: number;\n}) => {\n if (config.databaseUrl) return config.databaseUrl;\n const user = config.databaseUser ?? 'neuron';\n const password = config.databasePassword ?? 'neuron_dev';\n const database = config.databaseName ?? 'neuron_web';\n return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;\n};\n\nexport const dbCommand = new Command('db')\n .description('Database management commands')\n .addCommand(\n new Command('up')\n .description('Start PostgreSQL container')\n .option('--port <port>', 'Override port')\n .option('--force-recreate', 'Force recreate container')\n .option('--wait', 'Wait for readiness', true)\n .action(async (options) => {\n const config = await resolveCliConfig({\n port: options.port ? Number(options.port) : undefined,\n });\n const docker = new DockerManager({\n repoName: config.repoName,\n port: config.port,\n containerName: config.containerName,\n user: config.databaseUser,\n password: config.databasePassword,\n database: config.databaseName,\n });\n const spinner = new Spinner('Starting PostgreSQL container');\n spinner.start();\n await docker.start({\n forceRecreate: options.forceRecreate,\n waitForReady: options.wait,\n });\n spinner.stop(true, 'Database ready');\n const connectionString = await docker.getConnectionString();\n logger.info(`Connection string: ${connectionString}`);\n })\n )\n .addCommand(\n new Command('down')\n .description('Stop PostgreSQL container')\n .option('--remove-volumes', 'Remove volumes (destructive)')\n .action(async (options) => {\n const config = await resolveCliConfig();\n const docker = new DockerManager({\n repoName: config.repoName,\n port: config.port,\n containerName: config.containerName,\n });\n await docker.stop({ removeVolumes: options.removeVolumes });\n logger.success('Database container stopped');\n })\n )\n .addCommand(\n new Command('migrate')\n .description('Run migrations')\n .option('--status', 'Show status only')\n .option('--rollback <count>', 'Rollback N migrations')\n .option('--to <version>', 'Migrate to specific version')\n .option('--dry-run', 'Show SQL without executing')\n .action(async (options) => {\n const config = await resolveCliConfig();\n const db = new Database({\n connectionString: buildConnectionString(config),\n });\n const runner = new MigrationRunner(db);\n\n if (options.status) {\n const status = await runner.getStatus();\n status.forEach((item) => {\n logger.info(`${item.version} ${item.name} - ${item.status}`);\n });\n return;\n }\n\n if (options.dryRun) {\n const sql = await runner.dryRun(options.rollback ? 'down' : 'up');\n logger.info(sql.join('\\n\\n'));\n return;\n }\n\n if (options.rollback) {\n await runner.down({ count: Number(options.rollback) });\n logger.success('Rollback complete');\n return;\n }\n\n await runner.up({ to: options.to });\n logger.success('Migrations complete');\n })\n )\n .addCommand(\n new Command('status')\n .description('Show database status')\n .option('--json', 'Output JSON')\n .option('--verbose', 'Include stats')\n .action(async (options) => {\n const config = await resolveCliConfig();\n const docker = new DockerManager({\n repoName: config.repoName,\n port: config.port,\n containerName: config.containerName,\n });\n const health = await docker.healthCheck();\n\n if (options.json) {\n console.log(JSON.stringify(health, null, 2));\n return;\n }\n\n logger.info(`Container running: ${health.containerRunning}`);\n logger.info(`Database ready: ${health.databaseReady}`);\n if (options.verbose) {\n const stats = await docker.getStats();\n logger.info(`Stats: ${JSON.stringify(stats)}`);\n }\n })\n )\n .addCommand(\n new Command('reset')\n .description('Reset database schema')\n .option('--confirm', 'Skip confirmation prompt')\n .action(async (options) => {\n if (!options.confirm) {\n const confirmed = await confirmPrompt('This will drop and reapply all migrations. Continue?');\n if (!confirmed) return;\n }\n const config = await resolveCliConfig();\n const db = new Database({\n connectionString: buildConnectionString(config),\n });\n const runner = new MigrationRunner(db);\n await runner.reset();\n logger.success('Database reset complete');\n })\n )\n .addCommand(\n new Command('seed')\n .description('Seed database with sample data')\n .option('--file <path>', 'Custom seed file')\n .option('--clear', 'Clear before seeding')\n .option('--count <n>', 'Number of example nodes', '10')\n .action(async (options) => {\n const config = await resolveCliConfig();\n const db = new Database({\n connectionString: buildConnectionString(config),\n });\n if (options.clear) {\n await db.execute('DELETE FROM edges');\n await db.execute('DELETE FROM nodes');\n }\n const count = Number(options.count ?? 10);\n for (let i = 0; i < count; i += 1) {\n await db.execute(\n 'INSERT INTO nodes (slug, label, node_type, domain, metadata) VALUES ($1, $2, $3, $4, $5)',\n [`seed-${i + 1}`, `Seed Node ${i + 1}`, 'concept', 'general', {}]\n );\n }\n logger.success('Seed data inserted');\n })\n );\n","import { Command } from 'commander';\nimport { Database } from '../../storage/database';\nimport { resolveCliConfig } from '../utils/config';\nimport { logger } from '../utils/logger';\nimport { EventBus } from '../../core/events/event-bus';\nimport { EmbeddingsService } from '../../core/analysis/embeddings-service';\nimport { ClusteringEngine } from '../../core/analysis/clustering-engine';\nimport { RelationshipEngine } from '../../core/analysis/relationship-engine';\nimport { AnalysisPipeline } from '../../core/analysis/pipeline';\n\nconst buildConnectionString = (config: {\n databaseUrl?: string;\n databaseUser?: string;\n databasePassword?: string;\n databaseName?: string;\n port: number;\n}) => {\n if (config.databaseUrl) return config.databaseUrl;\n const user = config.databaseUser ?? 'neuron';\n const password = config.databasePassword ?? 'neuron_dev';\n const database = config.databaseName ?? 'neuron_web';\n return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;\n};\n\nasync function buildPipeline(): Promise<AnalysisPipeline> {\n const config = await resolveCliConfig();\n const db = new Database({ connectionString: buildConnectionString(config) });\n const events = new EventBus();\n\n const embeddings = new EmbeddingsService(\n {\n openaiApiKey: process.env.OPENAI_API_KEY ?? '',\n model: 'text-embedding-3-small',\n batchSize: 20,\n rateLimit: 60,\n cacheTTL: 86400,\n maxRetries: 3,\n },\n db\n );\n\n const clustering = new ClusteringEngine(db, embeddings);\n const relationships = new RelationshipEngine(db, {\n model: 'gpt-4o-mini',\n minConfidence: 0.7,\n maxPerNode: 10,\n similarityThreshold: 0.75,\n includeExisting: false,\n batchSize: 10,\n rateLimit: 30,\n });\n\n return new AnalysisPipeline(db, embeddings, clustering, relationships, events);\n}\n\nexport const analyzeCommand = new Command('analyze')\n .description('Analysis commands')\n .addCommand(\n new Command('embeddings')\n .description('Generate embeddings')\n .option('--node-ids <ids>', 'Comma-separated node IDs')\n .option('--force', 'Regenerate existing')\n .action(async (options) => {\n const pipeline = await buildPipeline();\n const nodeIds = options.nodeIds ? options.nodeIds.split(',') : undefined;\n await pipeline.runEmbeddings({ nodeIds, forceRecompute: options.force });\n logger.success('Embeddings complete');\n })\n )\n .addCommand(\n new Command('cluster')\n .description('Run clustering')\n .option('--count <n>', 'Number of clusters')\n .option('--algorithm <alg>', 'kmeans, dbscan, hierarchical', 'kmeans')\n .action(async (options) => {\n const pipeline = await buildPipeline();\n await pipeline.runClustering({\n clusterCount: options.count ? Number(options.count) : undefined,\n clusteringAlgorithm: options.algorithm,\n });\n logger.success('Clustering complete');\n })\n )\n .addCommand(\n new Command('relationships')\n .description('Infer relationships')\n .option('--threshold <n>', 'Min confidence (0-1)', '0.7')\n .option('--dry-run', 'Show without saving')\n .action(async (options) => {\n const pipeline = await buildPipeline();\n await pipeline.runRelationships({\n relationshipThreshold: Number(options.threshold),\n });\n logger.success('Relationship inference complete');\n })\n )\n .addCommand(\n new Command('full')\n .description('Run full analysis pipeline')\n .option('--force', 'Force recompute all')\n .action(async (options) => {\n const pipeline = await buildPipeline();\n await pipeline.runFull({ forceRecompute: options.force });\n logger.success('Analysis pipeline complete');\n })\n );\n","import { Command } from 'commander';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { DockerManager } from '../../storage/docker-manager';\nimport { Database } from '../../storage/database';\nimport { MigrationRunner } from '../../storage/migrations/runner';\nimport { resolveCliConfig } from '../utils/config';\nimport { logger } from '../utils/logger';\n\nconst buildConnectionString = (config: {\n databaseUrl?: string;\n databaseUser?: string;\n databasePassword?: string;\n databaseName?: string;\n port: number;\n}) => {\n if (config.databaseUrl) return config.databaseUrl;\n const user = config.databaseUser ?? 'neuron';\n const password = config.databasePassword ?? 'neuron_dev';\n const database = config.databaseName ?? 'neuron_web';\n return `postgresql://${user}:${password}@localhost:${config.port}/${database}`;\n};\n\nexport const validateCommand = new Command('validate')\n .description('Validate configuration and setup')\n .option('--fix', 'Attempt to fix issues')\n .option('--verbose', 'Show detailed validation')\n .action(async (options) => {\n const config = await resolveCliConfig();\n let hasError = false;\n\n const configPath = path.resolve('neuron.config.ts');\n try {\n await fs.access(configPath);\n logger.success('neuron.config.ts exists');\n } catch {\n hasError = true;\n logger.error('neuron.config.ts not found');\n }\n\n try {\n const docker = new DockerManager({ repoName: config.repoName, port: config.port });\n const health = await docker.healthCheck();\n logger.info(`Docker container running: ${health.containerRunning}`);\n logger.info(`Database ready: ${health.databaseReady}`);\n } catch (error) {\n hasError = true;\n logger.error(`Docker check failed: ${String(error)}`);\n }\n\n try {\n const db = new Database({ connectionString: buildConnectionString(config) });\n await db.connect();\n logger.success('Database connection ok');\n const runner = new MigrationRunner(db);\n const pending = await runner.getPending();\n if (pending.length > 0) {\n logger.warn(`Pending migrations: ${pending.map((m) => m.version).join(', ')}`);\n } else {\n logger.success('Migrations up to date');\n }\n } catch (error) {\n hasError = true;\n logger.error(`Database check failed: ${String(error)}`);\n }\n\n if (!process.env.OPENAI_API_KEY) {\n logger.warn('OPENAI_API_KEY not set');\n if (options.fix) {\n logger.info('Set OPENAI_API_KEY in your environment to enable analysis');\n }\n }\n\n if (hasError) {\n process.exitCode = 1;\n }\n });\n","import { Command } from 'commander';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { loadNeuronConfig } from '../utils/config';\nimport { logger } from '../utils/logger';\n\nconst CONFIG_FILE = path.resolve('neuron.config.ts');\n\nconst serializeConfig = (config: unknown): string => `import { defineNeuronConfig } from 'omi-neuron-web';\\n\\nexport default defineNeuronConfig(${JSON.stringify(\n config,\n null,\n 2\n)});\\n`;\n\nconst getNestedValue = (obj: Record<string, unknown>, key: string): unknown => {\n return key.split('.').reduce((acc, part) => {\n if (acc && typeof acc === 'object' && part in acc) {\n return (acc as Record<string, unknown>)[part];\n }\n return undefined;\n }, obj as unknown);\n};\n\nconst setNestedValue = (obj: Record<string, unknown>, key: string, value: unknown): void => {\n const parts = key.split('.');\n let current = obj;\n for (let i = 0; i < parts.length - 1; i += 1) {\n const part = parts[i];\n if (!current[part] || typeof current[part] !== 'object') {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]] = value;\n};\n\nexport const configCommand = new Command('config')\n .description('Manage neuron.config.ts')\n .addCommand(\n new Command('get')\n .argument('<key>', 'Dot path key')\n .action(async (key) => {\n const config = await loadNeuronConfig();\n if (!config) {\n logger.error('neuron.config.ts not found');\n return;\n }\n const value = getNestedValue(config as unknown as Record<string, unknown>, key);\n console.log(JSON.stringify(value, null, 2));\n })\n )\n .addCommand(\n new Command('set')\n .argument('<key>', 'Dot path key')\n .argument('<value>', 'Value (JSON)')\n .action(async (key, value) => {\n const config = await loadNeuronConfig();\n if (!config) {\n logger.error('neuron.config.ts not found');\n return;\n }\n const parsed = JSON.parse(value);\n const updated = { ...(config as unknown as Record<string, unknown>) };\n setNestedValue(updated, key, parsed);\n await fs.writeFile(CONFIG_FILE, serializeConfig(updated), 'utf8');\n logger.success(`Updated ${key}`);\n })\n )\n .addCommand(\n new Command('list').action(async () => {\n const config = await loadNeuronConfig();\n if (!config) {\n logger.error('neuron.config.ts not found');\n return;\n }\n console.log(JSON.stringify(config, null, 2));\n })\n )\n .addCommand(\n new Command('reset')\n .option('--section <section>', 'Section to reset')\n .action(async (options) => {\n const config = await loadNeuronConfig();\n if (!config) {\n logger.error('neuron.config.ts not found');\n return;\n }\n const updated = { ...(config as unknown as Record<string, unknown>) };\n if (options.section) {\n delete updated[options.section];\n } else {\n for (const key of Object.keys(updated)) {\n delete updated[key];\n }\n }\n await fs.writeFile(CONFIG_FILE, serializeConfig(updated), 'utf8');\n logger.success('Config reset');\n })\n );\n","#!/usr/bin/env node\nimport { program } from 'commander';\nimport { initCommand } from './commands/init';\nimport { dbCommand } from './commands/db';\nimport { analyzeCommand } from './commands/analyze';\nimport { validateCommand } from './commands/validate';\nimport { configCommand } from './commands/config';\n\nprogram\n .name('omi-neuron')\n .description('CLI for omi-neuron-web library')\n .version('0.1.0');\n\nprogram.addCommand(initCommand);\nprogram.addCommand(dbCommand);\nprogram.addCommand(analyzeCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(configCommand);\n\nprogram.parse();\n"]}