@observeone/cli 1.0.0

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 (84) hide show
  1. package/README.md +214 -0
  2. package/dist/README.md +214 -0
  3. package/dist/commands/ai-check.d.ts +9 -0
  4. package/dist/commands/ai-check.d.ts.map +1 -0
  5. package/dist/commands/ai-check.js +492 -0
  6. package/dist/commands/ai-check.js.map +1 -0
  7. package/dist/commands/apply.d.ts +6 -0
  8. package/dist/commands/apply.d.ts.map +1 -0
  9. package/dist/commands/apply.js +290 -0
  10. package/dist/commands/apply.js.map +1 -0
  11. package/dist/commands/check.d.ts +9 -0
  12. package/dist/commands/check.d.ts.map +1 -0
  13. package/dist/commands/check.js +267 -0
  14. package/dist/commands/check.js.map +1 -0
  15. package/dist/commands/export.d.ts +6 -0
  16. package/dist/commands/export.d.ts.map +1 -0
  17. package/dist/commands/export.js +95 -0
  18. package/dist/commands/export.js.map +1 -0
  19. package/dist/commands/heartbeat.d.ts +9 -0
  20. package/dist/commands/heartbeat.d.ts.map +1 -0
  21. package/dist/commands/heartbeat.js +264 -0
  22. package/dist/commands/heartbeat.js.map +1 -0
  23. package/dist/commands/list.d.ts +9 -0
  24. package/dist/commands/list.d.ts.map +1 -0
  25. package/dist/commands/list.js +42 -0
  26. package/dist/commands/list.js.map +1 -0
  27. package/dist/commands/login.d.ts +9 -0
  28. package/dist/commands/login.d.ts.map +1 -0
  29. package/dist/commands/login.js +192 -0
  30. package/dist/commands/login.js.map +1 -0
  31. package/dist/commands/monitor.d.ts +9 -0
  32. package/dist/commands/monitor.d.ts.map +1 -0
  33. package/dist/commands/monitor.js +292 -0
  34. package/dist/commands/monitor.js.map +1 -0
  35. package/dist/index.d.ts +5 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +125 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/interfaces/api-client.interface.d.ts +76 -0
  40. package/dist/interfaces/api-client.interface.d.ts.map +1 -0
  41. package/dist/interfaces/api-client.interface.js +2 -0
  42. package/dist/interfaces/api-client.interface.js.map +1 -0
  43. package/dist/interfaces/config.interface.d.ts +26 -0
  44. package/dist/interfaces/config.interface.d.ts.map +1 -0
  45. package/dist/interfaces/config.interface.js +2 -0
  46. package/dist/interfaces/config.interface.js.map +1 -0
  47. package/dist/interfaces/output.interface.d.ts +22 -0
  48. package/dist/interfaces/output.interface.d.ts.map +1 -0
  49. package/dist/interfaces/output.interface.js +2 -0
  50. package/dist/interfaces/output.interface.js.map +1 -0
  51. package/dist/interfaces/sse-client.interface.d.ts +18 -0
  52. package/dist/interfaces/sse-client.interface.d.ts.map +1 -0
  53. package/dist/interfaces/sse-client.interface.js +6 -0
  54. package/dist/interfaces/sse-client.interface.js.map +1 -0
  55. package/dist/package.json +42 -0
  56. package/dist/services/api-client.service.d.ts +82 -0
  57. package/dist/services/api-client.service.d.ts.map +1 -0
  58. package/dist/services/api-client.service.js +262 -0
  59. package/dist/services/api-client.service.js.map +1 -0
  60. package/dist/services/config.service.d.ts +32 -0
  61. package/dist/services/config.service.d.ts.map +1 -0
  62. package/dist/services/config.service.js +104 -0
  63. package/dist/services/config.service.js.map +1 -0
  64. package/dist/services/output.service.d.ts +28 -0
  65. package/dist/services/output.service.d.ts.map +1 -0
  66. package/dist/services/output.service.js +258 -0
  67. package/dist/services/output.service.js.map +1 -0
  68. package/dist/services/sse-client.service.d.ts +16 -0
  69. package/dist/services/sse-client.service.d.ts.map +1 -0
  70. package/dist/services/sse-client.service.js +80 -0
  71. package/dist/services/sse-client.service.js.map +1 -0
  72. package/dist/types/index.d.ts +106 -0
  73. package/dist/types/index.d.ts.map +1 -0
  74. package/dist/types/index.js +2 -0
  75. package/dist/types/index.js.map +1 -0
  76. package/dist/utils/live-progress.d.ts +23 -0
  77. package/dist/utils/live-progress.d.ts.map +1 -0
  78. package/dist/utils/live-progress.js +116 -0
  79. package/dist/utils/live-progress.js.map +1 -0
  80. package/dist/utils/log-writer.d.ts +13 -0
  81. package/dist/utils/log-writer.d.ts.map +1 -0
  82. package/dist/utils/log-writer.js +97 -0
  83. package/dist/utils/log-writer.js.map +1 -0
  84. package/package.json +66 -0
