@eide/foir-cli 0.1.22 → 0.1.24
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/auth/credentials.d.ts +10 -8
- package/dist/auth/credentials.d.ts.map +1 -1
- package/dist/auth/credentials.js +72 -12
- package/dist/cli.js +6 -0
- package/dist/codegen/fetch-customer-profile-schema.d.ts.map +1 -1
- package/dist/codegen/fetch-customer-profile-schema.js +4 -4
- package/dist/codegen/fetch-models.d.ts.map +1 -1
- package/dist/codegen/fetch-models.js +7 -7
- package/dist/codegen/field-mapping.d.ts.map +1 -1
- package/dist/codegen/field-mapping.js +1 -2
- package/dist/codegen/generators/static-documents.d.ts.map +1 -1
- package/dist/codegen/generators/static-documents.js +31 -29
- package/dist/codegen/generators/typed-operations.d.ts.map +1 -1
- package/dist/commands/api-keys.d.ts.map +1 -1
- package/dist/commands/api-keys.js +5 -5
- package/dist/commands/auth-config.d.ts +4 -0
- package/dist/commands/auth-config.d.ts.map +1 -0
- package/dist/commands/auth-config.js +37 -0
- package/dist/commands/auth-providers.d.ts.map +1 -1
- package/dist/commands/auth-providers.js +6 -6
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +7 -8
- package/dist/commands/customer-profiles.d.ts.map +1 -1
- package/dist/commands/customer-profiles.js +5 -5
- package/dist/commands/customers.d.ts.map +1 -1
- package/dist/commands/customers.js +6 -6
- package/dist/commands/embeddings.d.ts +4 -0
- package/dist/commands/embeddings.d.ts.map +1 -0
- package/dist/commands/embeddings.js +139 -0
- package/dist/commands/experiments.d.ts.map +1 -1
- package/dist/commands/experiments.js +12 -12
- package/dist/commands/extensions.d.ts.map +1 -1
- package/dist/commands/extensions.js +6 -6
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +8 -8
- package/dist/commands/hooks.d.ts +4 -0
- package/dist/commands/hooks.d.ts.map +1 -0
- package/dist/commands/hooks.js +182 -0
- package/dist/commands/locales.d.ts.map +1 -1
- package/dist/commands/locales.js +18 -13
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +11 -11
- package/dist/commands/notes.d.ts.map +1 -1
- package/dist/commands/notes.js +18 -8
- package/dist/commands/notifications.d.ts.map +1 -1
- package/dist/commands/notifications.js +4 -4
- package/dist/commands/operations.d.ts.map +1 -1
- package/dist/commands/operations.js +126 -12
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +2 -2
- package/dist/commands/records.d.ts.map +1 -1
- package/dist/commands/records.js +32 -20
- package/dist/commands/schedules.d.ts.map +1 -1
- package/dist/commands/schedules.js +9 -9
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +2 -2
- package/dist/commands/segments.d.ts.map +1 -1
- package/dist/commands/segments.js +9 -9
- package/dist/commands/select-project.d.ts.map +1 -1
- package/dist/commands/select-project.js +8 -9
- package/dist/commands/settings.d.ts.map +1 -1
- package/dist/commands/settings.js +8 -8
- package/dist/commands/variant-catalog.d.ts.map +1 -1
- package/dist/commands/variant-catalog.js +7 -7
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +9 -8
- package/dist/config/pull-config.js +2 -2
- package/dist/config/types.d.ts +1 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/graphql/generated.d.ts +8134 -0
- package/dist/graphql/generated.d.ts.map +1 -0
- package/dist/graphql/generated.js +133 -0
- package/dist/lib/client.d.ts +1 -0
- package/dist/lib/client.d.ts.map +1 -1
- package/dist/lib/client.js +10 -7
- package/dist/lib/config.js +1 -1
- package/dist/lib/errors.d.ts.map +1 -1
- package/dist/lib/errors.js +11 -0
- package/package.json +32 -10
- package/dist/graphql/queries.d.ts +0 -115
- package/dist/graphql/queries.d.ts.map +0 -1
- package/dist/graphql/queries.js +0 -459
|
@@ -2,7 +2,7 @@ import { withErrorHandler } from '../lib/errors.js';
|
|
|
2
2
|
import { createClient } from '../lib/client.js';
|
|
3
3
|
import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
|
|
4
4
|
import { confirmAction } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListCustomersDocument, GetCustomerDocument, GetCustomerByEmailDocument, CreateCustomerDocument, DeleteCustomerDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerCustomersCommands(program, globalOpts) {
|
|
7
7
|
const customers = program
|
|
8
8
|
.command('customers')
|
|
@@ -18,7 +18,7 @@ export function registerCustomersCommands(program, globalOpts) {
|
|
|
18
18
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
19
19
|
const opts = globalOpts();
|
|
20
20
|
const client = await createClient(opts);
|
|
21
|
-
const data = await client.request(
|
|
21
|
+
const data = await client.request(ListCustomersDocument, {
|
|
22
22
|
status: cmdOpts.status,
|
|
23
23
|
search: cmdOpts.search,
|
|
24
24
|
limit: parseInt(cmdOpts.limit ?? '20', 10),
|
|
@@ -54,11 +54,11 @@ export function registerCustomersCommands(program, globalOpts) {
|
|
|
54
54
|
const client = await createClient(opts);
|
|
55
55
|
let result;
|
|
56
56
|
if (idOrEmail.includes('@')) {
|
|
57
|
-
const data = await client.request(
|
|
57
|
+
const data = await client.request(GetCustomerByEmailDocument, { email: idOrEmail });
|
|
58
58
|
result = data.customerByEmail;
|
|
59
59
|
}
|
|
60
60
|
else {
|
|
61
|
-
const data = await client.request(
|
|
61
|
+
const data = await client.request(GetCustomerDocument, { id: idOrEmail });
|
|
62
62
|
result = data.customer;
|
|
63
63
|
}
|
|
64
64
|
if (!result) {
|
|
@@ -90,7 +90,7 @@ export function registerCustomersCommands(program, globalOpts) {
|
|
|
90
90
|
if (!input.email) {
|
|
91
91
|
throw new Error('--email is required.');
|
|
92
92
|
}
|
|
93
|
-
const data = await client.request(
|
|
93
|
+
const data = await client.request(CreateCustomerDocument, { input });
|
|
94
94
|
formatOutput(data.createCustomer, opts);
|
|
95
95
|
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
96
96
|
success(`Created customer ${data.createCustomer.email}`);
|
|
@@ -109,7 +109,7 @@ export function registerCustomersCommands(program, globalOpts) {
|
|
|
109
109
|
return;
|
|
110
110
|
}
|
|
111
111
|
const client = await createClient(opts);
|
|
112
|
-
const data = await client.request(
|
|
112
|
+
const data = await client.request(DeleteCustomerDocument, { id });
|
|
113
113
|
if (opts.json || opts.jsonl) {
|
|
114
114
|
formatOutput(data.deleteCustomer, opts);
|
|
115
115
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/commands/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAuJN"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { withErrorHandler } from '../lib/errors.js';
|
|
2
|
+
import { createClient } from '../lib/client.js';
|
|
3
|
+
import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
|
|
4
|
+
import { parseInputData } from '../lib/input.js';
|
|
5
|
+
import { WriteEmbeddingsDocument, DeleteEmbeddingsDocument, SearchEmbeddingsDocument, EmbeddingsForRecordDocument, EmbeddingStatsDocument, FindSimilarRecordsDocument, } from '../graphql/generated.js';
|
|
6
|
+
export function registerEmbeddingsCommands(program, globalOpts) {
|
|
7
|
+
const embeddings = program
|
|
8
|
+
.command('embeddings')
|
|
9
|
+
.description('Manage vector embeddings');
|
|
10
|
+
// write
|
|
11
|
+
embeddings
|
|
12
|
+
.command('write')
|
|
13
|
+
.description('Write embeddings for records')
|
|
14
|
+
.option('-d, --data <json>', 'Embedding data as JSON')
|
|
15
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
16
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
17
|
+
const opts = globalOpts();
|
|
18
|
+
const client = await createClient(opts);
|
|
19
|
+
const input = await parseInputData(cmdOpts);
|
|
20
|
+
const data = await client.request(WriteEmbeddingsDocument, { input });
|
|
21
|
+
formatOutput(data.writeEmbeddings, opts);
|
|
22
|
+
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
23
|
+
success(`Wrote ${data.writeEmbeddings.written} embedding(s)`);
|
|
24
|
+
}));
|
|
25
|
+
// delete
|
|
26
|
+
embeddings
|
|
27
|
+
.command('delete')
|
|
28
|
+
.description('Delete embeddings')
|
|
29
|
+
.option('--record-id <id>', 'Delete by record ID')
|
|
30
|
+
.option('--key <key>', 'Delete by embedding key')
|
|
31
|
+
.option('--model-key <key>', 'Delete by model key')
|
|
32
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
33
|
+
const opts = globalOpts();
|
|
34
|
+
const client = await createClient(opts);
|
|
35
|
+
const input = {};
|
|
36
|
+
if (cmdOpts.recordId)
|
|
37
|
+
input.recordId = cmdOpts.recordId;
|
|
38
|
+
if (cmdOpts.key)
|
|
39
|
+
input.key = cmdOpts.key;
|
|
40
|
+
if (cmdOpts.modelKey)
|
|
41
|
+
input.modelKey = cmdOpts.modelKey;
|
|
42
|
+
const data = await client.request(DeleteEmbeddingsDocument, { input });
|
|
43
|
+
formatOutput(data.deleteEmbeddings, opts);
|
|
44
|
+
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
45
|
+
success(`Deleted ${data.deleteEmbeddings.deleted} embedding(s)`);
|
|
46
|
+
}));
|
|
47
|
+
// search
|
|
48
|
+
embeddings
|
|
49
|
+
.command('search')
|
|
50
|
+
.description('Search embeddings by vector or text')
|
|
51
|
+
.option('-d, --data <json>', 'Search input as JSON')
|
|
52
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
53
|
+
.option('--limit <n>', 'Max results', '10')
|
|
54
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
55
|
+
const opts = globalOpts();
|
|
56
|
+
const client = await createClient(opts);
|
|
57
|
+
const input = await parseInputData(cmdOpts);
|
|
58
|
+
if (cmdOpts.limit && !input.limit) {
|
|
59
|
+
input.limit = parseInt(String(cmdOpts.limit), 10);
|
|
60
|
+
}
|
|
61
|
+
const data = await client.request(SearchEmbeddingsDocument, { input });
|
|
62
|
+
formatList(data.searchEmbeddings, opts, {
|
|
63
|
+
columns: [
|
|
64
|
+
{ key: 'recordId', header: 'Record ID', width: 28 },
|
|
65
|
+
{ key: 'modelKey', header: 'Model', width: 16 },
|
|
66
|
+
{ key: 'naturalKey', header: 'Natural Key', width: 20 },
|
|
67
|
+
{ key: 'key', header: 'Key', width: 16 },
|
|
68
|
+
{
|
|
69
|
+
key: 'similarity',
|
|
70
|
+
header: 'Similarity',
|
|
71
|
+
width: 12,
|
|
72
|
+
format: (v) => v.toFixed(4),
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
});
|
|
76
|
+
}));
|
|
77
|
+
// list (embeddings for a record)
|
|
78
|
+
embeddings
|
|
79
|
+
.command('list <recordId>')
|
|
80
|
+
.description('List embeddings for a record')
|
|
81
|
+
.action(withErrorHandler(globalOpts, async (recordId) => {
|
|
82
|
+
const opts = globalOpts();
|
|
83
|
+
const client = await createClient(opts);
|
|
84
|
+
const data = await client.request(EmbeddingsForRecordDocument, { recordId });
|
|
85
|
+
formatList(data.embeddingsForRecord, opts, {
|
|
86
|
+
columns: [
|
|
87
|
+
{ key: 'id', header: 'ID', width: 28 },
|
|
88
|
+
{ key: 'key', header: 'Key', width: 20 },
|
|
89
|
+
{ key: 'dimensions', header: 'Dims', width: 6 },
|
|
90
|
+
{ key: 'contentHash', header: 'Hash', width: 16 },
|
|
91
|
+
{
|
|
92
|
+
key: 'updatedAt',
|
|
93
|
+
header: 'Updated',
|
|
94
|
+
width: 12,
|
|
95
|
+
format: (v) => timeAgo(v),
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
});
|
|
99
|
+
}));
|
|
100
|
+
// stats
|
|
101
|
+
embeddings
|
|
102
|
+
.command('stats <modelKey>')
|
|
103
|
+
.description('Get embedding statistics for a model')
|
|
104
|
+
.action(withErrorHandler(globalOpts, async (modelKey) => {
|
|
105
|
+
const opts = globalOpts();
|
|
106
|
+
const client = await createClient(opts);
|
|
107
|
+
const data = await client.request(EmbeddingStatsDocument, { modelKey });
|
|
108
|
+
formatOutput(data.embeddingStats, opts);
|
|
109
|
+
}));
|
|
110
|
+
// similar
|
|
111
|
+
embeddings
|
|
112
|
+
.command('similar <recordId>')
|
|
113
|
+
.description('Find records similar to a given record')
|
|
114
|
+
.option('--key <key>', 'Embedding key to compare')
|
|
115
|
+
.option('--limit <n>', 'Max results', '10')
|
|
116
|
+
.action(withErrorHandler(globalOpts, async (recordId, cmdOpts) => {
|
|
117
|
+
const opts = globalOpts();
|
|
118
|
+
const client = await createClient(opts);
|
|
119
|
+
const data = await client.request(FindSimilarRecordsDocument, {
|
|
120
|
+
recordId,
|
|
121
|
+
key: cmdOpts.key,
|
|
122
|
+
limit: parseInt(String(cmdOpts.limit ?? '10'), 10),
|
|
123
|
+
});
|
|
124
|
+
formatList(data.findSimilarRecords, opts, {
|
|
125
|
+
columns: [
|
|
126
|
+
{ key: 'recordId', header: 'Record ID', width: 28 },
|
|
127
|
+
{ key: 'modelKey', header: 'Model', width: 16 },
|
|
128
|
+
{ key: 'naturalKey', header: 'Natural Key', width: 20 },
|
|
129
|
+
{ key: 'key', header: 'Key', width: 16 },
|
|
130
|
+
{
|
|
131
|
+
key: 'similarity',
|
|
132
|
+
header: 'Similarity',
|
|
133
|
+
width: 12,
|
|
134
|
+
format: (v) => v.toFixed(4),
|
|
135
|
+
},
|
|
136
|
+
],
|
|
137
|
+
});
|
|
138
|
+
}));
|
|
139
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"experiments.d.ts","sourceRoot":"","sources":["../../src/commands/experiments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmBtD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"experiments.d.ts","sourceRoot":"","sources":["../../src/commands/experiments.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAmBtD,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA+MN"}
|
|
@@ -2,7 +2,7 @@ import { withErrorHandler } from '../lib/errors.js';
|
|
|
2
2
|
import { createClient } from '../lib/client.js';
|
|
3
3
|
import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
|
|
4
4
|
import { parseInputData, isUUID, confirmAction } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListExperimentsDocument, GetExperimentDocument, GetExperimentByKeyDocument, CreateExperimentDocument, UpdateExperimentDocument, DeleteExperimentDocument, StartExperimentDocument, PauseExperimentDocument, ResumeExperimentDocument, EndExperimentDocument, ExperimentStatsDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerExperimentsCommands(program, globalOpts) {
|
|
7
7
|
const experiments = program
|
|
8
8
|
.command('experiments')
|
|
@@ -18,7 +18,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
18
18
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
19
19
|
const opts = globalOpts();
|
|
20
20
|
const client = await createClient(opts);
|
|
21
|
-
const data = await client.request(
|
|
21
|
+
const data = await client.request(ListExperimentsDocument, {
|
|
22
22
|
status: cmdOpts.status,
|
|
23
23
|
isActive: cmdOpts.active ? true : undefined,
|
|
24
24
|
limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
|
|
@@ -54,11 +54,11 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
54
54
|
const client = await createClient(opts);
|
|
55
55
|
let result;
|
|
56
56
|
if (isUUID(idOrKey)) {
|
|
57
|
-
const data = await client.request(
|
|
57
|
+
const data = await client.request(GetExperimentDocument, { id: idOrKey });
|
|
58
58
|
result = data.experiment;
|
|
59
59
|
}
|
|
60
60
|
else {
|
|
61
|
-
const data = await client.request(
|
|
61
|
+
const data = await client.request(GetExperimentByKeyDocument, { key: idOrKey });
|
|
62
62
|
result = data.experimentByKey;
|
|
63
63
|
}
|
|
64
64
|
if (!result)
|
|
@@ -75,7 +75,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
75
75
|
const opts = globalOpts();
|
|
76
76
|
const client = await createClient(opts);
|
|
77
77
|
const input = await parseInputData(cmdOpts);
|
|
78
|
-
const data = await client.request(
|
|
78
|
+
const data = await client.request(CreateExperimentDocument, { input });
|
|
79
79
|
formatOutput(data.createExperiment, opts);
|
|
80
80
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
81
81
|
success(`Created experiment ${data.createExperiment.key}`);
|
|
@@ -90,7 +90,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
90
90
|
const opts = globalOpts();
|
|
91
91
|
const client = await createClient(opts);
|
|
92
92
|
const input = await parseInputData(cmdOpts);
|
|
93
|
-
const data = await client.request(
|
|
93
|
+
const data = await client.request(UpdateExperimentDocument, { id, input });
|
|
94
94
|
formatOutput(data.updateExperiment, opts);
|
|
95
95
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
96
96
|
success(`Updated experiment ${id}`);
|
|
@@ -110,7 +110,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
110
110
|
return;
|
|
111
111
|
}
|
|
112
112
|
const client = await createClient(opts);
|
|
113
|
-
await client.request(
|
|
113
|
+
await client.request(DeleteExperimentDocument, { id });
|
|
114
114
|
if (opts.json || opts.jsonl)
|
|
115
115
|
formatOutput({ deleted: true, id }, opts);
|
|
116
116
|
else
|
|
@@ -123,7 +123,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
123
123
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
124
124
|
const opts = globalOpts();
|
|
125
125
|
const client = await createClient(opts);
|
|
126
|
-
const data = await client.request(
|
|
126
|
+
const data = await client.request(StartExperimentDocument, { experimentId: id });
|
|
127
127
|
formatOutput(data.startExperiment, opts);
|
|
128
128
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
129
129
|
success('Experiment started');
|
|
@@ -135,7 +135,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
135
135
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
136
136
|
const opts = globalOpts();
|
|
137
137
|
const client = await createClient(opts);
|
|
138
|
-
const data = await client.request(
|
|
138
|
+
const data = await client.request(PauseExperimentDocument, { experimentId: id });
|
|
139
139
|
formatOutput(data.pauseExperiment, opts);
|
|
140
140
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
141
141
|
success('Experiment paused');
|
|
@@ -147,7 +147,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
147
147
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
148
148
|
const opts = globalOpts();
|
|
149
149
|
const client = await createClient(opts);
|
|
150
|
-
const data = await client.request(
|
|
150
|
+
const data = await client.request(ResumeExperimentDocument, { experimentId: id });
|
|
151
151
|
formatOutput(data.resumeExperiment, opts);
|
|
152
152
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
153
153
|
success('Experiment resumed');
|
|
@@ -159,7 +159,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
159
159
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
160
160
|
const opts = globalOpts();
|
|
161
161
|
const client = await createClient(opts);
|
|
162
|
-
const data = await client.request(
|
|
162
|
+
const data = await client.request(EndExperimentDocument, { experimentId: id });
|
|
163
163
|
formatOutput(data.endExperiment, opts);
|
|
164
164
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
165
165
|
success('Experiment ended');
|
|
@@ -171,7 +171,7 @@ export function registerExperimentsCommands(program, globalOpts) {
|
|
|
171
171
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
172
172
|
const opts = globalOpts();
|
|
173
173
|
const client = await createClient(opts);
|
|
174
|
-
const data = await client.request(
|
|
174
|
+
const data = await client.request(ExperimentStatsDocument, { experimentId: id });
|
|
175
175
|
formatOutput(data.experimentStats, opts);
|
|
176
176
|
}));
|
|
177
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAatD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/commands/extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAatD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAoGN"}
|
|
@@ -2,7 +2,7 @@ import { withErrorHandler } from '../lib/errors.js';
|
|
|
2
2
|
import { createClient } from '../lib/client.js';
|
|
3
3
|
import { formatOutput, formatList, success } from '../lib/output.js';
|
|
4
4
|
import { parseInputData, isUUID } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListExtensionsDocument, GetExtensionDocument, GetExtensionByKeyDocument, RegisterExtensionDocument, TriggerExtensionSyncDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerExtensionsCommands(program, globalOpts) {
|
|
7
7
|
const extensions = program
|
|
8
8
|
.command('extensions')
|
|
@@ -17,7 +17,7 @@ export function registerExtensionsCommands(program, globalOpts) {
|
|
|
17
17
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
18
18
|
const opts = globalOpts();
|
|
19
19
|
const client = await createClient(opts);
|
|
20
|
-
const data = await client.request(
|
|
20
|
+
const data = await client.request(ListExtensionsDocument, {
|
|
21
21
|
extensionType: cmdOpts.type,
|
|
22
22
|
enabled: cmdOpts.enabled ? true : undefined,
|
|
23
23
|
limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
|
|
@@ -47,11 +47,11 @@ export function registerExtensionsCommands(program, globalOpts) {
|
|
|
47
47
|
const client = await createClient(opts);
|
|
48
48
|
let result;
|
|
49
49
|
if (isUUID(idOrKey)) {
|
|
50
|
-
const data = await client.request(
|
|
50
|
+
const data = await client.request(GetExtensionDocument, { id: idOrKey });
|
|
51
51
|
result = data.extension;
|
|
52
52
|
}
|
|
53
53
|
else {
|
|
54
|
-
const data = await client.request(
|
|
54
|
+
const data = await client.request(GetExtensionByKeyDocument, { key: idOrKey });
|
|
55
55
|
result = data.extensionByKey;
|
|
56
56
|
}
|
|
57
57
|
if (!result)
|
|
@@ -68,7 +68,7 @@ export function registerExtensionsCommands(program, globalOpts) {
|
|
|
68
68
|
const opts = globalOpts();
|
|
69
69
|
const client = await createClient(opts);
|
|
70
70
|
const input = await parseInputData(cmdOpts);
|
|
71
|
-
const data = await client.request(
|
|
71
|
+
const data = await client.request(RegisterExtensionDocument, { input });
|
|
72
72
|
formatOutput(data.registerExtension, opts);
|
|
73
73
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
74
74
|
success(`Registered extension ${data.registerExtension.key}`);
|
|
@@ -80,7 +80,7 @@ export function registerExtensionsCommands(program, globalOpts) {
|
|
|
80
80
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
81
81
|
const opts = globalOpts();
|
|
82
82
|
const client = await createClient(opts);
|
|
83
|
-
const data = await client.request(
|
|
83
|
+
const data = await client.request(TriggerExtensionSyncDocument, { extensionId: id });
|
|
84
84
|
if (opts.json || opts.jsonl) {
|
|
85
85
|
formatOutput(data.triggerExtensionSync, opts);
|
|
86
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/commands/files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA0JN"}
|
package/dist/commands/files.js
CHANGED
|
@@ -2,7 +2,7 @@ import { withErrorHandler } from '../lib/errors.js';
|
|
|
2
2
|
import { createClient } from '../lib/client.js';
|
|
3
3
|
import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
|
|
4
4
|
import { confirmAction } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListFilesDocument, GetFileDocument, FileStorageUsageDocument, UpdateFileDocument, UpdateFileMetadataDocument, DeleteFileDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerFilesCommands(program, globalOpts) {
|
|
7
7
|
const files = program
|
|
8
8
|
.command('files')
|
|
@@ -19,14 +19,14 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
19
19
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
20
20
|
const opts = globalOpts();
|
|
21
21
|
const client = await createClient(opts);
|
|
22
|
-
const data = await client.request(
|
|
22
|
+
const data = await client.request(ListFilesDocument, {
|
|
23
23
|
folder: cmdOpts.folder,
|
|
24
24
|
mimeType: cmdOpts.mimeType,
|
|
25
25
|
search: cmdOpts.search,
|
|
26
26
|
limit: parseInt(cmdOpts.limit ?? '50', 10),
|
|
27
27
|
offset: parseInt(cmdOpts.offset ?? '0', 10),
|
|
28
28
|
});
|
|
29
|
-
formatList(data.files.
|
|
29
|
+
formatList(data.files.files, opts, {
|
|
30
30
|
columns: [
|
|
31
31
|
{ key: 'id', header: 'ID', width: 28 },
|
|
32
32
|
{ key: 'filename', header: 'Filename', width: 30 },
|
|
@@ -55,7 +55,7 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
55
55
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
56
56
|
const opts = globalOpts();
|
|
57
57
|
const client = await createClient(opts);
|
|
58
|
-
const data = await client.request(
|
|
58
|
+
const data = await client.request(GetFileDocument, { id });
|
|
59
59
|
if (!data.file)
|
|
60
60
|
throw new Error(`File "${id}" not found.`);
|
|
61
61
|
formatOutput(data.file, opts);
|
|
@@ -67,7 +67,7 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
67
67
|
.action(withErrorHandler(globalOpts, async () => {
|
|
68
68
|
const opts = globalOpts();
|
|
69
69
|
const client = await createClient(opts);
|
|
70
|
-
const data = await client.request(
|
|
70
|
+
const data = await client.request(FileStorageUsageDocument);
|
|
71
71
|
formatOutput(data.fileStorageUsage, opts);
|
|
72
72
|
}));
|
|
73
73
|
// update
|
|
@@ -87,7 +87,7 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
87
87
|
vars.folder = cmdOpts.folder;
|
|
88
88
|
if (cmdOpts.tags)
|
|
89
89
|
vars.tags = cmdOpts.tags.split(',').map((t) => t.trim());
|
|
90
|
-
const data = await client.request(
|
|
90
|
+
const data = await client.request(UpdateFileDocument, vars);
|
|
91
91
|
formatOutput(data.updateFile, opts);
|
|
92
92
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
93
93
|
success(`Updated file ${id}`);
|
|
@@ -102,7 +102,7 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
102
102
|
.action(withErrorHandler(globalOpts, async (id, cmdOpts) => {
|
|
103
103
|
const opts = globalOpts();
|
|
104
104
|
const client = await createClient(opts);
|
|
105
|
-
const data = await client.request(
|
|
105
|
+
const data = await client.request(UpdateFileMetadataDocument, {
|
|
106
106
|
id,
|
|
107
107
|
altText: cmdOpts.altText,
|
|
108
108
|
caption: cmdOpts.caption,
|
|
@@ -127,7 +127,7 @@ export function registerFilesCommands(program, globalOpts) {
|
|
|
127
127
|
return;
|
|
128
128
|
}
|
|
129
129
|
const client = await createClient(opts);
|
|
130
|
-
await client.request(
|
|
130
|
+
await client.request(DeleteFileDocument, { id });
|
|
131
131
|
if (opts.json || opts.jsonl)
|
|
132
132
|
formatOutput({ deleted: true, id }, opts);
|
|
133
133
|
else
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAgBtD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA6NN"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { withErrorHandler } from '../lib/errors.js';
|
|
2
|
+
import { createClient } from '../lib/client.js';
|
|
3
|
+
import { formatOutput, formatList, timeAgo, success } from '../lib/output.js';
|
|
4
|
+
import { parseInputData, confirmAction } from '../lib/input.js';
|
|
5
|
+
import { ListHooksDocument, GetHookByKeyDocument, CreateHookDocument, UpdateHookDocument, DeleteHookDocument, HookDeliveriesDocument, RetryHookDeliveryDocument, TestHookDocument, } from '../graphql/generated.js';
|
|
6
|
+
export function registerHooksCommands(program, globalOpts) {
|
|
7
|
+
const hooks = program
|
|
8
|
+
.command('hooks')
|
|
9
|
+
.description('Manage event hooks');
|
|
10
|
+
// list
|
|
11
|
+
hooks
|
|
12
|
+
.command('list')
|
|
13
|
+
.description('List hooks')
|
|
14
|
+
.option('--event <event>', 'Filter by event (e.g. RECORD_CREATED)')
|
|
15
|
+
.option('--active', 'Only active hooks')
|
|
16
|
+
.option('--limit <n>', 'Max results', '50')
|
|
17
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
18
|
+
const opts = globalOpts();
|
|
19
|
+
const client = await createClient(opts);
|
|
20
|
+
const data = await client.request(ListHooksDocument, {
|
|
21
|
+
event: cmdOpts.event,
|
|
22
|
+
isActive: cmdOpts.active ? true : undefined,
|
|
23
|
+
limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
|
|
24
|
+
});
|
|
25
|
+
formatList(data.hooks.items, opts, {
|
|
26
|
+
columns: [
|
|
27
|
+
{ key: 'key', header: 'Key', width: 24 },
|
|
28
|
+
{ key: 'name', header: 'Name', width: 20 },
|
|
29
|
+
{ key: 'event', header: 'Event', width: 24 },
|
|
30
|
+
{ key: 'operationKey', header: 'Operation', width: 20 },
|
|
31
|
+
{
|
|
32
|
+
key: 'isActive',
|
|
33
|
+
header: 'Active',
|
|
34
|
+
width: 8,
|
|
35
|
+
format: (v) => (v ? 'yes' : 'no'),
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
key: 'updatedAt',
|
|
39
|
+
header: 'Updated',
|
|
40
|
+
width: 12,
|
|
41
|
+
format: (v) => timeAgo(v),
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
total: data.hooks.total,
|
|
45
|
+
});
|
|
46
|
+
}));
|
|
47
|
+
// get
|
|
48
|
+
hooks
|
|
49
|
+
.command('get <key>')
|
|
50
|
+
.description('Get a hook by key')
|
|
51
|
+
.action(withErrorHandler(globalOpts, async (key) => {
|
|
52
|
+
const opts = globalOpts();
|
|
53
|
+
const client = await createClient(opts);
|
|
54
|
+
const data = await client.request(GetHookByKeyDocument, { key });
|
|
55
|
+
if (!data.hookByKey)
|
|
56
|
+
throw new Error(`Hook "${key}" not found.`);
|
|
57
|
+
formatOutput(data.hookByKey, opts);
|
|
58
|
+
}));
|
|
59
|
+
// create
|
|
60
|
+
hooks
|
|
61
|
+
.command('create')
|
|
62
|
+
.description('Create a hook')
|
|
63
|
+
.option('-d, --data <json>', 'Hook data as JSON')
|
|
64
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
65
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
66
|
+
const opts = globalOpts();
|
|
67
|
+
const client = await createClient(opts);
|
|
68
|
+
const input = await parseInputData(cmdOpts);
|
|
69
|
+
const data = await client.request(CreateHookDocument, { input });
|
|
70
|
+
formatOutput(data.createHook, opts);
|
|
71
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
72
|
+
success(`Hook "${data.createHook.key}" created`);
|
|
73
|
+
}
|
|
74
|
+
}));
|
|
75
|
+
// update
|
|
76
|
+
hooks
|
|
77
|
+
.command('update <id>')
|
|
78
|
+
.description('Update a hook')
|
|
79
|
+
.option('-d, --data <json>', 'Update data as JSON')
|
|
80
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
81
|
+
.action(withErrorHandler(globalOpts, async (id, cmdOpts) => {
|
|
82
|
+
const opts = globalOpts();
|
|
83
|
+
const client = await createClient(opts);
|
|
84
|
+
const input = await parseInputData(cmdOpts);
|
|
85
|
+
const data = await client.request(UpdateHookDocument, { id, input });
|
|
86
|
+
formatOutput(data.updateHook, opts);
|
|
87
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
88
|
+
success(`Hook "${data.updateHook.key}" updated`);
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
// delete
|
|
92
|
+
hooks
|
|
93
|
+
.command('delete <id>')
|
|
94
|
+
.description('Delete a hook')
|
|
95
|
+
.option('--confirm', 'Skip confirmation')
|
|
96
|
+
.action(withErrorHandler(globalOpts, async (id, cmdOpts) => {
|
|
97
|
+
const opts = globalOpts();
|
|
98
|
+
const confirmed = await confirmAction(`Delete hook ${id}?`, cmdOpts);
|
|
99
|
+
if (!confirmed)
|
|
100
|
+
return;
|
|
101
|
+
const client = await createClient(opts);
|
|
102
|
+
await client.request(DeleteHookDocument, { id });
|
|
103
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
104
|
+
success(`Hook ${id} deleted`);
|
|
105
|
+
}
|
|
106
|
+
}));
|
|
107
|
+
// deliveries
|
|
108
|
+
hooks
|
|
109
|
+
.command('deliveries')
|
|
110
|
+
.description('List hook deliveries')
|
|
111
|
+
.option('--hook-id <id>', 'Filter by hook ID')
|
|
112
|
+
.option('--event <event>', 'Filter by event')
|
|
113
|
+
.option('--status <status>', 'Filter by status (SUCCESS, FAILED, RETRYING)')
|
|
114
|
+
.option('--limit <n>', 'Max results', '20')
|
|
115
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
116
|
+
const opts = globalOpts();
|
|
117
|
+
const client = await createClient(opts);
|
|
118
|
+
const data = await client.request(HookDeliveriesDocument, {
|
|
119
|
+
hookId: cmdOpts.hookId,
|
|
120
|
+
event: cmdOpts.event,
|
|
121
|
+
status: cmdOpts.status,
|
|
122
|
+
limit: parseInt(String(cmdOpts.limit ?? '20'), 10),
|
|
123
|
+
});
|
|
124
|
+
formatList(data.hookDeliveries.items, opts, {
|
|
125
|
+
columns: [
|
|
126
|
+
{ key: 'id', header: 'ID', width: 28 },
|
|
127
|
+
{ key: 'event', header: 'Event', width: 22 },
|
|
128
|
+
{ key: 'status', header: 'Status', width: 10 },
|
|
129
|
+
{ key: 'attempts', header: 'Tries', width: 6 },
|
|
130
|
+
{ key: 'durationMs', header: 'Duration', width: 10, format: (v) => v ? `${v}ms` : '—' },
|
|
131
|
+
{ key: 'error', header: 'Error', width: 30 },
|
|
132
|
+
{
|
|
133
|
+
key: 'deliveredAt',
|
|
134
|
+
header: 'Delivered',
|
|
135
|
+
width: 12,
|
|
136
|
+
format: (v) => timeAgo(v),
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
total: data.hookDeliveries.total,
|
|
140
|
+
});
|
|
141
|
+
}));
|
|
142
|
+
// retry-delivery
|
|
143
|
+
hooks
|
|
144
|
+
.command('retry-delivery <deliveryId>')
|
|
145
|
+
.description('Retry a failed hook delivery')
|
|
146
|
+
.action(withErrorHandler(globalOpts, async (deliveryId) => {
|
|
147
|
+
const opts = globalOpts();
|
|
148
|
+
const client = await createClient(opts);
|
|
149
|
+
const data = await client.request(RetryHookDeliveryDocument, { deliveryId });
|
|
150
|
+
formatOutput(data.retryHookDelivery, opts);
|
|
151
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
152
|
+
const status = data.retryHookDelivery.status;
|
|
153
|
+
if (status === 'SUCCESS')
|
|
154
|
+
success('Delivery retry succeeded');
|
|
155
|
+
else
|
|
156
|
+
console.error(`Delivery retry status: ${status}`);
|
|
157
|
+
}
|
|
158
|
+
}));
|
|
159
|
+
// test
|
|
160
|
+
hooks
|
|
161
|
+
.command('test <hookId>')
|
|
162
|
+
.description('Send a test event to a hook')
|
|
163
|
+
.option('-d, --data <json>', 'Test payload as JSON')
|
|
164
|
+
.option('-f, --file <path>', 'Read payload from file')
|
|
165
|
+
.action(withErrorHandler(globalOpts, async (hookId, cmdOpts) => {
|
|
166
|
+
const opts = globalOpts();
|
|
167
|
+
const client = await createClient(opts);
|
|
168
|
+
let testData;
|
|
169
|
+
if (cmdOpts.data || cmdOpts.file) {
|
|
170
|
+
testData = await parseInputData(cmdOpts);
|
|
171
|
+
}
|
|
172
|
+
const data = await client.request(TestHookDocument, { hookId, data: testData });
|
|
173
|
+
formatOutput(data.testHook, opts);
|
|
174
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
175
|
+
const status = data.testHook.status;
|
|
176
|
+
if (status === 'SUCCESS')
|
|
177
|
+
success('Test delivery succeeded');
|
|
178
|
+
else
|
|
179
|
+
console.error(`Test delivery status: ${status}`);
|
|
180
|
+
}
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/commands/locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAetD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../src/commands/locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAetD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAqJN"}
|