@butterbase/cli 0.2.1 → 0.3.2

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 (66) hide show
  1. package/README.md +118 -0
  2. package/dist/bin/butterbase.js +474 -2
  3. package/dist/bin/butterbase.js.map +1 -1
  4. package/dist/src/commands/ai.d.ts +36 -0
  5. package/dist/src/commands/ai.d.ts.map +1 -0
  6. package/dist/src/commands/ai.js +131 -0
  7. package/dist/src/commands/ai.js.map +1 -0
  8. package/dist/src/commands/app-billing.d.ts +62 -0
  9. package/dist/src/commands/app-billing.d.ts.map +1 -0
  10. package/dist/src/commands/app-billing.js +220 -0
  11. package/dist/src/commands/app-billing.js.map +1 -0
  12. package/dist/src/commands/app-config.d.ts +37 -0
  13. package/dist/src/commands/app-config.d.ts.map +1 -0
  14. package/dist/src/commands/app-config.js +152 -0
  15. package/dist/src/commands/app-config.js.map +1 -0
  16. package/dist/src/commands/audit.d.ts +15 -0
  17. package/dist/src/commands/audit.d.ts.map +1 -0
  18. package/dist/src/commands/audit.js +49 -0
  19. package/dist/src/commands/audit.js.map +1 -0
  20. package/dist/src/commands/billing.d.ts +26 -0
  21. package/dist/src/commands/billing.d.ts.map +1 -0
  22. package/dist/src/commands/billing.js +183 -0
  23. package/dist/src/commands/billing.js.map +1 -0
  24. package/dist/src/commands/do.js +1 -1
  25. package/dist/src/commands/do.js.map +1 -1
  26. package/dist/src/commands/functions.d.ts +16 -0
  27. package/dist/src/commands/functions.d.ts.map +1 -1
  28. package/dist/src/commands/functions.js +135 -2
  29. package/dist/src/commands/functions.js.map +1 -1
  30. package/dist/src/commands/integrations.d.ts +2 -0
  31. package/dist/src/commands/integrations.d.ts.map +1 -1
  32. package/dist/src/commands/integrations.js +2 -2
  33. package/dist/src/commands/integrations.js.map +1 -1
  34. package/dist/src/commands/keys.d.ts +1 -0
  35. package/dist/src/commands/keys.d.ts.map +1 -1
  36. package/dist/src/commands/keys.js +1 -1
  37. package/dist/src/commands/keys.js.map +1 -1
  38. package/dist/src/commands/move.d.ts +25 -0
  39. package/dist/src/commands/move.d.ts.map +1 -0
  40. package/dist/src/commands/move.js +157 -0
  41. package/dist/src/commands/move.js.map +1 -0
  42. package/dist/src/commands/oauth.d.ts +33 -0
  43. package/dist/src/commands/oauth.d.ts.map +1 -0
  44. package/dist/src/commands/oauth.js +122 -0
  45. package/dist/src/commands/oauth.js.map +1 -0
  46. package/dist/src/commands/rag.d.ts +44 -0
  47. package/dist/src/commands/rag.d.ts.map +1 -0
  48. package/dist/src/commands/rag.js +271 -0
  49. package/dist/src/commands/rag.js.map +1 -0
  50. package/dist/src/commands/regions.d.ts +4 -0
  51. package/dist/src/commands/regions.d.ts.map +1 -0
  52. package/dist/src/commands/regions.js +16 -0
  53. package/dist/src/commands/regions.js.map +1 -0
  54. package/dist/src/commands/rls.d.ts +26 -0
  55. package/dist/src/commands/rls.d.ts.map +1 -0
  56. package/dist/src/commands/rls.js +128 -0
  57. package/dist/src/commands/rls.js.map +1 -0
  58. package/dist/src/lib/api-client.d.ts +86 -3
  59. package/dist/src/lib/api-client.d.ts.map +1 -1
  60. package/dist/src/lib/api-client.js +229 -9
  61. package/dist/src/lib/api-client.js.map +1 -1
  62. package/dist/src/lib/errors.d.ts +8 -0
  63. package/dist/src/lib/errors.d.ts.map +1 -0
  64. package/dist/src/lib/errors.js +24 -0
  65. package/dist/src/lib/errors.js.map +1 -0
  66. package/package.json +2 -1
