@soulcraft/brainy 3.19.1 → 3.20.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.
@@ -0,0 +1,82 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Brainy CLI - Minimal Version (Conversation Commands Only)
5
+ *
6
+ * This is a temporary minimal CLI that only includes working conversation commands
7
+ * Full CLI will be restored in version 3.20.0
8
+ */
9
+
10
+ import { Command } from 'commander'
11
+ import { readFileSync } from 'fs'
12
+ import { dirname, join } from 'path'
13
+ import { fileURLToPath } from 'url'
14
+
15
+ const __dirname = dirname(fileURLToPath(import.meta.url))
16
+ const packageJson = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8'))
17
+
18
+ const program = new Command()
19
+
20
+ program
21
+ .name('brainy')
22
+ .description('🧠 Brainy - Infinite Agent Memory')
23
+ .version(packageJson.version)
24
+
25
+ // Dynamically load conversation command
26
+ const conversationCommand = await import('../dist/cli/commands/conversation.js').then(m => m.default)
27
+
28
+ program
29
+ .command('conversation')
30
+ .alias('conv')
31
+ .description('💬 Infinite agent memory and context management')
32
+ .addCommand(
33
+ new Command('setup')
34
+ .description('Set up MCP server for Claude Code integration')
35
+ .action(async () => {
36
+ await conversationCommand.handler({ action: 'setup', _: [] })
37
+ })
38
+ )
39
+ .addCommand(
40
+ new Command('remove')
41
+ .description('Remove MCP server and clean up')
42
+ .action(async () => {
43
+ await conversationCommand.handler({ action: 'remove', _: [] })
44
+ })
45
+ )
46
+ .addCommand(
47
+ new Command('search')
48
+ .description('Search messages across conversations')
49
+ .requiredOption('-q, --query <query>', 'Search query')
50
+ .option('-c, --conversation-id <id>', 'Filter by conversation')
51
+ .option('-r, --role <role>', 'Filter by role')
52
+ .option('-l, --limit <number>', 'Maximum results', '10')
53
+ .action(async (options) => {
54
+ await conversationCommand.handler({ action: 'search', ...options, _: [] })
55
+ })
56
+ )
57
+ .addCommand(
58
+ new Command('context')
59
+ .description('Get relevant context for a query')
60
+ .requiredOption('-q, --query <query>', 'Context query')
61
+ .option('-l, --limit <number>', 'Maximum messages', '10')
62
+ .action(async (options) => {
63
+ await conversationCommand.handler({ action: 'context', ...options, _: [] })
64
+ })
65
+ )
66
+ .addCommand(
67
+ new Command('thread')
68
+ .description('Get full conversation thread')
69
+ .requiredOption('-c, --conversation-id <id>', 'Conversation ID')
70
+ .action(async (options) => {
71
+ await conversationCommand.handler({ action: 'thread', ...options, _: [] })
72
+ })
73
+ )
74
+ .addCommand(
75
+ new Command('stats')
76
+ .description('Show conversation statistics')
77
+ .action(async () => {
78
+ await conversationCommand.handler({ action: 'stats', _: [] })
79
+ })
80
+ )
81
+
82
+ program.parse(process.argv)
@@ -15,8 +15,20 @@ interface AddOptions extends CoreOptions {
15
15
  }
16
16
  interface SearchOptions extends CoreOptions {
17
17
  limit?: string;
18
+ offset?: string;
18
19
  threshold?: string;
19
- metadata?: string;
20
+ type?: string;
21
+ where?: string;
22
+ near?: string;
23
+ connectedTo?: string;
24
+ connectedFrom?: string;
25
+ via?: string;
26
+ explain?: boolean;
27
+ includeRelations?: boolean;
28
+ fusion?: string;
29
+ vectorWeight?: string;
30
+ graphWeight?: string;
31
+ fieldWeight?: string;
20
32
  }
