@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.
- package/dist/commands/vector-search.d.ts +6 -0
- package/dist/commands/vector-search.d.ts.map +1 -0
- package/dist/commands/vector-search.js +120 -0
- package/dist/commands/vector-search.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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"}
|