@@ -0,0 +1,95 @@
1
+ import { Command } from 'commander';
2
+ import { writeFileSync } from 'fs';
3
+ export function createExportCommand(configService, apiClient, outputService) {
4
+ const exportCmd = new Command('export')
5
+ .description('Export existing remote resources into a declarative JSON file')
6
+ .option('-f, --file <path>', 'Path to save the JSON configuration file', 'observeone.json')
7
+ .option('-j, --json', 'Output in JSON format')
8
+ .action(async (options) => {
9
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
10
+ outputService.enableJsonMode();
11
+ }
12
+ try {
13
+ const apiKey = configService.getApiKey();
14
+ if (!apiKey) {
15
+ outputService.error('Not authenticated. Please run "obs login" first.');
16
+ process.exit(1);
17
+ }
18
+ outputService.progress('Fetching existing resources from backend...');
19
+ // Fetch all resources
20
+ const [monitors, apiChecks, heartbeats, aiChecks] = await Promise.all([
21
+ apiClient.getUrlMonitors().catch(() => []),
22
+ apiClient.getApiChecks().catch(() => []),
23
+ apiClient.getHeartbeats().catch(() => []),
24
+ apiClient.getTests().catch(() => []),
25
+ ]);
26
+ const config = {};
27
+ // 1. Map Monitors
28
+ if (monitors.length > 0) {
29
+ config.monitors = monitors.map((m) => ({
30
+ name: m.name,
31
+ url: m.url,
32
+ interval: m.interval || m.cron_expression,
33
+ timeout_ms: m.timeout_ms,
34
+ alert_on_failure: m.alert_on_failure,
35
+ }));
36
+ }
37
+ // 2. Map API Checks
38
+ if (apiChecks.length > 0) {
39
+ config.api_checks = apiChecks.map((c) => ({
40
+ name: c.name,
41
+ url: c.url,
42
+ method: c.method,
43
+ timeout_ms: c.timeout_ms,
44
+ alert_on_failure: c.alert_on_failure,
45
+ }));
46
+ }
47
+ // 3. Map Heartbeats
48
+ if (heartbeats.length > 0) {
49
+ config.heartbeats = heartbeats.map((h) => ({
50
+ name: h.name,
51
+ period: h.period,
52
+ grace: h.grace_period,
53
+ description: h.description,
54
+ }));
55
+ }
56
+ // 4. Map AI Checks
57
+ if (aiChecks.length > 0) {
58
+ config.ai_checks = aiChecks.map((t) => ({
59
+ name: t.name,
60
+ url: t.url,
61
+ prompt: t.prompt,
62
+ }));
63
+ }
64
+ // Write to file
65
+ const targetFile = options.file;
66
+ writeFileSync(targetFile, JSON.stringify(config, null, 2));
67
+ if (process.env.OBS_JSON_OUTPUT === 'true') {
68
+ outputService.formatJsonOutput({
69
+ success: true,
70
+ file: targetFile,
71
+ counts: {
72
+ monitors: monitors.length,
73
+ apiChecks: apiChecks.length,
74
+ heartbeats: heartbeats.length,
75
+ aiChecks: aiChecks.length,
76
+ },
77
+ });
78
+ }
79
+ else {
80
+ outputService.success(`Exported existing resources to ${targetFile}`);
81
+ console.log('');
82
+ console.log(` Monitors: ${monitors.length}`);
83
+ console.log(` API Checks: ${apiChecks.length}`);
84
+ console.log(` Heartbeats: ${heartbeats.length}`);
85
+ console.log(` AI Checks: ${aiChecks.length}`);
86
+ }
87
+ }
88
+ catch (error) {
89
+ outputService.error(outputService.formatError(error));
90
+ process.exit(1);
91
+ }
92
+ });
93
+ return exportCmd;
94
+ }
95
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/commands/export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ import { IConfigService } from '../interfaces/config.interface.js';
3
+ import { IApiClient } from '../interfaces/api-client.interface.js';
4
+ import { IOutputService } from '../interfaces/output.interface.js';
5
+ /**
6
+ * Factory function to create heartbeat command
7
+ */
8
+ export declare function createHeartbeatCommand(configService: IConfigService, apiClient: IApiClient, outputService: IOutputService): Command;
9
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../src/commands/heartbeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,cAAc,GAC5B,OAAO,CA+QT"}
@@ -0,0 +1,264 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import inquirer from 'inquirer';
4
+ /**
5
+ * Factory function to create heartbeat command
6
+ */
7
+ export function createHeartbeatCommand(configService, apiClient, outputService) {
8
+ const heartbeat = new Command('heartbeat').description('Manage heartbeats');
9
+ // LIST
10
+ heartbeat
11
+ .command('list')
12
+ .description('List all heartbeats')
13
+ .option('-f, --format <format>', 'Output format (table, json)', 'table')
14
+ .option('-j, --json', 'Output in JSON format')
15
+ .action(async (options) => {
16
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.format === 'json' || options.json) {
17
+ outputService.enableJsonMode();
18
+ }
19
+ try {
20
+ const apiKey = configService.getApiKey();
21
+ if (!apiKey) {
22
+ outputService.error('Not authenticated. Please run "obs login" first.');
23
+ process.exit(1);
24
+ }
25
+ outputService.progress('Fetching heartbeats...');
26
+ const heartbeats = await apiClient.getHeartbeats();
27
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.format === 'json') {
28
+ outputService.formatJsonOutput(heartbeats);
29
+ }
30
+ else {
31
+ outputService.formatHeartbeatList(heartbeats, process.env.OBS_VERBOSE === 'true');
32
+ }
33
+ }
34
+ catch (error) {
35
+ outputService.error(outputService.formatError(error));
36
+ process.exit(1);
37
+ }
38
+ });
39
+ // GET
40
+ heartbeat
41
+ .command('get <id>')
42
+ .description('Get details of a heartbeat')
43
+ .option('-j, --json', 'Output in JSON format')
44
+ .action(async (id, options) => {
45
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
46
+ outputService.enableJsonMode();
47
+ }
48
+ try {
49
+ const apiKey = configService.getApiKey();
50
+ if (!apiKey) {
51
+ outputService.error('Not authenticated. Please run "obs login" first.');
52
+ process.exit(1);
53
+ }
54
+ const hbId = parseInt(id);
55
+ if (isNaN(hbId)) {
56
+ outputService.error('Invalid heartbeat ID.');
57
+ process.exit(1);
58
+ }
59
+ outputService.progress(`Fetching heartbeat ${hbId}...`);
60
+ const hbData = await apiClient.getHeartbeat(hbId);
61
+ if (process.env.OBS_JSON_OUTPUT === 'true') {
62
+ outputService.formatJsonOutput(hbData);
63
+ }
64
+ else {
65
+ outputService.formatHeartbeatList([hbData], true);
66
+ }
67
+ }
68
+ catch (error) {
69
+ outputService.error(outputService.formatError(error));
70
+ process.exit(1);
71
+ }
72
+ });
73
+ // CREATE
74
+ heartbeat
75
+ .command('create')
76
+ .description('Create a new heartbeat')
77
+ .option('-n, --name <name>', 'Heartbeat name')
78
+ .option('-p, --period <seconds>', 'Expected period in seconds')
79
+ .option('-g, --grace <seconds>', 'Grace period in seconds')
80
+ .option('-j, --json', 'Output in JSON format')
81
+ .action(async (options) => {
82
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
83
+ outputService.enableJsonMode();
84
+ }
85
+ try {
86
+ const apiKey = configService.getApiKey();
87
+ if (!apiKey) {
88
+ outputService.error('Not authenticated. Please run "obs login" first.');
89
+ process.exit(1);
90
+ }
91
+ let { name, period, grace } = options;
92
+ if (!name) {
93
+ const answers = await inquirer.prompt([
94
+ {
95
+ type: 'input',
96
+ name: 'name',
97
+ message: 'Heartbeat name:',
98
+ validate: (val) => (val.trim() ? true : 'Name is required'),
99
+ },
100
+ {
101
+ type: 'number',
102
+ name: 'period',
103
+ message: 'Expected period (seconds):',
104
+ default: 300,
105
+ },
106
+ {
107
+ type: 'number',
108
+ name: 'grace',
109
+ message: 'Grace period (seconds):',
110
+ default: 60,
111
+ },
112
+ ]);
113
+ name = answers.name;
114
+ period = answers.period;
115
+ grace = answers.grace;
116
+ }
117
+ outputService.progress('Creating heartbeat...');
118
+ const newHb = await apiClient.createHeartbeat({
119
+ name,
120
+ period: parseInt(period) || 300,
121
+ grace_period: parseInt(grace) || 60,
122
+ description: 'Created via CLI',
123
+ });
124
+ if (process.env.OBS_JSON_OUTPUT === 'true') {
125
+ outputService.formatJsonOutput(newHb);
126
+ }
127
+ else {
128
+ outputService.success(`Heartbeat "${newHb.name}" created! UUID: ${newHb.ping_key}`);
129
+ console.log(`\nTo ping this heartbeat, send a GET or POST request to:`);
130
+ console.log(chalk.cyan(`${configService.getApiUrl()}/heartbeats/ping/${newHb.ping_key}`));
131
+ }
132
+ }
133
+ catch (error) {
134
+ outputService.error(outputService.formatError(error));
135
+ process.exit(1);
136
+ }
137
+ });
138
+ // UPDATE
139
+ heartbeat
140
+ .command('update <id>')
141
+ .description('Update a heartbeat')
142
+ .option('-n, --name <name>', 'New heartbeat name')
143
+ .option('-p, --period <seconds>', 'New expected period in seconds')
144
+ .option('-j, --json', 'Output in JSON format')
145
+ .action(async (id, options) => {
146
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
147
+ outputService.enableJsonMode();
148
+ }
149
+ try {
150
+ const apiKey = configService.getApiKey();
151
+ if (!apiKey) {
152
+ outputService.error('Not authenticated. Please run "obs login" first.');
153
+ process.exit(1);
154
+ }
155
+ const hbId = parseInt(id);
156
+ if (isNaN(hbId)) {
157
+ outputService.error('Invalid heartbeat ID.');
158
+ process.exit(1);
159
+ }
160
+ const { name, period } = options;
161
+ if (!name && !period) {
162
+ outputService.error('Please provide at least one field to update (--name or --period).');
163
+ process.exit(1);
164
+ }
165
+ outputService.progress(`Updating heartbeat ${hbId}...`);
166
+ const existing = await apiClient.getHeartbeat(hbId);
167
+ const payload = {
168
+ name: name || existing.name,
169
+ period: period ? parseInt(period) : existing.period,
170
+ description: existing.description || 'Updated via CLI',
171
+ grace_period: existing.grace_period || 60,
172
+ };
173
+ const updatedHb = await apiClient.updateHeartbeat(hbId, payload);
174
+ if (process.env.OBS_JSON_OUTPUT === 'true') {
175
+ outputService.formatJsonOutput(updatedHb);
176
+ }
177
+ else {
178
+ outputService.success(`Heartbeat ${hbId} updated successfully.`);
179
+ }
180
+ }
181
+ catch (error) {
182
+ outputService.error(outputService.formatError(error));
183
+ process.exit(1);
184
+ }
185
+ });
186
+ // DELETE
187
+ heartbeat
188
+ .command('delete <id>')
189
+ .description('Delete a heartbeat')
190
+ .option('-y, --yes', 'Skip confirmation prompt')
191
+ .option('-j, --json', 'Output in JSON format')
192
+ .action(async (id, options) => {
193
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
194
+ outputService.enableJsonMode();
195
+ }
196
+ try {
197
+ const apiKey = configService.getApiKey();
198
+ if (!apiKey) {
199
+ outputService.error('Not authenticated. Please run "obs login" first.');
200
+ process.exit(1);
201
+ }
202
+ const hbId = parseInt(id);
203
+ if (isNaN(hbId)) {
204
+ outputService.error('Invalid heartbeat ID.');
205
+ process.exit(1);
206
+ }
207
+ if (!options.yes) {
208
+ const { confirm } = await inquirer.prompt([
209
+ {
210
+ type: 'confirm',
211
+ name: 'confirm',
212
+ message: `Are you sure you want to delete heartbeat ${hbId}?`,
213
+ default: false,
214
+ },
215
+ ]);
216
+ if (!confirm)
217
+ return;
218
+ }
219
+ outputService.progress(`Deleting heartbeat ${hbId}...`);
220
+ await apiClient.deleteHeartbeat(hbId);
221
+ if (process.env.OBS_JSON_OUTPUT === 'true') {
222
+ outputService.formatJsonOutput({ success: true, id: hbId });
223
+ }
224
+ else {
225
+ outputService.success(`Heartbeat ${hbId} deleted successfully.`);
226
+ }
227
+ }
228
+ catch (error) {
229
+ outputService.error(outputService.formatError(error));
230
+ process.exit(1);
231
+ }
232
+ });
233
+ // TOGGLE
234
+ heartbeat
235
+ .command('toggle <id>')
236
+ .description('Pause or resume a heartbeat')
237
+ .option('-j, --json', 'Output in JSON format')
238
+ .action(async (id, options) => {
239
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.json) {
240
+ outputService.enableJsonMode();
241
+ }
242
+ try {
243
+ const apiKey = configService.getApiKey();
244
+ if (!apiKey) {
245
+ outputService.error('Not authenticated. Please run "obs login" first.');
246
+ process.exit(1);
247
+ }
248
+ const hbId = parseInt(id);
249
+ if (isNaN(hbId)) {
250
+ outputService.error('Invalid heartbeat ID.');
251
+ process.exit(1);
252
+ }
253
+ outputService.progress(`Toggling heartbeat ${hbId}...`);
254
+ const isActive = await apiClient.toggleHeartbeat(hbId);
255
+ outputService.success(`Heartbeat ${hbId} is now ${isActive ? 'ACTIVE' : 'PAUSED'}.`);
256
+ }
257
+ catch (error) {
258
+ outputService.error(outputService.formatError(error));
259
+ process.exit(1);
260
+ }
261
+ });
262
+ return heartbeat;
263
+ }
264
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../src/commands/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ import { IConfigService } from '../interfaces/config.interface.js';
3
+ import { IApiClient } from '../interfaces/api-client.interface.js';
4
+ import { IOutputService } from '../interfaces/output.interface.js';
5
+ /**
6
+ * Factory function to create list command with direct service injection
7
+ */
8
+ export declare function createListCommand(configService: IConfigService, apiClient: IApiClient, outputService: IOutputService): Command;
9
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAEnE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAuCT"}
@@ -0,0 +1,42 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Factory function to create list command with direct service injection
4
+ */
5
+ export function createListCommand(configService, apiClient, outputService) {
6
+ return new Command('list')
7
+ .description('List all AI browser checks')
8
+ .option('-f, --format <format>', 'Output format (table, json)', 'table')
9
+ .option('--api-url <url>', 'Override API URL')
10
+ .option('--api-key <key>', 'Override API key')
11
+ .action(async (options) => {
12
+ try {
13
+ // Handle API URL override first, before other operations
14
+ if (options.apiUrl) {
15
+ configService.setCommandLineApiUrl(options.apiUrl);
16
+ }
17
+ // Handle API key override
18
+ if (options.apiKey) {
19
+ configService.setApiKey(options.apiKey);
20
+ }
21
+ const apiKey = configService.getApiKey();
22
+ if (!apiKey) {
23
+ outputService.error('Not authenticated. Please run "obs login" first.');
24
+ process.exit(1);
25
+ }
26
+ outputService.progress('Fetching tests...');
27
+ const tests = await apiClient.getTests();
28
+ if (process.env.OBS_JSON_OUTPUT === 'true' || options.format === 'json') {
29
+ outputService.formatJsonOutput(tests);
30
+ }
31
+ else {
32
+ const isVerbose = process.env.OBS_VERBOSE === 'true';
33
+ outputService.formatTestList(tests, isVerbose);
34
+ }
35
+ }
36
+ catch (error) {
37
+ outputService.error(outputService.formatError(error));
38
+ process.exit(1);
39
+ }
40
+ });
41
+ }
42
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAA6B,EAC7B,SAAqB,EACrB,aAA6B;IAE7B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,uBAAuB,EAAE,6BAA6B,EAAE,OAAO,CAAC;SACvE,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,yDAAyD;YACzD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,aAAa,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACrD,CAAC;YAED,0BAA0B;YAC1B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC1C,CAAC;YAED,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,aAAa,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;gBACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;YAE5C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAC;YAEzC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxE,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC;gBACrD,aAAa,CAAC,cAAc,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ import { IConfigService } from '../interfaces/config.interface.js';
3
+ import { IApiClient } from '../interfaces/api-client.interface.js';
4
+ import { IOutputService } from '../interfaces/output.interface.js';
5
+ /**
6
+ * Factory function to create login command with direct service injection
7
+ */
8
+ export declare function createLoginCommand(configService: IConfigService, apiClient: IApiClient, outputService: IOutputService): Command;
9
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAInE;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,cAAc,EAC7B,SAAS,EAAE,UAAU,EACrB,aAAa,EAAE,cAAc,GAC5B,OAAO,CAqKT"}