21
33
  interface GetOptions extends CoreOptions {
22
34
  withConnections?: boolean;
@@ -38,7 +50,7 @@ export declare const coreCommands: {
38
50
  */
39
51
  add(text: string, options: AddOptions): Promise<void>;
40
52
  /**
41
- * Search the neural database
53
+ * Search the neural database with Triple Intelligence™
42
54
  */
43
55
  search(query: string, options: SearchOptions): Promise<void>;
44
56
  /**
@@ -9,10 +9,9 @@ import { readFileSync, writeFileSync } from 'node:fs';
9
9
  import { Brainy } from '../../brainy.js';
10
10
  import { BrainyTypes, NounType } from '../../index.js';
11
11
  let brainyInstance = null;
12
- const getBrainy = async () => {
12
+ const getBrainy = () => {
13
13
  if (!brainyInstance) {
14
14
  brainyInstance = new Brainy();
15
- await brainyInstance.init();
16
15
  }
17
16
  return brainyInstance;
18
17
  };
@@ -28,7 +27,7 @@ export const coreCommands = {
28
27
  async add(text, options) {
29
28
  const spinner = ora('Adding to neural database...').start();
30
29
  try {
31
- const brain = await getBrainy();
30
+ const brain = getBrainy();
32
31
  let metadata = {};
33
32
  if (options.metadata) {
34
33
  try {
@@ -93,43 +92,157 @@ export const coreCommands = {
93
92
  }
94
93
  },
95
94
  /**
96
- * Search the neural database
95
+ * Search the neural database with Triple Intelligence™
97
96
  */
98
97
  async search(query, options) {
99
- const spinner = ora('Searching neural database...').start();
98
+ const spinner = ora('Searching with Triple Intelligence™...').start();
100
99
  try {
101
- const brain = await getBrainy();
102
- const searchOptions = {
100
+ const brain = getBrainy();
101
+ // Build comprehensive search params
102
+ const searchParams = {
103
+ query,
103
104
  limit: options.limit ? parseInt(options.limit) : 10
104
105
  };
106
+ // Pagination
107
+ if (options.offset) {
108
+ searchParams.offset = parseInt(options.offset);
109
+ }
110
+ // Vector Intelligence - similarity threshold
105
111
  if (options.threshold) {
106
- searchOptions.threshold = parseFloat(options.threshold);
112
+ searchParams.near = { threshold: parseFloat(options.threshold) };
107
113
  }
108
- if (options.metadata) {
114
+ // Metadata Intelligence - type filtering
115
+ if (options.type) {
116
+ const types = options.type.split(',').map(t => t.trim());
117
+ searchParams.type = types.length === 1 ? types[0] : types;
118
+ }
119
+ // Metadata Intelligence - field filtering
120
+ if (options.where) {
109
121
  try {
110
- searchOptions.filter = JSON.parse(options.metadata);
122
+ searchParams.where = JSON.parse(options.where);
111
123
  }
112
124
  catch {
113
- spinner.fail('Invalid metadata filter JSON');
125
+ spinner.fail('Invalid --where JSON');
126
+ console.log(chalk.dim('Example: --where \'{"status":"active","priority":{"$gte":5}}\''));
114
127
  process.exit(1);
115
128
  }
116
129
  }
117
- const results = await brain.search(query, searchOptions.limit);
130
+ // Vector Intelligence - proximity search
131
+ if (options.near) {
132
+ searchParams.near = {
133
+ id: options.near,
134
+ threshold: options.threshold ? parseFloat(options.threshold) : 0.7
135
+ };
136
+ }
137
+ // Graph Intelligence - connection constraints
138
+ if (options.connectedTo || options.connectedFrom || options.via) {
139
+ searchParams.connected = {};
140
+ if (options.connectedTo) {
141
+ searchParams.connected.to = options.connectedTo;
142
+ }
143
+ if (options.connectedFrom) {
144
+ searchParams.connected.from = options.connectedFrom;
145
+ }
146
+ if (options.via) {
147
+ const vias = options.via.split(',').map(v => v.trim());
148
+ searchParams.connected.via = vias.length === 1 ? vias[0] : vias;
149
+ }
150
+ }
151
+ // Explanation
152
+ if (options.explain) {
153
+ searchParams.explain = true;
154
+ }
155
+ // Include relationships
156
+ if (options.includeRelations) {
157
+ searchParams.includeRelations = true;
158
+ }
159
+ // Triple Intelligence Fusion - custom weighting
160
+ if (options.fusion || options.vectorWeight || options.graphWeight || options.fieldWeight) {
161
+ searchParams.fusion = {
162
+ strategy: options.fusion || 'adaptive',
163
+ weights: {}
164
+ };
165
+ if (options.vectorWeight) {
166
+ searchParams.fusion.weights.vector = parseFloat(options.vectorWeight);
167
+ }
168
+ if (options.graphWeight) {
169
+ searchParams.fusion.weights.graph = parseFloat(options.graphWeight);
170
+ }
171
+ if (options.fieldWeight) {
172
+ searchParams.fusion.weights.field = parseFloat(options.fieldWeight);
173
+ }
174
+ }
175
+ const results = await brain.find(searchParams);
118
176
  spinner.succeed(`Found ${results.length} results`);
119
177
  if (!options.json) {
120
178
  if (results.length === 0) {
121
- console.log(chalk.yellow('No results found'));
179
+ console.log(chalk.yellow('\nNo results found'));
180
+ // Show helpful hints
181
+ console.log(chalk.dim('\nTips:'));
182
+ console.log(chalk.dim(' • Try different search terms'));
183
+ console.log(chalk.dim(' • Remove filters (--type, --where, --connected-to)'));
184
+ console.log(chalk.dim(' • Lower the --threshold value'));
122
185
  }
123
186
  else {
187
+ console.log(chalk.cyan(`\n📊 Triple Intelligence Results:\n`));
124
188
  results.forEach((result, i) => {
125
- console.log(chalk.cyan(`\n${i + 1}. ${result.content || result.id}`));
189
+ const entity = result.entity || result;
190
+ console.log(chalk.bold(`${i + 1}. ${entity.id}`));
191
+ // Show score with breakdown
126
192
  if (result.score !== undefined) {
127
- console.log(chalk.dim(` Similarity: ${(result.score * 100).toFixed(1)}%`));
193
+ console.log(chalk.green(` Score: ${(result.score * 100).toFixed(1)}%`));
194
+ if (options.explain && result.scores) {
195
+ const scores = result.scores;
196
+ if (scores.vector !== undefined) {
197
+ console.log(chalk.dim(` Vector: ${(scores.vector * 100).toFixed(1)}%`));
198
+ }
199
+ if (scores.graph !== undefined) {
200
+ console.log(chalk.dim(` Graph: ${(scores.graph * 100).toFixed(1)}%`));
201
+ }
202
+ if (scores.field !== undefined) {
203
+ console.log(chalk.dim(` Field: ${(scores.field * 100).toFixed(1)}%`));
204
+ }
205
+ }
206
+ }
207
+ // Show type
208
+ if (entity.type) {
209
+ console.log(chalk.dim(` Type: ${entity.type}`));
210
+ }
211
+ // Show content preview
212
+ if (entity.content) {
213
+ const preview = entity.content.substring(0, 80);
214
+ console.log(chalk.dim(` Content: ${preview}${entity.content.length > 80 ? '...' : ''}`));
215
+ }
216
+ // Show metadata
217
+ if (entity.metadata && Object.keys(entity.metadata).length > 0) {
218
+ console.log(chalk.dim(` Metadata: ${JSON.stringify(entity.metadata)}`));
128
219
  }
129
- if (result.entity && result.entity.metadata) {
130
- console.log(chalk.dim(` Metadata: ${JSON.stringify(result.entity.metadata)}`));
220
+ // Show relationships
221
+ if (options.includeRelations && result.relations) {
222
+ const relations = result.relations;
223
+ if (relations.length > 0) {
224
+ console.log(chalk.dim(` Relations: ${relations.length} connections`));
225
+ }
131
226
  }
227
+ console.log();
132
228
  });
229
+ // Show search summary
230
+ console.log(chalk.cyan('Search Configuration:'));
231
+ if (searchParams.type) {
232
+ console.log(chalk.dim(` Type filter: ${Array.isArray(searchParams.type) ? searchParams.type.join(', ') : searchParams.type}`));
233
+ }
234
+ if (searchParams.where) {
235
+ console.log(chalk.dim(` Field filter: ${JSON.stringify(searchParams.where)}`));
236
+ }
237
+ if (searchParams.connected) {
238
+ console.log(chalk.dim(` Graph filter: ${JSON.stringify(searchParams.connected)}`));
239
+ }
240
+ if (searchParams.fusion) {
241
+ console.log(chalk.dim(` Fusion: ${searchParams.fusion.strategy}`));
242
+ if (searchParams.fusion.weights && Object.keys(searchParams.fusion.weights).length > 0) {
243
+ console.log(chalk.dim(` Weights: ${JSON.stringify(searchParams.fusion.weights)}`));
244
+ }
245
+ }
133
246
  }
134
247
  }
135
248
  else {
@@ -139,6 +252,9 @@ export const coreCommands = {
139
252
  catch (error) {
140
253
  spinner.fail('Search failed');
141
254
  console.error(chalk.red(error.message));
255
+ if (options.verbose) {
256
+ console.error(chalk.dim(error.stack));
257
+ }
142
258
  process.exit(1);
143
259
  }
144
260
  },
@@ -148,22 +264,21 @@ export const coreCommands = {
148
264
  async get(id, options) {
149
265
  const spinner = ora('Fetching item...').start();
150
266
  try {
151
- const brain = await getBrainy();
267
+ const brain = getBrainy();
152
268
  // Try to get the item
153
- const results = await brain.search(id, 1);
154
- if (results.length === 0) {
269
+ const item = await brain.get(id);
270
+ if (!item) {
155
271
  spinner.fail('Item not found');
156
272
  console.log(chalk.yellow(`No item found with ID: ${id}`));
157
273
  process.exit(1);
158
274
  }
159
- const item = results[0];
160
275
  spinner.succeed('Item found');
161
276
  if (!options.json) {
162
277
  console.log(chalk.cyan('\nItem Details:'));
163
278
  console.log(` ID: ${item.id}`);
164
279
  console.log(` Content: ${item.content || 'N/A'}`);
165
- if (item.entity && item.entity.metadata) {
166
- console.log(` Metadata: ${JSON.stringify(item.entity.metadata, null, 2)}`);
280
+ if (item.metadata) {
281
+ console.log(` Metadata: ${JSON.stringify(item.metadata, null, 2)}`);
167
282
  }
168
283
  if (options.withConnections) {
169
284
  // Get verbs/relationships
@@ -193,7 +308,7 @@ export const coreCommands = {
193
308
  async relate(source, verb, target, options) {
194
309
  const spinner = ora('Creating relationship...').start();
195
310
  try {
196
- const brain = await getBrainy();
311
+ const brain = getBrainy();
197
312
  let metadata = {};
198
313
  if (options.metadata) {
199
314
  try {
@@ -238,7 +353,7 @@ export const coreCommands = {
238
353
  async import(file, options) {
239
354
  const spinner = ora('Importing data...').start();
240
355
  try {
241
- const brain = await getBrainy();
356
+ const brain = getBrainy();
242
357
  const format = options.format || 'json';
243
358
  const batchSize = options.batchSize ? parseInt(options.batchSize) : 100;
244
359
  // Read file content
@@ -324,7 +439,7 @@ export const coreCommands = {
324
439
  async export(file, options) {
325
440
  const spinner = ora('Exporting database...').start();
326
441
  try {
327
- const brain = await getBrainy();
442
+ const brain = getBrainy();
328
443
  const format = options.format || 'json';
329
444
  // Export all data
330
445
  const dataApi = await brain.data();
@@ -390,3 +505,4 @@ export const coreCommands = {
390
505
  }
391
506
  }
392
507
  };
508
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Data Management Commands
3
+ *
4
+ * Backup, restore, import, export operations
5
+ */
6
+ interface DataOptions {
7
+ verbose?: boolean;
8
+ json?: boolean;
9
+ pretty?: boolean;
10
+ }
11
+ export declare const dataCommands: {
12
+ /**
13
+ * Backup database
14
+ */
15
+ backup(file: string, options: DataOptions & {
16
+ compress?: boolean;
17
+ }): Promise<void>;
18
+ /**
19
+ * Restore from backup
20
+ */
21
+ restore(file: string, options: DataOptions & {
22
+ merge?: boolean;
23
+ }): Promise<void>;
24
+ /**
25
+ * Get database statistics
26
+ */
27
+ stats(options: DataOptions): Promise<void>;
28
+ };
29
+ export {};
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Data Management Commands
3
+ *
4
+ * Backup, restore, import, export operations
5
+ */
6
+ import chalk from 'chalk';
7
+ import ora from 'ora';
8
+ import { readFileSync, writeFileSync } from 'node:fs';
9
+ import { Brainy } from '../../brainy.js';
10
+ let brainyInstance = null;
11
+ const getBrainy = () => {
12
+ if (!brainyInstance) {
13
+ brainyInstance = new Brainy();
14
+ }
15
+ return brainyInstance;
16
+ };
17
+ const formatOutput = (data, options) => {
18
+ if (options.json) {
19
+ console.log(options.pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data));
20
+ }
21
+ };
22
+ export const dataCommands = {
23
+ /**
24
+ * Backup database
25
+ */
26
+ async backup(file, options) {
27
+ const spinner = ora('Creating backup...').start();
28
+ try {
29
+ const brain = getBrainy();
30
+ const dataApi = await brain.data();
31
+ const backup = await dataApi.backup({
32
+ compress: options.compress
33
+ });
34
+ spinner.text = 'Writing backup file...';
35
+ // Write backup to file
36
+ const content = typeof backup === 'string'
37
+ ? backup
38
+ : JSON.stringify(backup, null, options.pretty ? 2 : 0);
39
+ writeFileSync(file, content);
40
+ spinner.succeed('Backup created');
41
+ if (!options.json) {
42
+ console.log(chalk.green(`✓ Backup saved to: ${file}`));
43
+ if (backup.compressed) {
44
+ console.log(chalk.dim(` Original size: ${formatBytes(backup.originalSize)}`));
45
+ console.log(chalk.dim(` Compressed size: ${formatBytes(backup.compressedSize)}`));
46
+ console.log(chalk.dim(` Compression ratio: ${((backup.compressedSize / backup.originalSize) * 100).toFixed(1)}%`));
47
+ }
48
+ }
49
+ else {
50
+ formatOutput({ file, backup: true }, options);
51
+ }
52
+ }
53
+ catch (error) {
54
+ spinner.fail('Backup failed');
55
+ console.error(chalk.red(error.message));
56
+ process.exit(1);
57
+ }
58
+ },
59
+ /**
60
+ * Restore from backup
61
+ */
62
+ async restore(file, options) {
63
+ const spinner = ora('Restoring from backup...').start();
64
+ try {
65
+ const brain = getBrainy();
66
+ const dataApi = await brain.data();
67
+ // Read backup file
68
+ const content = readFileSync(file, 'utf-8');
69
+ const backup = JSON.parse(content);
70
+ // Restore
71
+ await dataApi.restore({
72
+ backup,
73
+ merge: options.merge || false
74
+ });
75
+ spinner.succeed('Restore complete');
76
+ if (!options.json) {
77
+ console.log(chalk.green(`✓ Restored from: ${file}`));
78
+ if (options.merge) {
79
+ console.log(chalk.dim(' Mode: Merged with existing data'));
80
+ }
81
+ else {
82
+ console.log(chalk.dim(' Mode: Replaced all data'));
83
+ }
84
+ }
85
+ else {
86
+ formatOutput({ file, restored: true }, options);
87
+ }
88
+ }
89
+ catch (error) {
90
+ spinner.fail('Restore failed');
91
+ console.error(chalk.red(error.message));
92
+ process.exit(1);
93
+ }
94
+ },
95
+ /**
96
+ * Get database statistics
97
+ */
98
+ async stats(options) {
99
+ const spinner = ora('Gathering statistics...').start();
100
+ try {
101
+ const brain = getBrainy();
102
+ const dataApi = await brain.data();
103
+ const stats = await dataApi.getStats();
104
+ spinner.succeed('Statistics gathered');
105
+ if (!options.json) {
106
+ console.log(chalk.cyan('\n📊 Database Statistics:\n'));
107
+ console.log(chalk.bold('Entities:'));
108
+ console.log(` Total: ${chalk.green(stats.entities)}`);
109
+ console.log(chalk.bold('\nRelationships:'));
110
+ console.log(` Total: ${chalk.green(stats.relations)}`);
111
+ if (stats.storageSize) {
112
+ console.log(chalk.bold('\nStorage:'));
113
+ console.log(` Size: ${chalk.green(formatBytes(stats.storageSize))}`);
114
+ }
115
+ if (stats.vectorDimensions) {
116
+ console.log(chalk.bold('\nVector Index:'));
117
+ console.log(` Dimensions: ${stats.vectorDimensions}`);
118
+ }
119
+ }
120
+ else {
121
+ formatOutput(stats, options);
122
+ }
123
+ }
124
+ catch (error) {
125
+ spinner.fail('Failed to get statistics');
126
+ console.error(chalk.red(error.message));
127
+ process.exit(1);
128
+ }
129
+ }
130
+ };
131
+ function formatBytes(bytes) {
132
+ if (bytes === 0)
133
+ return '0 B';
134
+ const k = 1024;
135
+ const sizes = ['B', 'KB', 'MB', 'GB'];
136
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
137
+ return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
138
+ }
139
+ //# sourceMappingURL=data.js.map
@@ -22,4 +22,18 @@ export declare const neuralCommand: {
22
22
  builder: (yargs: any) => any;
23
23
  handler: (argv: CommandArguments) => Promise<void>;
24
24
  };
25
+ declare function handleSimilarCommand(neural: any, argv: CommandArguments): Promise<void>;
26
+ declare function handleClustersCommand(neural: any, argv: CommandArguments): Promise<void>;
27
+ declare function handleHierarchyCommand(neural: any, argv: CommandArguments): Promise<void>;
28
+ declare function handleNeighborsCommand(neural: any, argv: CommandArguments): Promise<void>;
29
+ declare function handleOutliersCommand(neural: any, argv: CommandArguments): Promise<void>;
30
+ declare function handleVisualizeCommand(neural: any, argv: CommandArguments): Promise<void>;
31
+ export declare const neuralCommands: {
32
+ similar: typeof handleSimilarCommand;
33
+ cluster: typeof handleClustersCommand;
34
+ hierarchy: typeof handleHierarchyCommand;
35
+ related: typeof handleNeighborsCommand;
36
+ outliers: typeof handleOutliersCommand;
37
+ visualize: typeof handleVisualizeCommand;
38
+ };
25
39
  export default neuralCommand;
@@ -8,8 +8,7 @@ import chalk from 'chalk';
8
8
  import ora from 'ora';
9
9
  import fs from 'node:fs';
10
10
  import path from 'node:path';
11
- import { Brainy } from '../../brainyData.js';
12
- import { NeuralAPI } from '../../neural/neuralAPI.js';
11
+ import { Brainy } from '../../brainy.js';
13
12
  export const neuralCommand = {
14
13
  command: 'neural [action]',
15
14
  describe: '🧠 Neural similarity and clustering operations',
@@ -80,7 +79,7 @@ export const neuralCommand = {
80
79
  console.log(chalk.gray('━'.repeat(50)));
81
80
  // Initialize Brainy and Neural API
82
81
  const brain = new Brainy();
83
- const neural = new NeuralAPI(brain);
82
+ const neural = brain.neural();
84
83
  try {
85
84
  const action = argv.action || await promptForAction();
86
85
  switch (action) {
@@ -97,7 +96,9 @@ export const neuralCommand = {
97
96
  await handleNeighborsCommand(neural, argv);
98
97
  break;
99
98
  case 'path':
100
- await handlePathCommand(neural, argv);
99
+ console.log(chalk.yellow('\n⚠️ Semantic path finding coming in v3.21.0'));
100
+ console.log(chalk.dim('This feature requires implementing graph traversal algorithms'));
101
+ console.log(chalk.dim('Use "neighbors" and "hierarchy" commands to explore connections'));
101
102
  break;
102
103
  case 'outliers':
103
104
  await handleOutliersCommand(neural, argv);
@@ -126,7 +127,7 @@ async function promptForAction() {
126
127
  { name: '🎯 Find semantic clusters', value: 'clusters' },
127
128
  { name: '🌳 Show item hierarchy', value: 'hierarchy' },
128
129
  { name: '🕸️ Find semantic neighbors', value: 'neighbors' },
129
- { name: '🛣️ Find semantic path between items', value: 'path' },
130
+ { name: '🛣️ Find semantic path between items (v3.21.0)', value: 'path', disabled: true },
130
131
  { name: '🚨 Detect outliers', value: 'outliers' },
131
132
  { name: '📊 Generate visualization data', value: 'visualize' }
132
133
  ]
@@ -504,4 +505,14 @@ function showHelp() {
504
505
  console.log(' --explain, -e Include explanations');
505
506
  console.log('');
506
507
  }
508
+ export const neuralCommands = {
509
+ similar: handleSimilarCommand,
510
+ cluster: handleClustersCommand,
511
+ hierarchy: handleHierarchyCommand,
512
+ related: handleNeighborsCommand,
513
+ // path: handlePathCommand, // Coming in v3.21.0 - requires graph traversal implementation
514
+ outliers: handleOutliersCommand,
515
+ visualize: handleVisualizeCommand
516
+ };
507
517
  export default neuralCommand;
518
+ //# sourceMappingURL=neural.js.map