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