@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.
Files changed (71) hide show
  1. package/dist/auth/credentials.js +0 -1
  2. package/dist/cli.js +6 -0
  3. package/dist/codegen/fetch-customer-profile-schema.d.ts.map +1 -1
  4. package/dist/codegen/fetch-customer-profile-schema.js +4 -4
  5. package/dist/codegen/fetch-models.d.ts.map +1 -1
  6. package/dist/codegen/fetch-models.js +7 -7
  7. package/dist/codegen/field-mapping.d.ts.map +1 -1
  8. package/dist/codegen/field-mapping.js +1 -2
  9. package/dist/codegen/generators/static-documents.d.ts.map +1 -1
  10. package/dist/codegen/generators/static-documents.js +31 -29
  11. package/dist/codegen/generators/typed-operations.d.ts.map +1 -1
  12. package/dist/commands/api-keys.d.ts.map +1 -1
  13. package/dist/commands/api-keys.js +5 -5
  14. package/dist/commands/auth-config.d.ts +4 -0
  15. package/dist/commands/auth-config.d.ts.map +1 -0
  16. package/dist/commands/auth-config.js +37 -0
  17. package/dist/commands/auth-providers.d.ts.map +1 -1
  18. package/dist/commands/auth-providers.js +6 -6
  19. package/dist/commands/customer-profiles.d.ts.map +1 -1
  20. package/dist/commands/customer-profiles.js +5 -5
  21. package/dist/commands/customers.d.ts.map +1 -1
  22. package/dist/commands/customers.js +6 -6
  23. package/dist/commands/embeddings.d.ts +4 -0
  24. package/dist/commands/embeddings.d.ts.map +1 -0
  25. package/dist/commands/embeddings.js +139 -0
  26. package/dist/commands/experiments.d.ts.map +1 -1
  27. package/dist/commands/experiments.js +12 -12
  28. package/dist/commands/extensions.d.ts.map +1 -1
  29. package/dist/commands/extensions.js +6 -6
  30. package/dist/commands/files.d.ts.map +1 -1
  31. package/dist/commands/files.js +8 -8
  32. package/dist/commands/hooks.d.ts +4 -0
  33. package/dist/commands/hooks.d.ts.map +1 -0
  34. package/dist/commands/hooks.js +182 -0
  35. package/dist/commands/locales.d.ts.map +1 -1
  36. package/dist/commands/locales.js +18 -13
  37. package/dist/commands/models.d.ts.map +1 -1
  38. package/dist/commands/models.js +11 -11
  39. package/dist/commands/notes.d.ts.map +1 -1
  40. package/dist/commands/notes.js +18 -8
  41. package/dist/commands/notifications.d.ts.map +1 -1
  42. package/dist/commands/notifications.js +4 -4
  43. package/dist/commands/operations.d.ts.map +1 -1
  44. package/dist/commands/operations.js +126 -12
  45. package/dist/commands/pull.d.ts.map +1 -1
  46. package/dist/commands/pull.js +2 -2
  47. package/dist/commands/records.d.ts.map +1 -1
  48. package/dist/commands/records.js +32 -20
  49. package/dist/commands/schedules.d.ts.map +1 -1
  50. package/dist/commands/schedules.js +9 -9
  51. package/dist/commands/search.d.ts.map +1 -1
  52. package/dist/commands/search.js +2 -2
  53. package/dist/commands/segments.d.ts.map +1 -1
  54. package/dist/commands/segments.js +9 -9
  55. package/dist/commands/settings.d.ts.map +1 -1
  56. package/dist/commands/settings.js +8 -8
  57. package/dist/commands/variant-catalog.d.ts.map +1 -1
  58. package/dist/commands/variant-catalog.js +7 -7
  59. package/dist/config/pull-config.js +2 -2
  60. package/dist/config/types.d.ts +1 -1
  61. package/dist/config/types.d.ts.map +1 -1
  62. package/dist/graphql/generated.d.ts +8134 -0
  63. package/dist/graphql/generated.d.ts.map +1 -0
  64. package/dist/graphql/generated.js +133 -0
  65. package/dist/lib/config.js +1 -1
  66. package/dist/lib/errors.d.ts.map +1 -1
  67. package/dist/lib/errors.js +11 -0
  68. package/package.json +32 -10
  69. package/dist/graphql/queries.d.ts +0 -115
  70. package/dist/graphql/queries.d.ts.map +0 -1
  71. 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, success } from '../lib/output.js';
4
4
  import { parseInputData, confirmAction } from '../lib/input.js';
5
- import { LOCALES, LOCALE, LOCALE_BY_CODE, DEFAULT_LOCALE, CREATE_LOCALE, UPDATE_LOCALE, DELETE_LOCALE, } from '../graphql/queries.js';
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(LOCALES, {
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: 'code', header: 'Code', width: 8 },
24
- { key: 'name', header: 'Name', width: 20 },
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
- { key: 'direction', header: 'Dir', width: 4 },
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(LOCALE, { id: idOrCode });
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(LOCALE_BY_CODE, { code: idOrCode });
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(DEFAULT_LOCALE);
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(CREATE_LOCALE, { input });
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.code}`);
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(UPDATE_LOCALE, { id, input });
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.code}`);
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(DELETE_LOCALE, { id });
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,CAiMN"}
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"}
@@ -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 { MODELS, MODEL_BY_KEY, CREATE_MODEL, UPDATE_MODEL, DELETE_MODEL, MODEL_VERSIONS, } from '../graphql/queries.js';
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(MODELS, {
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(MODEL_BY_KEY, { key });
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(CREATE_MODEL, { input: inputData });
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 id
79
- const existing = await client.request(MODEL_BY_KEY, { key });
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(UPDATE_MODEL, { input });
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(MODEL_BY_KEY, { key });
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(DELETE_MODEL, { id: existing.modelByKey.id });
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(MODEL_BY_KEY, { key });
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(MODEL_VERSIONS, {
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,CA2IN"}
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"}
@@ -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 { NOTES, NOTE, CREATE_NOTE, RESOLVE_NOTE, DELETE_NOTE, } from '../graphql/queries.js';
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(NOTES, {
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
- { key: 'body', header: 'Body', width: 40 },
31
- { key: 'authorId', header: 'Author', width: 16 },
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(NOTE, { id });
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(CREATE_NOTE, { input });
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(RESOLVE_NOTE, { input });
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(DELETE_NOTE, { noteId: id });
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,CA0FN"}
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 { NOTIFICATIONS, MARK_NOTIFICATION_READ, MARK_ALL_NOTIFICATIONS_READ, } from '../graphql/queries.js';
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(NOTIFICATIONS, {
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(MARK_NOTIFICATION_READ, { id });
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(MARK_ALL_NOTIFICATIONS_READ);
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;AAetD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA0MN"}
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 { OPERATIONS, OPERATION, EXECUTE_OPERATION, OPERATION_EXECUTION_STATS, DEAD_LETTER_OPERATIONS, RETRY_DEAD_LETTER, DISMISS_DEAD_LETTER, } from '../graphql/queries.js';
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(OPERATIONS, {
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(OPERATION, { key });
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
- const data = await client.request(EXECUTE_OPERATION, {
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
- async: !!cmdOpts.async,
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(OPERATION_EXECUTION_STATS, { operationKey: key });
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(DEAD_LETTER_OPERATIONS, {
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(RETRY_DEAD_LETTER, { id });
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(DISMISS_DEAD_LETTER, { id });
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;AAmCtD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,aAAa,GAC9B,IAAI,CA+TN"}
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"}
@@ -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,CAwYN"}
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"}