@eide/foir-cli 0.1.23 → 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.js +0 -1
- 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/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/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/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/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
package/dist/commands/locales.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, success } from '../lib/output.js';
|
|
4
4
|
import { parseInputData, confirmAction } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListLocalesDocument, GetLocaleDocument, GetLocaleByCodeDocument, GetDefaultLocaleDocument, CreateLocaleDocument, UpdateLocaleDocument, DeleteLocaleDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerLocalesCommands(program, globalOpts) {
|
|
7
7
|
const locales = program.command('locales').description('Manage locales');
|
|
8
8
|
// list
|
|
@@ -14,14 +14,14 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
14
14
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
15
15
|
const opts = globalOpts();
|
|
16
16
|
const client = await createClient(opts);
|
|
17
|
-
const data = await client.request(
|
|
17
|
+
const data = await client.request(ListLocalesDocument, {
|
|
18
18
|
includeInactive: !!cmdOpts.includeInactive,
|
|
19
19
|
limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
|
|
20
20
|
});
|
|
21
21
|
formatList(data.locales, opts, {
|
|
22
22
|
columns: [
|
|
23
|
-
{ key: '
|
|
24
|
-
{ key: '
|
|
23
|
+
{ key: 'locale', header: 'Code', width: 8 },
|
|
24
|
+
{ key: 'displayName', header: 'Name', width: 20 },
|
|
25
25
|
{ key: 'nativeName', header: 'Native', width: 20 },
|
|
26
26
|
{
|
|
27
27
|
key: 'isDefault',
|
|
@@ -35,7 +35,12 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
35
35
|
width: 8,
|
|
36
36
|
format: (v) => (v ? 'yes' : 'no'),
|
|
37
37
|
},
|
|
38
|
-
{
|
|
38
|
+
{
|
|
39
|
+
key: 'isRtl',
|
|
40
|
+
header: 'RTL',
|
|
41
|
+
width: 4,
|
|
42
|
+
format: (v) => (v ? 'yes' : ''),
|
|
43
|
+
},
|
|
39
44
|
],
|
|
40
45
|
});
|
|
41
46
|
}));
|
|
@@ -49,11 +54,11 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
49
54
|
let result;
|
|
50
55
|
// Locale codes are short (e.g. "en", "en-US") — not UUIDs
|
|
51
56
|
if (/^[0-9a-f]{8}-/.test(idOrCode)) {
|
|
52
|
-
const data = await client.request(
|
|
57
|
+
const data = await client.request(GetLocaleDocument, { id: idOrCode });
|
|
53
58
|
result = data.locale;
|
|
54
59
|
}
|
|
55
60
|
else {
|
|
56
|
-
const data = await client.request(
|
|
61
|
+
const data = await client.request(GetLocaleByCodeDocument, { code: idOrCode });
|
|
57
62
|
result = data.localeByCode;
|
|
58
63
|
}
|
|
59
64
|
if (!result)
|
|
@@ -67,7 +72,7 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
67
72
|
.action(withErrorHandler(globalOpts, async () => {
|
|
68
73
|
const opts = globalOpts();
|
|
69
74
|
const client = await createClient(opts);
|
|
70
|
-
const data = await client.request(
|
|
75
|
+
const data = await client.request(GetDefaultLocaleDocument);
|
|
71
76
|
if (!data.defaultLocale)
|
|
72
77
|
throw new Error('No default locale configured.');
|
|
73
78
|
formatOutput(data.defaultLocale, opts);
|
|
@@ -82,10 +87,10 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
82
87
|
const opts = globalOpts();
|
|
83
88
|
const client = await createClient(opts);
|
|
84
89
|
const input = await parseInputData(cmdOpts);
|
|
85
|
-
const data = await client.request(
|
|
90
|
+
const data = await client.request(CreateLocaleDocument, { input });
|
|
86
91
|
formatOutput(data.createLocale, opts);
|
|
87
92
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
88
|
-
success(`Created locale ${data.createLocale.
|
|
93
|
+
success(`Created locale ${data.createLocale.locale}`);
|
|
89
94
|
}));
|
|
90
95
|
// update
|
|
91
96
|
locales
|
|
@@ -97,10 +102,10 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
97
102
|
const opts = globalOpts();
|
|
98
103
|
const client = await createClient(opts);
|
|
99
104
|
const input = await parseInputData(cmdOpts);
|
|
100
|
-
const data = await client.request(
|
|
105
|
+
const data = await client.request(UpdateLocaleDocument, { id, input });
|
|
101
106
|
formatOutput(data.updateLocale, opts);
|
|
102
107
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
103
|
-
success(`Updated locale ${data.updateLocale.
|
|
108
|
+
success(`Updated locale ${data.updateLocale.locale}`);
|
|
104
109
|
}));
|
|
105
110
|
// delete
|
|
106
111
|
locales
|
|
@@ -117,7 +122,7 @@ export function registerLocalesCommands(program, globalOpts) {
|
|
|
117
122
|
return;
|
|
118
123
|
}
|
|
119
124
|
const client = await createClient(opts);
|
|
120
|
-
await client.request(
|
|
125
|
+
await client.request(DeleteLocaleDocument, { id });
|
|
121
126
|
if (opts.json || opts.jsonl)
|
|
122
127
|
formatOutput({ deleted: true, id }, opts);
|
|
123
128
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AActD,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAiLN"}
|
package/dist/commands/models.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 { parseInputData, confirmAction } from '../lib/input.js';
|
|
5
|
-
import {
|
|
5
|
+
import { ListModelsDocument, GetModelByKeyDocument, CreateModelDocument, UpdateModelDocument, DeleteModelDocument, ModelVersionsDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerModelsCommands(program, globalOpts) {
|
|
7
7
|
const models = program.command('models').description('Manage models');
|
|
8
8
|
// list
|
|
@@ -16,7 +16,7 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
16
16
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
17
17
|
const opts = globalOpts();
|
|
18
18
|
const client = await createClient(opts);
|
|
19
|
-
const data = await client.request(
|
|
19
|
+
const data = await client.request(ListModelsDocument, {
|
|
20
20
|
search: cmdOpts.search,
|
|
21
21
|
category: cmdOpts.category,
|
|
22
22
|
limit: parseInt(cmdOpts.limit ?? '50', 10),
|
|
@@ -44,7 +44,7 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
44
44
|
.action(withErrorHandler(globalOpts, async (key) => {
|
|
45
45
|
const opts = globalOpts();
|
|
46
46
|
const client = await createClient(opts);
|
|
47
|
-
const data = await client.request(
|
|
47
|
+
const data = await client.request(GetModelByKeyDocument, { key });
|
|
48
48
|
if (!data.modelByKey) {
|
|
49
49
|
throw new Error(`Model "${key}" not found.`);
|
|
50
50
|
}
|
|
@@ -60,7 +60,7 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
60
60
|
const opts = globalOpts();
|
|
61
61
|
const client = await createClient(opts);
|
|
62
62
|
const inputData = await parseInputData(cmdOpts);
|
|
63
|
-
const data = await client.request(
|
|
63
|
+
const data = await client.request(CreateModelDocument, { input: inputData });
|
|
64
64
|
formatOutput(data.createModel, opts);
|
|
65
65
|
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
66
66
|
success(`Created model ${data.createModel.key}`);
|
|
@@ -75,14 +75,14 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
75
75
|
.action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
|
|
76
76
|
const opts = globalOpts();
|
|
77
77
|
const client = await createClient(opts);
|
|
78
|
-
// Resolve key
|
|
79
|
-
const existing = await client.request(
|
|
78
|
+
// Resolve key -> id
|
|
79
|
+
const existing = await client.request(GetModelByKeyDocument, { key });
|
|
80
80
|
if (!existing.modelByKey) {
|
|
81
81
|
throw new Error(`Model "${key}" not found.`);
|
|
82
82
|
}
|
|
83
83
|
const inputData = await parseInputData(cmdOpts);
|
|
84
84
|
const input = { id: existing.modelByKey.id, ...inputData };
|
|
85
|
-
const data = await client.request(
|
|
85
|
+
const data = await client.request(UpdateModelDocument, { input });
|
|
86
86
|
formatOutput(data.updateModel, opts);
|
|
87
87
|
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
88
88
|
success(`Updated model ${key}`);
|
|
@@ -103,11 +103,11 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
103
103
|
return;
|
|
104
104
|
}
|
|
105
105
|
const client = await createClient(opts);
|
|
106
|
-
const existing = await client.request(
|
|
106
|
+
const existing = await client.request(GetModelByKeyDocument, { key });
|
|
107
107
|
if (!existing.modelByKey) {
|
|
108
108
|
throw new Error(`Model "${key}" not found.`);
|
|
109
109
|
}
|
|
110
|
-
await client.request(
|
|
110
|
+
await client.request(DeleteModelDocument, { id: existing.modelByKey.id });
|
|
111
111
|
if (opts.json || opts.jsonl) {
|
|
112
112
|
formatOutput({ deleted: true, key }, opts);
|
|
113
113
|
}
|
|
@@ -123,11 +123,11 @@ export function registerModelsCommands(program, globalOpts) {
|
|
|
123
123
|
.action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
|
|
124
124
|
const opts = globalOpts();
|
|
125
125
|
const client = await createClient(opts);
|
|
126
|
-
const existing = await client.request(
|
|
126
|
+
const existing = await client.request(GetModelByKeyDocument, { key });
|
|
127
127
|
if (!existing.modelByKey) {
|
|
128
128
|
throw new Error(`Model "${key}" not found.`);
|
|
129
129
|
}
|
|
130
|
-
const data = await client.request(
|
|
130
|
+
const data = await client.request(ModelVersionsDocument, {
|
|
131
131
|
modelId: existing.modelByKey.id,
|
|
132
132
|
limit: parseInt(cmdOpts.limit ?? '20', 10),
|
|
133
133
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/commands/notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAatD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"notes.d.ts","sourceRoot":"","sources":["../../src/commands/notes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAatD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA6IN"}
|
package/dist/commands/notes.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 { ListNotesDocument, GetNoteDocument, CreateNoteDocument, ResolveNoteDocument, DeleteNoteDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerNotesCommands(program, globalOpts) {
|
|
7
7
|
const notes = program
|
|
8
8
|
.command('notes')
|
|
@@ -18,7 +18,7 @@ export function registerNotesCommands(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(ListNotesDocument, {
|
|
22
22
|
entityType: cmdOpts.entityType,
|
|
23
23
|
entityId: cmdOpts.entityId,
|
|
24
24
|
includeResolved: !!cmdOpts.includeResolved,
|
|
@@ -27,8 +27,18 @@ export function registerNotesCommands(program, globalOpts) {
|
|
|
27
27
|
formatList(data.notes.items, opts, {
|
|
28
28
|
columns: [
|
|
29
29
|
{ key: 'id', header: 'ID', width: 28 },
|
|
30
|
-
{
|
|
31
|
-
|
|
30
|
+
{
|
|
31
|
+
key: 'content',
|
|
32
|
+
header: 'Content',
|
|
33
|
+
width: 40,
|
|
34
|
+
format: (v) => typeof v === 'string' ? v : JSON.stringify(v),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
key: 'author',
|
|
38
|
+
header: 'Author',
|
|
39
|
+
width: 16,
|
|
40
|
+
format: (v) => v?.email ?? '',
|
|
41
|
+
},
|
|
32
42
|
{
|
|
33
43
|
key: 'isResolved',
|
|
34
44
|
header: 'Resolved',
|
|
@@ -52,7 +62,7 @@ export function registerNotesCommands(program, globalOpts) {
|
|
|
52
62
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
53
63
|
const opts = globalOpts();
|
|
54
64
|
const client = await createClient(opts);
|
|
55
|
-
const data = await client.request(
|
|
65
|
+
const data = await client.request(GetNoteDocument, { id });
|
|
56
66
|
if (!data.note)
|
|
57
67
|
throw new Error(`Note "${id}" not found.`);
|
|
58
68
|
formatOutput(data.note, opts);
|
|
@@ -75,7 +85,7 @@ export function registerNotesCommands(program, globalOpts) {
|
|
|
75
85
|
};
|
|
76
86
|
if (cmdOpts.parentNoteId)
|
|
77
87
|
input.parentNoteId = cmdOpts.parentNoteId;
|
|
78
|
-
const data = await client.request(
|
|
88
|
+
const data = await client.request(CreateNoteDocument, { input });
|
|
79
89
|
formatOutput(data.createNote, opts);
|
|
80
90
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
81
91
|
success('Note created');
|
|
@@ -91,7 +101,7 @@ export function registerNotesCommands(program, globalOpts) {
|
|
|
91
101
|
const input = { noteId: id };
|
|
92
102
|
if (cmdOpts.resolution)
|
|
93
103
|
input.resolution = cmdOpts.resolution;
|
|
94
|
-
const data = await client.request(
|
|
104
|
+
const data = await client.request(ResolveNoteDocument, { input });
|
|
95
105
|
formatOutput(data.resolveNote, opts);
|
|
96
106
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
97
107
|
success(`Resolved note ${id}`);
|
|
@@ -111,7 +121,7 @@ export function registerNotesCommands(program, globalOpts) {
|
|
|
111
121
|
return;
|
|
112
122
|
}
|
|
113
123
|
const client = await createClient(opts);
|
|
114
|
-
await client.request(
|
|
124
|
+
await client.request(DeleteNoteDocument, { noteId: id });
|
|
115
125
|
if (opts.json || opts.jsonl)
|
|
116
126
|
formatOutput({ deleted: true, id }, opts);
|
|
117
127
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/commands/notifications.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAUtD,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAgFN"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
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
|
-
import {
|
|
4
|
+
import { ListNotificationsDocument, MarkNotificationReadDocument, MarkAllNotificationsReadDocument, } from '../graphql/generated.js';
|
|
5
5
|
export function registerNotificationsCommands(program, globalOpts) {
|
|
6
6
|
const notifications = program
|
|
7
7
|
.command('notifications')
|
|
@@ -15,7 +15,7 @@ export function registerNotificationsCommands(program, globalOpts) {
|
|
|
15
15
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
16
16
|
const opts = globalOpts();
|
|
17
17
|
const client = await createClient(opts);
|
|
18
|
-
const data = await client.request(
|
|
18
|
+
const data = await client.request(ListNotificationsDocument, {
|
|
19
19
|
unreadOnly: !!cmdOpts.unread,
|
|
20
20
|
limit: parseInt(String(cmdOpts.limit ?? '20'), 10),
|
|
21
21
|
});
|
|
@@ -50,7 +50,7 @@ export function registerNotificationsCommands(program, globalOpts) {
|
|
|
50
50
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
51
51
|
const opts = globalOpts();
|
|
52
52
|
const client = await createClient(opts);
|
|
53
|
-
const data = await client.request(
|
|
53
|
+
const data = await client.request(MarkNotificationReadDocument, { id });
|
|
54
54
|
formatOutput(data.markNotificationRead, opts);
|
|
55
55
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
56
56
|
success('Marked as read');
|
|
@@ -62,7 +62,7 @@ export function registerNotificationsCommands(program, globalOpts) {
|
|
|
62
62
|
.action(withErrorHandler(globalOpts, async () => {
|
|
63
63
|
const opts = globalOpts();
|
|
64
64
|
const client = await createClient(opts);
|
|
65
|
-
const data = await client.request(
|
|
65
|
+
const data = await client.request(MarkAllNotificationsReadDocument);
|
|
66
66
|
if (opts.json || opts.jsonl) {
|
|
67
67
|
formatOutput({ marked: data.markAllNotificationsRead }, opts);
|
|
68
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/commands/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/commands/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAkBtD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAiUN"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
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
|
-
import { parseInputData } from '../lib/input.js';
|
|
5
|
-
import {
|
|
4
|
+
import { parseInputData, confirmAction } from '../lib/input.js';
|
|
5
|
+
import { ListOperationsDocument, GetOperationDocument, ExecuteOperationDocument, OperationExecutionStatsDocument, DeadLetterOperationsDocument, RetryDeadLetterDocument, DismissDeadLetterDocument, CreateOperationDocument, UpdateOperationDocument, DeleteOperationDocument, } from '../graphql/generated.js';
|
|
6
6
|
export function registerOperationsCommands(program, globalOpts) {
|
|
7
7
|
const operations = program
|
|
8
8
|
.command('operations')
|
|
@@ -13,16 +13,18 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
13
13
|
.description('List operations')
|
|
14
14
|
.option('--category <cat>', 'Filter by category')
|
|
15
15
|
.option('--active', 'Only active operations')
|
|
16
|
+
.option('--search <term>', 'Search by name')
|
|
16
17
|
.option('--limit <n>', 'Max results', '50')
|
|
17
18
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
18
19
|
const opts = globalOpts();
|
|
19
20
|
const client = await createClient(opts);
|
|
20
|
-
const data = await client.request(
|
|
21
|
+
const data = await client.request(ListOperationsDocument, {
|
|
21
22
|
category: cmdOpts.category,
|
|
22
23
|
isActive: cmdOpts.active ? true : undefined,
|
|
24
|
+
search: cmdOpts.search,
|
|
23
25
|
limit: parseInt(String(cmdOpts.limit ?? '50'), 10),
|
|
24
26
|
});
|
|
25
|
-
formatList(data.operations, opts, {
|
|
27
|
+
formatList(data.operations.items, opts, {
|
|
26
28
|
columns: [
|
|
27
29
|
{ key: 'key', header: 'Key', width: 24 },
|
|
28
30
|
{ key: 'name', header: 'Name', width: 24 },
|
|
@@ -40,6 +42,7 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
40
42
|
format: (v) => timeAgo(v),
|
|
41
43
|
},
|
|
42
44
|
],
|
|
45
|
+
total: data.operations.total,
|
|
43
46
|
});
|
|
44
47
|
}));
|
|
45
48
|
// get
|
|
@@ -49,7 +52,7 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
49
52
|
.action(withErrorHandler(globalOpts, async (key) => {
|
|
50
53
|
const opts = globalOpts();
|
|
51
54
|
const client = await createClient(opts);
|
|
52
|
-
const data = await client.request(
|
|
55
|
+
const data = await client.request(GetOperationDocument, { key });
|
|
53
56
|
if (!data.operation)
|
|
54
57
|
throw new Error(`Operation "${key}" not found.`);
|
|
55
58
|
formatOutput(data.operation, opts);
|
|
@@ -60,7 +63,8 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
60
63
|
.description('Execute an operation')
|
|
61
64
|
.option('-d, --data <json>', 'Input data as JSON')
|
|
62
65
|
.option('-f, --file <path>', 'Read input from file')
|
|
63
|
-
.option('--async', 'Execute asynchronously')
|
|
66
|
+
.option('--async', 'Execute asynchronously (shorthand for --mode async)')
|
|
67
|
+
.option('--mode <mode>', 'Execution mode: sync, async, or stream')
|
|
64
68
|
.action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
|
|
65
69
|
const opts = globalOpts();
|
|
66
70
|
const client = await createClient(opts);
|
|
@@ -68,13 +72,74 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
68
72
|
if (cmdOpts.data || cmdOpts.file) {
|
|
69
73
|
inputData = await parseInputData(cmdOpts);
|
|
70
74
|
}
|
|
71
|
-
|
|
75
|
+
// Resolve execution mode: --mode takes precedence, --async is shorthand
|
|
76
|
+
let mode;
|
|
77
|
+
if (cmdOpts.mode) {
|
|
78
|
+
mode = cmdOpts.mode.toUpperCase();
|
|
79
|
+
}
|
|
80
|
+
else if (cmdOpts.async) {
|
|
81
|
+
mode = 'ASYNC';
|
|
82
|
+
}
|
|
83
|
+
const data = await client.request(ExecuteOperationDocument, {
|
|
72
84
|
input: {
|
|
73
85
|
operationKey: key,
|
|
74
86
|
input: inputData,
|
|
75
|
-
|
|
87
|
+
...(mode ? { mode } : {}),
|
|
76
88
|
},
|
|
77
89
|
});
|
|
90
|
+
// For stream mode, connect to SSE endpoint and print events
|
|
91
|
+
if (mode === 'STREAM' && data.executeOperation.executionId) {
|
|
92
|
+
const executionId = data.executeOperation.executionId;
|
|
93
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
94
|
+
console.log(`Streaming execution ${executionId}…`);
|
|
95
|
+
}
|
|
96
|
+
const baseUrl = opts.apiUrl ?? process.env.FOIR_API_URL ?? 'http://localhost:4000';
|
|
97
|
+
const sseUrl = `${baseUrl}/api/operations/${executionId}/stream`;
|
|
98
|
+
const response = await fetch(sseUrl);
|
|
99
|
+
if (!response.ok || !response.body) {
|
|
100
|
+
throw new Error(`Failed to connect to stream: ${response.status}`);
|
|
101
|
+
}
|
|
102
|
+
const reader = response.body.getReader();
|
|
103
|
+
const decoder = new TextDecoder();
|
|
104
|
+
let buffer = '';
|
|
105
|
+
while (true) {
|
|
106
|
+
const { done, value } = await reader.read();
|
|
107
|
+
if (done)
|
|
108
|
+
break;
|
|
109
|
+
buffer += decoder.decode(value, { stream: true });
|
|
110
|
+
const lines = buffer.split('\n');
|
|
111
|
+
buffer = lines.pop() ?? '';
|
|
112
|
+
for (const line of lines) {
|
|
113
|
+
if (line.startsWith('data: ')) {
|
|
114
|
+
const eventData = JSON.parse(line.slice(6));
|
|
115
|
+
if (opts.json || opts.jsonl) {
|
|
116
|
+
console.log(JSON.stringify(eventData));
|
|
117
|
+
}
|
|
118
|
+
else if (!opts.quiet) {
|
|
119
|
+
const ev = eventData;
|
|
120
|
+
if (ev.event === 'chunk') {
|
|
121
|
+
process.stdout.write(String(ev.data ?? ''));
|
|
122
|
+
}
|
|
123
|
+
else if (ev.event === 'progress') {
|
|
124
|
+
console.log(`[progress] ${JSON.stringify(ev.data)}`);
|
|
125
|
+
}
|
|
126
|
+
else if (ev.event === 'error') {
|
|
127
|
+
console.error(`[error] ${JSON.stringify(ev.data)}`);
|
|
128
|
+
}
|
|
129
|
+
else if (ev.event === 'result') {
|
|
130
|
+
console.log(JSON.stringify(ev.data, null, 2));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (eventData.done)
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
139
|
+
success('Stream completed');
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
78
143
|
formatOutput(data.executeOperation, opts);
|
|
79
144
|
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
80
145
|
const result = data.executeOperation;
|
|
@@ -94,7 +159,7 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
94
159
|
.action(withErrorHandler(globalOpts, async (key) => {
|
|
95
160
|
const opts = globalOpts();
|
|
96
161
|
const client = await createClient(opts);
|
|
97
|
-
const data = await client.request(
|
|
162
|
+
const data = await client.request(OperationExecutionStatsDocument, { operationKey: key });
|
|
98
163
|
formatOutput(data.operationExecutionStats, opts);
|
|
99
164
|
}));
|
|
100
165
|
// dead-letters
|
|
@@ -107,7 +172,7 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
107
172
|
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
108
173
|
const opts = globalOpts();
|
|
109
174
|
const client = await createClient(opts);
|
|
110
|
-
const data = await client.request(
|
|
175
|
+
const data = await client.request(DeadLetterOperationsDocument, {
|
|
111
176
|
operationKey: cmdOpts.operation,
|
|
112
177
|
status: cmdOpts.status,
|
|
113
178
|
limit: parseInt(cmdOpts.limit ?? '20', 10),
|
|
@@ -136,7 +201,7 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
136
201
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
137
202
|
const opts = globalOpts();
|
|
138
203
|
const client = await createClient(opts);
|
|
139
|
-
const data = await client.request(
|
|
204
|
+
const data = await client.request(RetryDeadLetterDocument, { id });
|
|
140
205
|
formatOutput(data.retryDeadLetterOperation, opts);
|
|
141
206
|
if (!(opts.json || opts.jsonl || opts.quiet)) {
|
|
142
207
|
const r = data.retryDeadLetterOperation;
|
|
@@ -153,9 +218,58 @@ export function registerOperationsCommands(program, globalOpts) {
|
|
|
153
218
|
.action(withErrorHandler(globalOpts, async (id) => {
|
|
154
219
|
const opts = globalOpts();
|
|
155
220
|
const client = await createClient(opts);
|
|
156
|
-
const data = await client.request(
|
|
221
|
+
const data = await client.request(DismissDeadLetterDocument, { id });
|
|
157
222
|
formatOutput(data.dismissDeadLetterOperation, opts);
|
|
158
223
|
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
159
224
|
success(`Dismissed dead letter ${id}`);
|
|
160
225
|
}));
|
|
226
|
+
// create
|
|
227
|
+
operations
|
|
228
|
+
.command('create')
|
|
229
|
+
.description('Create an operation')
|
|
230
|
+
.option('-d, --data <json>', 'Operation data as JSON')
|
|
231
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
232
|
+
.action(withErrorHandler(globalOpts, async (cmdOpts) => {
|
|
233
|
+
const opts = globalOpts();
|
|
234
|
+
const client = await createClient(opts);
|
|
235
|
+
const input = await parseInputData(cmdOpts);
|
|
236
|
+
const data = await client.request(CreateOperationDocument, { input });
|
|
237
|
+
formatOutput(data.createOperation, opts);
|
|
238
|
+
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
239
|
+
success(`Created operation "${data.createOperation.key}"`);
|
|
240
|
+
}));
|
|
241
|
+
// update
|
|
242
|
+
operations
|
|
243
|
+
.command('update <key>')
|
|
244
|
+
.description('Update an operation')
|
|
245
|
+
.option('-d, --data <json>', 'Update data as JSON')
|
|
246
|
+
.option('-f, --file <path>', 'Read input from file')
|
|
247
|
+
.action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
|
|
248
|
+
const opts = globalOpts();
|
|
249
|
+
const client = await createClient(opts);
|
|
250
|
+
const input = await parseInputData(cmdOpts);
|
|
251
|
+
const data = await client.request(UpdateOperationDocument, { key, input });
|
|
252
|
+
formatOutput(data.updateOperation, opts);
|
|
253
|
+
if (!(opts.json || opts.jsonl || opts.quiet))
|
|
254
|
+
success(`Updated operation "${key}"`);
|
|
255
|
+
}));
|
|
256
|
+
// delete
|
|
257
|
+
operations
|
|
258
|
+
.command('delete <key>')
|
|
259
|
+
.description('Delete an operation')
|
|
260
|
+
.option('--confirm', 'Skip confirmation prompt')
|
|
261
|
+
.action(withErrorHandler(globalOpts, async (key, cmdOpts) => {
|
|
262
|
+
const opts = globalOpts();
|
|
263
|
+
const confirmed = await confirmAction(`Delete operation "${key}"?`, { confirm: !!cmdOpts.confirm });
|
|
264
|
+
if (!confirmed) {
|
|
265
|
+
console.log('Aborted.');
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
const client = await createClient(opts);
|
|
269
|
+
await client.request(DeleteOperationDocument, { key });
|
|
270
|
+
if (opts.json || opts.jsonl)
|
|
271
|
+
formatOutput({ deleted: true, key }, opts);
|
|
272
|
+
else
|
|
273
|
+
success(`Deleted operation "${key}"`);
|
|
274
|
+
}));
|
|
161
275
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAyCtD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CAyUN"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -10,7 +10,7 @@ import { generateFieldTypesFile } from '../codegen/generators/field-types.js';
|
|
|
10
10
|
import { generateConfigFile } from '../codegen/generators/config.js';
|
|
11
11
|
import { generateModelTypes } from '../codegen/generators/model-types.js';
|
|
12
12
|
import { generateModelIndex } from '../codegen/generators/model-index.js';
|
|
13
|
-
import { generateModelDocuments, generateSharedFragments } from '../codegen/generators/documents.js';
|
|
13
|
+
import { generateModelDocuments, generateSharedFragments, } from '../codegen/generators/documents.js';
|
|
14
14
|
import { generateSwiftModelFile } from '../codegen/generators/swift-types.js';
|
|
15
15
|
import { generateSwiftFieldTypesFile } from '../codegen/generators/swift-field-types.js';
|
|
16
16
|
import { generateSwiftModelKeys } from '../codegen/generators/swift-model-keys.js';
|
|
@@ -19,7 +19,7 @@ import { generateSwiftCustomerProfileFile } from '../codegen/generators/swift-cu
|
|
|
19
19
|
import { generateCustomerProfileDocuments } from '../codegen/generators/customer-profile-documents.js';
|
|
20
20
|
import { generateStaticDocuments } from '../codegen/generators/static-documents.js';
|
|
21
21
|
import { generateTypedOperationsCommon } from '../codegen/generators/typed-operations-common.js';
|
|
22
|
-
import { generateTypedOperations, computeTypesRelPath } from '../codegen/generators/typed-operations.js';
|
|
22
|
+
import { generateTypedOperations, computeTypesRelPath, } from '../codegen/generators/typed-operations.js';
|
|
23
23
|
import { generateTypedOperationsIndex } from '../codegen/generators/typed-operations-index.js';
|
|
24
24
|
import { generateCustomerProfileOperations } from '../codegen/generators/customer-profile-operations.js';
|
|
25
25
|
import { generateReactHooks } from '../codegen/generators/react-hooks.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/commands/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA6BtD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,
|
|
1
|
+
{"version":3,"file":"records.d.ts","sourceRoot":"","sources":["../../src/commands/records.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA6BtD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA4XN"}
|