@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.
Files changed (82) hide show
  1. package/dist/auth/credentials.d.ts +10 -8
  2. package/dist/auth/credentials.d.ts.map +1 -1
  3. package/dist/auth/credentials.js +72 -12
  4. package/dist/cli.js +6 -0
  5. package/dist/codegen/fetch-customer-profile-schema.d.ts.map +1 -1
  6. package/dist/codegen/fetch-customer-profile-schema.js +4 -4
  7. package/dist/codegen/fetch-models.d.ts.map +1 -1
  8. package/dist/codegen/fetch-models.js +7 -7
  9. package/dist/codegen/field-mapping.d.ts.map +1 -1
  10. package/dist/codegen/field-mapping.js +1 -2
  11. package/dist/codegen/generators/static-documents.d.ts.map +1 -1
  12. package/dist/codegen/generators/static-documents.js +31 -29
  13. package/dist/codegen/generators/typed-operations.d.ts.map +1 -1
  14. package/dist/commands/api-keys.d.ts.map +1 -1
  15. package/dist/commands/api-keys.js +5 -5
  16. package/dist/commands/auth-config.d.ts +4 -0
  17. package/dist/commands/auth-config.d.ts.map +1 -0
  18. package/dist/commands/auth-config.js +37 -0
  19. package/dist/commands/auth-providers.d.ts.map +1 -1
  20. package/dist/commands/auth-providers.js +6 -6
  21. package/dist/commands/context.d.ts.map +1 -1
  22. package/dist/commands/context.js +7 -8
  23. package/dist/commands/customer-profiles.d.ts.map +1 -1
  24. package/dist/commands/customer-profiles.js +5 -5
  25. package/dist/commands/customers.d.ts.map +1 -1
  26. package/dist/commands/customers.js +6 -6
  27. package/dist/commands/embeddings.d.ts +4 -0
  28. package/dist/commands/embeddings.d.ts.map +1 -0
  29. package/dist/commands/embeddings.js +139 -0
  30. package/dist/commands/experiments.d.ts.map +1 -1
  31. package/dist/commands/experiments.js +12 -12
  32. package/dist/commands/extensions.d.ts.map +1 -1
  33. package/dist/commands/extensions.js +6 -6
  34. package/dist/commands/files.d.ts.map +1 -1
  35. package/dist/commands/files.js +8 -8
  36. package/dist/commands/hooks.d.ts +4 -0
  37. package/dist/commands/hooks.d.ts.map +1 -0
  38. package/dist/commands/hooks.js +182 -0
  39. package/dist/commands/locales.d.ts.map +1 -1
  40. package/dist/commands/locales.js +18 -13
  41. package/dist/commands/models.d.ts.map +1 -1
  42. package/dist/commands/models.js +11 -11
  43. package/dist/commands/notes.d.ts.map +1 -1
  44. package/dist/commands/notes.js +18 -8
  45. package/dist/commands/notifications.d.ts.map +1 -1
  46. package/dist/commands/notifications.js +4 -4
  47. package/dist/commands/operations.d.ts.map +1 -1
  48. package/dist/commands/operations.js +126 -12
  49. package/dist/commands/pull.d.ts.map +1 -1
  50. package/dist/commands/pull.js +2 -2
  51. package/dist/commands/records.d.ts.map +1 -1
  52. package/dist/commands/records.js +32 -20
  53. package/dist/commands/schedules.d.ts.map +1 -1
  54. package/dist/commands/schedules.js +9 -9
  55. package/dist/commands/search.d.ts.map +1 -1
  56. package/dist/commands/search.js +2 -2
  57. package/dist/commands/segments.d.ts.map +1 -1
  58. package/dist/commands/segments.js +9 -9
  59. package/dist/commands/select-project.d.ts.map +1 -1
  60. package/dist/commands/select-project.js +8 -9
  61. package/dist/commands/settings.d.ts.map +1 -1
  62. package/dist/commands/settings.js +8 -8
  63. package/dist/commands/variant-catalog.d.ts.map +1 -1
  64. package/dist/commands/variant-catalog.js +7 -7
  65. package/dist/commands/whoami.d.ts.map +1 -1
  66. package/dist/commands/whoami.js +9 -8
  67. package/dist/config/pull-config.js +2 -2
  68. package/dist/config/types.d.ts +1 -1
  69. package/dist/config/types.d.ts.map +1 -1
  70. package/dist/graphql/generated.d.ts +8134 -0
  71. package/dist/graphql/generated.d.ts.map +1 -0
  72. package/dist/graphql/generated.js +133 -0
  73. package/dist/lib/client.d.ts +1 -0
  74. package/dist/lib/client.d.ts.map +1 -1
  75. package/dist/lib/client.js +10 -7
  76. package/dist/lib/config.js +1 -1
  77. package/dist/lib/errors.d.ts.map +1 -1
  78. package/dist/lib/errors.js +11 -0
  79. package/package.json +32 -10
  80. package/dist/graphql/queries.d.ts +0 -115
  81. package/dist/graphql/queries.d.ts.map +0 -1
  82. 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 { CUSTOMERS, CUSTOMER, CUSTOMER_BY_EMAIL, CREATE_CUSTOMER, DELETE_CUSTOMER, } from '../graphql/queries.js';
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(CUSTOMERS, {
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(CUSTOMER_BY_EMAIL, { email: idOrEmail });
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(CUSTOMER, { id: idOrEmail });
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(CREATE_CUSTOMER, { input });
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(DELETE_CUSTOMER, { id });
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,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { GlobalOptions } from '../lib/config.js';
3
+ export declare function registerEmbeddingsCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -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,CAmON"}
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 { EXPERIMENTS, EXPERIMENT, EXPERIMENT_BY_KEY, CREATE_EXPERIMENT, UPDATE_EXPERIMENT, DELETE_EXPERIMENT, START_EXPERIMENT, PAUSE_EXPERIMENT, RESUME_EXPERIMENT, END_EXPERIMENT, EXPERIMENT_STATS, } from '../graphql/queries.js';
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(EXPERIMENTS, {
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(EXPERIMENT, { id: idOrKey });
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(EXPERIMENT_BY_KEY, { key: idOrKey });
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(CREATE_EXPERIMENT, { input });
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(UPDATE_EXPERIMENT, { id, input });
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(DELETE_EXPERIMENT, { id });
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(START_EXPERIMENT, { experimentId: id });
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(PAUSE_EXPERIMENT, { experimentId: id });
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(RESUME_EXPERIMENT, { experimentId: id });
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(END_EXPERIMENT, { experimentId: id });
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(EXPERIMENT_STATS, { experimentId: id });
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,CA8GN"}
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 { EXTENSIONS, EXTENSION, EXTENSION_BY_KEY, REGISTER_EXTENSION, TRIGGER_EXTENSION_SYNC, } from '../graphql/queries.js';
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(EXTENSIONS, {
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(EXTENSION, { id: idOrKey });
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(EXTENSION_BY_KEY, { key: idOrKey });
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(REGISTER_EXTENSION, { input });
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(TRIGGER_EXTENSION_SYNC, { extensionId: id });
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,CAoKN"}
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"}
@@ -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 { FILES, FILE, FILE_STORAGE_USAGE, UPDATE_FILE, UPDATE_FILE_METADATA, DELETE_FILE, } from '../graphql/queries.js';
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(FILES, {
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.items, opts, {
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(FILE, { id });
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(FILE_STORAGE_USAGE);
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(UPDATE_FILE, vars);
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(UPDATE_FILE_METADATA, {
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(DELETE_FILE, { id });
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,4 @@
1
+ import type { Command } from 'commander';
2
+ import type { GlobalOptions } from '../lib/config.js';
3
+ export declare function registerHooksCommands(program: Command, globalOpts: () => GlobalOptions): void;
4
+ //# sourceMappingURL=hooks.d.ts.map
@@ -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,CA4JN"}
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"}