@@ -0,0 +1,122 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { oauthCreate, oauthList, oauthGet, oauthUpdate, oauthDelete } from '../lib/api-client.js';
4
+ import { getCurrentAppId } from '../lib/config.js';
5
+ async function requireAppId(appId) {
6
+ if (appId)
7
+ return appId;
8
+ const current = await getCurrentAppId();
9
+ if (!current) {
10
+ console.log(chalk.red('No app specified and no current app set'));
11
+ console.log(chalk.gray('Use: butterbase apps use <app-id>'));
12
+ process.exit(1);
13
+ }
14
+ return current;
15
+ }
16
+ export async function oauthConfigureCommand(provider, options) {
17
+ const appId = await requireAppId(options.app);
18
+ const body = {
19
+ provider,
20
+ client_id: options.clientId,
21
+ client_secret: options.clientSecret,
22
+ };
23
+ if (options.redirectUri)
24
+ body.redirect_uris = options.redirectUri;
25
+ if (options.scope)
26
+ body.scopes = options.scope;
27
+ if (options.authorizationUrl)
28
+ body.authorization_url = options.authorizationUrl;
29
+ if (options.tokenUrl)
30
+ body.token_url = options.tokenUrl;
31
+ if (options.userinfoUrl)
32
+ body.userinfo_url = options.userinfoUrl;
33
+ const spinner = ora(`Configuring OAuth provider: ${provider}`).start();
34
+ try {
35
+ const r = await oauthCreate(appId, body);
36
+ spinner.succeed(`Configured ${provider}`);
37
+ if (options.json)
38
+ console.log(JSON.stringify(r, null, 2));
39
+ }
40
+ catch (e) {
41
+ spinner.fail('Configure failed');
42
+ console.error(chalk.red(e.message));
43
+ process.exit(1);
44
+ }
45
+ }
46
+ export async function oauthListCommand(options) {
47
+ const appId = await requireAppId(options.app);
48
+ try {
49
+ const r = await oauthList(appId);
50
+ if (options.json)
51
+ return console.log(JSON.stringify(r, null, 2));
52
+ const providers = r.providers ?? r;
53
+ if (!Array.isArray(providers) || providers.length === 0) {
54
+ console.log(chalk.gray('No OAuth providers configured.'));
55
+ return;
56
+ }
57
+ for (const p of providers) {
58
+ console.log(`${p.provider} enabled=${p.enabled}`);
59
+ }
60
+ }
61
+ catch (e) {
62
+ console.error(chalk.red(e.message));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ export async function oauthGetCommand(provider, options) {
67
+ const appId = await requireAppId(options.app);
68
+ try {
69
+ const r = await oauthGet(appId, provider);
70
+ console.log(options.json ? JSON.stringify(r, null, 2) : r);
71
+ }
72
+ catch (e) {
73
+ console.error(chalk.red(e.message));
74
+ process.exit(1);
75
+ }
76
+ }
77
+ export async function oauthUpdateCommand(provider, options) {
78
+ const appId = await requireAppId(options.app);
79
+ const body = {};
80
+ if (options.clientId)
81
+ body.client_id = options.clientId;
82
+ if (options.clientSecret)
83
+ body.client_secret = options.clientSecret;
84
+ if (options.redirectUri)
85
+ body.redirect_uris = options.redirectUri;
86
+ if (options.scope)
87
+ body.scopes = options.scope;
88
+ if (options.enabled !== undefined)
89
+ body.enabled = options.enabled;
90
+ if (Object.keys(body).length === 0) {
91
+ console.log(chalk.yellow('Nothing to update — pass at least one field.'));
92
+ process.exit(1);
93
+ }
94
+ const spinner = ora(`Updating ${provider}...`).start();
95
+ try {
96
+ const r = await oauthUpdate(appId, provider, body);
97
+ spinner.succeed(`Updated ${provider}`);
98
+ if (options.json)
99
+ console.log(JSON.stringify(r, null, 2));
100
+ }
101
+ catch (e) {
102
+ spinner.fail('Update failed');
103
+ console.error(chalk.red(e.message));
104
+ process.exit(1);
105
+ }
106
+ }
107
+ export async function oauthDeleteCommand(provider, options) {
108
+ const appId = await requireAppId(options.app);
109
+ const spinner = ora(`Deleting ${provider}...`).start();
110
+ try {
111
+ await oauthDelete(appId, provider);
112
+ spinner.succeed(`Deleted ${provider}`);
113
+ if (options.json)
114
+ console.log(JSON.stringify({ deleted: true }));
115
+ }
116
+ catch (e) {
117
+ spinner.fail('Delete failed');
118
+ console.error(chalk.red(e.message));
119
+ process.exit(1);
120
+ }
121
+ }
122
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/commands/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export declare function ragCollectionsListCommand(options: {
2
+ app?: string;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function ragCollectionsCreateCommand(name: string, options: {
6
+ app?: string;
7
+ json?: boolean;
8
+ description?: string;
9
+ accessMode?: string;
10
+ chunkSize?: string;
11
+ chunkOverlap?: string;
12
+ }): Promise<void>;
13
+ export declare function ragCollectionsGetCommand(name: string, options: {
14
+ app?: string;
15
+ json?: boolean;
16
+ }): Promise<void>;
17
+ export declare function ragCollectionsDeleteCommand(name: string, options: {
18
+ app?: string;
19
+ }): Promise<void>;
20
+ export declare function ragIngestCommand(fileOrText: string, options: {
21
+ app?: string;
22
+ json?: boolean;
23
+ collection: string;
24
+ text?: boolean;
25
+ filename?: string;
26
+ metadata?: string;
27
+ }): Promise<void>;
28
+ export declare function ragDocsListCommand(collection: string, options: {
29
+ app?: string;
30
+ json?: boolean;
31
+ }): Promise<void>;
32
+ export declare function ragDocsDeleteCommand(collection: string, docId: string, options: {
33
+ app?: string;
34
+ }): Promise<void>;
35
+ export declare function ragQueryCommand(collection: string, options: {
36
+ app?: string;
37
+ json?: boolean;
38
+ query: string;
39
+ topK?: string;
40
+ threshold?: string;
41
+ synthesize?: boolean;
42
+ model?: string;
43
+ }): Promise<void>;
44
+ //# sourceMappingURL=rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag.d.ts","sourceRoot":"","sources":["../../../src/commands/rag.ts"],"names":[],"mappings":"AA8BA,wBAAsB,yBAAyB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyBxF;AAED,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,iBAwBF;AAED,wBAAsB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAqBrG;AAED,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAWxF;AAID,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,iBAiEF;AAID,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyBrG;AAED,wBAAsB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAWtG;AAID,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,iBA8CF"}
@@ -0,0 +1,271 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import fs from 'fs-extra';
4
+ import path from 'path';
5
+ import { ragCreateCollection, ragListCollections, ragGetCollection, ragDeleteCollection, ragIngest, ragListDocuments, ragDeleteDocument, ragQuery, generateUploadUrl, } from '../lib/api-client.js';
6
+ import { getCurrentAppId } from '../lib/config.js';
7
+ async function requireAppId(appId) {
8
+ if (appId)
9
+ return appId;
10
+ const current = await getCurrentAppId();
11
+ if (!current) {
12
+ console.log(chalk.red('No app specified and no current app set'));
13
+ console.log(chalk.gray('Use: butterbase apps use <app-id>'));
14
+ process.exit(1);
15
+ }
16
+ return current;
17
+ }
18
+ // ─── Collections ────────────────────────────────────────────────────────────
19
+ export async function ragCollectionsListCommand(options) {
20
+ const appId = await requireAppId(options.app);
21
+ const spinner = ora('Fetching RAG collections...').start();
22
+ try {
23
+ const result = await ragListCollections(appId);
24
+ spinner.stop();
25
+ if (options.json) {
26
+ console.log(JSON.stringify(result, null, 2));
27
+ return;
28
+ }
29
+ const collections = result.collections ?? result ?? [];
30
+ if (!Array.isArray(collections) || collections.length === 0) {
31
+ console.log(chalk.gray('No RAG collections found.'));
32
+ return;
33
+ }
34
+ console.log('');
35
+ for (const c of collections) {
36
+ console.log(` ${chalk.cyan(c.name)} ${chalk.gray(c.description ?? '')} ${chalk.gray(`${c.document_count ?? 0} docs`)}`);
37
+ }
38
+ console.log('');
39
+ }
40
+ catch (err) {
41
+ spinner.fail('Failed to fetch collections');
42
+ console.error(chalk.red(err.message));
43
+ process.exit(1);
44
+ }
45
+ }
46
+ export async function ragCollectionsCreateCommand(name, options) {
47
+ const appId = await requireAppId(options.app);
48
+ const spinner = ora(`Creating collection ${name}...`).start();
49
+ try {
50
+ const body = { name };
51
+ if (options.description)
52
+ body.description = options.description;
53
+ if (options.accessMode)
54
+ body.accessMode = options.accessMode;
55
+ if (options.chunkSize)
56
+ body.chunkSize = parseInt(options.chunkSize, 10);
57
+ if (options.chunkOverlap)
58
+ body.chunkOverlap = parseInt(options.chunkOverlap, 10);
59
+ const result = await ragCreateCollection(appId, body);
60
+ spinner.succeed(`Collection ${chalk.cyan(name)} created`);
61
+ if (options.json) {
62
+ console.log(JSON.stringify(result, null, 2));
63
+ return;
64
+ }
65
+ console.log('');
66
+ console.log(` Name: ${chalk.cyan(result.name ?? name)}`);
67
+ console.log('');
68
+ }
69
+ catch (err) {
70
+ spinner.fail('Failed to create collection');
71
+ console.error(chalk.red(err.message));
72
+ process.exit(1);
73
+ }
74
+ }
75
+ export async function ragCollectionsGetCommand(name, options) {
76
+ const appId = await requireAppId(options.app);
77
+ const spinner = ora(`Fetching collection ${name}...`).start();
78
+ try {
79
+ const result = await ragGetCollection(appId, name);
80
+ spinner.stop();
81
+ if (options.json) {
82
+ console.log(JSON.stringify(result, null, 2));
83
+ return;
84
+ }
85
+ console.log('');
86
+ console.log(` Name: ${chalk.cyan(result.name)}`);
87
+ console.log(` Description: ${chalk.gray(result.description ?? '—')}`);
88
+ console.log(` Access mode: ${result.access_mode ?? result.accessMode ?? '—'}`);
89
+ console.log(` Documents: ${result.document_count ?? 0}`);
90
+ console.log('');
91
+ }
92
+ catch (err) {
93
+ spinner.fail('Failed to get collection');
94
+ console.error(chalk.red(err.message));
95
+ process.exit(1);
96
+ }
97
+ }
98
+ export async function ragCollectionsDeleteCommand(name, options) {
99
+ const appId = await requireAppId(options.app);
100
+ const spinner = ora(`Deleting collection ${name}...`).start();
101
+ try {
102
+ await ragDeleteCollection(appId, name);
103
+ spinner.succeed(`Deleted collection ${chalk.cyan(name)}`);
104
+ }
105
+ catch (err) {
106
+ spinner.fail('Failed to delete collection');
107
+ console.error(chalk.red(err.message));
108
+ process.exit(1);
109
+ }
110
+ }
111
+ // ─── Ingest ──────────────────────────────────────────────────────────────────
112
+ export async function ragIngestCommand(fileOrText, options) {
113
+ const appId = await requireAppId(options.app);
114
+ if (!options.collection) {
115
+ console.error(chalk.red('--collection is required'));
116
+ process.exit(1);
117
+ }
118
+ const spinner = ora('Ingesting...').start();
119
+ try {
120
+ let body = {};
121
+ if (options.metadata) {
122
+ try {
123
+ body.metadata = JSON.parse(options.metadata);
124
+ }
125
+ catch { /* ignore */ }
126
+ }
127
+ if (options.text) {
128
+ body.text = fileOrText;
129
+ if (options.filename)
130
+ body.filename = options.filename;
131
+ }
132
+ else {
133
+ // Upload file to storage first
134
+ const filePath = path.resolve(fileOrText);
135
+ if (!await fs.pathExists(filePath)) {
136
+ spinner.fail(`File not found: ${filePath}`);
137
+ process.exit(1);
138
+ }
139
+ const stats = await fs.stat(filePath);
140
+ const filename = options.filename ?? path.basename(filePath);
141
+ let contentType = 'application/octet-stream';
142
+ if (filename.endsWith('.pdf'))
143
+ contentType = 'application/pdf';
144
+ else if (filename.endsWith('.txt'))
145
+ contentType = 'text/plain';
146
+ else if (filename.endsWith('.md'))
147
+ contentType = 'text/markdown';
148
+ else if (filename.endsWith('.json'))
149
+ contentType = 'application/json';
150
+ spinner.text = 'Uploading file to storage...';
151
+ const uploadData = await generateUploadUrl(appId, filename, contentType, stats.size, false);
152
+ const fileBuffer = await fs.readFile(filePath);
153
+ const uploadRes = await fetch(uploadData.uploadUrl, {
154
+ method: 'PUT',
155
+ headers: { 'Content-Type': contentType },
156
+ body: fileBuffer,
157
+ });
158
+ if (!uploadRes.ok) {
159
+ throw new Error(`Storage upload failed (${uploadRes.status})`);
160
+ }
161
+ body.storage_object_id = uploadData.objectId;
162
+ body.filename = filename;
163
+ spinner.text = 'Ingesting document...';
164
+ }
165
+ const result = await ragIngest(appId, options.collection, body);
166
+ spinner.succeed('Ingested');
167
+ if (options.json) {
168
+ console.log(JSON.stringify(result, null, 2));
169
+ return;
170
+ }
171
+ console.log('');
172
+ console.log(` Document ID: ${chalk.cyan(result.id ?? result.document_id ?? '—')}`);
173
+ console.log('');
174
+ }
175
+ catch (err) {
176
+ spinner.fail('Ingest failed');
177
+ console.error(chalk.red(err.message));
178
+ process.exit(1);
179
+ }
180
+ }
181
+ // ─── Documents ───────────────────────────────────────────────────────────────
182
+ export async function ragDocsListCommand(collection, options) {
183
+ const appId = await requireAppId(options.app);
184
+ const spinner = ora(`Fetching documents in ${collection}...`).start();
185
+ try {
186
+ const result = await ragListDocuments(appId, collection);
187
+ spinner.stop();
188
+ if (options.json) {
189
+ console.log(JSON.stringify(result, null, 2));
190
+ return;
191
+ }
192
+ const docs = result.documents ?? result ?? [];
193
+ if (!Array.isArray(docs) || docs.length === 0) {
194
+ console.log(chalk.gray('No documents found.'));
195
+ return;
196
+ }
197
+ console.log('');
198
+ for (const d of docs) {
199
+ console.log(` ${chalk.cyan(d.id)} ${chalk.gray(d.filename ?? d.name ?? '')} ${chalk.gray(d.status ?? '')}`);
200
+ }
201
+ console.log('');
202
+ }
203
+ catch (err) {
204
+ spinner.fail('Failed to fetch documents');
205
+ console.error(chalk.red(err.message));
206
+ process.exit(1);
207
+ }
208
+ }
209
+ export async function ragDocsDeleteCommand(collection, docId, options) {
210
+ const appId = await requireAppId(options.app);
211
+ const spinner = ora(`Deleting document ${docId}...`).start();
212
+ try {
213
+ await ragDeleteDocument(appId, collection, docId);
214
+ spinner.succeed(`Deleted document ${chalk.cyan(docId)}`);
215
+ }
216
+ catch (err) {
217
+ spinner.fail('Failed to delete document');
218
+ console.error(chalk.red(err.message));
219
+ process.exit(1);
220
+ }
221
+ }
222
+ // ─── Query ────────────────────────────────────────────────────────────────────
223
+ export async function ragQueryCommand(collection, options) {
224
+ const appId = await requireAppId(options.app);
225
+ if (!options.query) {
226
+ console.error(chalk.red('-q/--query is required'));
227
+ process.exit(1);
228
+ }
229
+ const spinner = ora('Querying...').start();
230
+ try {
231
+ const body = { query: options.query };
232
+ if (options.topK)
233
+ body.topK = parseInt(options.topK, 10);
234
+ if (options.threshold)
235
+ body.threshold = parseFloat(options.threshold);
236
+ if (options.synthesize !== undefined)
237
+ body.synthesize = options.synthesize;
238
+ if (options.model)
239
+ body.model = options.model;
240
+ const result = await ragQuery(appId, collection, body);
241
+ spinner.stop();
242
+ if (options.json) {
243
+ console.log(JSON.stringify(result, null, 2));
244
+ return;
245
+ }
246
+ console.log('');
247
+ if (result.answer ?? result.synthesis) {
248
+ console.log(chalk.bold('Answer:'));
249
+ console.log((result.answer ?? result.synthesis) + '\n');
250
+ }
251
+ const hits = result.results ?? result.hits ?? result.documents ?? [];
252
+ if (Array.isArray(hits) && hits.length > 0) {
253
+ console.log(chalk.bold('Sources:'));
254
+ for (const h of hits) {
255
+ const score = h.score !== undefined ? chalk.gray(` (score: ${h.score.toFixed(3)})`) : '';
256
+ console.log(` ${chalk.cyan(h.id ?? h.document_id)}${score}`);
257
+ if (h.content ?? h.text) {
258
+ const snippet = (h.content ?? h.text ?? '').slice(0, 200);
259
+ console.log(chalk.gray(` ${snippet}${snippet.length >= 200 ? '…' : ''}`));
260
+ }
261
+ }
262
+ }
263
+ console.log('');
264
+ }
265
+ catch (err) {
266
+ spinner.fail('Query failed');
267
+ console.error(chalk.red(err.message));
268
+ process.exit(1);
269
+ }
270
+ }
271
+ //# sourceMappingURL=rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rag.js","sourceRoot":"","sources":["../../../src/commands/rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,QAAQ,EACR,iBAAiB,GAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,KAAK,UAAU,YAAY,CAAC,KAAc;IACxC,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,MAAM,OAAO,GAAG,MAAM,eAAe,EAAE,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,+EAA+E;AAE/E,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,OAAyC;IACvF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,6BAA6B,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,MAAM,GAAQ,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,cAAc,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7H,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAAY,EACZ,OAOC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,IAAI,GAA4B,EAAE,IAAI,EAAE,CAAC;QAC/C,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAChE,IAAI,OAAO,CAAC,UAAU;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC7D,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,OAAO,CAAC,YAAY;YAAE,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,MAAM,GAAQ,MAAM,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,OAAO,CAAC,cAAc,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAAY,EAAE,OAAyC;IACpG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,MAAM,GAAQ,MAAM,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,cAAc,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,IAAY,EAAE,OAAyB;IACvF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,uBAAuB,IAAI,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvC,OAAO,CAAC,OAAO,CAAC,sBAAsB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAkB,EAClB,OAOC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5C,IAAI,CAAC;QACH,IAAI,IAAI,GAA4B,EAAE,CAAC;QACvC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,IAAI,CAAC;gBAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;YACvB,IAAI,OAAO,CAAC,QAAQ;gBAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,+BAA+B;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnC,OAAO,CAAC,IAAI,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAE7D,IAAI,WAAW,GAAG,0BAA0B,CAAC;YAC7C,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,iBAAiB,CAAC;iBAC1D,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,WAAW,GAAG,YAAY,CAAC;iBAC1D,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,WAAW,GAAG,eAAe,CAAC;iBAC5D,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,WAAW,GAAG,kBAAkB,CAAC;YAEtE,OAAO,CAAC,IAAI,GAAG,8BAA8B,CAAC;YAC9C,MAAM,UAAU,GAAQ,MAAM,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACjG,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,SAAS,EAAE;gBAClD,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE;gBACxC,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,CAAC,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC;YAC7C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACzB,OAAO,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACzC,CAAC;QAED,MAAM,MAAM,GAAQ,MAAM,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACrE,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAAkB,EAAE,OAAyC;IACpG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,yBAAyB,UAAU,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IACtE,IAAI,CAAC;QACH,MAAM,MAAM,GAAQ,MAAM,gBAAgB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACjH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,UAAkB,EAAE,KAAa,EAAE,OAAyB;IACrG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,KAAK,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAClD,OAAO,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC1C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,OAQC;IAED,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3C,IAAI,CAAC;QACH,MAAM,IAAI,GAA4B,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,OAAO,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,SAAS;YAAE,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC3E,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAE9C,MAAM,MAAM,GAAQ,MAAM,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,EAAE,CAAC;QACf,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1D,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;QACrE,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzF,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC;gBAC9D,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;oBACxB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function regionsListCommand(options: {
2
+ json?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=regions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regions.d.ts","sourceRoot":"","sources":["../../../src/commands/regions.ts"],"names":[],"mappings":"AAGA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBASnE"}
@@ -0,0 +1,16 @@
1
+ import chalk from 'chalk';
2
+ import { listRegions } from '../lib/api-client.js';
3
+ export async function regionsListCommand(options) {
4
+ try {
5
+ const r = await listRegions();
6
+ if (options.json)
7
+ return console.log(JSON.stringify(r, null, 2));
8
+ for (const reg of r.regions ?? [])
9
+ console.log(reg);
10
+ }
11
+ catch (e) {
12
+ console.error(chalk.red(e.message));
13
+ process.exit(1);
14
+ }
15
+ }
16
+ //# sourceMappingURL=regions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regions.js","sourceRoot":"","sources":["../../../src/commands/regions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA2B;IAClE,IAAI,CAAC;QACH,MAAM,CAAC,GAAQ,MAAM,WAAW,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,IAAI;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,CAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare function rlsListCommand(options: {
2
+ app?: string;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ export declare function rlsCreateCommand(options: {
6
+ app?: string;
7
+ json?: boolean;
8
+ userIsolation?: boolean;
9
+ table?: string;
10
+ userColumn?: string;
11
+ publicReadColumn?: string;
12
+ policyName?: string;
13
+ command?: string;
14
+ using?: string;
15
+ withCheck?: string;
16
+ restrictive?: boolean;
17
+ role?: 'anon' | 'user';
18
+ }): Promise<void>;
19
+ export declare function rlsEnableCommand(table: string, options: {
20
+ app?: string;
21
+ }): Promise<void>;
22
+ export declare function rlsDeleteCommand(table: string, options: {
23
+ app?: string;
24
+ policy?: string;
25
+ }): Promise<void>;
26
+ //# sourceMappingURL=rls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rls.d.ts","sourceRoot":"","sources":["../../../src/commands/rls.ts"],"names":[],"mappings":"AAuBA,wBAAsB,cAAc,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyB7E;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB,iBAmDA;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,iBAW9E;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,iBAgB/F"}
@@ -0,0 +1,128 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { listRlsPolicies, createUserIsolationPolicy, createRlsPolicy, enableRls, deleteRlsTablePolicies, deleteRlsPolicy, } from '../lib/api-client.js';
4
+ import { getCurrentAppId } from '../lib/config.js';
5
+ async function requireAppId(appId) {
6
+ if (appId)
7
+ return appId;
8
+ const current = await getCurrentAppId();
9
+ if (!current) {
10
+ console.log(chalk.red('No app specified and no current app set'));
11
+ console.log(chalk.gray('Use: butterbase apps use <app-id>'));
12
+ process.exit(1);
13
+ }
14
+ return current;
15
+ }
16
+ export async function rlsListCommand(options) {
17
+ const appId = await requireAppId(options.app);
18
+ const spinner = ora('Fetching RLS policies...').start();
19
+ try {
20
+ const result = await listRlsPolicies(appId);
21
+ spinner.stop();
22
+ if (options.json) {
23
+ console.log(JSON.stringify(result, null, 2));
24
+ return;
25
+ }
26
+ const policies = result.policies ?? result ?? [];
27
+ if (!Array.isArray(policies) || policies.length === 0) {
28
+ console.log(chalk.gray('No RLS policies found.'));
29
+ return;
30
+ }
31
+ console.log('');
32
+ for (const p of policies) {
33
+ console.log(` ${chalk.cyan(p.table_name ?? p.tablename)} ${chalk.bold(p.policy_name ?? p.policyname)} ${chalk.gray(p.command ?? p.cmd ?? '')}`);
34
+ }
35
+ console.log('');
36
+ }
37
+ catch (err) {
38
+ spinner.fail('Failed to fetch RLS policies');
39
+ console.error(chalk.red(err.message));
40
+ process.exit(1);
41
+ }
42
+ }
43
+ export async function rlsCreateCommand(options) {
44
+ const appId = await requireAppId(options.app);
45
+ if (!options.table) {
46
+ console.error(chalk.red('--table is required'));
47
+ process.exit(1);
48
+ }
49
+ const spinner = ora('Creating RLS policy...').start();
50
+ try {
51
+ let result;
52
+ if (options.userIsolation) {
53
+ if (!options.userColumn) {
54
+ spinner.fail('--user-column is required with --user-isolation');
55
+ process.exit(1);
56
+ }
57
+ result = await createUserIsolationPolicy(appId, {
58
+ table_name: options.table,
59
+ user_column: options.userColumn,
60
+ public_read_column: options.publicReadColumn,
61
+ });
62
+ }
63
+ else {
64
+ if (!options.policyName) {
65
+ spinner.fail('--policy-name is required for custom policies');
66
+ process.exit(1);
67
+ }
68
+ result = await createRlsPolicy(appId, {
69
+ table_name: options.table,
70
+ policy_name: options.policyName,
71
+ command: options.command,
72
+ role: options.role,
73
+ using_expression: options.using,
74
+ with_check_expression: options.withCheck,
75
+ restrictive: options.restrictive,
76
+ user_column: options.userColumn,
77
+ });
78
+ }
79
+ spinner.succeed('RLS policy created');
80
+ if (options.json) {
81
+ console.log(JSON.stringify(result, null, 2));
82
+ return;
83
+ }
84
+ console.log('');
85
+ console.log(` Table: ${chalk.cyan(options.table)}`);
86
+ if (options.policyName)
87
+ console.log(` Policy: ${chalk.bold(options.policyName)}`);
88
+ console.log('');
89
+ }
90
+ catch (err) {
91
+ spinner.fail('Failed to create RLS policy');
92
+ console.error(chalk.red(err.message));
93
+ process.exit(1);
94
+ }
95
+ }
96
+ export async function rlsEnableCommand(table, options) {
97
+ const appId = await requireAppId(options.app);
98
+ const spinner = ora(`Enabling RLS on ${table}...`).start();
99
+ try {
100
+ await enableRls(appId, table);
101
+ spinner.succeed(`RLS enabled on ${chalk.cyan(table)}`);
102
+ }
103
+ catch (err) {
104
+ spinner.fail('Failed to enable RLS');
105
+ console.error(chalk.red(err.message));
106
+ process.exit(1);
107
+ }
108
+ }
109
+ export async function rlsDeleteCommand(table, options) {
110
+ const appId = await requireAppId(options.app);
111
+ const spinner = ora(options.policy ? `Deleting policy ${options.policy} on ${table}...` : `Deleting all policies on ${table}...`).start();
112
+ try {
113
+ if (options.policy) {
114
+ await deleteRlsPolicy(appId, table, options.policy);
115
+ spinner.succeed(`Deleted policy ${chalk.cyan(options.policy)} on ${chalk.cyan(table)}`);
116
+ }
117
+ else {
118
+ await deleteRlsTablePolicies(appId, table);
119
+ spinner.succeed(`Deleted all RLS policies on ${chalk.cyan(table)}`);
120
+ }
121
+ }
122
+ catch (err) {
123
+ spinner.fail('Failed to delete RLS policy');
124
+ console.error(chalk.red(err.message));
125
+ process.exit(1);
126
+ }
127
+ }
128
+ //# sourceMappingURL=rls.js.map