@flxbl-dev/cli 0.1.0 → 0.2.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,6 @@
1
+ /**
2
+ * flxbl vector-search <entity> — Vector similarity search
3
+ */
4
+ import type { Command } from 'commander';
5
+ export declare function registerVectorSearchCommand(program: Command): void;
6
+ //# sourceMappingURL=vector-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.d.ts","sourceRoot":"","sources":["../../src/commands/vector-search.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyIlE"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * flxbl vector-search <entity> — Vector similarity search
3
+ */
4
+ import * as fs from 'node:fs';
5
+ import * as path from 'node:path';
6
+ import { log, spinner, chalk } from '../ui/logger.js';
7
+ import { renderTable } from '../ui/table.js';
8
+ import { loadFlxblConfig } from '../config/loader.js';
9
+ import { resolveAuth } from '../codegen/schema-fetcher.js';
10
+ export function registerVectorSearchCommand(program) {
11
+ program
12
+ .command('vector-search <entity>')
13
+ .description('Perform vector similarity search on an entity')
14
+ .requiredOption('--field <name>', 'Name of the VECTOR field')
15
+ .requiredOption('--vector <json>', 'Query vector as JSON array or path to .json file')
16
+ .option('--top-k <n>', 'Maximum number of results', '10')
17
+ .option('-w, --where <json>', 'Filter conditions as JSON')
18
+ .option('-f, --fields <fields>', 'Comma-separated list of fields to display')
19
+ .option('--format <format>', 'Output format: table or json', 'table')
20
+ .option('--instance <url>', 'FLXBL instance URL')
21
+ .option('--api-key <key>', 'API key for authentication')
22
+ .action(async (entity, opts) => {
23
+ const loaded = await loadFlxblConfig();
24
+ const config = loaded?.config;
25
+ const instanceUrl = opts.instance || process.env.FLXBL_INSTANCE_URL || config?.instanceUrl;
26
+ if (!instanceUrl) {
27
+ log.error('No FLXBL instance URL configured.');
28
+ process.exit(1);
29
+ }
30
+ // Parse the vector from JSON string or file
31
+ let vector;
32
+ try {
33
+ if (opts.vector.endsWith('.json')) {
34
+ const filePath = path.resolve(opts.vector);
35
+ const content = fs.readFileSync(filePath, 'utf-8');
36
+ vector = JSON.parse(content);
37
+ }
38
+ else {
39
+ vector = JSON.parse(opts.vector);
40
+ }
41
+ if (!Array.isArray(vector) || !vector.every((v) => typeof v === 'number')) {
42
+ throw new Error('Vector must be an array of numbers');
43
+ }
44
+ }
45
+ catch (error) {
46
+ log.error(`Invalid vector: ${error instanceof Error ? error.message : 'must be a JSON array of numbers'}`);
47
+ process.exit(1);
48
+ }
49
+ const topK = parseInt(opts.topK || '10', 10);
50
+ let where;
51
+ if (opts.where) {
52
+ try {
53
+ where = JSON.parse(opts.where);
54
+ }
55
+ catch {
56
+ log.error('Invalid --where JSON');
57
+ process.exit(1);
58
+ }
59
+ }
60
+ const select = opts.fields
61
+ ? opts.fields.split(',').map((f) => f.trim())
62
+ : undefined;
63
+ const s = spinner(`Searching ${entity} by vector similarity...`).start();
64
+ try {
65
+ const { client } = await resolveAuth({
66
+ apiKey: opts.apiKey,
67
+ instanceUrl,
68
+ });
69
+ const results = await client.vectorSearchEntities(entity, {
70
+ field: opts.field,
71
+ vector,
72
+ topK,
73
+ where,
74
+ select,
75
+ });
76
+ s.stop();
77
+ if (results.length === 0) {
78
+ log.warn(`No similar ${entity} records found.`);
79
+ return;
80
+ }
81
+ if (opts.format === 'json') {
82
+ console.log(JSON.stringify(results, null, 2));
83
+ return;
84
+ }
85
+ // Table format — include score column + data fields
86
+ const firstItem = results[0].data;
87
+ const dataKeys = select || Object.keys(firstItem);
88
+ const columns = [
89
+ {
90
+ header: 'score',
91
+ key: '__score__',
92
+ formatter: (v) => chalk.yellow(String(v)),
93
+ },
94
+ ...dataKeys.map((key) => ({
95
+ header: key,
96
+ key,
97
+ formatter: (v) => {
98
+ if (v === null || v === undefined)
99
+ return chalk.dim('null');
100
+ if (typeof v === 'object')
101
+ return JSON.stringify(v);
102
+ return String(v);
103
+ },
104
+ })),
105
+ ];
106
+ const rows = results.map((r) => ({
107
+ __score__: r.score.toFixed(4),
108
+ ...r.data,
109
+ }));
110
+ renderTable(columns, rows);
111
+ log.dim(`${results.length} results`);
112
+ }
113
+ catch (error) {
114
+ s.fail(`Vector search failed for ${entity}`);
115
+ log.error(error instanceof Error ? error.message : String(error));
116
+ process.exit(1);
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=vector-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-search.js","sourceRoot":"","sources":["../../src/commands/vector-search.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAgB,GAAG,IAAI,IAAI,CAuB1B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAIrD,wBAAgB,GAAG,IAAI,IAAI,CAwB1B"}
package/dist/index.js CHANGED
@@ -9,6 +9,7 @@ import { registerInitCommand } from './commands/init.js';
9
9
  import { registerGenerateCommand } from './commands/generate.js';
10
10
  import { registerDevCommand } from './commands/dev.js';
11
11
  import { registerDataCommand } from './commands/data.js';
12
+ import { registerVectorSearchCommand } from './commands/vector-search.js';
12
13
  import { registerSchemaCommand } from './commands/schema/index.js';
13
14
  const VERSION = '0.1.0';
14
15
  export function run() {
@@ -27,6 +28,7 @@ export function run() {
27
28
  registerDevCommand(program);
28
29
  // Data commands
29
30
  registerDataCommand(program);
31
+ registerVectorSearchCommand(program);
30
32
  registerSchemaCommand(program);
31
33
  program.parse();
32
34
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,UAAU,GAAG;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,iEAAiE,CAAC;SAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,gBAAgB;IAChB,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,mBAAmB;IACnB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5B,gBAAgB;IAChB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAKnE,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,UAAU,GAAG;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,OAAO,CAAC;SACb,WAAW,CAAC,iEAAiE,CAAC;SAC9E,OAAO,CAAC,OAAO,CAAC,CAAC;IAEpB,gBAAgB;IAChB,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,mBAAmB;IACnB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE5B,gBAAgB;IAChB,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC7B,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACrC,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAE/B,OAAO,CAAC,KAAK,EAAE,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flxbl-dev/cli",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "FLXBL CLI — generate typed SDKs, manage schemas, and query data from the terminal",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",